德尔福:按下保存按钮后返回焦点

时间:2015-04-18 11:36:12

标签: delphi focus

我有一个带有保存按钮的表单(模态)。请记住,按下后此按钮不会关闭表单,并在保存数据后被禁用。

我想要做的是在按下保存按钮后将焦点返回到使用的最新对象组件(edit,vst,combobox等)。

1 个答案:

答案 0 :(得分:4)

您可以使用专门的按钮来保存以前聚焦的控件,同时获得焦点:

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;

但是,这需要对具有多个窗口的某些控件进行一些专门处理。例如。组合框,如果编辑窗口被聚焦,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;