AS:在与话题发起者的交流过程中,答案也增长了。总的结果就像http://pastebin.ca/2426760
procedure TForm1.CreateButton(VAR Button: TButton; CONST L: Integer; CONST T: Integer);
这是 Pascal 语言的基础知识,如何将参数传递给过程/函数。
http://docwiki.embarcadero.com/RADStudio/XE4/en/Parameters_(Delphi)
其实我认为参数
Button = nil没有问题,这意味着“Button1”和“Button2”的值没有发送,但是
http://pastebin.ca/2427238
感谢 Bill 发现这一点。使用单独的属性来定位控件既低效又容易出现复制粘贴错误。
使用第二个链接:
procedure TForm1.CreateButton(out Button: TButton; const L: Integer; const T: Integer);
begin
Button:= TButton.Create(Self);
Button.Parent:= Self;
Button.SetBounds( L, T, 100, 50);
end;
实际上,您如何处理指向新创建按钮的指针?在您的代码中,您只需松开它们!
procedure TForm1.FormCreate(Sender: TObject);
Var
Button1, Button2: TButton;
begin
...
end;
在这个你的代码中,那些指针会丢失!如果您确实需要这些值 - 将它们传递到过程之外。如果您不这样做 - 不要要求他们 - http://en.wikipedia.org/wiki/YAGNI http://en.wikipedia.org/wiki/KISS_principle
Procedure TForm1.CreateButton(const L, T: Integer);
begin
With TButton.Create(Self) do begin
Parent := Self;
SetBounds( L, T, 100, 50);
Caption := 'Caption at ' + IntToStr(T);
Name := 'Name at ' + IntToStr(L);
End;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
B1.CreateButton( 100, 50); //Sending properties
B2.CreateButton( 200, 40); //Sending properties
end;
现在到那些B1,B2......
您声称要在表单上使用 2 个按钮,但您的代码显示您尝试在第 2 个表单上制作三个表单和一个按钮,在第 3 个表单上制作一个按钮。那你真正想要什么???您是否检查过 B1 和 B2 表单是在尝试向它们添加按钮之前创建的?
也许你真的想要
procedure TForm1.FormCreate(Sender: TObject);
begin
SELF.CreateButton( 100, 50); //Sending properties
SELF.CreateButton( 200, 40); //Sending properties
end;
然后遵循 DRY 原则并将所有变量保存在一个地方。
http://docwiki.embarcadero.com/Libraries/XE2/en/System.Types.TPoint
Procedure TForm1.CreateButtons(const a: array of TPoint);
Var p: TPoint;
Begin
for p in a do
CreateButton( p.x, p.y );
End;
type TPointDynArray = array of TPoint;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateButtons( TPointDynArray.Create(
Point( 100,50 ), Point(200, 40) ) );
end;
感谢Delphi 数组初始化
稍后您可以随时向数组添加更多坐标并保持一致。好吧,为了把它归结为 Delphi 7 的能力,这些能力 - 有点多余 - 被编码为
const BtnCnt = 2;
BtnLocations : array [1..BtnCnt] of TSize = (
( cx: 100, cy: 50 ), ( cx: 200, cy: 40 )
);
Procedure TForm1.CreateButtons(const a: array of TSize);
Var i: integer;
Begin
for i := Low(a) to High(a) do
with a[i] do
CreateButton( cx, cy );
End;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateButtons( BtnLocations );
end;
但是虽然 Delphi 5 和 Dephi 7 是很棒的版本,但它们已经过时了。我绝对建议您升级到 Delphi XE 或更新版本,或者转而使用 CodeTyphon
TForm1 = class(TForm) //Declaring the procedure
procedure CreateButton(Button: TButton; L: Integer; T: Integer);
在表单类的 PUBLISHED 部分声明单一用途的过程也不是一种很好的风格。你最好在 PRIVATE 部分声明它们。坚持“最小可见性”将帮助您使相互依赖关系可控。否则一年后你的程序就会变得一团糟,你不能改变任何东西而不破坏其他一切。我现在正在从事一个有 10 多年历史的项目,我非常清楚地看到“一切都是公开的”的后果。这是一个巨大的痛苦!