Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Fran1946 en 30 Agosto 2015, 17:29 pm



Título: Por que Un ListBox con mas de 32767 items no funciona
Publicado por: Fran1946 en 30 Agosto 2015, 17:29 pm
Hola a todos:

Tengo un problema que me desconcierta, tengo este simple código, para quitar todos los Items seleccionados, el ListBox tiene MultiSelect = 2 - Extended:

Código:
Private Sub NoSeleccion()
    Dim i As Long
    Ocupado = True
    For i = 0 To List2.ListCount - 1
       List2.Selected(i) = False
    Next
    Ocupado = False
End Sub

Pues mi sorpresa es que List2 después de llenarlo tiene 57647 items y este bucle For, simplemente no funciona por que List2.ListCount tiene un valor de -45.
Y además List2.Listindex a partir de 32768 su valor, en lugar de 32769 tiene un valor de -32767.
Por lo que deduzco que el puntero trabaja como Integer + - 32767, he buscado información sobre este tema pero no encuentro nada.

Y entonces que se puede hacer con ListBox que almacenen mas de 32767 items.

Hay alguna forma de solucionar esto, se puede manejar este ListBox mediante SendMessage?

Agradecería cualquier ayuda por que no salgo de mi asombro.

Un saludo.


Título: Re: Por que Un ListBox con mas de 32767 items no funciona
Publicado por: 79137913 en 31 Agosto 2015, 15:51 pm
HOLA!!!

Tu deduccion es correcta, es un +/-integer el index y el listcount, soluciones 2:

1, Utilizar un Listview que deberia tener limite long creo.

2, y mas simple para tu codigo, usar una variable CT (contadora) cada vez que agregas o quitas un elemento, de tal manera que sepas la cantidad que tenes, y cuando llegas a 32769 te vas a otro for que empiece desde -32767, todo asi hasta que se complete CT.

GRACIAS POR LEER!!!


Título: Re: Por que Un ListBox con mas de 32767 items no funciona
Publicado por: Fran1946 en 31 Agosto 2015, 22:32 pm
Gracias por responder:

Lo de seleccionar el contenido del ListBox entero no importa el número de items que tenga, ya lo he solucionado con SendMessage y una sola línea de código.
Código:
SendMessage list.hwnd, LB_SETSEL, True, ByVal -1 'select all
SendMessage list.hwnd, LB_SETSEL, False, ByVal -1 'deselect all

No me gusta utilizar ListView, salvo que sea imprescindible, es mucho mas lioso e innecesario para una simple lista, pero voy a probar tu sugerencia.

Pero ahora lo que necesito es copiar todos los items seleccionados (sucesivos o no) de un ListBox a otro ListBox, y lógicamente con SendMessage, pero no encuentro nada.

Alguna idea?

Un saludo.


Título: Re: Por que Un ListBox con mas de 32767 items no funciona
Publicado por: Grave en 1 Septiembre 2015, 04:50 am
creas tu propio control con soporte para mas elementos solo creas una clase nueva y heredas todo de la clase ListBox y adentro escribes una nueva funcion o propiedad para listcount y al final tendrias que agregar esa clases a los controles generales del editor grafico, no le veo mayor dificultad


Título: Re: Por que Un ListBox con mas de 32767 items no funciona
Publicado por: MCKSys Argentina en 1 Septiembre 2015, 07:07 am
Pero ahora lo que necesito es copiar todos los items seleccionados (sucesivos o no) de un ListBox a otro ListBox, y lógicamente con SendMessage, pero no encuentro nada.

Revisa esto (https://msdn.microsoft.com/en-us/library/windows/desktop/bb761311%28v=vs.85%29.aspx). (1er. resultado de Google  :silbar:)

Saludos!


Título: Re: Por que Un ListBox con mas de 32767 items no funciona
Publicado por: Fran1946 en 1 Septiembre 2015, 20:39 pm
Hola Grave:
Muchas gracias por tu ayuda, pero esa solución me parece muy complicada, y ademas yo no se hacer una clase de este tipo, si no te importa explicarme como se haría, te lo agradecería y una cosa mas que aprendo.

Hola MCKSys Argentina:
Gracias también a ti por tu ayuda, en el link que me indicas, solo tiene la constante pero no el valor Hex, pero el tener que buscarlo luego me ha servido para encontrar la forma perfecta de hacerlo.
Por si a alguien le sirve, y como agradecimiento lo aporta aquí:

Código:

Public Function CopiarSeleccionados(list As ListBox) As Long
     Dim numSelected As Long, i As Long
    
    'lee el nº de items seleccionados
    'si el listbox es single-select style numSelected retorna -1 (LB_ERR).
    'si el listbox es multiselect style,y niguno es seleccionado,
    'numSelected rettorna 0, si hay seleccionados, numSelected retorna el nº seleccionado (del List.SelCount)
     numSelected = SendMessage(list.hwnd, LB_GETSELCOUNT, 0&, ByVal 0&)
    'debug ...
     'Debug.Print numSelected; " items seleccionados:"
     'Debug.Print "inddice", "item"
     CopiarSeleccionados = 0
     If numSelected > 0 Then
        'dimensiona un array largo para almacenar los items seleccionados
        ReDim sSelected(0 To numSelected - 1) As Long
        'pasa el array a Sendmessage para que lo llene con el item seleccionado
        ret = SendMessage(list.hwnd, LB_GETSELITEMS, numSelected, sSelected(0))
        'debug ...
        For i = 0 To numSelected - 1
            Debug.Print list.list(sSelected(i))   'el contenido del item
            'aqui lo que se necesite
        Next
     End If
End Function


Un saludo a todos.