2009-10-28 2 views
2

В одной форме моего приложения мы добавляем наборы данных, добавляя к форме фреймы. Для каждого фрейма мы хотим, чтобы мы могли перейти от одного элемента управления редактирования (Express Express Editors) к следующему, нажав клавишу Enter. До сих пор я пробовал четыре разных метода в событиях KeyPress и KeyUp моего контроля.Как перейти к следующему элементу управления внутри рамки?

  1. SelectNext(TcxCurrencyEdit(Sender), True, True); // also base types attempted

  2. SelectNext(Sender as TWinControl, True, True);

  3. Perform(WM_NEXTDLGCTL, 0, 0);

  4. не
  5. f := TForm(self.Parent); // f is TForm or my form c := f.FindNextControl(f.ActiveControl, true, true, false); // c is TWinControl or TcxCurrencyEdit if assigned(c) then c.SetFocus;

Ни один из этих методов работы в Delphi 5. Может ли кто-нибудь привести меня к работе? Благодарю.

ответ

3

Это работает в Delphi 3, 5 и 6: KeyPreview собственности

установленной формы к Правда.

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
    If (Key = #13) then 
    Begin 
    SelectNext(ActiveControl as TWinControl, True, True); 
    Key := #0; 
    End; 
end; 
+0

Не знаю, почему это работает, когда натыкаясь для формирования уровня, но я предполагаю, что это связано с ограниченными возможностями взаимодействия фрейма. Хорошо работает, спасибо. –

3

Я нашел один старый проект, который ловит сообщение CM_DIALOGKEY при нажатии пользователем. Введите ключ, а затем он запустит VK_TAB ключ. Он работает с несколькими различными элементами управления.

interface 
... 
    procedure CMDialogKey(var Message: TCMDialogKey);message CM_DIALOGKEY; 

implementation 
... 

procedure TSomeForm.CMDialogKey(var Message : TCMDialogKey); 
begin 
    case Message.CharCode of 
    VK_RETURN : Perform(CM_DialogKey, VK_TAB, 0); 
    ... 
    else 
    inherited; 
    end; 
end; 
+0

Работы действительно лучше в большем количестве компонентов в низком уровне слишком – user2092868

1

Вы можете разместить TButton на форме, сделать ее небольшой и скрыть ее под другим контролем. Установите свойство по умолчанию истина (что делает его получение Введите ключ) и поместите следующий код в событие OnClick:

SelectNext(ActiveControl, true, true); 
1

Событие onKeyPress является тригером, как любая другая форма.

Проблема заключается в том, что выполнение процедуры (wm_nextdlgctl, 0,0) не работает внутри кадра.

Вы должны знать активный элемент управления для правильного события.

procedure TFrmDadosCliente.EditKeyPress(Sender: TObject; var Key: Char); 
var 
    AParent:TComponent; 
begin 
    if key = #13 then 
    begin 
    key := #0; 

    AParent:= TComponent(Sender).GetParentComponent; 

    while not (AParent is TCustomForm) do 
     AParent:= AParent.GetParentComponent; 

    SelectNext(TCustomForm(AParent).ActiveControl, true, true); 
    end; 
end;