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

user profile iconHeiko 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'//dürfte es geben
  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'//als Beispiel

(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

user profile iconJojojoxx 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

user profile iconMSCH 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


Jojojoxx - Sa 21.01.06 13:56

Hi!

Ich hab hier [http://www.delphi-forum.de/viewtopic.php?t=54778&start=0&postdays=0&postorder=asc&highlight=&sid=ff7defa89683f2c57faffb6037d020c5] mal ein neues Topic aufgemacht!

mfg

Jojo