Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con ListView delphi (https://www.clubdelphi.com/foros/showthread.php?t=74456)

maxinitto 21-06-2011 12:56:15

Ayuda con ListView delphi
 
Hola:

Estoy programando una aplicacion cliente/servidor en delphi 2009 y uso los socket por defecto, bueno pues tengo un listview con varias columnas pero para hacer una serie de pruebas solo añado 1 item por linea, los subitem por cada item estan vacios, y bueno ¿que almaceno?, pues almaceno el handle de cada conexion entrante al cliente es decir llega una conexion su handle se añade al listview bueno mi duda llega aqui en el evento onconnect del socket tengo puesto esto
Código Delphi [-]
procedure TForm2.cClientConnect(Sender: TObject; Socket: TCustomWinSocket);     // ONCLIENT CONNECT DEL SOCKET
var
  i : integer;
begin
  for i := 0 to Length(conexiones)-1 do // almaceno cada handle en un elemento de este array para posteriores comparaciones.
   if conexiones[i] = 0 then
   begin
    Conexiones[i] := Socket.Handle;
    LV_Lista.Items.Add.Caption := IntToStr(Conexiones[i]);
    exit;
   end;

end;

como veis por cada conexion entrante añado su handle al array y al listview bien, y luego uso tambien el evento ondisconnect...

Código Delphi [-]
procedure TForm2.cClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);  // ONCLIENT DISCONNECT DEL SOCKET
var
  i: integer;
begin

 for i := 0 to LV_Lista.Items.Count -1 do  // si se desconecta buscamos el handle del socket desconectado y lo eliminamos de la lista.
  if socket.Handle = StrToInt(LV_Lista.Items[i].Caption) then
    if LV_Lista.Items[i].Checked then
        LV_Lista.Items[i].Delete;


 for i := 0 to Length(conexiones)-1 do
   if Socket.Handle = conexiones[i] then
      conexiones[i] := 0;


end;

vale mi problema llega cnd en mi listview muestro 2 conexiones ordenadas logicamente

conex 1
conex 2

vale pues yo desconecto el conex 1 y me tira un runtime...:confused: no tengo ni idea de porque pone algo de accessviolation, en cambio si desconecto los servidores en el orde de conex 2 y conex 1 no me tira ningun runtime, no se... es rarisimo quizas no haya implementado bien el codigo

gracias de antemano.

Chris 21-06-2011 17:33:25

Cuando vas a quitar un elemento de una lista es preferible utilizar un contador decreciente. O mejor dicho, utilizar el FOR en modo decreciente.

En tu caso sería así:
Código Delphi [-]
procedure TForm2.cClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);  // ONCLIENT DISCONNECT DEL SOCKET
var
  i: integer;
begin

 for i := LV_Lista.Items.Count -1 downto 0 do  // si se desconecta buscamos el handle del socket desconectado y lo eliminamos de la lista.
  if socket.Handle = StrToInt(LV_Lista.Items[i].Caption) then
    if LV_Lista.Items[i].Checked then
        LV_Lista.Items[i].Delete;


 for i := Length(conexiones)-1 downto 0 do
   if Socket.Handle = conexiones[i] then
      conexiones[i] := 0;
end;

Lo que no me queda claro es cómo manejas el número de elementos que contiene el arreglo Conexiones. Aparte de ésto, no sé el por qué guardas el mismo valor en dos variables distintas (LV_Lista.Items y Conexiones).

Saludos,
Chris

maxinitto 21-06-2011 22:17:21

es verdad ejejejeje bueno gracias ya me funciono thanks!


La franja horaria es GMT +2. Ahora son las 19:54:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi