.
Antes queda estas tecnicas que te menciono las he aplicado en mi ListViewEX... a lo mejor te sirva ( ListViewEx 2.0 ).
Seria mopdificando esta funcion para que trabajara con un vector a la estructura del tipo:
en el código de la función (el del enlace) modificas el vaBuff() as long por vaBuff as stRelacion y en las comparaciones donde aparece vaBuff pones la variable de la estructura stRelacion a buscar de manera rapida.
algo asi:
antes:
lo suplantas por algo similar a esto...
Ahora para hacer o estar creando dicha relación debes llenar cada elemento del vector donde guardaras la relación en IndiceSocket-IndiceFilaListView en el evento donde haces el AceptRequest del Socket.
algo asi:
Con eso se llena... ahora que si quieres quitar dicha relacion. solo seria modificando esta funcion de la misma manera:
Temibles Lunas!¡.
.
Antes queda estas tecnicas que te menciono las he aplicado en mi ListViewEX... a lo mejor te sirva ( ListViewEx 2.0 ).
Seria mopdificando esta funcion para que trabajara con un vector a la estructura del tipo:
Código (vb) [Seleccionar]
type stRelacion
lIndexSock as long
lIndexListView as long
end type
en el código de la función (el del enlace) modificas el vaBuff() as long por vaBuff as stRelacion y en las comparaciones donde aparece vaBuff pones la variable de la estructura stRelacion a buscar de manera rapida.
algo asi:
antes:
Código (Vb) [Seleccionar]
private function ExitsInArray (byval lvaltofind as long,byref vaBuff() as long,byref lPos as long) as boolean
'....algo de código
if lvaltofind= vabuff(indice) then
'...algo de código
end if
end function
lo suplantas por algo similar a esto...
Código (Vb,9,2,3,4,5) [Seleccionar]
type stRelacion
lIndexSock as long
lIndexListView as long
end type
private function ExitsInArray (byval lvaltofind as long,byref vaBuff() as stRelacion,byref lPos as long) as boolean
'....algo de código
if lvaltofind= vabuff(indice).lIndexSock then
'...algo de código
end if
end function
Ahora para hacer o estar creando dicha relación debes llenar cada elemento del vector donde guardaras la relación en IndiceSocket-IndiceFilaListView en el evento donde haces el AceptRequest del Socket.
algo asi:
Código (Vb) [Seleccionar]
private vaRelacion() as stRelacion
private sub algunproceso(byval index as long,... otros parametros del proceso o evento)
Dim lpos as long
Dim lub as long
Dim lIndexRow as long
'... Antes aceptas la conexion en este mismo proceso
lIndexRow = '...Agregas un registro mas al listview y obtienes su indice ( propiedad count y le resta 1 para obtener el indice de la fila...) )
if ( ExitsInArray(index, vaRelacion, lpos) ) 'buscamos si ya hay alguna relacion....
'// Ya hay una relacion pero como dicha relacion no esta en el listview actualmente o esta en desuso... solo la modificamos
vaRelacion(lpos).lIndexListView = index ' // como ya existia solo le actualisamos el registro al listview...
else
' // si no existe redimensionamos vaRelacion
if (itsarrayini(varptrarr(vaRelacion))=true) then
lub = ubound(vaRelacion)+1
redim preserve vaRelacion (lbound(vaRelacion) to lub)
vaRelacion(lub).lIndexSock = index
vaRelacion(lub).lIndexListView = lIndexRow
end if
end if
end sub
Con eso se llena... ahora que si quieres quitar dicha relacion. solo seria modificando esta funcion de la misma manera:
Código (Vb) [Seleccionar]
Private Function privRowDelete(ByRef vRowIndex As Long) As Boolean
Dim ln_Bytes As Long
Dim lng_PtrOld() As Byte
With PCVars.Rows
If .Count > 0 Then
ln_Bytes = LenB(.Row(0))
.Count = .Count - 1
If .Count > 0 And vRowIndex > InvalidValueArray Then
If ln_Bytes > 0 And vRowIndex + 1 <= .Count Then
ReDim lng_PtrOld(1 To ln_Bytes)
Call CopyMemory(ByVal VarPtr(lng_PtrOld(1)), ByVal VarPtr(.Row(vRowIndex)), ln_Bytes)
Call CopyMemory(ByVal VarPtr(.Row(vRowIndex)), ByVal VarPtr(.Row(vRowIndex + 1)), ln_Bytes * (.Count - vRowIndex))
Call CopyMemory(ByVal VarPtr(.Row(.Count)), ByVal VarPtr(lng_PtrOld(1)), ln_Bytes)
End If
ReDim Preserve .Row(0 To .Count - 1)
Else
Erase .Row()
End If
privRowDelete = True
End If
End With
End Function
Código [Seleccionar]
para que entiendas esta funcion has de cuenta que un array vector o matrix es una sucesion de valores uno atras de otro o uno delante de otro como la numeros:
0123456789
Ok bien el trabajo de copymemory es copiar bloques de ellos a otras partes es decir digamos que tenemos esto en la memoria...
aaaabbbbccccddddeeeeffff
ok? en la memoria un puntero es de 4 bytes (en arquitecturas de 32 bits vb es de 32 bits), bien lo que se hace es que la dirrecion fisica de un puntero indica donde esta algo lo que sea...
ahora par LenB() obtiene el peso en bytes de un indice de un elemento de un array o vector... despues se multiplica por la cantidad de elementos a deszplazar.. digamos ahora si:
aaaabbbbccccddddeeeeffff
Como vez puse de alguna manera 4 a, 4 b 4c etc... por que digamos que son punteros ( 4 bytes = long = puntero ) funcion VarptrArr().
Cada 4 bytes = 1 elemento del indice de un vector/array por lo tanto lenb(vaRelacion(indice)) = 4 u 8 bytes ( puede variar aun que si hay punteros o declaracion de strings o mas arrays no inicializado dentro de la estructura es comun que sean 4 bytes de lo contrario en este caso como son todos long te dara 8 bytes cada elemento de vaRelacion(indice)... )
Ok llendo al grano de esto lenb(vaRealacion(indice)) = 8 por lo tanto de:
aaaabbbbccccddddeeeeffff
"aaaabbbb" se decuce que que como esta la estructura en la 1ra variable es lIndexSock las "aaaa" indican este valor y las "bbbb" indicaran lIndexListView el trabajo del codigo es que si quieres remover por ejemplo el indice 1 de vaRelacion ( es decir "ccccdddd" ) se hace esto:
Se hace un backup de "ccccdddd" en un array de Bytes(0 to (lenb(vaRelacion(indice))-1)) o bien (0 to 7) como ya habíamos analisado...
lng_PtrOld = {"ccccdddd"} ' 1er copymemory
se mueve el bloque hacia la izquierda....
aaaabbbbeeeeffffeeeefffff ' 2do copymemory
como vez ahora se repitieron "eeeeffff" pero como somos organisados y queremos que nuestro proceso sea maleable y adaptable para otros aspectos que quisas nos sirvan en un futuro hacemos que lo guardado en el array de bytes (en este caso lng_PtrOld) lo mandamos al final...
Hacemos un 3er copymemory para mandar lo resguardado al final quedando
quedando:
aaaabbbbeeeeffffccccdddd ' // 3er copymemory
al final aplicamos un redim preserve para eliminar ahora si el ultimo indice y quedaria haci...
aaaabbbbeeeeffff
De esta manera se eliminara un elemento de un array/vector cualquiera de manera veloz es la mas veloz que existe en vb6
en si solo se nesesitaria 1 copymoemy para este caso pero quise explicarte el por que de 3 copymemory... ya que si es otra estructura puede que cada indice el puntero sea un puntero al bloque de memoria donde se encuentren las variables pero como no es el caso puedes usar 1 copymemory libremente...
Temibles Lunas!¡.
.