读书人

江湖救急动态创造控件的事件注册

发布时间: 2013-09-05 16:02:07 作者: rapoo

江湖救急,动态创建控件的事件注册
上代码 无关的代码都删除了
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;

[解决办法]
麻烦点:
var
m: TMethod;
begin
m.Code := @TForm1.ButtonClick;
m.Data := BTN;
BTN.onClick := TNotifyEvent(m)
end;
[解决办法]
引用:
感谢,写成BTN.OnClick := Form1.ButtonClick;可以了,但还有个问题,我动态创建的按钮是多个,但是共享的procedure TForm1.ButtonClick(Sender: TObject);事件,现在我需要传递参数到procedure TForm1.ButtonClick(Sender: TObject);这个事件要怎么做呢,也就是BTN.OnClick := Form1.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属性即可

读书人网 >.NET

热点推荐