Функция onclick переопределить событие

у меня есть свой пользовательский класс witch, производный от 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;

в конструкторе я добавил:

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

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

но когда я нажимаю на кнопку, она не запускает OnClickResult, что я делаю неправильно? Можно ли "переопределить" обработчик событий OnClick или скрыть его и сделать, например, событие OnResultClick?

1 ответов


при написании компонентов не следует использовать обработчики событий для реализации пользовательского поведения. Вместо этого следует переопределить код, вызывающий эти обработчики событий. В этом случае забудьте о настройке OnClick. Вместо этого, просто добавьте

public
  procedure Click; override;

для объявления класса и реализации

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

обработчики событий должны использоваться разработчиком используя компонент. Компонентный писатель не должен использовать их сам.

если вы хотите компонент user чтобы увидеть другой метод "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;