2

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

假设我有一个TComboFrame包含 TCombo 的框架,Combo1我在主窗体的几个地方使用它。

当我将 TComboFrame 的实例放置MyFrame1到我的主窗体上,并且我想为组合分配一个事件处理程序时,我通过单击MyFrame1放置在窗体上的框架内的 TCombo 并双击空白 OnChange字段来实现在对象检查器事件选项卡中。

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

procedure TMainForm.MyFrame1Combo1Change(Sender: TObject);

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

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

这是我对它应该如何工作的理解,但是某处出了点问题。在我的主窗体上的几个框架实例中,有些有自己的事件处理程序,有些有一个通用的事件处理程序,

procedure TDMainForm.ComboFrame1Combo1Change(Sender: TObject);

我尝试过的任何事情都没有破坏这个幻像链接 Delphi 似乎与这个由多个框架共享的公共事件处理程序具有。

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

** 更新 1 **

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

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

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

** 更新 2 **

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

4

3 回答 3

3

我会在框架中编写另一个事件并在我想要另一个 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 方式,很容易在不注意的情况下删除整个事件。

于 2012-04-06T01:19:38.990 回答
1

只需单击TCombo要断开链接OnClick的对象,在 Object Inspector 中清除其事件处理程序分配,然后双击该事件以生成新的事件处理程序。当然,如果生成的事件处理程序名称已经存在,它会被重新使用,但至少 Object Inspector 会在生成事件时重新评估所有的对象名称。

当然,这不是一种非常面向对象的方法。法比奥建议的是更好的选择。尽管我建议将TFrame事件声明为,published而不是public这样,您可以像任何其他事件一样在设计时分配它。

于 2012-04-06T01:23:16.057 回答
1

我无法在 Delphi6 或 Delphi 2009 中重新创建这种行为。在我看来,有很多框架(并且可能会更改它们的名称添加和删除)你已经愚弄/迷惑了 Delphi 的命名约定,它默认使用它来链接事件和框架最终与以前的名称相同。

因此,双击事件处理程序只会将您置于与由先前删除(或重命名)的框架创建的事件处理程序同名的事件处理程序(但删除框架不会删除旧的事件处理程序。IYSWIM :)

因此,我的回答是,你把框架名称和事件处理程序名称弄得一团糟!

于 2012-04-06T10:00:01.023 回答