有一个函数
function massbutton(a:integer);integer;
var i:integer;
    mybutton:array of Tbutton;
begin
setlength(mybutton,a);
for i:=0 to a-1 do 
  begin
    mybutton[i]:=Tbutton.create(from1);
    mybutton[i].parent:=form1;
    mybutton[i].left:=100+i*2;
    mybutton[i].top:=200+i*2;
    mybutton[i].caption:='this is No.'+inttostr(i)+'button';
  end;
  massbutton:=1;
end;请问如何给这些每一个按钮的onclick事件编写代码?

解决方案 »

  1.   

    先把要实现的功能写在一个过程里,在附给button ,应该可以吧
      

  2.   

    每个按钮要处理的事件是一个依赖于i的值的事件。比如showmessage(inttostr(i));
      

  3.   

    这样的话你可以先编写一个通用的事件方法,然后在动态创建那些按钮的时候动态的把这个通用的事件名赋给事件属性啊,因为事件是一种特殊的属性啊!
    --------------------------------------------------------------------------------
    我很菜,就以showmessage(inttostr(i));为例子教我一下吧。
      

  4.   

    你可以写一个公共过程,如:procedure btnclick(sender:TObject);
    然后,在按钮创建后
    //...
    mybutton[i].top:=200+i*2;
    mybutton[i].caption:='this is No.'+inttostr(i)+'button';
    mybutton[i].Name := Btn+IntToStr(i);
    mybutton[i].Onclick := btnclick;
    //...
    然后,在公共事件里面根据sender的名字判断进行处理各自的事件,如:
    procedure TForm1.btnclick(sender:TObject);
    begin
      case (sender as TButton).Name of
       'btn1':{button[1]的事件}
       'btn2':{button[2]的事件};
       //...
    end;
      

  5.   

    [Error] Unit1.pas(38): Undeclared identifier: 'btnclick'
    ------------------------------------------------------------------------------
    这是啥玩意儿?
      

  6.   

    要是我在设计阶段不知道最后生成的button的数量,那么
    case (sender as TButton).Name of
       'btn1':{button[1]的事件}
       'btn2':{button[2]的事件};
       //...
    不是很无稽吗?
      

  7.   

    函数function中不能调用procedure吗?
    [Error] Unit1.pas(38): Undeclared identifier: 'btnclick'
      

  8.   

    button.onClick := mybutton.onClick; 然后在Button 中写OnClick 事件
      

  9.   

    要是我在设计阶段不知道最后生成的button的数量,那么
    case (sender as TButton).Name of
       'btn1':{button[1]的事件}
       'btn2':{button[2]的事件};
       //...
    不是很无稽吗?
    --------------------------
    怎么会不知道有多少个?
    for i:=0 to a-1 do  你的这句代码不是代表了多少个button吗?
    -----------------------------
    函数function中不能调用procedure吗?
    [Error] Unit1.pas(38): Undeclared identifier: 'btnclick'你要先定义btnclick事件
    在form的publish 里写上
      procedure btnclick(sender:TObject);
    然后在实现部分写上procedure TForm1.btnclick(sender:TObject);
    begin
      case (sender as TButton).Name of
       'btn1':{button[1]的事件}
       'btn2':{button[2]的事件};
       //...
    end;
      

  10.   

    创建TActionList 实例,并赋给相应的控件就可以了。
    麻烦一点的,你可以通过消息的形式去执行!每一个Button的编号加上一个固定的书就可以对应一个Windows消息.
      

  11.   

    动态定义时,不用定义数组
    for i:=0 to a-1 do 
      begin
        mybutton:=Tbutton.create(from1);
        ....
        mybutton.name:='button_'+inttostr(i);
    end;
    寻找该组件  tbutton(findconponent('')).