Autor Tema: [APORTE] Poner orden en columnas de ucListView  (Leído 3676 veces)

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

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
[APORTE] Poner orden en columnas de ucListView
« en: Noviembre 29, 2010, 07:27:07 pm »
Buenas. Esto es un agregado al ucListView de Carles PV en el que pongo mediante flags que las columnas muestren el triangulito al lado (winXP) o arriba y que ademas se ponga la cabecera de la columna azulada (win7)

Porque a veces las columnas se vuelven locas y hay que poner orden xD

Si alguno probo Win7, vera que en el ListView el orden se muestra de una forma distinta


Poniendo el triangulo arriba y remarcando el Header de la columna ordenada.

Pues se me ocurrio buscar como lograr eso, y encontre Esto que es parte de como se maneja un ListView por API. Me di cuenta que ya no se agrega un triángulo al listview, es anticuado, ahora es mediante unos flags en el formato de la cabecera. Entonces me decidí modificar el ucListView para que acepte eso en sus columnas. Y aqui el resultado

En el control de usuario, agregar lo siguiente

En las declaraciones
Código: (vb) [Seleccionar]
Private Const HDF_SORTDOWN As Long = &H400
Private Const HDF_SORTUP As Long = &H200

En las Propiedades
Código: (vb) [Seleccionar]
Public Property Get ColumnOrder(ByVal Column As Integer) As eSortOrderConstants
    Dim uHDI   As HDITEM
    If (m_hListView And m_hHeader) Then
        uHDI.mask = LVCF_FMT
        Call SendMessage(m_hListView, HDM_GETITEM, Column, uHDI)
        If (HDF_SORTDOWN And uHDI.fmt) Then
            ColumnOrder = soDescending
        ElseIf (HDF_SORTUP And uHDI.fmt) Then
            ColumnOrder = soAscending
        Else
            ColumnOrder = soDefault
        End If
    End If
End Property
Public Property Let ColumnOrder(ByVal Column As Integer, ByVal order As eSortOrderConstants)
    Dim uHDI   As HDITEM
    If (m_hListView And m_hHeader) Then
        With uHDI
            .mask = HDI_FORMAT
            Call SendMessage(m_hHeader, HDM_GETITEM, Column, uHDI)
            If order = soAscending Then
                .fmt = (.fmt And Not HDF_SORTDOWN) Or HDF_SORTUP
            ElseIf order = soDescending Then
                .fmt = (.fmt And Not HDF_SORTUP) Or HDF_SORTDOWN
            Else
                .fmt = .fmt And Not (HDF_SORTUP Or HDF_SORTDOWN)
            End If
        End With
        Call SendMessage(m_hHeader, HDM_SETITEM, Column, uHDI)
    End If
End Property

Y listo, para que ver la modificacion en accion ponen en un ucListView

Código: (vb) [Seleccionar]
Private Sub ucListView1_ColumnClick(Column As Integer)
    If ucListView1.ColumnOrder(Column) = soAscending Then
        ucListView1.ColumnOrder(Column) = soDescending
    Else
        ucListView1.ColumnOrder(Column) = soAscending
    End If

Y les quedara asi:


Aunque no es muy lindo que quede asi digamos.... para que paresca un ListView Comun y corriente, con este codigo alcanza

Código: (vb) [Seleccionar]
Private Sub ucListView1_ColumnClick(Column As Integer)
   Dim nCol As Integer

    With ucListView1
        If (.Count > 1) Then
            For nCol = 0 To 2
                If (nCol <> Column) Then .ColumnOrder(nCol) = soDefault
            Next nCol
            If .ColumnOrder(Column) = soAscending Then
                .ColumnOrder(Column) = soDescending
              Else
                .ColumnOrder(Column) = soAscending
            End If
            ' Aca su rutina para ordenar
        End If
    End With
End Sub

PD: Deben compilar el proyecto para verlo visualmente y ponerle un manifest, desde el IDE (salvo que le hayan puesto un manifest, aunque dudo que funcione) no se mostrará

Espero que les sirva!
Pueden bajar el control modificado, con el ejecutable y un ejemplo descargandolo Aca
« última modificación: Noviembre 30, 2010, 07:18:20 am por raul338 »

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:[APORTE] Poner orden en columnas de ucListView
« Respuesta #1 en: Noviembre 29, 2010, 11:05:59 pm »
Exelente Raul, buenisimo, no conosia esas constantes yo lo estaba haciendo a lo clasico con iconos, y supongo que con esto hasta se puede usar iconos y mostrar el orden.

