一自定义函数问题,请朋友们帮忙看看

取昵称麻烦 2008-09-20 10:59:34
函数如下:
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'错误

请教各位怎么解决
...全文
91 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
取昵称麻烦 2008-09-23
  • 打赏
  • 举报
回复
没有解决
取昵称麻烦 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oasiswsc 的回复:]
补充:
在调用的时候出错,也就是运行到
initButtons(pnlfirst,C,Buttons1,ButtonClick1); 的时候出错
[/Quote]
试过了不行
bob008 2008-09-20
  • 打赏
  • 举报
回复
..........
ivvn 2008-09-20
  • 打赏
  • 举报
回复
Buttons1 : array of TObject;
试试
取昵称麻烦 2008-09-20
  • 打赏
  • 举报
回复
补充:
在调用的时候出错,也就是运行到
initButtons(pnlfirst,C,Buttons1,ButtonClick1); 的时候出错
取昵称麻烦 2008-09-20
  • 打赏
  • 举报
回复
补充TinitButton的定义如下:
TinitButton = procedure(Button: array of TSpeedButton) of Object;
取昵称麻烦 2008-09-20
  • 打赏
  • 举报
回复
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;
leeky 2008-09-20
  • 打赏
  • 举报
回复
Buttons1 : array of Object; 这个是对的。
请看我的代码,没问题的:

unit Unit1;

interface

uses
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.
手指风 2008-09-20
  • 打赏
  • 举报
回复
以上代码没发现错误(d2009下通过)
怀疑你的问题出在ButtonClick1上,把这个事件的代码再贴出来看看.
取昵称麻烦 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ivvn 的回复:]
Buttons1 : array of TObject;
试试
[/Quote]
试过了还是一样的错误

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