Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: rapbyone en 19 Agosto 2016, 21:16 pm



Título: Como detectar cambios en un listbox en tiempo de ejecución
Publicado por: rapbyone en 19 Agosto 2016, 21:16 pm
Estimados, tengo el siguiente problema, necesito detectar cambios en un listbox en tiempo de ejecución, no solamente la cantidad de items, sino que también la edición de alguno de ellos, así como lo hace el evento change en un textbox. Se puede?

Atento a sus comentarios
gracias amigos


Título: Re: Como detectar cambios en un listbox en tiempo de ejecución
Publicado por: Eleкtro en 20 Agosto 2016, 04:55 am
Ups, te escribí el comentario de aquí abajo pensando que estaba en el foro de VB.NET... qué confusión más tonta y qué pérdida de tiempo hacer ese código suponiendo que no te pueda servir de nada, pero bueno, de todas formas ahí dejo el código, por que en esencia la información proporcionada te servría igualmente para adaptarlo a VB6, me refiero a la solución basada en los mensajes de ventana, y lo cierto es que no has aclarado si trabajas en VB6 o VB.NET y en este subforo de VB nunca se sabe si andan preguntando de VB.NET o de VB6...

Saludos!












Se puede?

Si, se puede, simplemente debes controlar los mensajes de ventana para ese ListBox.

En particular, para determinar si el texto o datos de un item han sido modificados, debes controlar el mensaje LB_INSERTSTRING o LB_SETITEMDATA respectivamente del tipo de item.

Para determinar cambios en la cantidad de items, debes controlar los mensajes LB_ADDSTRING y LB_DELETESTRING.

Los valores de los mensajes los puedes encontrar en el archivo "WinUser.h" de la SDK de Windows:
Citar
/*
 * Listbox messages
 */
#define LB_ADDSTRING            0x0180
#define LB_INSERTSTRING         0x0181
#define LB_DELETESTRING         0x0182
#define LB_SELITEMRANGEEX       0x0183
#define LB_RESETCONTENT         0x0184
#define LB_SETSEL               0x0185
#define LB_SETCURSEL            0x0186
#define LB_GETSEL               0x0187
#define LB_GETCURSEL            0x0188
#define LB_GETTEXT              0x0189
#define LB_GETTEXTLEN           0x018A
#define LB_GETCOUNT             0x018B
#define LB_SELECTSTRING         0x018C
#define LB_DIR                  0x018D
#define LB_GETTOPINDEX          0x018E
#define LB_FINDSTRING           0x018F
#define LB_GETSELCOUNT          0x0190
#define LB_GETSELITEMS          0x0191
#define LB_SETTABSTOPS          0x0192
#define LB_GETHORIZONTALEXTENT  0x0193
#define LB_SETHORIZONTALEXTENT  0x0194
#define LB_SETCOLUMNWIDTH       0x0195
#define LB_ADDFILE              0x0196
#define LB_SETTOPINDEX          0x0197
#define LB_GETITEMRECT          0x0198
#define LB_GETITEMDATA          0x0199
#define LB_SETITEMDATA          0x019A
#define LB_SELITEMRANGE         0x019B
#define LB_SETANCHORINDEX       0x019C
#define LB_GETANCHORINDEX       0x019D
#define LB_SETCARETINDEX        0x019E
#define LB_GETCARETINDEX        0x019F
#define LB_SETITEMHEIGHT        0x01A0
#define LB_GETITEMHEIGHT        0x01A1
#define LB_FINDSTRINGEXACT      0x01A2
#define LB_SETLOCALE            0x01A5
#define LB_GETLOCALE            0x01A6
#define LB_SETCOUNT             0x01A7
#if(WINVER >= 0x0400)
#define LB_INITSTORAGE          0x01A8
#define LB_ITEMFROMPOINT        0x01A9
#endif /* WINVER >= 0x0400 */
#if defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0400)
#define LB_MULTIPLEADDSTRING    0x01B1
#endif

Y toda la información necesaria sobre los valores de la parametización (WParam/LParam) y el valor de retorno de los mensajes que he mencionado los tienes en la MSDN:
  • List Box Messages (Windows) - MSDN (https://msdn.microsoft.com/en-us/library/windows/desktop/ff485967(v=vs.85).aspx)



Ejemplo para determinar cambios en un item:

Código
  1. Public Enum ListBoxMessages As Integer
  2.    LB_SETITEMDATA = &H19A
  3.    LB_INSERTSTRING = &H181 ' Equivalente a "LB_SETTEXT"
  4. End Enum
+
Código
  1. Public Class ListBoxEx : Inherits ListBox
  2.  
  3.    <Description("Occurs when the text of a single item has changed")>
  4.    Public Event ItemTextChanged As EventHandler(Of ListBoxItemTextChangedEventArgs)
  5.  
  6.    Protected Overridable Sub OnItemTextChanged(ByVal e As ListBoxItemTextChangedEventArgs)
  7.        If (Me.ItemTextChangedEvent IsNot Nothing) Then
  8.            RaiseEvent ItemTextChanged(Me, e)
  9.        End If
  10.    End Sub
  11.  
  12.    Protected Overrides Sub WndProc(ByRef m As Message)
  13.  
  14.        Select Case m.Msg
  15.  
  16.            Case ListBoxMessages.LB_INSERTSTRING
  17.                Dim itemIndex As Integer = m.WParam.ToInt32()
  18.                If (itemIndex = -1) Then ' Equivalente al último item en la colección.
  19.                    itemIndex = Me.Items.Count
  20.                End If
  21.                Dim newText As String = Marshal.PtrToStringUni(m.LParam)
  22.                Me.OnItemTextChanged(New ListBoxItemTextChangedEventArgs(itemIndex, newText))
  23.  
  24.            Case ListBoxMessages.LB_SETITEMDATA
  25.                Throw New NotImplementedException("")
  26.  
  27.        End Select
  28.  
  29.        MyBase.WndProc(m)
  30.  
  31.    End Sub
  32.  
  33. End Class
+
Código
  1. Public NotInheritable Class ListBoxItemTextChangedEventArgs : Inherits EventArgs
  2.  
  3.    Public ReadOnly Property ItemIndex As Integer
  4.    Public ReadOnly Property NewText As String
  5.  
  6.    Private Sub New()
  7.    End Sub
  8.  
  9.    Public Sub New(ByVal itemIndex As Integer, ByVal newText As String)
  10.        Me.ItemIndex = itemIndex
  11.        Me.NewText = newText
  12.    End Sub
  13.  
  14. End Class

Saludos