我是Delphi的新手。
我想创建一个应用程序,其中将创建一些按钮。声明一组Tbuttons并逐个创建按钮并不令人满意,因为它令人困惑并且需要花费大量时间。使用Command For也不满意,因为如果需要,我将无法更改某些按钮的属性,例如他们的位置。
所以我决定在TForm1 Class中声明一个过程,它根据我发送给过程的属性创建按钮。但由于某种原因它不起作用(没有任何语法错误):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm) //Declaring the procedure
procedure CreateButton(Button: TButton; L: Integer; T: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
B1, B2: TForm1; //Declaring controls
implementation
{$R *.dfm}
procedure TForm1.CreateButton(Button: TButton; L: Integer; T: Integer);
begin
Button:= TButton.Create(Self);
Button.Parent:= Self;
Button.Width:= 100; Button.Height:= 50;
Button.Left:= L; Button.Top:= T;
end;
procedure TForm1.FormCreate(Sender: TObject);
Var
Button1, Button2: TButton;
begin
B1.CreateButton(Button1, 100, 50); //Sending properties
B2.CreateButton(Button2, 200, 40); //Sending properties
end;
end.
答案 0 :(得分:0)
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”的值,但是
感谢比尔发现这一点。使用单独的属性来定位控件既低效又容易出现复制粘贴错误。
使用第二个链接:
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个按钮,但您的代码显示您尝试在第二个表单上创建三个表单和一个按钮,在第三个表单上创建一个按钮。那么你真正想要的是什么?你是否检查过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;
稍后您可以随时为数组添加更多坐标并保持一致。 好吧,把它降低到德尔福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多年历史的项目,我看到“一切都是公开的”后果非常明确。这是一个巨大的痛苦!