Por que Un ListBox con mas de 32767 items no funciona

Iniciado por Fran1946, 30 Agosto 2015, 17:29 PM

0 Miembros y 1 Visitante están viendo este tema.

Fran1946

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:


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.

79137913

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!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Fran1946

#2
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.

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.

Grave

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
"y el conocimiento os hara libres"

Module Console1
   Console.Write("Hello Word")
   Console.ReadLine()
End Module
http://aion.cr0n0triger.operaunite.com/

MCKSys Argentina

Cita de: Fran1946 en 31 Agosto 2015, 22:32 PM
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. (1er. resultado de Google  :silbar:)

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Fran1946

#5
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í:



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.