page_1
, page_2
, etc. sind tabsheets, keine Frames, aber Sie sie auf Rahmen werfen, was falsch ist.
Wenn jeder Rahmen mehrere TabSheets enthält und jedes TabSheet eine ComboBox enthält, würden Sie FindComponent()
überhaupt nicht verwenden. Sie müssten stattdessen durch Eltern/Kind Controls[]
Listen iterieren, oder verwenden Sie FindChildControl()
.
Wenn der Rahmen jedoch die Owner
der ComboBox ist (was wäre, wenn die ComboBox zur Entwurfszeit dem Rahmen hinzugefügt wird), dann würden Sie FindComponent()
auf dem Rahmen selbst verwenden. Aber Sie können nicht mehr untergeordneten Komponenten mit dem gleichen Namen haben, so dass jede ComboBox auf jeder tabsheet würde einen eindeutigen Namen benötigen:
cb := TComboBox(frm1.FindComponent('comboBoxAccount_'+IntToStr(i)));
für jeden Index von frm1
Wiederholung, dann all Indizes von frm2
, dann frm3
.
Wenn Ihr ComboBox wirklich benannt ist nur comboBoxAccount
dann frage ich mich, wenn Sie wirklich einen übergeordneten Container, die mehrere tabsheets drauf hat, und jeder tabsheet hat einen Rahmen auf, und jeder Rahmen hat nur ein ComboBox comboBoxAccount
auf ihm benannt.Wenn das der Fall ist, brauchen Sie überhaupt keine Suche zu tun, nur um Ihre vorhandenen Objektzeiger direkt:
cb := frm1.comboBoxAccount;
cb := frm2.comboBoxAccount;
cb := frm3.comboBoxAccount;
Aber wenn Sie wirklich eine Schleife verwenden mögen, setzen Sie dann den Rahmen in eine Liste zB:
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;
Oder ein Array verwenden:
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;
aktualisieren : Neue Informationen, die Sie zur Verfügung gestellt gegeben, können Sie die ComboBox wie diese statt finden:
cb := Tfrm1(PageControl[i].Pages[j].FindChildControl('frame_'+IntToStr(i))).comboBoxAccount;
Ihre while
Schleife mehrere tabsheets und Rahmen schafft, die die gleiche Name
haben, die nicht gültig ist. Ich würde vorschlagen, sie überhaupt nicht zu benennen.
while condition=true do
begin
TabSheet := TTabSheet.Create(PageControl[i]);
TabSheet.Caption := '';
//TabSheet.Name:='tabesheet_'+IntToStr(i);
TabSheet.PageControl := PageControl[i];
TabSheet.PageControl.ActivePageIndex:=0;
{I also create a frame for each TabSheet. In every frame there is the ComboBox that I want to access}
frame := Tfrm1.Create(TabSheet);
//frame.Name:='frame_'+IntToStr(i);
frame.Parent:=TabSheet;
end;
einen Rahmen Unter der Annahme, ist das einzige Kind seiner tabsheet, können Sie dies dann tun:
cb := Tfrm1(PageControl[i].Pages[j].Controls[0]).comboBoxAccount;
Bitte zeigen Sie Ihren tatsächlichen übersetzbar Code –
Es gibt zu viele Teile, die mein Problem hier invole und es würde Nimm viele Zeilen Code. Mein Hauptproblem ist: Gibt es eine Möglichkeit, auf Steuerelemente von Frames zuzugreifen, die zur Laufzeit instanziiert werden? Es gibt TabSheets, für jedes TabSheet gibt es mehrere TabSheets (zur Laufzeit erstellt) und in jedem Kind TabSheet gibt es einen Frame mit dem Steuerelement, auf das ich zugreifen möchte. Kann ich Tags verwenden? Oder eine Möglichkeit, auf Steuerelemente von Steuerelementen zuzugreifen (TabSheets in Tabsheets)? –
Ok. Gib uns dann keinen Kontext. Aber erwarte nicht Hilfe zum Thema. –