Сосредоточить следующий элемент управления на вводе - в переопределенном KeyUp - PullRequest
9 голосов
/ 21 июля 2011

У меня есть свой собственный класс, который расширяет TEdit:

  TMyTextEdit = class (TEdit)
   private
     fFocusNextOnEnter: Boolean;
   public
    procedure KeyUp(var Key: Word; Shift :TShiftState); override;
   published
     property FocusNextOnExnter: Boolean read fFocusNextOnEnter
                                 write fFocusNextOnEnter default false;
  end;

В процедуре KeyUp я делаю:

procedure TMyTextEdit.KeyUp(var Key: Word; Shift: TShiftState);
begin
  inherited;

  if FocusNextOnExnter then
    if Key = VK_RETURN then 
      SelectNext(Self as TWinControl, True, false);
end;

Но он не перемещает фокус на следующий элемент управления.Я пытался

if Key = VK_RETURN then
      Key := VK_TAB;

, но это тоже не работает.Чего мне не хватает?

Ответы [ 4 ]

12 голосов
/ 21 июля 2011

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

type
  THackWinControl = class(TWinControl);

if Key = VK_RETURN then
  if Assigned(Parent) then
    THackWinControl(Parent).SelectNext(Self, True, False);
5 голосов
/ 21 июля 2011

Вот подход PostMessage (использует сообщения) для записи:)

procedure TMyEdit.KeyUp(var Key: Word; Shift: TShiftState);
begin
  inherited;
  if FocusNextOnExnter then
    if Key = VK_RETURN then begin
      PostMessage(GetParentForm(Self).Handle, wm_NextDlgCtl, Ord((ssShift in Shift)), 0);
      Key := 0;
    end;
end;
4 голосов
/ 10 мая 2013
procedure TMyEdit.KeyUp(var Key: Word; Shift: TShiftState);
begin

  inherited;

  if FocusNextOnExnter and Focused and (Key = VK_RETURN) then 

  begin

    Perform(CM_DIALOGKEY, VK_TAB, 0);

    Key := 0;

  end;

end;
0 голосов
/ 30 декабря 2015

THackWinControl можно избежать и сделать его красивым:

SelectNext(ActiveControl as TWinControl, True, ssShift in Shift);

Проблема в том, что все еще есть выпадающие списки.

Я работаю над этим.

...