0

クライアントソケットがサーバーソケットから切断されたときに、リストビューから項目のキャプションを削除しようとしています。私のコードでは、クライアントがサーバーに接続するとリストビューにアイコンとキャプション (client.hostname) が追加されますが、クライアントが切断されたときに項目を削除するにはどうすればよいですか? Listview1.items.delete.caption(socket.host). 何か助けはありますか?

英語が下手ですが、説明しようと思います。必要なのは、リストビューからアイテムを削除して、クライアントソケットを切断することだけです。ケン・ホワイト氏は、ほとんど同じ質問に対する解決策を教えてくれましたが、サーバーに複数のクライアントが接続されている状況にうまく適合できませんでした。つまり、切断したばかりのホストに属するリストビューのキャプションを削除するにはどうすればよいですか?

私のserversocket1コード:(serversocket1の名前をsocket1に変更しました)

procedure TForm1.socket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin

ListView1.AddItem(Socket.RemoteHost, socket);
end;

クライアントの切断時にアイテムを削除しようとするために使用するコード:

procedure TForm1.socket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
L : TListItem;
begin
L:=listview1.FindCaption(0,inttostr(socket.Handle),false,true,false);
if L<>nil then 
L.Delete;
end;

しかし、リストビュー項目は削除されません。

4

2 に答える 2

1

最初に、追加されたアイテムのインデックス、つまり Listview1.items.IndexOf(socket.host) を見つけてから、その特定のインデックスでアイテムを削除する必要があります。

于 2013-10-17T14:55:54.800 に答える
1

コードを変更しました:

procedure TForm1.socket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
L : TListItem;
begin
L:=listview1.FindCaption(0,inttostr(socket.Handle),false,true,false);
if L<>nil then 
L.Delete;
end;

これに:

procedure TForm1.socket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
L : TListItem;
begin
L:=listview1.FindCaption(0,socket.remotehost,false,true,false); // <--changed this line socket.remotehost

if L<>nil then 
begin
L.Delete;
end;
end;

そして、それはうまくいきますが、正しい方法を作ったかどうかはわかりません。全てに感謝。

于 2013-10-17T19:04:34.610 に答える