Как перейти к следующему элементу управления внутри кадра? - PullRequest
3 голосов
/ 29 октября 2009

В одной форме моего приложения мы добавляем наборы данных, добавляя в форму фреймы. Для каждого кадра мы хотим иметь возможность перейти от одного элемента редактирования (Dev 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. 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. Может ли кто-нибудь подсказать мне, как заставить это работать? Спасибо.

Ответы [ 4 ]

3 голосов
/ 29 октября 2009

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

Установите для свойства KeyPreview формы значение True.

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  If (Key = #13) then
  Begin
    SelectNext(ActiveControl as TWinControl, True, True);
    Key := #0; 
  End;
end;
3 голосов
/ 29 октября 2009

Я нашел один старый проект, который ловит сообщение CM_DIALOGKEY, когда пользователь нажимает клавишу Enter, а затем запускает клавишу 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;
2 голосов
/ 29 августа 2013

Событие 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;
1 голос
/ 29 октября 2009

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

SelectNext(ActiveControl, true, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...