我有这种类型的
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;如何在一行中调用此组件...在类型中?
谢谢..。
UpDate...
我从anwser得到并接受了它的基础,当我有了所有这些组件并使动作像按钮一样时,它工作得很好。从主窗体单击…
但我习惯于在单位中采取行动...所以
当我点击一个按钮时,我会打开一个程序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 form单位ComplexMaths它调用一些组件form Form1...例如Form1.label1等。
因此,当我调用RegisterClass( Tlabel )并从类型中删除Tlabel时,它会给出一个错误,即找不到Label1…
有没有人能帮帮我,让我从一开始就不做打洞计划…
再次感谢你..。
发布于 2012-08-23 15:11:04
您可以删除TPanel或TLabel的名称,然后它只存在于控件列表中,而不存在于窗体的类型声明中。您需要保留一个标签和一个面板,或者添加:
initialization
RegisterClass(TPanel);
RegisterClass(Tlabel);
end.在表单的末尾。
这使得有很多控件的表单更加整洁。
发布于 2012-08-23 10:09:08
使用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项的列表。控件contains.Components是控件上所有TComponents的列表。注意,所有的Controls都是Components,但不是所有的Components都是Controls;这就是为什么有两个列表。(例如,TDataSet在Components列表中,但不在Controls列表中;另一方面,TEdit将同时在两者中。)
您也可以使用相同的技术来遍历面板或其他容器上的组件-例如,TPanel同时具有Control和Component数组。
如果您真正想要的是减少type声明本身中的项数,那么可以在运行时创建它们- Delphi会根据Owner和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文件的大小,但不会加快代码或加载时间,这意味着您不能可视化地布局表单。(维护您的代码也更加困难,因为您的控件的名称毫无意义。当你阅读6个月后的代码时,知道什么是LastNameEdit或EditLastName要比Edit1容易得多。)
发布于 2012-08-23 05:32:00
您可以使用数组:
panels : array[1..45] of TPanel; 这将允许您创建一个控件数组,并按索引访问和使用它们。
https://stackoverflow.com/questions/12081700
复制相似问题