2015-04-18 63 views
1

我有一個保存按鈕的窗體(模式)。請記住,此按鈕在按下後沒有關閉表格,並且在保存數據後變爲禁用狀態。德爾福:按下保存按鈕後返回焦點

我想要做的是將焦點返回到保存按鈕被按下後使用的最新對象組件(編輯,vst,組合框等)。

+0

http://stackoverflow.com/questions/15316831/how-to-remove-focus-rectangle-from-一鍵控制 –

回答

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; 
+0

第二個變體看起來更好。謝謝你的回答Sertac Akyuz – REALSOFO