Delphi “如何消除变量”;第1组、第2组、第3组。。等等。”;在德尔菲?
我有这种类型的Delphi “如何消除变量”;第1组、第2组、第3组。。等等。”;在德尔菲?,delphi,optimization,delphi-7,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;
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获得并接受了它,当我拥有所有这些组件并使操作像按钮一样时,它工作得非常好1。从主窗体单击
但我用单位来做动作。。。所以
当我点击一个按钮时,我看到一个程序域(发送者:TObject)
do_Math_standard_包位于unit ComplexMaths中
是程序做数学,标准,包形式,单元复杂度,它调用一些组件形式,形式1。。。如Form1.label1等
因此,当我调用RegisterClass(TLabel)并从类型中删除TLabel时,它会给出一个错误,即找不到Label1
请有人能帮我从一开始就不要做打孔程序
再次感谢您……您可以使用阵列:
panels : array[1..45] of TPanel;
这将允许您创建控件数组,并按索引访问和使用它们。使用
t表单。控件数组:
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
创建两个列表:
控件
包含控件包含的所有t控件
项的列表
Components
是控件上所有t组件的列表
请注意,所有控件
都是组件
,但并非所有组件
都是控件
;这就是为什么有两个列表。(例如,TDataSet
在组件
列表中,但不在控件
列表中;另一方面,TEdit
将同时在这两个列表中。)
您也可以使用相同的技术来迭代面板或其他容器上的组件-TPanel
既有控件
又有组件
数组
如果您真正想要的是减少类型
声明本身中的项目数量,请改为在运行时创建它们-Delphi将根据所有者
和父项
自动将它们添加到数组中:
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个月后阅读代码时,了解lastnamedit
或EditLastName
比了解Edit1
要容易得多。)您可以删除TPanel或TLabel的名称,然后它只存在于控件列表中,而不存在于表单的类型声明中。您需要留下一个标签和一个面板,或者
加:
在表格的末尾
这使得具有大量控件的表单更加整洁。这是错误的。:-)Delphi分别在TCustomForm.Controls
和TCustomForm.Components
中,在表单上自动创建TControls
和TCustomForm.Components
的列表。(表格上的所有项目都是t组件
,但并非所有项目都是t控件
-组件
列表包括控件
)而不是下选(技术上可以这样做),但这不是正确的方法,除非出于某种原因需要复制现有阵列。@Ken我不确定这是不是错的。这只是答案中代码创建部分的一部分。无论如何,这个问题有点弱,所以可能值得留点余地。@KenWhite继续这一行-让我们去掉控件,因为它只复制部分组件。让我们去掉所有类似Panel1的成员,因为它们只复制相应的组件[i]值。里德数组中的值正好是它是一个面板数组,并且只是其中的一个。这对特定的应用程序是否有用取决于上下文,但这并不是必须的?我们知道我们在寻找tcontrol,所以使用它意味着我们处理的项目更少,里德的回答增加了添加已经包含在另外两个数组中的项目数组的开销。因为开发人员可能非常希望有一个面板列表,也就是说有一个控件列表。不总是,但为什么不呢?为什么不能有一个任务,我想明确的按钮阵列或面板阵列?你想要控制吗?迭代组件并放弃非控件。使用控件集合更舒适,速度更快?当您只需要面板时,usint阵列fo面板也是如此。“所有组件都不是控件”-我打赌您的意思是“不是所有组件都是控件”,或者“不是每个组件都是控件”:-@Arioch'The:谢谢。措辞可以稍加改进;修正了。但我有一个小问题,当我从一个单位呼叫面板时,它说他找不到我呼叫的特定Tpanel。。。ex.main.great.color:=clred它说找不到面板great…尝试将(公共)过程添加到主窗体:procedure SetGreat(col:TColor);那就叫这个。这样行吗?不行,我的朋友。。。而且比一开始更复杂。。。。。非常感谢。但是为什么一个单元不能从主窗体中理解RegisterClass()单元呢?如果窗体上的一个面板有一个名称,那么您不需要注册该类-Delphi会自动注册。标签也一样。如果您需要以编程方式引用面板(或标签),那么您确实需要对其命名(您可以通过控件进行迭代,但是..为什么?),这样表单对象声明中的面板和标签的数量等于您在运行时必须引用的数量-并且它们将具有有意义的名称,而不是“Label1”,不是:)。主表单是任何其他表单,.dpr项目文件是
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;
initialization
RegisterClass(TPanel);
RegisterClass(Tlabel);
end.