首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2013-09-05 
江湖救急,动态创建控件的事件注册上代码 无关的代码都删除了publicprocedure ButtonClick(Sender: TObject

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

热点排行