首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何消除变量"panel1,panel2,panel3 ..“在Delphi中?

如何消除变量"panel1,panel2,panel3 ..“在Delphi中?
EN

Stack Overflow用户
提问于 2012-08-23 05:30:26
回答 3查看 576关注 0票数 2

我有这种类型的

代码语言:javascript
复制
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);

代码语言:javascript
复制
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…

有没有人能帮帮我,让我从一开始就不做打洞计划…

再次感谢你..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-23 15:11:04

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

代码语言:javascript
复制
initialization
  RegisterClass(TPanel);
  RegisterClass(Tlabel);
end.

在表单的末尾。

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

票数 7
EN

Stack Overflow用户

发布于 2012-08-23 10:09:08

使用TForm.Controls数组:

代码语言:javascript
复制
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;这就是为什么有两个列表。(例如,TDataSetComponents列表中,但不在Controls列表中;另一方面,TEdit将同时在两者中。)

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

如果您真正想要的是减少type声明本身中的项数,那么可以在运行时创建它们- Delphi会根据OwnerParent自动将它们添加到数组中

代码语言:javascript
复制
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个月后的代码时,知道什么是LastNameEditEditLastName要比Edit1容易得多。)

票数 5
EN

Stack Overflow用户

发布于 2012-08-23 05:32:00

您可以使用数组:

代码语言:javascript
复制
panels : array[1..45] of TPanel; 

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12081700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档