Delphi7,创建许多具有相同属性的控件

时间:2013-07-13 21:11:57

标签: delphi class properties controls delphi-7

我是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.

1 个答案:

答案 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”的值,但是

http://pastebin.ca/2427238


感谢比尔发现这一点。使用单独的属性来定位控件既低效又容易出现复制粘贴错误。

使用第二个链接:

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;

感谢Delphi array initialization

稍后您可以随时为数组添加更多坐标并保持一致。 好吧,把它降低到德尔福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多年历史的项目,我看到“一切都是公开的”后果非常明确。这是一个巨大的痛苦!