Wie dyn. erzeugte Formulare ansprechen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
jrx
Beiträge: 49
Registriert: Fr 14. Mai 2010, 13:23
OS, Lazarus, FPC: Win/UX
Wohnort: Erlangen

Wie dyn. erzeugte Formulare ansprechen

Beitrag von jrx »

Hallo

In meinem Programm werden in einige gleichartige Formulare als Matrix dymisch erzeugt:

Code: Alles auswählen

for i:=0 to maxCol do begin
    for j:=0 to maxRow do begin
        f := TForm2.Create(self);
        f.Name:='frm'+intToStr(i)+'x'+intToStr(j);
Es folgt die Anordnung als Matrix auf dem Bildschirm. Das Formular TForm2 hab ich vorher designed.

Wie kann ich denn nun die Formulare Ansprechen.
FindComponent geht ja nicht, weil ich ja ein ein Formular finden will.

Gibt es da was? --- á la:

Code: Alles auswählen

FindFormular('frm2x4').Height := 100;
Danke jrx

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Wie dyn. erzeugte Formulare ansprechen

Beitrag von Bora4d »

Wie ich in dein Code sehe erstellst du in ein Formular hier:
f := TForm2.Create(self);

Die werden dort als Control und Component in die Liste eingetragen, du hast mehrere Möglichkeiten:

1. Möglichkeit über Controls Eigenschaft.

Code: Alles auswählen

//...
var i:integer;
begin
   for i:=0 to (ControlCount-1) do 
     //entweder das
     if (Controls[i] is TForm) then ... //Du hast ein Form gefunden
      //oder das
    if TComponent(Controls[i]).Name='frm2x4' then ... //du hast Form 'frm2x4' gefunden
 
    //jetzt kanns du es  mit TForm(Controls[i]) als Form benutzen
2. Oder Über Components Eigenschaft

Code: Alles auswählen

//...
var i:integer;
begin
   for i:=0 to (ComponentCount-1) do 
     //entweder das
     if (Components[i] is TForm) then ... //Du hast ein Form gefunden
      //oder das
    if Components[i]).Name='frm2x4' then ... //du hast Form 'frm2x4' gefunden
 
   //jetzt kanns du es  mit TForm(Components[i]) als Form benutzen
Wenn der Eigentümer von erstellen Formularen Application ist dann kannst du nur 2. Möglichkeit benutzen.

Hier ist Eigentümer ein Formular oder ein Control in dessen Funktion du die Formulare erstellt:
f := TForm2.Create(self);

Und hier Application:
f := TForm2.Create(Application);

klar?

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Wie dyn. erzeugte Formulare ansprechen

Beitrag von Bora4d »

Noch was, um nicht immer strings zuvergleichen mache ich so:

Code: Alles auswählen

if (Controls[i] is TForm) and (TComponent(Controls[i]).Name='frm2x4') then ...
 //und das andere
  if (Components[i] is TForm) and (Components[i]).Name='frm2x4') then ...
Die 2. Bedingung (rechte Teil von 'and') wird nur ausgeführt wenn erste Teil richtig ist.

jrx
Beiträge: 49
Registriert: Fr 14. Mai 2010, 13:23
OS, Lazarus, FPC: Win/UX
Wohnort: Erlangen

Re: Wie dyn. erzeugte Formulare ansprechen

Beitrag von jrx »

Vielen Dank für die schnellen Antworten.

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Wie dyn. erzeugte Formulare ansprechen

Beitrag von Patito »

Also dieses Suchen nach dem Formular über den Typ und den Namen finde ich recht wackelig.

Man kriegt doch mit dem f := TForm2.Create(self) Referenzen auf die Formulare.
Die Referenzen sollte man eben nicht wegwerfen, sondern in einer Objekt-Liste speichern.
-> Dann spart man sich das unnötige rumsuchen in den Komponenten über irgendwelche Typ und String-Vergleiche.

Formulare über den Namen zu Suchen ist ein wenig eine Bastelei, die einem um die Ohren fliegt sobald man irgendwann mal das Formular umbenennt.

Antworten