Entwickler-Ecke

Internet / Netzwerk - TSocket - Server


Robii - Fr 26.06.09 15:38
Titel: TSocket - Server
Hallo, ich hab folgenden Code geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TClientNameBut.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i,y: Integer;
  ListItem: TListItem;
  AllExist: Boolean;
begin
  AllExist := False;
  For i:= 0 to ConnectList.Items.Count-1 do begin
    If ConnectList.Items[i].SubItems[1] = Socket.RemoteAddress
     Then begin AllExist:= True; y:= i; end
     Else begin AllExist:= False; end;
  end;
  If AllExist
    Then begin ConnectList.Items[y].SubItems[1] := 'Online'end
    Else Begin
      ListItem := ConnectList.Items.Add;
      ListItem.Caption := Socket.RemoteAddress;
      ListItem.SubItems.Add(Socket.RemoteAddress);
      ListItem.SubItems.Add('Online');
    End;
end;


Der Sinn des Codes ist es, zu überprüfen, wenn schon eine Verbindung vorhanden ist, keine neue in meine ConnectList zu adden, sondern den Status einfach von 'Offline' nach 'Online' zu ändern. Aber das funktioniert bei mir nicht, es wird immer eine neue Verbindung geaddet. Beim debuggen ist mir aufgefallen, das AllExist immer False bleibt, obwohl sie ja, wenn es die Verbindung schon gibt auf True ändern müsste?

Gruß.


jaenicke - Fr 26.06.09 15:53

Du setzt AllExist ja auch wieder auf False statt nur auf True. Gefunden werden kann also nur der letzte Eintrag, da sonst die folgenden den Fund wieder überschreiben...

Dann könntest du den Code auch ordentlicher formatieren, dann kann man das auch besser überblicken...

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:
procedure TClientNameBut.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i, y: Integer;
  ListItem: TListItem;
  AllExist: Boolean;
begin
  AllExist := False;
  for i := 0 to ConnectList.Items.Count-1 do
    if ConnectList.Items[i].SubItems[0] = Socket.RemoteAddress then
    begin
      AllExist := True;
      y := i;
    end
    else
      AllExist := False;
  if AllExist then
    ConnectList.Items[y].SubItems[1] := 'Online'
  else
  begin
    ListItem := ConnectList.Items.Add;
    ListItem.Caption := Socket.RemoteAddress;
    ListItem.SubItems.Add(Socket.RemoteAddress);
    ListItem.SubItems.Add('Online');
  end;
end;
Und dann ist da die Frage wofür du AllExist eigentlich brauchst?

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:
procedure TClientNameBut.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i, FoundItem: Integer;
  ListItem: TListItem;
begin
  FoundItem := -1;
  for i := 0 to ConnectList.Items.Count-1 do
    if ConnectList.Items[i].SubItems[0] = Socket.RemoteAddress then
    begin
      FoundItem := i;
      Break;
    end;
  if FoundItem >= 0 then
    ConnectList.Items[FoundItem].SubItems[1] := 'Online'
  else
  begin
    ListItem := ConnectList.Items.Add;
    ListItem.Caption := Socket.RemoteAddress;
    ListItem.SubItems.Add(Socket.RemoteAddress);
    ListItem.SubItems.Add('Online');
  end;
end;
// EDIT:
Und dann fällt mir gerade auf...
Socket.RemoteAdress schreibst du in Caption und SubItems[0] und suchst es in Subitems[1]. Da steht aber Online drin... ;-)
(entsprechend korrigiert, siehe highlight)


Robii - Fr 26.06.09 16:05

Besten Dank für die Hilfe habs verstanden & klappt jetzt.
Gruiß