Delphi 将下一个控件的焦点放在enter-in覆盖的KeyUp上

Delphi 将下一个控件的焦点放在enter-in覆盖的KeyUp上,delphi,delphi-2010,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

我有一个扩展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;
在键控程序中,我执行以下操作:

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;
但它也不起作用。我缺少什么?

选择下一个同级子控件,即,您需要在编辑的父控件上调用它:

type
  THackWinControl = class(TWinControl);

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

以下是记录的PostMessage方法(使用消息:)


可以避免THackWinControl,并且为了使其更好:

SelectNext(ActiveControl as TWinControl, True, ssShift in Shift);
问题是它仍然下拉组合框选项


我正在处理这个问题。

谢谢,但它不像tab键那样工作-它总是将焦点移到formIt上的第一个控件,它应该根据其他同级控件的
TabOrder
TabStop
属性移到下一个控件。@JustMe,我刚刚测试了TOndrej的代码(因为我要发布同样的东西,但他更快了)。效果很好,我的表单上有3个
TYourTextEdit
,焦点从一个循环到另一个,正如您所期望的。尝试将
True
作为最后一个参数传递(
CheckTabStop
)。如果父容器是表单上多个容器中的一个容器,该怎么办?此代码是围绕该容器中的控件循环,还是会延伸到下一个容器的第一个控件?还强烈建议在答案中添加一些描述,因为代码可能不会对每个人进行自我描述。非常好,谢谢Tacu Aureliu。
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;
SelectNext(ActiveControl as TWinControl, True, ssShift in Shift);