Delphi 将下一个控件的焦点放在enter-in覆盖的KeyUp上
我有一个扩展TEdit的自定义类: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
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);