Sale para la recopilacion de aportes

Saludos.

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:[APORTE] Poner orden en columnas de ucListView
« Respuesta #2 en: Noviembre 29, 2010, 11:32:02 pm »
Buen punto raul, yo lo hacia como dice leandro con iconos, y hacia lo mismo a veces... buen fix!

saludos che
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:[APORTE] Poner orden en columnas de ucListView
« Respuesta #3 en: Noviembre 30, 2010, 07:12:52 am »
Exelente Raul, buenisimo, no conosia esas constantes yo lo estaba haciendo a lo clasico con iconos, y supongo que con esto hasta se puede usar iconos y mostrar el orden.

Sale para la recopilacion de aportes

Saludos.

Ese es un problema xD, no se puede mezclar iconos con el flag de orden, es una lastima

Header Item - MSDN - Seccion fmt
Cita de: msdn
HDF_SORTDOWN
Version 6.00. Draws a down-arrow on this item. This is typically used to indicate that information in the current window is sorted on this column in descending order. This flag cannot be combined with HDF_IMAGE or HDF_BITMAP.

HDF_SORTUP
Version 6.00. Draws an up-arrow on this item. This is typically used to indicate that information in the current window is sorted on this column in ascending order. This flag cannot be combined with HDF_IMAGE or HDF_BITMAP.

(Nota, no se preocupen por la version 6.0, segun el msdn es de WinXP en adelante :D, no es que sea vista en adelante)

Es una pena, pero .... seguro poniendo un picturebox arriba se soluciona jajaja xD

Saludos!

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:[APORTE] Poner orden en columnas de ucListView
« Respuesta #4 en: Diciembre 11, 2010, 09:48:53 pm »
Che raul, lo probe recien, pero solo aparece el iconito con la flecha para abajo, el problema es que siempre me devuelve que esta en orden Descendente... que podra ser???
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:[APORTE] Poner orden en columnas de ucListView
« Respuesta #5 en: Diciembre 11, 2010, 11:06:26 pm »
Ese problema esta en la lógica binaria, fíjate bien de haber copiado las comparaciones

Código: (vb) [Seleccionar]
        If (HDF_SORTDOWN And uHDI.fmt) Then
            ColumnOrder = soDescending
        ElseIf (HDF_SORTUP And uHDI.fmt) Then
            ColumnOrder = soAscending
        Else
            ColumnOrder = soDefault
        End If

y

Código: (vb) [Seleccionar]
            If order = soAscending Then
                .fmt = (.fmt And Not HDF_SORTDOWN) Or HDF_SORTUP
            ElseIf order = soDescending Then
                .fmt = (.fmt And Not HDF_SORTUP) Or HDF_SORTDOWN
            Else
                .fmt = .fmt And Not (HDF_SORTUP Or HDF_SORTDOWN)
            End If

Todo depende de eso. Baje el proyecto y funciona, así que podes copiar y pegar el control. Fíjate que no estés usando iconos en el header (en los items y subitems no hay drama) ya que no se puede según el msdn (la verdad ni probe, pero si lo dice por algo es)

También tené en cuenta la versión del windows, probé en xp (sp3) y posterior. Creo que a partir de windows 2000 es soportado. Habría que probarlo en un xp común sin sp

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:[APORTE] Poner orden en columnas de ucListView
« Respuesta #6 en: Diciembre 11, 2010, 11:18:09 pm »
Si, copie y pegue exactamente eso.. el proyecto funciona bien, asi que ahora copie el user control y funciona.. pero que raro porque yo hice exactamente lo que vos dijiste...

bueno en fin, ya esta solucionado.
PD: yo uso w7 x64, con themes activados en el vb6, y en los .exe de mis proyectos :P asi que no hay drama por esa parte

saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

DarkStreaM

  • Bytes
  • *
  • Mensajes: 22
  • Reputación: +1/-4
  • Los Sentimientos son la fuente de todos los miedos
    • Ver Perfil
Re:[APORTE] Poner orden en columnas de ucListView
« Respuesta #7 en: Diciembre 11, 2010, 11:38:15 pm »
Muy Buen aporte  ;D
.. me ire a hechar un revisada a la msdn