Autor Beitrag
Jojojoxx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Di 27.12.05 16:56 
Davon ausgehend, dass die Klasse deines Forms TForm1 heisst, bau dir mal einen Button mit folgendem OnClick-Handler:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Di 27.12.05 17:12 
Ahhhhh :-)
Danke! Jetzt klappts!
mfg

Jojo
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: 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.
ausblenden 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 19.01.06 20:53 
Oder du speicherst gloabal array of TForm1 und rufst die dann mit dem Index des Array auf.
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 19.01.06 21:03 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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:
ausblenden 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 ;).

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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.

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Sa 21.01.06 13:56 
Hi!

Ich hab hier mal ein neues Topic aufgemacht!

mfg

Jojo