将输入的下一个控制重点放在重写的KeyUp上

时间:2011-07-21 08:44:14

标签: delphi delphi-2010

我的自定义类扩展了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 个答案:

答案 0 :(得分:12)

SelectNext选择下一个同级子控件,即。你需要在编辑的父母那里调用它:

type
  THackWinControl = class(TWinControl);

if Key = VK_RETURN then
  if Assigned(Parent) then
    THackWinControl(Parent).SelectNext(Self, True, False);

答案 1 :(得分:5)

这是PostMessage方法(使用Messages)作为记录:)

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;

答案 2 :(得分:4)

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;

答案 3 :(得分:0)

可以避免THackWinControl,并使它变得更好:

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

问题是它仍然会降低组合框的选择。

我正在努力。