Autor Beitrag
mtin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Do 14.09.06 17:12 
hallo, ich hab mal versucht so ein bisschen dass xfire protokoll(ist nen messenger mit speziellen funktionen für gamer) in einem Delphi Programm umzusetzen (um den ganzen Netzwerk-krams zu üben)

das klappt auch soweit ganz gut, kann Nachrichten empfangen + senden, allerdings hab ich bis jetzt alles in einem fenster (Form1)
nun hätt ich das aber gerne so, dass man doppelt auf einen User in ner ListBox klickt und sich dann ein neues Formular öffnet mit nem Memo, nem Edit und nem "Senden" Button! Allerdings soll es von diesen Fenstern so viele geben wie der user will, also ich will gleichzeitig 2 dieser chatfenster mit verschiedenen usern offen haben!

wie mach ich das am dümmsten? bzw. gibts da vielleicht irgendwo ein Beispiel, weil ich würde das jetzt irgendwie mit einem dynamischen array of TForm versuchen, aber weiß nicht so wirklich wie das dann alles geht mit der Buttonclick-Funktion z.B. usw. (bis jetzt hat das immer schön die IDE für mich gemacht xD)

bin für jede Hilfe dankbar....
Carl Johnson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP
D3
BeitragVerfasst: Do 14.09.06 19:29 
Also:

Hier der Quelltext.Hatte ne Form mit nem Button drauf.

Wenn du auf den Button klickst, dann wird ein neues Form erzeugt (inkl. aller Objekte).

Die Positionen und Größe der Objekte sind natürlich nur ad hoc ausgedacht. Dass musst du selbst designen.
Am besten mal während der Entwurfsphase ein Formular zusammenbauen und die Werte des fertigen Designs
auf den Quelltext übertragen.

Beim klicken auf den Button wird jedes mal ein neues Form erzeugt(so viele du willst!).

Hier der Text:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure NewButtonClick(Sender : TObject);//eigenes OnClick
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
NewForm : TForm;
NewButton : TButton;
NewEdit : TEdit;
NewMemo : TMemo;
begin
//Form erzeugen
NewForm := TForm.Create(nil);
NewForm.Top := 100;
NewForm.Left := 100;
NewForm.Height := 150;
NewForm.Width := 250;
NewForm.Caption := 'TestForm';

//Button erzeugen
NewButton := TButton.Create(self);
NewButton.Width := 75;
NewButton.Height := 25;
NewButton.Left := 30;
//Kannst aber auch nen beliebigen anderen Wert einsetzten
NewButton.Top := 82;
NewButton.Caption := 'Senden';
NewButton.OnClick := NewButtonClick;
//Button dem neuen Form zuweisen
NewButton.Parent := NewForm;

//Edit erzeugen
NewEdit := TEdit.Create(self);
NewEdit.Width := 121;
NewEdit.Height := 21;
NewEdit.Left := 30;
NewEdit.Top := 10;
//Edit dem neuen Form zuweisen
NewEdit.Parent := NewForm;

//Memo erzeugen
NewMemo := TMemo.Create(self);
NewMemo.Width := 185;
NewMemo.Height := 40;
NewMemo.Left := 30;
NewMemo.Top := 41;
//Memo dem neuen Form zuweisen
NewMemo.Parent := NewForm;

//Neue Form zeigen
NewForm.Show;

end;

procedure TForm1.NewButtonClick(Sender : TObject);
begin
//Dass ist deine Sache, was beim klicken auf den neuen Button passiert!
end;

end.



Ich hoffe, dass ist es, was du meinst.

Viel Spaß damit.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 14.09.06 20:51 
Du kannst theoretisch auch das ganze viel Einfacher haben:

