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.
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!!!
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.
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
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 (https://msdn.microsoft.com/en-us/library/windows/desktop/bb761311%28v=vs.85%29.aspx). (1er. resultado de Google :silbar:)
Saludos!
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.