【问题标题】:Delphi Autocomplete ButtonClick ProcedureDelphi自动完成按钮点击过程
【发布时间】:2012-12-26 10:43:37
【问题描述】:

所以当您双击一个按钮并自动完成按钮单击过程时,我很好奇编译器如何知道该函数链接到哪个按钮。例如它会使 TForm1.Button1Click(Sender: TObject);

那么编译器如何知道链接的按钮呢?它是否只是解析过程名称以查看它是什么按钮?

【问题讨论】:

    标签: delphi button compiler-construction autocomplete buttonclick


    【解决方案1】:

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

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

      object Button1: TButton
        Left = 104
        Top = 64
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 0
        OnClick = Button1Click
      end
    

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

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

    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 只需将事件与该方法关联。

    写下想要的方法名:

    按回车键:

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

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

    【讨论】:

      【解决方案2】:

      编译器不参与其中。 IDE 正在处理所有事情。

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

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

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

      一旦表单设计器找到该过程,它会使用 RTTI 来验证该过程是否与事件的签名匹配,然后在需要时将该过程分配为新的事件处理程序,然后最终跳转到代码编辑器中的过程实现.

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多