我想引用一个存在于多个帧中的组件(使用循环)。所有帧的组件都相同。
我也有多个框架(我在运行时实例化)。 我创建的框架命名为:
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
而不是逐个编写它们?
答案 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