如何从继承自另一个自定义控件的自定义控件中触发方法?

用户名

概述

为了更简单地将问题输入文本,我控件的继承看起来像这样:

TCustomListBox> TMyCustomListBox>TMyListBox

这样做的原因TMyCustomListBoxTCustomListBox通过添加一些我自己的新属性和方法进行扩展,然后我将拥有TMyListBox从派生而来的其他组件TMyCustomListBox,但也可能具有自己的属性和方法。

问题

我面临的问题是无法激发TMyListBox我引入的方法TCustomListBox

考虑到这一点,下面是一个摘要片段TMyCustomListBox,您可以在其中查看我添加的新方法类型(OnAddition):

type
  TOnAdditionEvent = procedure(Sender: TObject; Index: Integer; Value: string) of object;

  TMyCustomListBox = class(TCustomListBox)
  private
    FOnAddition: TOnAdditionEvent;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnAddition: TOnAdditionEvent read FOnAddition write FOnAddition;
    property OnClick;
    property OnDblClick;
    // ...
  end;

我将事件分配为:

if Assigned(FOnAddition) then
begin
  FOnAddition(Self, SomeIndex, SomeValue);
end;

从上面调用:

procedure WndProc(var Message: TMessage); override;

现在我们有TMyListBox

type
  TMyListBox = class(TMyCustomListBox)
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

如果我要在设计时使用实例TMyListBox并使用new事件,则在运行时进行测试时,它可以正常工作:

procedure Form1.MyListBox1Addition(Sender: TObject; Index: Integer; Value: string);
begin
  ShowMessage('Added Item: [' + Value + '] whose index is: ' + IntToStr(Index));
end;

我如何在TMyListBox组件源中执行相同的操作,我尝试了一些不同的操作,但没有触发事件或出现错误。


我尝试了什么

1个

type
  TMyListBox = class(TMyCustomListBox)
  protected
    procedure Addition(Sender: TObject; Index: Integer; Value: string);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

constructor TMyListBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  OnAddition := Addition; // shouldn't this call Addition procedure below?
end;

procedure TMyListBox.Addition(Sender: TObject; Index: Integer;
  Value: string);
begin
  ShowMessage('test'); // doesnt fire
end;

2

与上述相同,仅添加inherited

procedure TMyListBox.Addition(Sender: TObject; Index: Integer;
  Value: string);
begin
  inherited; // no difference
  ShowMessage('test'); // doesnt fire
end;

3

我尝试覆盖Addition方法声明:

procedure Addition(Sender: TObject; Index: Integer; Value: string); override;

Addition在基类中找不到错误

4

我什至尝试将声明更改为:

procedure OnAddition(Sender: TObject; Index: Integer; Value: string);

并从构造函数中删除事件处理程序,仍然不会触发。

我也尝试了其他一些方法,但是此时我陷入了死胡同,因此希望朝着正确的方向前进。我确实应该能够解决这个问题,但是我想我一直在解决这个问题上花费太长时间了,而且我的大脑正在融化,所以我等待最有可能成为一个简单明显答案的方法:)

谢谢。

雷米·勒博
constructor TMyListBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  OnAddition := Addition; // shouldn't this call Addition procedure below?
end;

这项工作应该很好。不,它不 Addition(),它的地址分配Addition()OnAddition事件。触发事件后,它将调用 Addition()

但是,话虽如此,这是错误的设计。组件永远不要为自己的事件(尤其是published事件)分配处理程序正确的解决方案是TMyCustomListBox声明一个virtual触发方法,OnAddition然后在需要时调用该方法。TMyListBox(或其他任何后代)可以使用override该方法,inherited如果希望/当希望触发用户的OnAddition事件处理程序,则调用该方法额外的好处是,即使用户未分配任何事件处理程序,这也允许后代对事件做出反应。

尝试以下方法:

type
  TOnAdditionEvent = procedure(Sender: TObject; Index: Integer; Value: string) of object;

  TMyCustomListBox = class(TCustomListBox)
  private
    FOnAddition: TOnAdditionEvent;
  protected
    procedure DoAddition(Index: Integer; Value: string); virtual;
    property OnAddition: TOnAdditionEvent read FOnAddition write FOnAddition;
  // ...
  end;

procedure TMyCustomListBox.DoAddition(Index: Integer; Value: string);
begin
  if Assigned(OnAddition) then
   OnAddition(Self, Index, Value);
end;

type
  TMyListBox = class(TMyCustomListBox)
  protected
    procedure DoAddition(Index: Integer; Value: string); override;
  // ...
  published
    property OnAddition;
  //...
  end;

procedure TMyListBox.DoAddition(Index: Integer; Value: string);
begin
  ShowMessage('test'); // doesnt fire
  inherited;
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用XAML中的另一个自定义控件基类使WPF在视图中实例化一个自定义控件?

