我的自定义类扩展了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;
但它也没有用。我错过了什么?
答案 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);
问题是它仍然会降低组合框的选择。
我正在努力。