首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi自动补全ButtonClick过程

Delphi自动补全ButtonClick过程
EN

Stack Overflow用户
提问于 2013-01-12 03:18:15
回答 2查看 2K关注 0票数 2

所以,当双击一个按钮时,它会自动完成button - click过程,我很好奇编译器是如何知道函数链接到哪个按钮的。例如,它将使TForm1.Button1Click(发送者: TObject);

那么,编译器如何知道哪个按钮也被链接了呢?它是否只是解析过程名称来查看它是什么按钮?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 03:26:58

您可以将该方法命名为任何名称,并且Delphi不会解析或使用该方法名称来标识相关的组件或事件。

如果在设计时执行此操作,则与事件处理程序相关联的事件将存储在DFM文件中,您可以在该文件中找到类似以下内容:

代码语言:javascript
复制
  object Button1: TButton
    Left = 104
    Top = 64
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end

在创建表单时,OnClick = Button1Click使程序在运行时将方法(也称为事件处理程序)与对象的事件(一种特殊类型的属性)相关联。

您还可以在运行时将事件关联到任何兼容的方法,例如使用以下代码:

代码语言:javascript
复制
type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    procedure MyClick(Sender: TObject);
    procedure MyOtherClick(Sender: TObject);


  ....

procedure TForm1.AssociateClickHandler;
begin
  Button1.OnClick := MyClick;
end;

procedure TForm1.MyClick(Sender: TObject);
begin
  Button1.OnClick := MyOtherClick; //from now, the other method with handle the event.
end;

使用任何你想要的名字

在设计时,您可以直接在ObjectInspector中为事件处理程序编写所需的名称,然后按Enter,Delphi将为您创建具有该名称的方法。如果您不提供名称,Delphi将使用组件名称以及不带"On“的事件名称自动生成方法的名称。如果该方法已经存在,IDE只会将该事件与该方法相关联。

写入所需的方法名称:

按enter键:

您可以将同一方法关联到同一对象的不同事件,也可以关联到不同对象的同一事件。

例如,您可以将上面显示的MyOwnMethodName与任意数量的按钮的OnClick相关联。通常,Sender参数包含对激发事件的对象的引用。

票数 10
EN

Stack Overflow用户

发布于 2013-01-12 04:27:57

编译器不会参与其中的任何操作。取而代之的是IDE来处理一切。

当您在设计时双击控件时,窗体设计器知道正在单击哪个控件,因为它是内存中的活动对象。

窗体设计器使用控件的RTTI和已注册的TComponentEditor实现(如果未注册用户定义的实现,则VCL提供默认实现)来确定该类类型的哪个事件是默认事件(对于TButton,即OnClick事件),然后使用RTTI检查该事件是否已分配有处理程序。

如果尚未分配处理程序,窗体设计器将使用RTTI读取控件的Name属性和事件的声明名称,将它们连接在一起(删除事件名称的On部分),并在控件的Owner的源代码中查找具有该名称的过程。如果未找到该过程,则会在此时创建该过程。

窗体设计器找到该过程后,将使用RTTI验证该过程是否与事件的签名匹配,然后根据需要将该过程分配为新的事件处理程序,最后跳转到代码编辑器中的过程实现。

如果在对象检查器中单击控件的事件并重命名处理程序,则源代码中相应的过程将重命名以匹配新名称,并且链接到同一过程的任何其他事件(即使在其他组件中)也会通过其RTTI更新以匹配新名称。

在编译项目时,集成开发环境首先利用RTTI和注册的组件流例程来创建包含所有各种组件属性/事件值的.DFM文件。然后,它调用编译器,编译器编译源代码并将.DFM文件中的二进制资源链接到最终的可执行文件中。

在运行时,RTL使用RTTI和注册的自定义组件流例程解析DFM资源,以定位各种组件并根据需要挂钩它们的属性/事件值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14285139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档