|
Postada em 22/10/2004 11:05 hs
Bom Dia Voce me eviou o exemplo abaixo que estana secao de dicas, para ordenar um ListView de fora inteligente, de forma que numeros sejam ordenados por numeros edatas por datas, ao inves de serem consideradoscomo caracatres Eu pegueiese exempleinfelizente nao fucionou, pois ocorre o erro de : User definied-type not definied. O nome do meu Listview esta correto em todos os lugares, pois nao e ListView1, os comandos para serem colocados no modulo tambem foram colocados emesmo assim nao funcionou. Infelizmente eu nao sou bom em API's. Voce te alguma causa provavel para este problema? Obrigado e Abraco Use isto: Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) 'Usaremos o "Tag" de cada ColumHeader para armazenar 'se a coluna recebe valores: ' = N para Números ' = D para Datas ' = T para Textos If ColumnHeader.Tag = "N" Then ' SortListView ListView1, ColumnHeader.Index, ldtNumber, OrdAsc ElseIf ColumnHeader.Tag = "T" Then SortListView ListView1, ColumnHeader.Index, ldtString, OrdAsc Else SortListView ListView1, ColumnHeader.Index, ldtDateTime, True End If OrdAsc = Not OrdAsc End Sub Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long Public Sub SortListView(ListView As ListView, ByVal Index As Integer, _ ByVal DataType As ListDataType, ByVal Ascending As Boolean) On Error Resume Next Dim i As Integer Dim l As Long Dim strFormat As String Dim lngCursor As Long lngCursor = ListView.MousePointer ListView.MousePointer = vbHourglass LockWindowUpdate ListView.hwnd Dim blnRestoreFromTag As Boolean Select Case DataType Case ldtString blnRestoreFromTag = False Case ldtNumber strFormat = String$(20, "0") & "." & String$(10, "0") With ListView.ListItems If (Index = 1) Then For l = 1 To .Count With .Item(l) .Tag = .Text & Chr$(0) & .Tag If IsNumeric(.Text) Then If CDbl(.Text) >= 0 Then .Text = Format(CDbl(.Text), strFormat) Else .Text = "&" & InvNumber(Format(0 - CDbl(.Text), strFormat)) End If Else .Text = "" End If End With Next l Else For l = 1 To .Count With .Item(l).ListSubItems(Index - 1) .Tag = .Text & Chr$(0) & .Tag If IsNumeric(.Text) Then If CDbl(.Text) >= 0 Then .Text = Format(CDbl(.Text), strFormat) Else .Text = "&" & InvNumber(Format(0 - CDbl(.Text), strFormat)) End If Else .Text = "" End If End With Next l End If End With blnRestoreFromTag = True Case ldtDateTime strFormat = "YYYYMMDDHhNnSs" Dim dte As Date With ListView.ListItems If (Index = 1) Then For l = 1 To .Count With .Item(l) .Tag = .Text & Chr$(0) & .Tag dte = CDate(.Text) .Text = Format$(dte, strFormat) End With Next l Else For l = 1 To .Count With .Item(l).ListSubItems(Index - 1) .Tag = .Text & Chr$(0) & .Tag dte = CDate(.Text) .Text = Format$(dte, strFormat) End With Next l End If End With blnRestoreFromTag = True End Select ListView.SortOrder = IIf(Ascending, lvwAscending, lvwDescending) ListView.SortKey = Index - 1 ListView.Sorted = True If blnRestoreFromTag Then With ListView.ListItems If (Index = 1) Then For l = 1 To .Count With .Item(l) i = InStr(.Tag, Chr$(0)) .Text = Left$(.Tag, i - 1) .Tag = Mid$(.Tag, i + 1) End With Next l Else For l = 1 To .Count With .Item(l).ListSubItems(Index - 1) i = InStr(.Tag, Chr$(0)) .Text = Left$(.Tag, i - 1) .Tag = Mid$(.Tag, i + 1) End With Next l End If End With End If LockWindowUpdate 0& ListView.MousePointer = lngCursor End Sub
|
|
|
|
PC²
|
JUCUTUQUARA, VITÓRIA ES - BRASIL
|
|
Postada em 23/10/2004 09:40 hs
oLÁ AMIGO,
você pode, por gentileza, colocar somente a linha aonde ocorre o erro "User definied-type not definied." pois o VB deve indicá-la.
____________________________ PC² T+
|
|
|
|
Postada em 23/10/2004 18:22 hs
Public Sub SortListView(ListView As ListView, ByVal Index As Integer, _ ByVal DataType As ListDataType, ByVal Ascending As Boolean)
o Erro ocorreu na linha acima Obrigado
|
|
|
|
Postada em 25/10/2004 22:09 hs
Ola como vai? c viu a minha resposta? Um Abraço
|
|
|
|
Postada em 26/10/2004 14:35 hs
Ventana, eu uso uma maneira diferente de tratar a listview, podendo ordenar qualquer coluna ascendente ou descendente (num segundo clique da mesma coluna). Eu crio uma coluna a mais para cada coluna com data ou valor, e mantenho essas "clones" com largura zero para não aparecer. O conteúdo delas, eu preencho com a data ou valor correspondente usando uma formatação que permita classificar igual texto. Ao clicar na coluna com data ou valor, é a clone que faz a ordenação. Segue um exemplo pra você dar uma olhada. 'Num módulo qualquer: Public Sub OrdenaLvw(ByVal LVW As MSComctlLib.ListView, ByVal ColCabecalho As MSComctlLib.ColumnHeader) 'Ordena o ListView conforme a coluna especificada. If LVW.SortKey = ColCabecalho.Index - 1 Then LVW.SortOrder = IIf(LVW.SortOrder = lvwAscending, lvwDescending, lvwAscending) Else LVW.SortOrder = lvwAscending End If LVW.SortKey = ColCabecalho.Index - 1 LVW.Sorted = True End Sub 'A montagem e preenchimento de um listview (Name = LSV) no form, 'considerando que já foi criado uma consulta num recordset Rs:
LSV.ListItems.Clear LSV.ColumnHeaders.Clear LSV.ColumnHeaders.Add , , "Codigo", 1000 LSV.ColumnHeaders.Add , , "Tipo", 1500 LSV.ColumnHeaders.Add , , "Data", 1500, 2 LSV.ColumnHeaders.Add , , "Valor", 1500, 1 LSV.ColumnHeaders.Add , , "dt1", 0 'colunas com tamanho zero para não aparecer LSV.ColumnHeaders.Add , , "vl1r", 0 Do Until Rs.Eof Set Item = LSV.ListItems.Add Item.Text = Format(Rs!cod, "0000") Item.SubItems(1) = Rs!tipo Item.SubItems(2) = Format(Rs!data, "dd/mm/yy") Item.SubItems(3) = Format(Rs!valor, "#,##0.00") Item.SubItems(4) = Format(Rs!data, "yyyymmdd") 'formato que permite classificação como se fosse texto Item.SubItems(5) = Format(Rs!valor * 100, "000000000000000") Rs.Movenext Loop LSV.Refresh 'Evento do listview:
Private Sub LSV_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) If ColumnHeader = LSV.ColumnHeaders(3).Text Then OrdenaLvw LSV, LSV.ColumnHeaders(5) ElseIf ColumnHeader = LSV.ColumnHeaders(4).Text Then OrdenaLvw LSV, LSV.ColumnHeaders(6) Else OrdenaLvw LSV, ColumnHeader End If End Sub Olha, tem funcionado legal, experimenta e qualquer coisa, tamos aí....
|
TÓPICO EDITADO
|
|
|
|
PC²
|
JUCUTUQUARA, VITÓRIA ES - BRASIL
|
|
ENUNCIADA !
|
|
|
Postada em 26/10/2004 16:27 hs
oLÁ, FOI MAL fatou colocar uma coisa no MODULE: Public Enum ListDataType ldtString = 0 ldtNumber = 1 ldtDateTime = 2 End Enum
____________________________ PC² T+
|
|
|
|