Delphi: Return 按下保存按钮后的焦点
Delphi: Return focus after save button is pressed
我有一个带有保存按钮的表单(模态)。请记住,此按钮在按下后不会关闭表单,并在保存数据后变为禁用。
我想做的是在按下保存按钮后return将焦点放在最新使用的对象组件(编辑、vst、组合框等)上。
您可以使用一个专门的按钮来保存先前获得焦点的控件,同时它正在接收焦点:
type
TSaveButton = class(TButton)
private
FPrevWinControl: TWinControl;
protected
procedure Click; override;
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
end;
procedure TSaveButton.WMSetFocus(var Message: TWMSetFocus);
begin
FPrevWinControl := FindControl(Message.FocusedWnd);
inherited;
end;
procedure TSaveButton.Click;
begin
inherited;
if Assigned(FPrevWinControl) then
FPrevWinControl.SetFocus;
end;
然而,这需要对一些具有多个 window 的控件进行专门处理。例如。组合框,如果编辑 window 获得焦点,FindControl
将找不到组合框,您需要传递编辑的父项。
也可以在表单级别处理它,例如通过覆盖 SetFocusedControl
:
type
TForm1 = class(TForm)
...
procedure ButtonSaveClick(Sender: TObject);
private
FPrevWinControl: TWinControl;
public
function SetFocusedControl(Control: TWinControl): Boolean; override;
...
function TForm1.SetFocusedControl(Control: TWinControl): Boolean;
begin
if Control = ButtonSave then
FPrevWinControl := ActiveControl;
Result := inherited SetFocusedControl(Control);
end;
procedure TForm1.ButtonSaveClick(Sender: TObject);
begin
// save ...
if Assigned(FPrevWinControl) then
FPrevWinControl.SetFocus;
end;
我有一个带有保存按钮的表单(模态)。请记住,此按钮在按下后不会关闭表单,并在保存数据后变为禁用。
我想做的是在按下保存按钮后return将焦点放在最新使用的对象组件(编辑、vst、组合框等)上。
您可以使用一个专门的按钮来保存先前获得焦点的控件,同时它正在接收焦点:
type
TSaveButton = class(TButton)
private
FPrevWinControl: TWinControl;
protected
procedure Click; override;
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
end;
procedure TSaveButton.WMSetFocus(var Message: TWMSetFocus);
begin
FPrevWinControl := FindControl(Message.FocusedWnd);
inherited;
end;
procedure TSaveButton.Click;
begin
inherited;
if Assigned(FPrevWinControl) then
FPrevWinControl.SetFocus;
end;
然而,这需要对一些具有多个 window 的控件进行专门处理。例如。组合框,如果编辑 window 获得焦点,FindControl
将找不到组合框,您需要传递编辑的父项。
也可以在表单级别处理它,例如通过覆盖 SetFocusedControl
:
type
TForm1 = class(TForm)
...
procedure ButtonSaveClick(Sender: TObject);
private
FPrevWinControl: TWinControl;
public
function SetFocusedControl(Control: TWinControl): Boolean; override;
...
function TForm1.SetFocusedControl(Control: TWinControl): Boolean;
begin
if Control = ButtonSave then
FPrevWinControl := ActiveControl;
Result := inherited SetFocusedControl(Control);
end;
procedure TForm1.ButtonSaveClick(Sender: TObject);
begin
// save ...
if Assigned(FPrevWinControl) then
FPrevWinControl.SetFocus;
end;