我现在把动态生成控件的过程放到DLL中,在创建按钮控件时要给按钮加载事件(如给按钮click事件)我在DLL中已经定义了一个过程(如:procedure BtnClick(sender:Tobject);),我如何把这个事件加载给创建的按钮呢??也就是说在点击创建的按钮时如何触发BtnClick事件!!!
最好哪位兄弟有详细代码贴出来!!!!!

解决方案 »

  1.   

    procedure haha(Sender:TObject)
    begin
      ShowMessage('');
    end;
    btn1:TButtonbtn1:=TButton.create(nil)
    btn1.parent:=form1;
    //设置btn的属性
    btn1.OnClick:=haha;
      

  2.   

    动态添加一个按钮及指定按钮的事件,我的例子:
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Panel1: TPanel;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        MyButton: TButton;
        procedure MyButtonClick(Sender: TObject);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyButton := TButton.Create(Self);
      MyButton.Parent := Panel1;
      MyButton.Show;
    end;procedure TForm1.MyButtonClick(Sender: TObject);
    begin
      ShowMessage('Hello');
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      MyButton.OnClick := MyButtonClick;
    end;end.
      

  3.   

    晚了一步,补充一下。
    如果你自定义的事件过程不是一个类过程的话,那就要进行这样的转换。
    ..
    var
      MyMet : TMetmod;
      ..
    ..
    Begin
      ..
      MyMet.Code := @BtnClick;
      MyButton.OnClick := TNotifyEvent(MyMet);
      ..
    End;
      

  4.   

    Stiven_PFan(爱卿儿),你好 你说的方法我试了 可以成功。
    但是,这样指定的过程如何带参数进去呢?
    在哪一句指定参数?
      

  5.   

    也就是说我在btnclick过程如何获得TButton(sender).name;我用这一句获得就报内存错,请问应该如何解决??
      

  6.   

    用(sender as TButton).name报内存错,不要光考虑这一个要把 “Stiven_PFan(爱卿儿)”回答的一起考虑进去,我说的是在DLL里面或单独的一个.pas里面,不是Form里面。
    如下:
    library DCC;
    .
    .
    .
    procedure BtnClick(sender:Tobject);
    begin
      showmessage((sender sa TButton).name);//执行这一句报内存错
    end;
    .
    .
    .
    ..
    //========================下面是自动创建按钮,并加载事件
    var
      MyMet : TMetmod;
      ..
    ..
    Begin
      ..
      MyMet.Code := @BtnClick;
      MyButton.OnClick := TNotifyEvent(MyMet);
      ..
    End;
      

  7.   

    楼上的方法,在窗体中可以实现,可是放在只有PAS文件的BASE里,就没法实现了,会报内存错的!!所以,怎么才能带参数进过程呢??
    var
      MyMet : TMetmod;
      ..
    ..
    Begin
      ..
      MyMet.Code := @BtnClick;
      MyButton.OnClick := TNotifyEvent(MyMet);
      ..
    End;
      

  8.   

    用一个折中的办法吧。通过程序来调用dll的内容.
    dll中:procedure Btn1Click(sender:TObject);stdcall;
    begin
      showmessage(TButton(sender).name);
    end;procedure Btn2Click(sender:TObject);stdcall;
    begin
      showmessage('haha:'+TButton(sender).name);
    end;exports
        Btn1Click,
        Btn2Click;
    ....程序中:  public
        procedure EventBtnsClick(Sender:TObject);
    .....
    var
      btn1,btn2:TButton;
    .....procedure Btn1Click(sender:TObject);stdcall;external 'project1.dll';
    procedure Btn2Click(sender:TObject);stdcall;external 'project1.dll';
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        btn1:=TButton.Create(nil);
        btn1.OnClick:=EventBtnsClick;
        btn1.Left:=100;
        btn1.Parent:=Form1;
        btn1.Name:='ButtonTest';    btn2:=TButton.Create(nil);
        btn2.OnClick:=EventBtnsClick;
        btn2.Left:=200;
        btn2.Parent:=Form1;
        btn2.Name:='ButtonTest2';
    end;procedure TForm1.EventBtnsClick(Sender:TObject);
    begin
        if TButton(Sender).Name='ButtonTest' then
            btn1Click(Sender)
        else if TButton(Sender).Name='ButtonTest2' then
            btn2Click(Sender);
    end;