Ik ben bezig met een simpele TCP Chat server in Delphi, met meerdere chatroom ondersteuning.
Nu is de opzet vrij eenvoudig
Ik krijg deze versimpelde code niet aan de praat, als je op de 2e knop drukt zou je de naam van de host moeten zien, ik heb een pointer opgeslagen naar de user in de TChatbox, maar ik krijg een AV.
Maar als ik Join procedure aanroep staat er een showmessage die als het goed is dezelfde Pointer opvraagt en deze uitkomst is gewoon, maar doe ik procedure Who dan gaat het fout
Ik zit echt met een raadsel want er is erg weinig op te vinden op het internet, alleen wat basis pointer gebruik, maar niet zoals hier.
Nu is de opzet vrij eenvoudig
- een verbonden client wordt een TClient object
- een Client verbind en maakt een chatbox aan
- Deze chatbox heeft een host, welke een pointer is naar de Client
- Deze Client krijgt weer een pointer ChatBox naar de zojuist gemaakte ChatBox
Ik krijg deze versimpelde code niet aan de praat, als je op de 2e knop drukt zou je de naam van de host moeten zien, ik heb een pointer opgeslagen naar de user in de TChatbox, maar ik krijg een AV.
Delphi:
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
85
86
87
88
| PClient = ^TClient; PChatBox = ^TChatBox; TChatBox = class(TObject) public ID: Integer; Host: PClient; procedure Who; end; TClient = class(TObject) Name: String; ChatBox: PChatBox; procedure Connect; procedure Join(AChatBox: PChatBox); end; TChatBoxList = class(TObjectList) public function AddChatBox: PChatBox; end; procedure TForm1.FormCreate(Sender: TObject); begin ChatList := TChatBoxList.Create; UserList := TObjectList.Create; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin UserList.Free; ChatList.Free; end; procedure TForm1.Button1Click(Sender: TObject); var Client: TClient; begin Client := TClient.Create; Client.Connect; UserList.Add(Client); end; procedure TClient.Connect; var PNewChatBox: PChatBox; begin Name := 'test'; PNewChatBox := Form1.ChatList.AddChatBox; PNewChatBox^.Host := @Self; Join(PNewChatBox); end; function TChatBoxList.AddChatBox: PChatBox; var NewChatBox: TChatBox; begin NewChatBox := TChatBox.Create; NewChatBox.ID := 9; NewChatBox.Host := nil; Add(NewChatBox); Result := @NewChatBox; end; procedure TClient.Join(AChatBox: PChatBox); var User: PClient; begin User := AChatBox^.Host; ChatBox := AChatBox; ShowMessage(User^.Name); end; procedure TForm1.Button2Click(Sender: TObject); begin TChatBox(ChatList.Items[0]).Who; end; procedure TChatBox.Who; var User: PClient; begin User := PClient(Host); // En hier komt een AV ShowMessage(User^.Name); end; |
Maar als ik Join procedure aanroep staat er een showmessage die als het goed is dezelfde Pointer opvraagt en deze uitkomst is gewoon, maar doe ik procedure Who dan gaat het fout
Ik zit echt met een raadsel want er is erg weinig op te vinden op het internet, alleen wat basis pointer gebruik, maar niet zoals hier.