Autor |
Beitrag |
mtin
      
Beiträge: 177
Win XP SP2
BDS2006 Enterprise
|
Verfasst: 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
      
Beiträge: 19
Win XP
D3
|
Verfasst: 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:
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); private public end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); var NewForm : TForm; NewButton : TButton; NewEdit : TEdit; NewMemo : TMemo; begin NewForm := TForm.Create(nil); NewForm.Top := 100; NewForm.Left := 100; NewForm.Height := 150; NewForm.Width := 250; NewForm.Caption := 'TestForm';
NewButton := TButton.Create(self); NewButton.Width := 75; NewButton.Height := 25; NewButton.Left := 30; NewButton.Top := 82; NewButton.Caption := 'Senden'; NewButton.OnClick := NewButtonClick; NewButton.Parent := NewForm;
NewEdit := TEdit.Create(self); NewEdit.Width := 121; NewEdit.Height := 21; NewEdit.Left := 30; NewEdit.Top := 10; NewEdit.Parent := NewForm;
NewMemo := TMemo.Create(self); NewMemo.Width := 185; NewMemo.Height := 40; NewMemo.Left := 30; NewMemo.Top := 41; NewMemo.Parent := NewForm;
NewForm.Show;
end;
procedure TForm1.NewButtonClick(Sender : TObject); begin end;
end. |
Ich hoffe, dass ist es, was du meinst.
Viel Spaß damit.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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:
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); 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
      
Beiträge: 19
Win XP
D3
|
Verfasst: 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 
      
Beiträge: 177
Win XP SP2
BDS2006 Enterprise
|
Verfasst: Do 14.09.06 21:54
wunderbar, danke, ist genau was ich meinte 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 14.09.06 22:16
Carl 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.
Carl 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...
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
      
Beiträge: 19
Win XP
D3
|
Verfasst: 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 
      
Beiträge: 177
Win XP SP2
BDS2006 Enterprise
|
Verfasst: 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...)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| if (users[l].fenster<>nil) then begin (users[l].fenster as TForm2).Memo1.Lines.Add(name+Form1.Edit7.Text); users[l].fenster.Show; end else 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 
      
Beiträge: 177
Win XP SP2
BDS2006 Enterprise
|
Verfasst: 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)
|
|
|