如何消除变量“panel1,panel2,panel3 ..等”在德尔福?

时间:2012-08-22 21:30:26

标签: delphi optimization delphi-7

我有这种类型

type
 TMain = class(TForm)

 panel1: Tpanel;
 panel2: Tpanel;
 panel3: Tpanel;
 panel4: Tpanel;
 panel5: Tpanel;
 panel6: Tpanel;
 panel7: Tpanel;
 panel8: Tpanel;
 ......
 panel45: Tpanel;

 label1: TLabel;
 label2: TLabel;
 label3: TLabel;
 label4: TLabel;
 label5: TLabel;
 label6: TLabel;
 label7: TLabel;
 ...........
 label109: TLabel;

如何在一行中调用此组件...在Type?

谢谢...

...更新

来自anwser的基础我得到并接受它当我拥有所有这些组件并且从主窗体中执行类似button1.click的操作时效果很好...

但我用来制作单位的动作......所以

当我点击一个按钮我很棒的程序DoMaths(发件人:TObject);

procedure Tform1.DoMaths(Sender: TObject);
  begin
    if TButton1(Sender).hint := 'Make the standard Package' then
      do_Maths_standard_package;
  end;

do_Maths_standard_package位于ComplexMaths单元中。

是do_Maths_standard_package表单单元ComplexMaths它调用Form1的一些组件...就像Form1.label1等...

因此,当我调用RegisterClass(TLabel)并从类型中删除Tlabel时,它会发出错误,无法找到Label1 ...

请有人帮助我,所以不要从头开始做洞程序......

再次感谢你......

3 个答案:

答案 0 :(得分:7)

您可以删除TPanel或TLabel的名称,然后它只存在于控件列表中,而不存在于表单的Type声明中。您需要留下一个Label和一个面板或 添加:

initialization
  RegisterClass(TPanel);
  RegisterClass(Tlabel);
end.

在表格的末尾。

这使得具有大量控件的表单更加整洁。

答案 1 :(得分:5)

使用TForm.Controls数组:

var
  i: Integer;
  Pnl: TPanel;
begin
  for i := 0 to ControlCount - 1 do
    if Controls[i] is TPanel then
    begin
      Pnl := TPanel(Controls[i]);
      Pnl.Caption := 'This is panel ' + IntToStr(i);
    end;
end;

Delphi自动为每个TWinControl创建两个列表:

  • Controls包含控件包含的所有TControl项的列表。

  • Components是控件上所有TComponents的列表。

请注意,所有Controls都是Components,但并非所有Components都是Controls;这就是为什么有两个列表。 (例如,TDataSet位于Components列表中,但不在Controls列表中;另一方面,TEdit将位于TPanel列表中。)

您也可以使用相同的技术迭代面板或其他容器上的组件 - 例如,Control同时包含Componenttype数组。

如果您真正想要的是减少Owner声明中的项目数量,请在运行时创建它们 - Delphi将根据Parent和{{自动将它们添加到数组中1}}:

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  Panel: TPanel;
  Label: TLabel;
begin
  for i := 0 to 10 do
  begin
    Panel := TPanel.Create(Self);  // Set who frees it
    Panel.Parent := Self;   // Set display surface
    Panel.Align := alTop;
    Panel.Name := Format('Panel%d', [i]); // Not necessary
    Panel.Caption := Panel.Name;  

    // Add a label on each panel, just for fun.
    Label := TLabel.Create(Panel); // Panel will free label
    Label.Parent := Panel;         // Label will show on panel
    Label.Top := 10;
    Label.Left := 10;
    Label.Name := Format('Label%d', [i]);
    Label.Caption := Label.Caption;   // Not necessary
  end;
end;

请注意,自己创建它们并不是“优化”,因为它只是将加载从VCL转移到您自己完成。它会减小.dfm文件的大小,但不会加速你的代码或加载时间,这意味着你也无法在视觉上布局表单。 (维护代码也要困难得多,因为你的控件名称毫无意义。从现在起6个月阅读代码时,知道LastNameEditEditLastNameEdit1更容易。)

答案 2 :(得分:2)

您可以使用数组:

panels : array[1..45] of TPanel; 

这将允许您创建控件数组,并通过索引访问和使用它们。