Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Formular beliebig oft öffnen [Update: und unterscheiden]
Jojojoxx - Mo 26.12.05 16:12
Titel: Formular beliebig oft öffnen [Update: und unterscheiden]
Hallo!
Kan mir jemand sagen, wie es unter Delphi möglich ist, eine erstellte Form
beliebig oft in mehreren lauffähigen Instanzen zu öffnen???
Z.B: wie bei ICQ, dort kann man mehrere Chatfenster (für verschiedene Chatpartner)
öffnen.
Danke euch!
mfg
Jojo
MSCH - Di 27.12.05 15:18
statt Form.ShowModal musst du Form.Show verwenden.
grez
msch
Jojojoxx - Di 27.12.05 16:45
Hi!
Nein, das geht leider nicht. Mit form.show wird nur eine Instanz aufgerufen, und beim erneuten ausführen von Form.show bleibt das auch so. Ich möchte aber ja eine Form mehrfach aufrufen (gleichzeitig). Ich habe noch die Methode Form.NewInstance gefunden, aber damit nichts hinbekommen, könnte es irgendwie damit funktionieren???
Danke für die Hilfe! ;-)
mfg
Jojo
noidic - Di 27.12.05 16:56
Davon ausgehend, dass die Klasse deines Forms TForm1 heisst, bau dir mal einen Button mit folgendem OnClick-Handler:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1Button1Click( Sender : TObject ); var frm : TForm1; begin frm := TForm1.create( self ); frm.show; end; |
Jojojoxx - Di 27.12.05 17:12
Ahhhhh :-)
Danke! Jetzt klappts!
mfg
Jojo
Jojojoxx - Do 19.01.06 20:04
Hi!
Hab noch grad ne Frage dazu!
Wie kann ich denn nun diese mehreren Formen differenziert ansprechen.
Ich will also, dass z.B. auf Form1 ein Button etwas auslöst, was auf einer bestimmten Form4 (habe ja mehrere) etwas ändert. Wie kann ich das realisieren!???
Danke euch!
mfg
Jojo
Martin1966 - Do 19.01.06 20:18
Du musst irgendwo die erstellten Instanzen "speichern". Am besten geht das wohl mit einer TList. In deinem Hauptfenster erstellst du eine Instanz von TList.
Delphi-Quelltext
1:
| FensterListe := TList.Create; |
Wenn Du dann eine Instanz von deinem Unterfester erzeugst fügst du diese Referenz der erzeugten Instanze der TList hinzu:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1Button1Click( Sender : TObject ); var frm : TForm1; begin frm := TForm1.create( self ); frm.show; FensterListe.Add (frm); end; |
Dann kannst du über die TList auf die Forms zugreifen. Hier ein Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var i: integer; begin for i := 0 to FensterListe.Count -1 Do TForm1 (FensterListe [i]).Caption := 'TEST'; end; |
lg martin
Heiko - Do 19.01.06 20:53
Oder du speicherst gloabal array of TForm1 und rufst die dann mit dem Index des Array auf.
Jojojoxx - Do 19.01.06 20:58
Heiko hat folgendes geschrieben: |
Oder du speicherst gloabal array of TForm1 und rufst die dann mit dem Index des Array auf. |
Hi!
Das versteh ich nicht ganz! :(
mfg
Jojo
Heiko - Do 19.01.06 21:03
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Fensterliste: array of TForm1;
procedure TForm1Button1Click( Sender : TObject ); begin SetLength(Fensterliste, length(Fensterliste)+1) Fensterliste[High(Fensterliste)]:=TForm1.create(self); Fensterliste[High(Fensterliste)].Show; end;
var i: integer; begin for i := 0 to Fensterliste.Count -1 Do Fensterliste[i].Caption := 'TEST'; end; |
mfg
Heiko
Jojojoxx - Do 19.01.06 22:08
Hi!
Achso hast du das gedacht...
Mhh, leider passt das alles nicht so in mein Programm. Ist es nicht möglich, jeder Form beim Erstellen einen eigenen Namen zu geben???
Es ist folgendes bei mir:
ich habe einen String, es soll nun geprüft werden, ob die zum String gehörende Form (der String wäre dann irgendwo in der Form enthalten, sei es die Caption oder so) schon sichtbar ist, ansonsten muss sie geöffnet werden. Ist sie bzw. wurde sie geöffnet, so soll noch eine weitere Aufgabe folgen (unwichtig :wink: )
mfg
Jojo
Heiko - Fr 20.01.06 07:50
Ja es dürfte möglich sein. Wenn mich nicht falsch erinnere kannst du auch einem Form einen Namen zu weisen. Zum erzeugen bräuchtest du erst wieder einen fensten Variablennamen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1Button1Click( Sender : TObject ); var Fenster: TForm1; begin Fenster:=TForm1.Create(Self); Fenster.Name:='Hallo'; Fenster.Show; end; |
Den Aufruf des Formas machst du dann so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var FensterName: String;
... FensterName:='Hallo'; (FensterName as TForm1).Caption:='Test'; |
PS: Ich hoffe das ich jetzt gerade keinen Fehler drin habe, da ich es ohne Delphi schnell gemacht habe ;).
Jojojoxx - Fr 20.01.06 15:07
Hi!
Die Lösung wäre super!!! Leider klappt der Aufruf bei mir nicht ganz.
Fehlermeldung "Operator ist auf diesen Operandentyp nicht anwendbar!".
Das passiert bei der Zeile:
Delphi-Quelltext
1:
| (FensterName as TForm1).Caption:='Test'; |
Wäre nett, wenn du da mal nachschauen könntest, wo der Fehler liegt...
Danke dir!
mfg
Jojo
MSCH - Fr 20.01.06 18:35
o gott o gott
globale Variablen, Listen, das ist Stil von gestern. tse tse.
Was hälst du von Nachrichten?
implementiere einfach eine Nachricht oder mehrere und schicke diese ein mit einem Broadcast rum.
Schau dir dazu einfach mal Post-/Sendmessage an.
grez
msch
Jojojoxx - Fr 20.01.06 18:45
Hi!
@MSCH: Ich glaub das bringt nicht viel. Die verschiedenen Fenster sollen ja zwecks Identifizierung einen eindeutigen Namen erhalten. Da bringen mich Nachrichten ja nicht wirklich weiter (oder??)
Wenn die Methode von Heiko klappen würde, wäre ich ja schon happy! :D
mfg
Jojo
Heiko - Fr 20.01.06 20:43
Jojojoxx hat folgendes geschrieben: |
Hi!
Die Lösung wäre super!!! Leider klappt der Aufruf bei mir nicht ganz.
Fehlermeldung "Operator ist auf diesen Operandentyp nicht anwendbar!".
Das passiert bei der Zeile:
Delphi-Quelltext 1:
| (FensterName as TForm1).Caption:='Test'; |
Wäre nett, wenn du da mal nachschauen könntest, wo der Fehler liegt...
Danke dir!
mfg
Jojo |
Mhm, mir fällt gerade keine Idee ein, wie man es noch einfach machen könnte, dass es geht. Es geht folgendes (wes wegen ich es hier auch genommen hatte), aber da bekomme ich nicht das TForm1 her. Wenn mir eine Idee einfällt wie man es machen kann sage ich es dir ;).
Delphi-Quelltext
1:
| (Sender as TForm1).Caption:='Test'; |
@MSCH: Messages sind an vielen Stellen gut, aber hier wäre der Arbeitsaufwand wesentlich höeher als bei einem Array von der Komponente ... ;).
tommie-lie - Fr 20.01.06 20:58
MSCH hat folgendes geschrieben: |
Listen, das ist Stil von gestern. |
Du hast gleichförmige Objekte also lieber als lose Instanzen auf dem Heap rumfliegen?
MSCH hat folgendes geschrieben: |
Was hälst du von Nachrichten? [...] Broadcast |
Davon halte ich deutlich weniger als von einer Hashtable mit den TForm1-Instanzen.
Wenn ich einen Brief an Karl Müller schreiben will, schicke ich auch keine Postwurfsendungen an jeden Haushalt in Deutschland, sondern suche mir seine Adresse im Telefonbuch raus.
Jojojoxx - Fr 20.01.06 22:33
Hi!
Okay, danke!
Wär super, wenn dir noch was einfallen würde!! :-)
Ansonsten kann ich die Frage ja auch mal gezielt in einem eigenen Topic machen!
mfg
Jojo
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!