Delphi:引用多个框架中的组件

时间:2016-06-25 11:06:44

标签: delphi vcl

我想引用一个存在于多个帧中的组件(使用循环)。所有帧的组件都相同。

  • 我有一个名为" comboBoxAccount"。
  • 的ComboBox
  • 我也有多个框架(我在运行时实例化)。 我创建的框架命名为:

    frm1,frm2,frm3

  • 每个框架都有一个在运行时创建的多个TabSheets: page_1,page_2,page_3

所以,我目前正在使用: Tfrm1(FindComponent('page_'+i)).comboBoxAccount

这意味着我在循环中使用FindComponent来访问所有TabSheets中的所有comboBoxAccount

问题是我必须使用强制转换来让Delphi了解我想要访问哪个组件,所以我将Tfrm1( )放在FindComponent之前。

所以,如果我想使用循环转换,我该怎么办?

我可以使用:

Tfrm1(FindComponent('page_'+i)).comboBoxAccount
Tfrm2(FindComponent('page_'+i)).comboBoxAccount
Tfrm3(FindComponent('page_'+i)).comboBoxAccount

但有没有办法循环Tfrm而不是逐个编写它们?

1 个答案:

答案 0 :(得分:1)

'Show Text'page_1等是TabSheets,而不是框架,但是您将它们转换为框架,这是错误的。

如果每个框架上有多个TabSheets,并且每个TabSheet上都有一个ComboBox,则根本不会使用page_2。您必须改为遍历父/子Controls[]列表,或使用FindChildControl()

但是,如果框架是ComboBox的FindComponent()(如果在设计时将ComboBox添加到框架中,则会是这样),那么您将在框架本身上使用Owner 。但是您不能拥有多个具有相同名称的子组件,因此每个TabSheet上的每个ComboBox都需要一个唯一的名称:

FindComponent()

重复cb := TComboBox(frm1.FindComponent('comboBoxAccount_'+IntToStr(i))); 的每个索引,然后是frm1的所有索引,然后是frm2

如果您的ComboBox真的名为frm3,那么我想知道您是否真的有一个父容器上有多个TabSheets,每个TabSheet上都有一个框架,每个框架只有一个名为{的ComboBox {1}}就可以了。如果是这种情况,您根本不需要进行任何搜索,只需直接使用现有的对象指针:

comboBoxAccount

但是如果你真的想要使用一个循环,那么把帧放到一个列表中,例如:

comboBoxAccount

或使用数组:

cb :=  frm1.comboBoxAccount;
cb :=  frm2.comboBoxAccount;
cb :=  frm3.comboBoxAccount;

更新:根据您提供的新信息,您可以找到这样的ComboBox:

private
    Frames: TList;

...

Frames := TList.Create;
Frames.Add(frm1);
Frames.Add(frm2);
Frames.Add(frm3);

...

for I := 0 to Frames.Count-1 do
begin
  // assuming TFrm1, TFrm2, etc do not have a common ancestor holding the ComboBox...
  cb := TComboBox(TWinControl(Frames[i]).FindComponent('comboBoxAccount'));
  ...
end;

您的private // assuming TFrm1, TFrm2, etc do not have a common ancestor holding the ComboBox... Frames: array[0..2] of TWinControl; ... Frames[0] := frm1; Frames[1] := frm2; Frames[2] := frm3; ... for I := Low(Frames) to High(Frames) do begin cb := TComboBox(Frames[i].FindComponent('comboBoxAccount')); ... end; 循环正在创建多个具有相同cb := Tfrm1(PageControl[i].Pages[j].FindChildControl('frame_'+IntToStr(i))).comboBoxAccount; 的标签页和框架,这是无效的。我建议不要将它们命名。

while

假设某个框架是其TabSheet的唯一子项,则可以执行以下操作:

Name