函数如下:
procedure TForm1.initButtons(AParent: TWinControl; C: Integer;
  var Button:array of TSpeedButton ; ButtonClick: TinitButton=nil);
const
  bWidth =80;
  bHeight =50;
  cSpace =8;
  vSpace = 10;
var
  i,j:Integer;
begin
  //SetLength(Button,C);
  j:=0;
  for i := 0 to C -1 do
  begin
    Button[i] := TSpeedButton.Create(Self);
    Button[i].Width := bWidth;
    Button[i].Height := bHeight;
    Button[i].Caption := Button[i].Name+IntToStr(i);
    Button[i].Parent := AParent;
    if i=0 then
    begin
      Button[i].Top := vSpace;
      Button[i].Left := cSpace;
    end
    else if (Button[i-1].Left + Button[i-1].Width +cSpace+Button[i].Width+cSpace) <= AParent.Width then
    begin
      Button[i].Top := Button[i-1].Top;
      Button[i].Left := Button[i-1].Left + Button[i-1].Width +cSpace ;
    end
    else
    begin
      Inc(j);
      AParent.Height := AParent.Height + (Button[i].Height+cSpace) * j;
      Button[i].Top := vSpace+(Button[i].Height+vSpace)*j;
      if j=1 then
        Button[i].Left := cSpace
      else
        Button[i].Left := Button[i-1].Left + Button[i-1].Width +cSpace;
    end;
    Button[i].Tag := i;
    if Assigned(ButtonClick) then  ButtonClick(Button);
  end;
end;
调用如下:
procedure TForm1.FormCreate(Sender: TObject);
const
  C =15
var
  Buttons1 : array of TSpeedButton;
begin
  SetLength(Buttons1,C);
  initButtons(pnlfirst,C,Buttons1,ButtonClick1);
end;
运行时提示:incompatible types :'Array' and 'TObject'错误请教各位怎么解决

解决方案 »

  1.   

    补充TinitButton的定义如下:
    TinitButton = procedure(Button: array of TSpeedButton) of Object;
      

  2.   

    补充:
    在调用的时候出错,也就是运行到
    initButtons(pnlfirst,C,Buttons1,ButtonClick1); 的时候出错
      

  3.   

    Buttons1 : array of TObject;
    试试
      

  4.   

    以上代码没发现错误(d2009下通过)
    怀疑你的问题出在ButtonClick1上,把这个事件的代码再贴出来看看.
      

  5.   

    Buttons1 : array of Object;  这个是对的。
    请看我的代码,没问题的:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, ExtCtrls;type
      TinitButton = procedure(Button: array of TSpeedButton) of Object;  TForm1 = class(TForm)
        btn1: TSpeedButton;
        pnl1: TPanel;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure initButtons(AParent: TWinControl; C: Integer;
          var Button:array of TSpeedButton ; ButtonClick: TinitButton =nil);
      end;var
      Form1: TForm1;
      ButtonClick1 : TinitButton;implementation{$R *.dfm}procedure TForm1.initButtons(AParent: TWinControl; C: Integer;
      var Button:array of TSpeedButton ; ButtonClick: TinitButton=nil);
    const
      bWidth =80;
      bHeight =50;
      cSpace =8;
      vSpace = 10;
    var
      i,j:Integer;
    begin
      //SetLength(Button,C);
      j:=0;
      for i := 0 to C -1 do
      begin
        Button[i] := TSpeedButton.Create(Self);
        Button[i].Width := bWidth;
        Button[i].Height := bHeight;
        Button[i].Caption := Button[i].Name+IntToStr(i);
        Button[i].Parent := AParent;
        if i=0 then
        begin
          Button[i].Top := vSpace;
          Button[i].Left := cSpace;
        end
        else if (Button[i-1].Left + Button[i-1].Width +cSpace+Button[i].Width+cSpace) <= AParent.Width then
        begin
          Button[i].Top := Button[i-1].Top;
          Button[i].Left := Button[i-1].Left + Button[i-1].Width +cSpace ;
        end
        else
        begin
          Inc(j);
          AParent.Height := AParent.Height + (Button[i].Height+cSpace) * j;
          Button[i].Top := vSpace+(Button[i].Height+vSpace)*j;
          if j=1 then
            Button[i].Left := cSpace
          else
            Button[i].Left := Button[i-1].Left + Button[i-1].Width +cSpace;
        end;
        Button[i].Tag := i;
        if Assigned(ButtonClick) then  ButtonClick(Button);
      end;
    end; procedure TForm1.FormCreate(Sender: TObject);
    const
      C =15 ;
    var
      Buttons1 : array of TSpeedButton; 
    begin
      ButtonClick1 := nil;
      SetLength(Buttons1,C);
      initButtons(pnl1,C,Buttons1,ButtonClick1);
    end;end.
      

  6.   

    procedure TForm1.ButtonClick1(Sender: TObject);
    const
      SQL = '';
      C =15;
      bWidth =80;
      bHeight =50;
      cSpace =8;
      vSpace = 10;
    var
      Buttons2 : array of TBitBtn;
      i,j:Integer;
    begin
      SetLength(Buttons2,C);
      j:=0;
      for i := 0 to C -1 do
      begin
        Buttons2[i] := TBitBtn.Create(Self);
        Buttons2[i].Width := bWidth;
        Buttons2[i].Height := bHeight;
        Buttons2[i].Caption := Buttons2[i].Name+IntToStr(i);
        Buttons2[i].Parent := pnlSecond;
        if i=0 then
        begin
          Buttons2[i].Top := vSpace;
          Buttons2[i].Left := cSpace;
        end
        else if (Buttons2[i-1].Left + Buttons2[i-1].Width +cSpace+Buttons2[i].Width+cSpace) <= pnlSecond.Width then
        begin
          Buttons2[i].Top := Buttons2[i-1].Top;
          Buttons2[i].Left := Buttons2[i-1].Left + Buttons2[i-1].Width +cSpace ;
        end
        else
        begin
          Inc(j);
          pnlSecond.Height := pnlSecond.Height + (Buttons2[i].Height+cSpace) * j;
          Buttons2[i].Top := vSpace+(Buttons2[i].Height+10)*j;
          if j=1 then
            Buttons2[i].Left := cSpace
          else
            Buttons2[i].Left := Buttons2[i-1].Left + Buttons2[i-1].Width +cSpace;
        end;
        Buttons2[i].Tag := i;
        Buttons2[i].OnClick := ButtonClick2;
      end;
    end;