Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: raul338 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
(http://darkkaiser.cafe24.com/blog/attach/1/1212137820.jpg)
Poniendo el triangulo arriba y remarcando el Header de la columna ordenada.
Pues se me ocurrio buscar como lograr eso, y encontre Esto (http://msdn.microsoft.com/en-us/library/bb775247%28VS.85%29.aspx) 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
Private Const HDF_SORTDOWN As Long = &H400
Private Const HDF_SORTUP As Long = &H200
En las Propiedades
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
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:
(http://raul338.iespana.es/ScreenShotucListViewEx.jpg)
Aunque no es muy lindo que quede asi digamos.... para que paresca un ListView Comun y corriente, con este codigo alcanza
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 (http://www.mediafire.com/?tuwyjihu183e4x7)
-
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.
-
Buen punto raul, yo lo hacia como dice leandro con iconos, y hacia lo mismo a veces... buen fix!
saludos che
-
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 (http://msdn.microsoft.com/en-us/library/bb775247(VS.85).aspx) - Seccion fmt
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 (http://msdn.microsoft.com/en-us/library/bb776779(v=VS.85).aspx) 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!
-
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???
-
Ese problema esta en la lógica binaria, fíjate bien de haber copiado las comparaciones
If (HDF_SORTDOWN And uHDI.fmt) Then
ColumnOrder = soDescending
ElseIf (HDF_SORTUP And uHDI.fmt) Then
ColumnOrder = soAscending
Else
ColumnOrder = soDefault
End If
y
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
-
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
-
Muy Buen aporte ;D
.. me ire a hechar un revisada a la msdn