No conozco mucho de sockets pero en términos generales pienso que tu problema no es de sockets. Me explico:
Tú mismo te has dado cuenta de la dificultad de sincronizar el índice de un ítem en el listview y una conexión.
Lo que yo haría es utilizar la propiedad
Data de TListItem. Data es un puntero de manera que puedes almacenar ahí virtualmente cualquier cosa. Podrías asignar una estructura- por ejemplo un record -a cada conexión nueva en la que incluyas los datos que identifiquen de manera única a la conexión:
Código:
type
PConnectionInfo = ^TConnectionInfo;
TConnectionInfo = record
RemoteAddress: ShortString;
{
otros datos que necesites para identificar
de manera única cada conexión
}
end;
Al momento de entrar una nueva conexión asignas una de estas estructuras a Data:
Código:
var
Info: PConnectionInfo;
Item: TListItem;
begin
// Inicializar la estructura
New(Info);
Info.RemoteAddress := Socket.RemoteAddress;
{
otros datos
}
// Agregar el item a la lista
Item := ListView1.Items.Add;
Item.Caption := Info.RemoteAddress;
Item.Data := Info;
end;
Cuando necesites tomar datos de la estructura de, por ejemplo, el ítem seleccionado haces un moldeo de datos:
Código:
PConnectionInfo(ListView1.SelectedItem.Data).RemoteAddress
y usas el evento OnDeletion (creo que se llama así) del listview para liberar memoria del puntero.
De esta forma cada ítem del listview "apuntará" a la estructura correcta sin depender de su posición en la lista. Además puedes guardar en dicha estructura otros datos de la conexión que necesites y no desees colocar en el listview.
// Saludos