【问题标题】:OnClick event overrideOnClick 事件覆盖
【发布时间】:2011-08-26 14:32:11
【问题描述】:

我的自定义类女巫是从 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 事件?

【问题讨论】:

  • >我做错了什么?它发生了,因为实际的 OnClick 事件处理程序是在您的构造函数完成执行后分配的。在加载方法中。但是按照下面的建议,覆盖 TButton 的 Click 事件要好得多,而不是使用事件处理程序。但是如果你想从组件中分配你的事件处理程序,你应该在 TComponent.Loaded 方法执行之后分配它。
  • @Aleksey 谢谢,很高兴知道
  • 事件被使用你的类/组件的应用程序使用,而不是被它自己使用。

标签: delphi delphi-2010


【解决方案1】:

在编写组件时,您不应使用事件处理程序来实现自定义行为。相反,您应该重写调用这些事件处理程序的代码。在这种情况下,忘记设置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;

【讨论】:

  • 谢谢!将 LoginResult 实现到 OnClick 事件处理程序怎么样,有可能吗?
  • 很好......再次缓慢回答:-)
猜你喜欢
  • 2013-07-16
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
相关资源
最近更新 更多