2011-05-16 181 views
6

我有我的自定義類巫婆從TButton的衍生:OnClick事件覆蓋

TLoginResultEvent = procedure (Sender: TObject; LoginResult: boolean) of object; 
TLoginButton = class(TButton) 
    private 
     fLogin: TLoginChooser; 
     fOnClick: TLoginResultEvent; 
    public 
     constructor Create(AOwner: TComponent); override; 
     destructor Destroy; override; 

     procedure OnClickResult(Sender: TObject; LoginResult: boolean); 
    published 
     property Login: TLoginChooser read fLogin write fLogin; 
     property OnClick: TLoginResultEvent read fOnClick write fOnClick; 
    end; 

在構造函數中我說:

constructor TLoginButton.Create(AOwner: TComponent); 
begin 
    inherited; 

    fOnClick := OnClick; 
    OnClick := OnClickResult; 
end; 

但是,當我點擊它沒有發射OnClickResult按鈕,我算什麼我做錯了?是否有可能「重寫」OnClick事件處理程序,或者我應該隱藏它,並例如OnResultClick事件?

+1

>我究竟做錯了什麼? 它發生,因爲實際的OnClick事件處理程序是在您的構造函數完成執行後分配的。在加載的方法。 但重寫TButton的Click事件會更好,因爲建議較低,而不是使用事件處理程序。但是,如果您想從組件內分配事件處理程序,則應在TComponent.Loaded方法執行後分配它。 – 2011-05-16 17:05:33

+0

@Aleksey謝謝,很高興知道 – JustMe 2011-05-16 17:07:36

+2

使用您的類/組件的應用程序將使用事件,而不是自行使用。 – 2011-05-17 02:43:16

回答

12

編寫組件時,不應該使用事件處理程序來實現自定義行爲。相反,您應該重寫調用這些事件處理程序的代碼。在這種情況下,忘記設置OnClick。相反,只需添加

public 
    procedure Click; override; 

你的類聲明,並實現

procedure TLoginButton.Click; 
begin 
    inherited; // call the inherited Click method. 
    // Do something new. 
end; 

事件處理程序在那裏使用組件開發商使用。組件編寫者不應該自己使用它們。

如果你想在組件的用戶看到一個不一樣的「onClick」的方法,你必須自己實現,像

type 
    TLoginResultEvent = procedure(Sender: TObject; LoginResult: boolean) of object; 

... 

TLoginButton = class(TButton) 
private 
    FOnClick: TLoginResultEvent; 
... 
public 
    procedure Click; override; 
... 
published 
    property OnClick: TLoginResultEvent read FOnClick write FOnClick; 
... 

procedure TLoginButton.Click; 
begin 
    inherited; 
    if Assigned(FOnClick) then 
    FOnClick(Self, true); // or false... 
end; 
+0

謝謝!如何實現LoginResult到OnClick事件處理程序,這可能嗎? – JustMe 2011-05-16 16:52:23

+0

不錯...再次慢回答:-) – 2011-05-16 16:55:12