Anulación del evento OnClick

Tengo mi clase personalizada que se deriva de TButton:

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 agregué:

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

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

Pero cuando hago clic en el botón, no se activa OnClickResult, ¿qué estoy haciendo mal? ¿Es posible "anular" el controlador de eventos OnClick o debo ocultarlo y crear, por ejemplo, un evento OnResultClick?

preguntado el 16 de mayo de 11 a las 16:05

> ¿qué estoy haciendo mal? Sucede, porque el controlador de eventos OnClick real se asigna después de que su constructor termina de ejecutarse. En 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 dentro del componente, debe asignarlo después de que se ejecute el método TComponent.Loaded. -

@Aleksey Gracias, es bueno saberlo -

Los eventos están hechos para ser utilizados por la aplicación que usa su clase / componente, no para ser consumidos por sí mismos. -

1 Respuestas

Al escribir componentes, no debe utilizar 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, simplemente agregue

public
  procedure Click; override;

a su declaración de clase, e implemente

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

Los controladores de eventos están ahí para que los utilice el desarrollador. usar el componente. El escritor de componentes no debe usarlos por sí mismo.

Si desea que el usuario del componente para ver un método 'OnClick' diferente, debe implementarlo usted 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;

contestado el 16 de mayo de 11 a las 21:05

¡Gracias! ¿Qué pasa con la implementación de LoginResult en el controlador de eventos OnClick, es posible? - Solo yo

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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.