当我从单元制作动态组件时,我没有创建OnClick事件的问题。 当我从第2单元制作动态组件时,我无法访问OnClick事件。
unit Unit1
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
Procedure ClickBtn1(Sender: TObject);
end;
var
Form1: TForm1;
MyBtn1: TButton;
implementation
{$R *.dfm}
{ TForm1 }
uses Unit2;
procedure TForm1.ClickBtn1;
begin
MyBtn1.Caption := 'OK';
MakeBtn2;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyBtn1 := TButton.Create(Self);
MyBtn1.Parent := Form1;
MyBtn1.Name := 'Btn1';
MyBtn1.Left := 50;
MyBtn1.Top := 100;
MyBtn1.Caption := 'Click Me';
MyBtn1.OnClick := ClickBtn1;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
procedure MakeBtn2;
procedure ClickBtn2;
var
MyBtn2: TButton;
implementation
Uses Unit1;
procedure MakeBtn2;
begin
MyBtn2 := TButton.Create(Form1);
MyBtn2.Parent := Form1;
MyBtn2.Name := 'Btn2';
MyBtn2.Left := 250;
MyBtn2.Top := 100;
MyBtn2.Caption := 'Click Me';
MyBtn2.OnClick := ClickBtn2; //Compiler ERROR
end;
procedure ClickBtn2;
begin
MyBtn1.Caption := 'OK';
end;
end.
答案 0 :(得分:2)
看看这篇文章“Creating A Component at Runtime”
引用:
我想在代码中创建一个按钮 它在一个表格上并附上一个程序 它的点击事件。我怎么能得到 单击链接到预定义的事件 程序名称来自代码?我假设了 在对象浏览器中链接IDE 答案的关键,但我想做 这在运行时,而不是在开发中。
首先,你可以分配任何 对象的方法另一种方法为 只要它具有相同的形式。看着 以下代码:
{This method is from another button that when pressed will create
the new button.}
procedure TForm1.Button1Click(Sender: TObject);
var
btnRunTime : TButton;
begin
btnRunTime := TButton.Create(form1);
with btnRunTime do begin
Visible := true;
Top := 64;
Left := 200;
Width := 75;
Caption := 'Press Me';
Name := 'MyNewButton';
Parent := Form1;
OnClick := ClickMe;
end;
end;
{This is the method that gets assigned to the new button's OnClick method}
procedure TForm1.ClickMe(Sender : TObject);
begin
with (Sender as TButton) do
ShowMessage('You clicked me');
end;
如您所见,我创建了一种新方法 名为ClickMe,已在声明中声明 Form1的私有部分:
type
TForm1 = class(TForm
...
...
private
procedure ClickMe(Sender : TObject);
published
end;
有关其他示例和解释,请参阅以下内容:
答案 1 :(得分:1)
你确定第一个例子有效吗?这些都不应该编译。
OnClick处理程序是TNotifyEvent,定义为
procedure(Sender: TObject) of object;
这意味着它必须是对象(例如表单)的方法,并且方法签名必须是采用单个TObject参数的过程。你的程序MakeBtn2不是一个对象方法,它们都没有使用Sender:TObject。