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 user profile iconNarses: 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
// hier könntest Du auch Name setzen z.B.
// name := 'FindMich';
  Parent := MyForm;
//  Left ...
//  etc..
  
  end;
MycheckBox := TCheckbox.Create(MyForm);
with MyCheckbox do
   begin
   Parent := MyGroupbox;
//   Left .....
//   etc..
   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

user profile iconMetschu hat folgendes geschrieben Zum zitierten Posting springen:
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); // <- Da war mein Fehler, hatte da "g" drin stehen
....


Jetzt klappts wie es soll :dance2:

Vielen Dank!


jaenicke - Sa 30.10.10 21:47

user profile iconMetschu hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
   c := TCheckbox.Create(f); // <- Da war mein Fehler, hatte da "g" drin stehen                    
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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.