Delphi 7-如何在客户端套接字断开连接时删除Listview项标题

Delphi 7-如何在客户端套接字断开连接时删除Listview项标题,delphi,delphi-7,Delphi,Delphi 7,当客户端套接字与服务器套接字断开连接时,我正在尝试从listview中删除项目标题。在我的代码中,当客户端连接到服务器时,listview会添加一个图标和一个标题(client.hostname),但是当客户端断开连接时,如何删除该项呢列表视图1.items.delete.caption(socket.host)。有什么帮助吗 尽管我的英语很差,我还是要解释一下:我只需要从listview中删除一个项目,这样客户端套接字就会断开连接。Ken White先生给了我一个几乎相同的问题的解决方案,但我

当客户端套接字与服务器套接字断开连接时,我正在尝试从listview中删除项目标题。在我的代码中,当客户端连接到服务器时,listview会添加一个图标和一个标题(client.hostname),但是当客户端断开连接时,如何删除该项呢<代码>列表视图1.items.delete.caption(socket.host)。有什么帮助吗

尽管我的英语很差,我还是要解释一下:我只需要从listview中删除一个项目,这样客户端套接字就会断开连接。Ken White先生给了我一个几乎相同的问题的解决方案,但我无法将其应用于多个客户端连接到服务器的情况,即,如何删除属于刚刚断开连接的主机的listview标题

我的serversocket1代码:(我将serversocket1重命名为socket1)

在客户端断开连接时尝试删除项目时使用的代码:

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;
程序TForm1.socket1ClientDisconnect(发送方:TObject;
套接字:TCustomWinSocket);
变量
L:TListItem;
开始
L:=listview1.FindCaption(0,inttostr(socket.Handle),false,true,false);
如果是的话
L.删除;
结束;

但是listview项不会删除。

您需要先找到添加项的索引,即Listview1.items.IndexOf(socket.host),然后删除该特定索引处的项。

我更改了代码:

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;
程序TForm1.socket1ClientDisconnect(发送方:TObject;
套接字:TCustomWinSocket);
变量
L:TListItem;
开始
L:=listview1.FindCaption(0,inttostr(socket.Handle),false,true,false);
如果是的话
L.删除;
结束;
为此:

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;
程序TForm1.socket1ClientDisconnect(发送方:TObject;
套接字:TCustomWinSocket);
变量
L:TListItem;
开始

L:=listview1.FindCaption(0,socket.remotehost,false,true,false);//我发布的代码也不适用于此,这有什么原因吗?你还没有解释你要解决的问题是什么。你能这样做吗?Welisson,你还没有给我们任何关于
列表视图中的内容如何与主机相关的信息。您在
列表视图.Caption中存储了哪些与
套接字中的哪个属性相关的信息?(
TCustomWinSocket
没有
Host
属性-它有一个
LocalHost
RemoteHost
,即使其中一个是您正在引用的,我们也不知道它与您的
列表项有何关系。标题
ListView.Items.IndexOf
要求您已经有一个
TListItem
作为参数传递。请参阅,它将其声明为
TListItems.IndexOf(值:TListItem):Integer
。你的代码无法编译。是的,这是正确的。您正在将
Socket.RemoteHost
存储为
ListView1.AddItem
中的
ListItem
的标题,因此您还应该在调用
ListView1.FindCaption
时使用
Socket.RemoteHost
。根据您的代码在之后对
套接字执行的操作,您可能需要先释放
套接字
,然后再删除
FindCaption
返回的
列表项
,但我无法从您的代码片段中看出这一点。
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;