Autor |
Beitrag |
Jojojoxx
      
Beiträge: 386
|
Verfasst: Mo 26.12.05 16:12
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
Zuletzt bearbeitet von Jojojoxx am Do 19.01.06 20:12, insgesamt 1-mal bearbeitet
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Di 27.12.05 15:18
statt Form.ShowModal musst du Form.Show verwenden.
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Jojojoxx 
      
Beiträge: 386
|
Verfasst: 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
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: 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; |
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
Jojojoxx 
      
Beiträge: 386
|
Verfasst: Di 27.12.05 17:12
Ahhhhh
Danke! Jetzt klappts!
mfg
Jojo
|
|
Jojojoxx 
      
Beiträge: 386
|
Verfasst: 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
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: 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
_________________ Ein Nutzer der Ecke
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Do 19.01.06 20:53
Oder du speicherst gloabal array of TForm1 und rufst die dann mit dem Index des Array auf.
|
|
Jojojoxx 
      
Beiträge: 386
|
Verfasst: 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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 
      
Beiträge: 386
|
Verfasst: 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  )
mfg
Jojo
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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 
      
Beiträge: 386
|
Verfasst: 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
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: 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
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Jojojoxx 
      
Beiträge: 386
|
Verfasst: 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!
mfg
Jojo
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Fr 20.01.06 20:43
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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.
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Jojojoxx 
      
Beiträge: 386
|
Verfasst: 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 
      
Beiträge: 386
|
Verfasst: Sa 21.01.06 13:56
Hi!
Ich hab hier mal ein neues Topic aufgemacht!
mfg
Jojo
|
|