gpt4 book ai didi

delphi - 如何强制 TFrame 上的组件拥有自己的事件处理程序?

转载 作者:行者123 更新时间:2023-12-03 18:23:34 27 4
gpt4 key购买 nike

我很难让 Delphi 2006 将事件处理程序分配给 TFrame 上独立的组件。

假设我有一个框架TComboFrame包含 TCombo Combo1我在我的主要表单的几个地方使用它。

当我放置一个 TComboFrame MyFrame1 的实例时到我的主窗体上,我想分配一个
组合的事件处理程序,我通过单击里面的 TCombo 来完成
框架 MyFrame1我放在表格上,然后双击空白OnChange对象检查器事件选项卡中的字段。

通常会创建一个新的处理程序,其名称如下:

procedure TMainForm.MyFrame1Combo1Change(Sender: TObject);

并且事件处理程序名称源自祖先 TComboFrame ( Combo1) 上的组件名称和我放置在表单上的实例名称 ( MyFrame1) - 即对于该 TComboFrame 实例而言是唯一的。那我可以
对我放置在主框架上的其他框架实例执行此操作
形式,他们每个人都有自己的事件处理程序。

如果我想要一个为框架的所有实例触发的事件处理程序,
我会打开祖先框架本身并在那里做。

这是我对它应该如何工作的理解,但是有些东西
哪里出错了。在我的主要框架的几个实例中
表单,有些有自己的事件处理程序,有些有通用的事件处理程序,
procedure TDMainForm.ComboFrame1Combo1Change(Sender: TObject);

我尝试过的任何方法都没有破坏 Delphi 似乎拥有的这个幻像链接
这个由多个框架共享的公共(public)事件处理程序。

我该如何修复这种状态,首先是什么原因造成的?

** 更新 1 **

在阅读了回复和一些实验后,我发现我可以通过以下过程修复有问题的组件:

1)删除框架的所有事件处理程序。
2)删除框架,记住它的名字。
3)复制另一个已知可以的(即具有自己的“个人”事件名称)。
4)粘贴那个代替你删除的那个。
5)恢复原名。
6) 创建您的事件处理程序。

...至少,它至少对我有用一次...

** 更新 2 **

解决它的另一种方法似乎是在对象检查器中双击空事件字段时改写它创建的事件处理程序名称,并使用新的唯一名称,然后再次双击该名称。 Delphi 然后创建一个具有唯一名称的空处理程序。

最佳答案

我会在框架中编写另一个事件并在我想要另一个 OnChange 事件时设置它,如下所示:

type
TFrame2 = class(TFrame)
ComboBox1: TComboBox;
procedure ComboBox1Change(Sender: TObject);
private
FMyChangeEvent: TNotifyEvent;
public
property MyChangeEvent: TNotifyEvent read FMyChangeEvent write FMyChangeEvent
end;

implementation

{$R *.dfm}

procedure TFrame2.ComboBox1Change(Sender: TObject);
begin
//Your default combo behavior here
if Assigned(FMyChangeEvent) then
FMyChangeEvent(Self);
end;

我需要在 OnChange 行为中添加一些内容:
type
TForm1 = class(TForm)
MyLittleFrame: TFrame2;
private
procedure MyOwnCustomLittleOnChangeBehavior(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
MyLittleFrame.MyChangeEvent := MyOwnCustomLittleOnChangeBehavior;
end;

procedure TForm1.MyOwnCustomLittleOnChangeBehavior(Sender: TObject);
begin
ShowMessage('42');
end;

我通常这样做是因为我不相信在 DFM 中设置事件的 delphi 方式,很容易在不注意的情况下删除整个事件。

关于delphi - 如何强制 TFrame 上的组件拥有自己的事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10037833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com