Переопределение события OnClick - PullRequest
6 голосов
/ 16 мая 2011

У меня есть пользовательский класс ведьма, полученная из 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 Ответ

12 голосов
/ 16 мая 2011

При написании компонентов не следует использовать обработчики событий для реализации пользовательского поведения. Вместо этого вы должны переопределить код, вызывающий эти обработчики событий. В этом случае забудьте о настройке 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;
...