2

我有这种类型

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;

我怎样才能在一行中调用这些组件......在类型内?

谢谢 ...

更新....

从我得到并接受的 anwser 的基础上,当我拥有所有这些组件并从主窗体中进行 button1.click 之类的操作时,它工作得很好......

但我习惯从单位做出行动......所以

当我单击一个按钮时,我会看到一个过程 DoMaths(Sender: 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 ...

请有人可以帮助我,以免从一开始就进行洞计划...

再次感谢你...

4

3 回答 3

7

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

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

在表格的末尾。

这使得带有很多控件的表单更加整洁。

于 2012-08-23T07:11:03.503 回答
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

  • ControlsTControl包含控件包含的所有项目的列表。

  • ComponentsTComponents一个控件上所有的列表。

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

您也可以使用相同的技术来遍历面板或其他容器上的组件 -例如,TPanel同时具有ControlComponent数组。

如果您真正想要的是减少type声明本身中的项目数量,请在运行时创建它们——Delphi 将根据Ownerand自动将它们添加到数组中Parent

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 文件的大小,但不会加快您的代码或加载时间,这意味着您也无法直观地布置表单。(维护你的代码也更难,因为你的控件有无意义的名字。知道什么LastNameEdit或是什么EditLastNameEdit1你在 6 个月后阅读代码要容易得多。)

于 2012-08-23T02:09:07.643 回答
2

您可以使用数组:

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

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

于 2012-08-22T21:32:00.197 回答