2016-06-25 18 views
0

Ich möchte auf eine Komponente verweisen (mit Schleife), die in mehreren Frames vorhanden ist. Die Komponente ist für alle Frames gleich.Delphi: beziehen sich auf eine Komponente aus mehreren Frames

  • Ich habe eine ComboBox namens "ComboBoxAccount".
  • Ich habe auch mehrere Frames (die ich zur Laufzeit instanziieren). Die Rahmen I schaffen sind benannt:

    FRM1, FRM2, frm3

  • Jeder Rahmen hat eine multple tabsheets zur Laufzeit erstellt mit dem Namen: PAGE_1, page_2, page_3

Also, ich bin zur Zeit mit: Tfrm1(FindComponent('page_'+i)).comboBoxAccount

Was ich in einer Schleife verwenden FindComponent mit i bezeichnet alle comboBoxAccount in allen tabsheets zuzugreifen.

Das Problem ist, dass ich Casting verwenden muss, um Delphi zu verstehen, auf welche Komponente ich zugreifen möchte, also habe ich Tfrm1() vor FindComponent gesetzt.

Also, wenn ich Casting mit einer Schleife verwenden möchte, was kann ich tun?

Ich konnte einfach zu verwenden:

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

aber ist es eine Möglichkeit, eine Schleife Tfrm ohne sie eins nach dem anderen zu schreiben?

+0

Bitte zeigen Sie Ihren tatsächlichen übersetzbar Code –

+0

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)? –

+0

Ok. Gib uns dann keinen Kontext. Aber erwarte nicht Hilfe zum Thema. –

Antwort

1

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; 
+0

Vielen Dank für all Ihre Ratschläge mein Freund. Ich werde deine Antwort studieren und verschiedene Dinge ausprobieren. Ich werde versuchen, jeden Frame auf eine Liste zu setzen und durchzulaufen. Jede ComboBox befindet sich in einem Frame (ich habe es in Design-Zeit gesetzt), so dass es keinen eindeutigen Namen für jede ComboBox gibt. Gibt es eine Möglichkeit, durch jede einzelne Kontrolle des Formulars (Childs und sogar Childs von Kindern) zu durchlaufen und finden Sie die Combobox mit Tags möglicherweise. –

+0

@ConstantinosKarentzos Ich habe das bereits auf meine Antwort angesprochen. –