我有这种类型
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 ...
请有人帮助我,所以不要从头开始做洞程序......
再次感谢你......
答案 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
同时包含Component
和type
数组。
如果您真正想要的是减少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个月阅读代码时,知道LastNameEdit
或EditLastName
比Edit1
更容易。)
答案 2 :(得分:2)
您可以使用数组:
panels : array[1..45] of TPanel;
这将允许您创建控件数组,并通过索引访问和使用它们。