来自分类Dev

如何使用XAML中的另一个自定义控件基类使WPF在视图中实例化一个自定义控件?

来自分类Dev

WPF:自定义控件属性已被另一个自定义控件错误注册

来自分类Dev

如何正确地向另一个自定义控件添加一个自定义控件,使其以表格形式呈现?

来自分类Dev

我可以创建一个使用Generic.xml中的另一个自定义控件的自定义控件吗

来自分类Dev

是否可以在自定义View类中创建另一个控件?

来自分类Dev

Inno Setup:从另一个控件的OnClick事件访问自定义控件

来自分类Dev

如何在自定义控件中创建一个按钮以触发onClick事件,并以自定义控件所在的主要形式对其进行处理?

来自分类Dev

将属性绑定到自定义控件的另一个属性

来自分类Dev

在另一个angularjs页面中包括自定义angularjs页面作为用户控件

来自分类Dev

从自定义控件的另一个属性获取在设计器中设置的属性值

来自分类Dev

使用WPF C#中的多个控件的组合创建一个自定义控件

来自分类Dev

动态在另一个自定义tagLib中调用自定义tagLib

来自分类Dev

在另一个自定义 UIView 中嵌入自定义 UITableViewCell?

来自分类Dev

用户控件中的自定义方法

来自分类Dev

使用fxml从自定义控件继承

来自分类Dev

自定义控件OnPaint不会触发

来自分类Dev

从嵌套自定义控件中的RepeatControl继承索引

来自分类Dev

自定义addToDisplay方法在另一个类中返回异常

来自分类Dev

如何从Colab中的另一个python模块调用自定义模块

来自分类Dev

如何在自定义tableViewController中过渡到另一个viewController?

来自分类Dev

子控件未继承 WPF 自定义控件样式

来自分类Dev

WPF KeyBinding 命令未在自定义控件中触发

来自分类Dev

从另一个自定义重定向到自定义 html 页面

来自分类Dev

如何在另一个自定义模块中使用一个自定义模块中的功能

来自分类Dev

MFC:如何在Visual Studio的工具箱中包含一个自定义控件

来自分类Dev

如何在另一个自定义视图中添加自定义视图?

来自分类Dev

如何从另一个“高级自定义字段”获取“高级自定义字段”选择值?

来自分类Dev

如何从另一个“高级自定义字段”获取“高级自定义字段”选择值?

Related 相关文章

  1. 1

    如何使用XAML中的另一个自定义控件基类使WPF在视图中实例化一个自定义控件?

  2. 2

    如何使用XAML中的另一个自定义控件基类使WPF在视图中实例化一个自定义控件?

  3. 3

    WPF:自定义控件属性已被另一个自定义控件错误注册

  4. 4

    如何正确地向另一个自定义控件添加一个自定义控件,使其以表格形式呈现?

  5. 5

    我可以创建一个使用Generic.xml中的另一个自定义控件的自定义控件吗

  6. 6

    是否可以在自定义View类中创建另一个控件?

  7. 7

    Inno Setup:从另一个控件的OnClick事件访问自定义控件

  8. 8

    如何在自定义控件中创建一个按钮以触发onClick事件,并以自定义控件所在的主要形式对其进行处理?

  9. 9

    将属性绑定到自定义控件的另一个属性

  10. 10

    在另一个angularjs页面中包括自定义angularjs页面作为用户控件

  11. 11

    从自定义控件的另一个属性获取在设计器中设置的属性值

  12. 12

    使用WPF C#中的多个控件的组合创建一个自定义控件

  13. 13

    动态在另一个自定义tagLib中调用自定义tagLib

  14. 14

    在另一个自定义 UIView 中嵌入自定义 UITableViewCell?

  15. 15

    用户控件中的自定义方法

  16. 16

    使用fxml从自定义控件继承

  17. 17

    自定义控件OnPaint不会触发

  18. 18

    从嵌套自定义控件中的RepeatControl继承索引

  19. 19

    自定义addToDisplay方法在另一个类中返回异常

  20. 20

    如何从Colab中的另一个python模块调用自定义模块

  21. 21

    如何在自定义tableViewController中过渡到另一个viewController?

  22. 22

    子控件未继承 WPF 自定义控件样式

  23. 23

    WPF KeyBinding 命令未在自定义控件中触发

  24. 24

    从另一个自定义重定向到自定义 html 页面

  25. 25

    如何在另一个自定义模块中使用一个自定义模块中的功能

  26. 26

    MFC:如何在Visual Studio的工具箱中包含一个自定义控件

  27. 27

    如何在另一个自定义视图中添加自定义视图?

  28. 28

    如何从另一个“高级自定义字段”获取“高级自定义字段”选择值?

  29. 29

    如何从另一个“高级自定义字段”获取“高级自定义字段”选择值?

热门标签

归档