elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 03:13  


Tema destacado: Personaliza-Escoge el diseño del foro que más te guste.

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  Como recibir datos y ubicarlos segun le corresponda
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Como recibir datos y ubicarlos segun le corresponda  (Leído 2,762 veces)
ŞCØRPIØN-X3

Desconectado Desconectado

Mensajes: 119


Ver Perfil
Re: Como recibir datos y ubicarlos segun le corresponda
« Respuesta #15 en: 1 Junio 2011, 21:29 »

DarkMatrix, lo hice como me dijiste con un bucle aver que tal anda, pero una pregunta, esto tiene alguna consecuencia en el caso de que el listview posea muchos items? bueno cro que no pero quiero lograr la mejor estabilidad posible en mi proyecto xD. Muchas gracias :)


En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Como recibir datos y ubicarlos segun le corresponda
« Respuesta #16 en: 2 Junio 2011, 01:22 »

ŞCØRPIØN-X3.

Se te a alentisar demasiado con un simple For Next... digamos que con los primeros 1000 elementos irea rapido pero a medida que se eliminan, agregan etc etc, se alentizara de manera esuberante.

Una pequeña solución es crear una estructura

Código
 
type tlvFind
   lindexSrc as long ' // Indica de donde viene
   lindexDest as long ' // Indica a donde pertece
end type
 
 

Después creando un vector de la estructura y ordenando de menor a mayor o viceversa, el indice respectivo al Item del listview puedes usar la función ItsInArrayNR modificandola un poco para que busque de manera rapida en donde ubicar la informacion.

Temibles Lunas!¡.


En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
ŞCØRPIØN-X3

Desconectado Desconectado

Mensajes: 119


Ver Perfil
Re: Como recibir datos y ubicarlos segun le corresponda
« Respuesta #17 en: 2 Junio 2011, 04:09 »

Hola BlackZero, gracias por tu respuesta, no entiendo muy bien como aplicar tu codigo :S ese code me supera :/, mira, este es lo que yo codie hoy utilizando un bucle como me habian sugerido anteriormente:

Código:
Private Sub winsock1_DataArrival(index As Integer, ByVal BytesTotal As Long)

         Dim i As Long
         For i = 1 To ListView1.ListItems.Count
         If ListView1.ListItems.Item(i).Tag = index Then
         Listvieww1.ListItems.Item(i).ListSubItems(8).Text = Datos
         End If
         Next


Bueno, "Datos" contiene la informacion que llega por winsock... Espero aver que me sugieres, si con este code me va a servir o si me puedes explicar como seria el uso de tu code BlackZero estaria agradecido :), Muchas gracias por su ayuda :)

Edito: me olvide de mencionar que el tag de cada item tiene el index de su conexion xD
« Última modificación: 2 Junio 2011, 04:16 por ŞCØRPIØN-X3 » En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Como recibir datos y ubicarlos segun le corresponda
« Respuesta #18 en: 2 Junio 2011, 07:29 »

.

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
 
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
 
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
 
type stRelacion    lIndexSock as long    lIndexListView as longend 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
 
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
 
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:

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!¡.
.
« Última modificación: 2 Junio 2011, 07:47 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
DarkMatrix

Desconectado Desconectado

Mensajes: 125


Nuestro Limite es la Imaginacion


Ver Perfil WWW
Re: Como recibir datos y ubicarlos segun le corresponda
« Respuesta #19 en: 2 Junio 2011, 07:33 »

Si tu proyecto no va a tener muchos clientes conectados ps el for te sirve, de lo contrario aplica lo que dice BlackZero, yo lo haria mas o menos asi:

Declaro una variable global:

Código
Dim LvwSockIndex(100) as Long

Cuando un cliente se conecte uso su index para almacenar la posicion que ocupa en el listview, asi no tendria que almacenar el valor del sock en el tag del listview:

Ejemplo ( esto iria donde agregas el cliente al listview ) :

Código
Dim sItem as Listitem
 
Set sItem = Listview1.listitems.add (,, Index) ' Agrego el cliente al listview
sItem.Subitem(1) = "Cliente" ' Agrego algunos sub valores

' Luego Almaceno la posicion que ocupa en el listview en el indice de la matrix igual al indice del sock del cliente:

LvwSockIndex(Index) = Sitem.Index

Asi cuando el cliente mande un dato, solo tendrias que hacer esto:

Código
Private Sub winsock1_DataArrival(index As Integer, ByVal BytesTotal As Long)
 
        Listvieww1.ListItems.Item(LvwSockIndex(Index)).ListSubItems(8).Text = Datos
 
end sub

Espero que se entienda mas o menos la idea...
En línea

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Medir inclinacion y recibir datos en la PC
Electrónica
loelc 4 2,164 Último mensaje 17 Enero 2007, 09:06
por loelc
¿Tipo de variable para recibir datos binarios?
Programación C/C++
Bb-7 4 2,285 Último mensaje 18 Octubre 2008, 11:51
por AxXioma
Recibir datos del puerto serie en bytes.
.NET
Meta 2 3,783 Último mensaje 29 Octubre 2008, 23:24
por Meta
Duda sobre recibir datos de logueo
Programación Visual Basic
julietth 4 603 Último mensaje 7 Abril 2009, 05:08
por 43H4FH44H45H4CH49H56H45H
Ataque sin recibir datos?¿?
Wireless en Linux
kazero 0 525 Último mensaje 3 Marzo 2010, 18:59
por kazero
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines