在开始之前,我必须声明此主题上没有其他堆栈溢出帖子对我有帮助
我有一个由btnApply
调用的动态按钮它是在动态表单frmSort上动态创建的静态按钮上的静态按钮btnSort的单击事件frmTable
在frmTable的全局范围var下声明
btnApply: TButton;
Procedure btnApplyClick(Sender:TObject);
//other vars
点击
下的btnSort//other code
btnApply:= TButton.create(frmSort);
//all its properties
BtnApply.onclick:= btnApplyClick;
//other code
之后
Procedure btnApplyClick(Sender:TObject);
Begin
//it's code it has to execute
End;
我在“BtnApply.onclick:= btnApplyClick;”中收到错误消息 方法指针和常规过程之间的不兼容类型行
我如何使这项工作?
提前致谢
答案 0 :(得分:13)
您的btnApplyClick
需要是对象的方法。由于按钮必须在表单上才有用,所以将它作为表单本身的一种方法:
type
TfrmSort = class(TForm)
// UI controls listed here
public
procedure btnApplyClick(Sender: TObject);
end;
implementation
procedure TfrmSort.btnApplyClick(Sender: TObject);
begin
(Sender as TButton).Caption := 'You clicked me';
end;
procedure TfrmSort.FormCreate(Sender: TObject);
var
Btn: TButton;
begin
Btn := TButton.Create(Self);
Btn.Parent := Self;
Btn.Top := 100;
Btn.Left := 100;
Btn.OnClick := btnApplyClick;
end;
如果由于某种原因你无法使它成为一种形式方法(虽然我看不出它是如何用于视觉控制),你可以使它成为任何对象的方法,如下所示:
implementation
// You must use StdCtrls in order to have the types available if
// it's not already in your uses clause
type
TDummyButtonClickObj = class
class procedure ButtonClickHandler(Sender: TObject);
end;
{ TDummyButtonClickObj }
class procedure TDummyButtonClickObj.ButtonClickHandler(Sender: TObject);
begin
(Sender as TButton).Caption := 'You clicked me.';
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
with TButton.Create(Self) do
begin
Parent := Self;
Top := 100;
Left := 100;
Caption := 'Click here';
OnClick := TDummyButtonClickObj.ButtonClickHandler;
end;
end;
答案 1 :(得分:8)
正如其他人所说,事件处理程序应该是一个类的成员。这就是事件所期待的。但是,也可以使用非成员过程作为事件处理程序。只需要几个额外的步骤即可完成设置。
添加额外的显式参数以考虑Self
指针:
procedure btnApplyClick(Self: Pointer; Sender: TObject);
使用TMethod
记录将过程分配给按钮:
var
btnApply: TButton;
M: TMethod;
//other vars
Procedure btnApplyClick(Self: Pointer; Sender: TObject);
...
btnApply := TButton.create(frmSort);
//all its properties
M.Code := @btnApplyClick;
M.Data := nil; // can be anything you want passed to the Self parameter
BtnApply.onclick := TNotifyEvent(M);
//other code
...
procedure btnApplyClick(Self: Pointer; Sender: TObject);
Begin
// code to execute
End;