江湖救急,动态创建控件的事件注册
上代码 无关的代码都删除了
public
procedure ButtonClick(Sender: TObject);
end;
procedure TForm1.ButtonClick(Sender: TObject);
begin
ShowMessage(Tbutton(Sender).Name);
end;
procedure tform1.dabj;
var
BTN.Parent := form11.bsSkinScrollBox1;
BTN.SkinDataName := 'resizetoolbutton';
btn.Caption := '...';
//BTN.Flat:=true;
btn.SkinData := form1.bsSkinData1;
BTN.Height := 21;
btn.Width := 21;
BTN.Top := y;
BTN.Left := x + w1 + 2;
BTN.OnClick:=tform1.ButtonClick; 老在这出错 说什么类型不兼容,要怎么写啊 谢谢
END
[解决办法]
鼠标指针移动到BTN.OnClick的OnClick上,保持不动,查看提示信息。
[解决办法]
事件的类型都是procedure xxxx(...) of Object,必须得是对象方法。
你可以把BTN.OnClick:=tform1.ButtonClick;改为下面几种写法之一,反正都是一样。
BTN.OnClick := ButtonClick;
BTN.OnClick := Form1.ButtonClick;
BTN.OnClick := Self.ButtonClick;
这里事件的参数就那样,你不能去改。替代的,你可以在TForm1类中声明一个共享的数据结构。
[解决办法]
用Tag属性。
type
PParams = ^TParams;
TParams = record
s: string;
end;
var
P: PParams;
begin
New(P);
P^.s := 'abc';
BTN.Tag := Integer(P);
//释放BTN之前用Dispose(PParams(BTN.Tag))手动释放P的内存
end;
procedure TForm1.ButtonClick(Sender: TObject);
begin
ShowMessage(PParams(Tbutton(Sender).Tag)^.s);
end;
[解决办法]
学习学习,这个写法用tag属性即可