2011-05-16 111 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