在Delphi XE中的运行时设置onclick事件

在Delphi XE中的运行时设置onclick事件,delphi,event-handling,firemonkey,Delphi,Event Handling,Firemonkey,第一个帖子在这里,所以请原谅任何礼仪错误 我正在Delphi XE8中创建一个多设备FMX应用程序,在为动态创建的按钮分配事件处理程序时遇到困难。我在StackOverflow中搜索,找到了与NotifyEvents相关的答案,所以我遵循了这些答案中的建议——仍然没有运气。编译错误是E2010不兼容的类型:“TNotifyEvent”和“Procedure” 我已经准备了一个简单的表单测试用例,其中有一个编辑字段和一个静态Hello按钮,第二个按钮创建了一个再见按钮,并尝试将一个过程分配给OnC

第一个帖子在这里,所以请原谅任何礼仪错误

我正在Delphi XE8中创建一个多设备FMX应用程序,在为动态创建的按钮分配事件处理程序时遇到困难。我在StackOverflow中搜索,找到了与NotifyEvents相关的答案,所以我遵循了这些答案中的建议——仍然没有运气。编译错误是E2010不兼容的类型:“TNotifyEvent”和“Procedure”

我已经准备了一个简单的表单测试用例,其中有一个编辑字段和一个静态Hello按钮,第二个按钮创建了一个再见按钮,并尝试将一个过程分配给OnClick事件,但我仍然得到了相同的错误

据我所知,我已经遵循了使该过程与TNotifyEvent兼容的所有要求,但即使是这个基本示例也因相同的错误而失败。我的头撞到墙上了,有人能告诉我我做错了什么吗

非常感谢

unit Dynamic_Button_Test1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation, FMX.Edit;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Hello: TButton;
    Create_GoodBye: TButton;
    procedure HelloClick(Sender: TObject);
    procedure Create_GoodByeClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure GoodbyeClick(Sender: TObject) ;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Create_GoodByeClick(Sender: TObject);
var
  New_Button : TButton ;
begin
New_Button := TButton.Create( Form1 );
New_Button.Parent := Form1 ;
New_Button.Text := 'Goodbye' ;
New_Button.Visible := True ;
New_Button.Margins.Left := 50 ;
New_Button.Margins.Right := 50 ;
New_Button.Margins.Bottom := 30 ;
New_Button.Height := 50 ;
New_Button.Align := TAlignLayout.Bottom ;

New_Button.OnClick := TForm1.GoodbyeClick ;
end;

procedure TForm1.HelloClick(Sender: TObject);
begin
Edit1.Text := 'Hello' ;
end;

procedure TForm1.GoodbyeClick(Sender: TObject);
begin
Edit1.Text := 'Goodbye' ;
end;

end.

VCL/FMX事件处理程序在运行时绑定到特定对象。分配事件处理程序时,需要用对象指针替换类typename。稍后触发事件时,该对象将成为事件处理程序的自指针:

New_Button.OnClick := Self.GoodbyeClick ;
或者简单地说:

New_Button.OnClick := GoodbyeClick ; // Self implicitly used
另一方面,在创建按钮时,该代码位于TForm1实例方法内部,因此应使用自对象指针而不是全局Form1对象指针:

New_Button := TButton.Create( Self );
New_Button.Parent := Self ;

VCL/FMX事件处理程序在运行时绑定到特定对象。分配事件处理程序时,需要用对象指针替换类typename。稍后触发事件时,该对象将成为事件处理程序的自指针:

New_Button.OnClick := Self.GoodbyeClick ;
或者简单地说:

New_Button.OnClick := GoodbyeClick ; // Self implicitly used
另一方面,在创建按钮时,该代码位于TForm1实例方法内部,因此应使用自对象指针而不是全局Form1对象指针:

New_Button := TButton.Create( Self );
New_Button.Parent := Self ;
新建按钮。OnClick:=t或m1。再见单击→ New\u Button.OnClick:=Form1.GoodbyeClick,或仅New\u Button.OnClick:=GoodbyeClick.New\u Button.OnClick:=TForm1.GoodbyeClick→ New_Button.OnClick:=Form1.GoodbyeClick,或仅New_Button.OnClick:=GoodbyeClick。