Hi,
folgendes problem ich will die Clientliste bei jedem Client bei disconnect eines clients refreshen
klappt soweit auch, wenn ich die clients in der reihenfolge des connects wieder disconnecte
also connect 1,2 dann disconnect 2,1
ändere ich jetzt die Reihenfolge, des disconnect auf 1,2 (der zuerst eingeloggte Client loggt sich als erstes aus)
dann kriege ich eine EAccessViolation
ich hab den code auch schon mal mit den Chatdemos verglichen finde den Fehler aber leider nicht...
Danke
Ralf
hier die Problemstelle
Delphi-Quellcode:
procedure Tform1.BroadcastClientList;
var
Count: Integer;
List : TList;
begin
List := tcpServer.Contexts.LockList;
try
for Count := 0 to ClientList.Count -1 do begin
// hier wird die EAccessviolation ausgelöst
TIdContext(List.Items[Count]).Connection.iohandler.WriteLn(form1.lbClients.Items.CommaText);
// hier wird die EAccessviolation ausgelöst
end;
except
end;
tcpServer.Contexts.UnlockList;
end;
und hier der code beim connect/disconnect
Delphi-Quellcode:
type
// Speichert TCPclients
TClient = class(TObject)
Name : String;
No : Integer;
Thread : Pointer;
end;
//......
var
Clientlist : TList;
//......
procedure TForm1.tcpServerConnect(AContext: TIdContext);
var
Client : TClient;
begin
Client := TClient.Create;
Client.Name := 'Logging In';
Client.No := lbClients.Items.Count;
Client.Thread := AContext;
AContext.Data := Client;
Clientlist.Add(Client);
end;
//....
procedure TForm1.tcpServerDisconnect(AContext: TIdContext);
var
Client : TClient;
begin
Client := Pointer(AContext.Data);
Clientlist.Delete(Client.No);
Client.Free;
AContext.Data := nil;
BroadcastClientlist;
end;