2011-05-16 32 views
6

He mi bruja clase personalizada se deriva de TButton:OnClick anulación evento

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; 

en el constructor añadí:

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

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

Pero cuando hago clic en el botón no está disparando OnClickResult, lo que soy Estoy haciendo mal? ¿Es posible "anular" el controlador de eventos OnClick o debería ocultarlo y hacer, por ejemplo, el evento OnResultClick?

+1

> ¿qué estoy haciendo mal? Sucede, porque el controlador de evento OnClick real se asigna después de que el constructor haya terminado de ejecutarse. En el método cargado. Pero es mucho mejor anular el evento Click de TButton, como se sugiere más abajo, en lugar de jugar con controladores de eventos. Pero si desea asignar su controlador de eventos desde el componente, debe asignarlo después de que se ejecute el método TComponent.Loaded. –

+0

@ Aleksey Gracias, es bueno saber – JustMe

+2

Los eventos están hechos para ser utilizados por la aplicación que utiliza su clase/componente, para no consumirse por sí mismo. –

Respuesta

12

Al escribir componentes, no debe usar los controladores de eventos para implementar un comportamiento personalizado. En su lugar, debe anular el código que llama a estos controladores de eventos. En este caso, olvídese de configurar OnClick. En su lugar, sólo tiene que añadir

public 
    procedure Click; override; 

a su declaración de la clase, e implementar

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

El evento manipuladores están ahí para ser utilizado por el desarrollador usando el componente. El escritor componente no debe usarlos ella misma.

Si desea que el usuario del componente para ver un método diferente 'onclick', usted tiene que poner en práctica esto por sí mismo, como

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

¡Gracias! ¿Qué hay de implementar LoginResult al controlador de eventos OnClick, es posible? – JustMe

+0

Agradable ... Lento para responder una vez más :-) –

Cuestiones relacionadas