Datei --> Neu --> Formular
Das dann wie gewünscht designen
Projekt --> Optionen --> Formulare
Dort dein grade designtes Formular aus der Liste automatisch zu erzeugender Forms entfernen
Zur Laufzeit (immer wenn ein Formular zu erstellen ist:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure THauptform.ButtonClick(Sender: TObject);
var
    NewForm: TDynamischesForm;
Begin
    NewForm := TDynamischesForm.Create(Self);
    FormListe.Add(NewForm); //Optional, um später darauf zugreifen zu können
end;

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Carl Johnson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP
D3
BeitragVerfasst: Do 14.09.06 21:22 
Das ist richtig. Hätte ich erwähnen sollen!

Ist aber nur die praktische Variante. Die Theorie findest du in meinem post.

Wenn du also während der Laufzeit Objekte erzeugen und Events (z.B. OnClick) einer procedure zuordnen willst, dann kannst du auf den Theorie zurückgreifen.

Für die Erstellung der Form reicht BenBEs Variante völlig aus.


Es kann aber sein, dass du evtl. das OnClick-Event anpassen willst und es dann, je nachdem, einer anderen procedure zuordnen willst. Dass kannst du mit BenBEs Lösung nicht!



Mein Tipp:

Mach das, was BenBE vorschlägt und benutze meinen Vorschlag für Änderungen während der Laufzeit.


Viel Spaß.
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Do 14.09.06 21:54 
wunderbar, danke, ist genau was ich meinte :)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 14.09.06 22:16 
user profile iconCarl Johnson hat folgendes geschrieben:
Es kann aber sein, dass du evtl. das OnClick-Event anpassen willst und es dann, je nachdem, einer anderen procedure zuordnen willst. Dass kannst du mit BenBEs Lösung nicht!

HALT HALT!!! Mit meiner Variante kann er auch OnClick usw. nutzen. Allerdings muss er dann Self anstatt DynamischeFormXY nehmen. Ist aber ne Einschränkung, die eh vernachlässigt werden kann, weil man wenn man schon OOP progt, eh keine Globalen Variablen nutzt.

user profile iconCarl Johnson hat folgendes geschrieben:
Mein Tipp:

Mach das, was BenBE vorschlägt und benutze meinen Vorschlag für Änderungen während der Laufzeit.

Das einzige, wann man auf deine Lösung zurückgreifen muss, sind Layout-Änderungen während der Laufzeit, oder wenn man Events umsetzen will. Da reicht es aber vollkommen, die betroffenen Änderungen im Source zu schreiben, anstatt das ganze Formular...

user profile iconCarl Johnson hat folgendes geschrieben:
Viel Spaß.

Wünsch ich auch ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Carl Johnson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP
D3
BeitragVerfasst: So 17.09.06 12:00 
Das ist ja richtig. Aber er muss doch erst mal wissen, wie es geht. Er hatte davon keine Ahnung, was seine Frage beweist. Ich wollte deine Antwort nicht kritisieren, da sie völlig korrekt ist.
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Fr 29.09.06 23:01 
mh, bin länger nicht dazu gekommen, hab jetzt aber immer noch ein Problem:
wenn ich die Fenster durch ein ButtonClick oder ähnliches(-->Prozeduren, die zu TForm1 gehören) öffne, dann funktioniert alles wunderbar...

allerdings öffnet der user nicht immer selber das chatfenster, es muss sich auch automatisch öffnen, falls einem jemand was schreibt. Dies habe ich folgendermaßen probiert, allerdings schmiert er dabei immer ab (TForm2.Create(self) geht nicht weil die Prozedur nicht zu TForm1 gehört oder so...)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
          if (users[l].fenster<>nilthen
            begin
            (users[l].fenster as TForm2).Memo1.Lines.Add(name+Form1.Edit7.Text);
             users[l].fenster.Show;
            end
          else // ab hier scheints nicht zu gehen....
            begin
             users[l].fenster             := TForm2.Create(nil);
             users[l].fenster.Caption     := 'Chat with '+users[l].name;
            (users[l].fenster as TForm2).user_index:=l;
            (users[l].fenster as TForm2).Memo1.Lines.Add(name+Form1.Edit7.Text);
             users[l].fenster.Show;
            end;
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: So 01.10.06 12:08 
kann mir keiner helfen? es muss irgendwie etwas damit zu tun haben glaube ich:users[l].fenster := TForm2.Create(nil);
ich weiß nicht was ich in die klammern schreiben soll, hab es schon mit Form1 und mit nil versucht....so wie von euch beschrieben mit "self" geht irgendwie nicht, das nimmt er in der prozedur nicht an (an anderer stelle geht es o_O)