Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Komponente in Dynamisch erstellter Form finden
Metschu - Sa 30.10.10 11:21
Titel: Komponente in Dynamisch erstellter Form finden
Moin zusammen!
Ich stehe gerade etwas auf dem Schlauch.
Mein Prog erstellt zur Laufzeit eine neue Form und setzt darauf eine GroupBox.
Nun soll auf diese GroupBox eine CheckBox gesetzt werden.
Nur klappt es nicht, dieser CheckBox die GroupBox als Parent zuzuweisen. FindComponent findet die GroupBox nicht :(
Folgenden Code hab ich zum testen:
Delphi-Quelltext
1: 2: 3:
| if TGroupBox(TForm(FindComponent('NeuesFenster')).FindComponent('NeueGroupBox'))<>NIL then showmessage('Gefunden') else showmessage('Nicht gefunden'); |
Bin für jeden Tip Dankbar!
Gruß
Torsten
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 30.10.2010 um 14:29
bummi - Sa 30.10.10 12:37
Wenn Du es dynamisch erzeugst hast Du doch schon alle Zeiger?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| MyForm := Tform.Create(self); MyGroupbox := TGroupbox.Create(Myform) with MyGroupbox do begin Parent := MyForm; end; MycheckBox := TCheckbox.Create(MyForm); with MyCheckbox do begin Parent := MyGroupbox; end; |
wenn den Namen gesetzt hast kannst Du falls nötig später per
Delphi-Quelltext
1: 2:
| aGroupbox := TGroupbox(MyForm.FindComponent('FindMich')); If assigned(aGroupbox) then |
zugreifen..
delfiphan - Sa 30.10.10 13:23
Metschu hat folgendes geschrieben : |
Mein Prog erstellt zur Laufzeit eine neue Form und setzt darauf eine GroupBox.
Nun soll auf diese GroupBox eine CheckBox gesetzt werden. |
Wenn das so vorgegeben ist, wieso erstellst du das Formular nicht zur Designzeit?
bummi - Sa 30.10.10 14:12
@delfiphan
Ich habe auch derartiges gebraucht um für Parametrisierbare Abfragen Eingabeformulare für den Benutzer zu generieren. Wenn der SQL umgebaut wird müßen mehr/weniger/andere Datentypen mit entsprechenden Eingabeelementen erstellt / ausgefüllt und ausgewertet werden.
Metschu - Sa 30.10.10 21:08
Hm, das ist alles etwas verwirrend...
Die Checkbox ist auf einer GroupBox. Die Checkbox finde ich aber nicht über TForm, sondern nur über TForm.TGroupBox.
Delphi-Quelltext
1: 2: 3: 4:
| window:=TForm(FindComponent('Window')); grpBox:=TGroupBox(Window.FindComponent('GrpBox')) if tcheckbox(grpBox.FindComponent('ChkBox')).Checked then showmessage('...'); |
So wird nix gefunden:
Delphi-Quelltext
1: 2: 3:
| window:=TForm(FindComponent('Window')); if tcheckbox(Window.FindComponent('ChkBox')).Checked then showmessage('...'); |
Bei einer Statisch erstellten Form, in der die CheckBox auch auf der GroupBox sitzt, kann ich diese über direkt über TForm finden.
Wie kann man denn die CheckBox finden, wenn man nicht weiß, auf welcher Groupbox sie sitzt, ohne alle durchsuchen zu müssen?
Oder mache ich bereits beim erstellen der Komponente einen Fehler?
Die CheckBox soll auf der GroupBox sitzen, deswegen setzte ich bei der CheckBox die GroupBox als Parent.
bummi - Sa 30.10.10 21:28
die Zeile mache keinen Sinn
Delphi-Quelltext
1:
| window:=TForm(FindComponent('Window')); |
das Vorgehen sollte irgendwie wie untern aussehen,
zumindest f im Beispiel unten solltest innerhalb Deiner Klasse aufbewahren, z.B. unter Private als MyForm:TForm
wenn Du mehrere brauchst könntest Du auch ein KlassenArray oder eine TList o.ä verwenden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); var f:TForm; g:TGroupbox; c , sc:Tcheckbox; begin f := Tform.Create(self); g := TGroupbox.Create(f); g.Parent := f; c := TCheckbox.Create(f); c.Name := 'Test'; c.Caption := 'Hallo'; c.Parent := g; sc := TCheckBox(f.FindComponent('Test')); if Assigned(sc) then Showmessage('found: Caption=' + sc.Caption) else Showmessage('not found') ;
end; |
Metschu - Sa 30.10.10 21:36
Danke für den weg der Erleuchtung... :idea:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var f:TForm; g:TGroupbox; c , sc:Tcheckbox; begin f := Tform.Create(self); g := TGroupbox.Create(f); g.Parent := f; c := TCheckbox.Create(f); .... |
Jetzt klappts wie es soll :dance2:
Vielen Dank!
jaenicke - Sa 30.10.10 21:47
Metschu hat folgendes geschrieben : |
Delphi-Quelltext 1:
| c := TCheckbox.Create(f); | |
Die Angabe bedeutet, dass diese Komponente (hier das Formular) sich um die Freigabe kümmert. Dafür wird die neue Komponente dort in die Liste der Komponenten eingefügt. ;-)
Metschu - Sa 30.10.10 21:52
jaenicke hat folgendes geschrieben : |
| Die Angabe bedeutet, dass diese Komponente (hier das Formular) sich um die Freigabe kümmert. Dafür wird die neue Komponente dort in die Liste der Komponenten eingefügt. ;-) |
Kein wunder, das ich es dort auch nicht gefunden habe :-)
Danke für die Erklärung.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!