Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problemas com ListView


Xistyle

Pergunta

Prezados, bom dia!

Estou enfrentando mais um problema com o VB6. Estou trabalhando com a ListView, e deixando com cara de uma grid. Estou usando algumas APIs também para conseguir exibir imagens ou outros recursos.

O fato é o seguinte: existe uma tela que apenas exibe uma lista de documentos (Tela Documentos). Essa tela possui um botão que leva a uma outra tela, onde é possível anexar os arquivos (Tela Profile). Um profile pode ter N arquivos. Nela posso incluir um novo arquivo a um profile já existente, criar um novo profile, excluir um profile, excluir um arquivo de um profile já existente ou ainda apenas visualizar os arquivos que estão neste profile. Podemos ilustrar o profile como se fosse uma pasta, com as mesmas permissões que o Windows provê para os usuários (alterar, editar, somente leitura).

Quando eu carrego a tela de documentos, os arquivos são carregados normalmente. Porém, quando abro a tela de profiles e a fecho, após alguma operação das que citei acima (ou não fazendo nada), é chamada a rotina para carregar os documentos novamente na tela de documentos. Ao chamar a rotina, os itens são adicionados ao ListView. O primeiro item é adicionado normalmente (text e subitems). Quando o próximo item é adicionado, os valores do item anterior são apagados! Pensei que poderia ser algum problema com instância de formulários, mas não é.

Abaixo segue o código com algumas explicações de rotinas:

Private Sub lsubCarregarDocumentos()
On Error GoTo erro

Dim llngIndice              As Long
Dim llngIDProfile           As Long
Dim lfsoVerificarArquivo    As FileSystemObject
Dim lstrSQL                 As String
Dim sTypeName               As String
Dim lstrCaminhoArquivo      As String
Dim sClass                  As String * MAX_PATH
Dim lrsProfiles             As ADODB.Recordset
Dim lrsArquivo              As ADODB.Recordset
Dim lvi                     As LVITEM
Dim ft                      As FILETIME
    
    Set lfsoVerificarArquivo = New FileSystemObject

    Me.MousePointer = vbHourglass

    '#  Limpa o listview
    lvwDocumentos.ListItems.Clear
    lvwDocumentos.Visible = False
    
    '# Carrega dados como ID do Profile, ID do Documento, Tipo do Documento, Data em que foi anexado
    lstrSQL = "EXEC SEL_DOCPROCANDA " & mclsAdvProcessos.getlngIDAdv_Processo & ",NULL,NULL,NULL"
    
    '# Essa função genérica faz as verificações se existem dados e, caso existam, carrega-os no recordset
    If gfcnLocalizarDados(lrsProfiles, lstrSQL, 0) = True Then
           
        While Not lrsProfiles.EOF
            
            '# Essa função genérica de leitura verifica o tipo de dado do campo no banco e faz as conversões
            llngIDProfile = gfcnLerDado(lrsProfiles("IDDOC_PROFILE"))
            
            '# Verifica se a pasta existe (início)
            If lfsoVerificarArquivo.FolderExists(gtParametrosGerais.strCaminhoDocumento & gtParametrosGerais.strIdentificacaoBanco & "\" & llngIDProfile) Then
                
                '# Usada para verificação da existência do arquivo
                lstrSQL = "SELECT caminhodocumento FROM adv_profiledocx WHERE idadv_documento = " & gfcnLerDado(lrsProfiles("IDADV_DOCUMENTO"))
                
                If gfcnLocalizarDados(lrsArquivo, lstrSQL, 0) = True Then
                        
                        lstrCaminhoArquivo = gtParametrosGerais.strCaminhoDocumento & gtParametrosGerais.strIdentificacaoBanco & "\" & llngIDProfile & "\" & gfcnLerDado(lrsArquivo("CAMINHODOCUMENTO"))
                        
                        '# Verifica se o arquivo contido na tabela existe na pasta
                        If lfsoVerificarArquivo.FileExists(lstrCaminhoArquivo) Then
                            
                            Screen.MousePointer = vbHourglass
                            lvi.mask = LVIF_IMAGE
                            
                            '#Verificação nas chaves do registro (início)
                            If (RegEnumKeyEx(HKEY_CLASSES_ROOT, 0, Right(lstrCaminhoArquivo, 4), MAX_PATH, _
                                    0, sClass, MAX_PATH, ft) = ERROR_SUCCESS) Then
                                    
                                If (Asc(Trim(Right(lstrCaminhoArquivo, 4))) = vbAscDot) Then
                                    sTypeName = GetFileTypeName(Right(lstrCaminhoArquivo, 4))
                                    
                                    If Len(sTypeName) Then
                                    
                                        lvwDocumentos.ListItems.Add lvwDocumentos.ListItems.Count + 1
                                        lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Text = gfcnLerDado(lrsArquivo("CAMINHODOCUMENTO"))
                                        lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Tag = lstrCaminhoArquivo
                                        lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(1) = Format(gfcnLerDado(lrsProfiles("O_DATA_ANEXO")), "DD/MM/YYYY")
                                        lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(2) = mconstProcesso
                                        lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(3) = llngIDProfile
                                        lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(4) = 0
                                        lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(5) = gfcnLerDado(lrsProfiles("TIPODOCUMENTO"))
                                        
                                        lvi.iItem = lvwDocumentos.ListItems.Count - 1
                                        lvi.iImage = GetFileIconIndex(Mid(lstrCaminhoArquivo, InStrRev(lstrCaminhoArquivo, "\") + 1, Len(lstrCaminhoArquivo) - InStrRev(lstrCaminhoArquivo, "\")), SHGFI_ICON)
                                        
                                        Call ListView_SetItem(m_hwndLV, lvi, lvwDocumentos.ListItems.Count - 1)
                                        
                                    End If
                                    
                                Else
                                    '# Arquivos com extensão de 3 caracteres
                                    If (Asc(Trim(Right(lstrCaminhoArquivo, 4))) = vbAscDot) Then
                                        sTypeName = GetFileTypeName(Right(lstrCaminhoArquivo, 4))
                                        
                                        If Len(sTypeName) Then
                                        
                                            lvwDocumentos.ListItems.Add lvwDocumentos.ListItems.Count + 1
                                            lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Text = gfcnLerDado(lrsArquivo("CAMINHODOCUMENTO"))
                                            lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Tag = lstrCaminhoArquivo
                                            lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(1) = Format(gfcnLerDado(lrsProfiles("O_DATA_ANEXO")), "DD/MM/YYYY")
                                            lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(2) = mconstProcesso
                                            lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(3) = llngIDProfile
                                            lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(4) = 0
                                            lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(5) = gfcnLerDado(lrsProfiles("TIPODOCUMENTO"))
                                            
                                            lvi.iItem = lvwDocumentos.ListItems.Count - 1
                                            lvi.iImage = GetFileIconIndex(Mid(lstrCaminhoArquivo, InStrRev(lstrCaminhoArquivo, "\") + 1, Len(lstrCaminhoArquivo) - InStrRev(lstrCaminhoArquivo, "\")), SHGFI_ICON)
                                            
                                            Call ListView_SetItem(m_hwndLV, lvi, lvwDocumentos.ListItems.Count - 1)
                                            
                                        End If '# Arquivos com extensão de 3 caracteres (FIM)
                                        
                                    Else
                                        
                                        '# Arquivos com extensão de 4 caracteres
                                        If (Asc(Trim(Right(lstrCaminhoArquivo, 5))) = vbAscDot) Then
                                            sTypeName = GetFileTypeName(Right(lstrCaminhoArquivo, 5))
                                            
                                            If Len(sTypeName) Then
                                            
                                                lvwDocumentos.ListItems.Add lvwDocumentos.ListItems.Count + 1
                                                lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Text = gfcnLerDado(lrsArquivo("CAMINHODOCUMENTO"))
                                                lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Tag = lstrCaminhoArquivo
                                                lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(1) = Format(gfcnLerDado(lrsProfiles("O_DATA_ANEXO")), "DD/MM/YYYY")
                                                lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(2) = mconstProcesso
                                                lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(3) = llngIDProfile
                                                lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(4) = 0
                                                lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(5) = gfcnLerDado(lrsProfiles("TIPODOCUMENTO"))
                                                
                                                lvi.iItem = lvwDocumentos.ListItems.Count - 1
                                                lvi.iImage = GetFileIconIndex(Mid(lstrCaminhoArquivo, InStrRev(lstrCaminhoArquivo, "\") + 1, Len(lstrCaminhoArquivo) - InStrRev(lstrCaminhoArquivo, "\")), SHGFI_ICON)
                                                
                                                Call ListView_SetItem(m_hwndLV, lvi, lvwDocumentos.ListItems.Count - 1)
                                                
                                            End If
                                            
                                        End If '# Arquivos com extensão de 4 caracteres (FIM)
                                        
                                    End If
                                        
                                End If
                                
                                Call ListView_SetSelectedItem(m_hwndLV, 0)
                                Call ListView_EnsureVisible(m_hwndLV, 0, False)
                                
                            End If '#Verificação nas chaves do registro (fim)
                            
                            Screen.MousePointer = vbNormal
                                            
                        End If '# Verifica se o arquivo contido na tabela existe na pasta (FIM)
                            
                End If '# Usada para verificação da existência do arquivo (FIM)
            
            End If '# Verifica se a pasta existe (FIM)

            If Not lrsProfiles.EOF Then
                lrsProfiles.MoveNext
            End If
            
        Wend
        
        lrsProfiles.Close
       
    End If

    Set lrsProfiles = Nothing
    Set lrsArquivo = Nothing
    
    '# Realiza a ordenação dos arquivos por data em que foram anexados
    Call lvwDocumentos_ColumnClick(lvwDocumentos.ColumnHeaders(2))

    lvwDocumentos.Visible = True
    Me.MousePointer = vbDefault

    Exit Sub
    
erro:
    Set lrsProfiles = Nothing
    Set lrsArquivo = Nothing
    
    Me.MousePointer = vbDefault
    
    If Err.Number = 52 Then
        MsgBox "Você não tem permissão para acessar a pasta de documentos do processo no servidor. Entre em contato com o administrador de rede.", vbCritical, "Zats & Loib"
    Else
        MsgErro Err.Number, Err.Description
    End If

End Sub

Alguém tem alguma idéia do que possa estar acontecendo? Achei que poderia ser algo relacionado ao listview se perder nos índices... mas nada disso.

Abraços!

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

o q faz a funcao ListView_SetItem()?? o q é m_hwndLV e qual o valor contido nele??

pra q serve o tipo LVITEM??

pelo q entendi td isso são das APIs q você falou, certo?? imagino q você esteja usando elas pra incrementar o visual, certo??

minha recomendacao, é q você comente todas a partes do codigo relacionada a essas APIs, e veja se funciona direito.

se for mesmo um problema relacionado com as APIs, depois va descomentando as linhas aos poucos pra ver se você descobre qual parte causa esse erro.

Link para o comentário
Compartilhar em outros sites

  • 0

Ah não creio! O erro nem tava nessa rotina...

De alguma forma, quando a rotina passava pelo

'# Realiza a ordenação dos arquivos por data em que foram anexados
    Call lvwDocumentos_ColumnClick(lvwDocumentos.ColumnHeaders(2))
O mais esquisito é que debugando ele já apagava os dados ao adicionar um novo item. A rotina de ordenação estava assim:
Private Sub lvwDocumentos_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    
    If lvwDocumentos.SortKey <> ColumnHeader.Index - 1 Then
        lvwDocumentos.SortKey = ColumnHeader.Index - 1
        lvwDocumentos.SortOrder = lvwAscending
    Else
    
        If lvwDocumentos.SortOrder = lvwAscending Then
            lvwDocumentos.SortOrder = lvwDescending
        Else
            lvwDocumentos.SortOrder = lvwAscending
        End If
        
    End If
    
    lvwDocumentos.Sorted = -1
   
End Sub

Ai alterei o lvwDocumentos.Sorted = -1 por lvwDocumentos.Sorted = True e funcionou :/

Ainda tomo uns bons olé do VB :/

Obrigado kuroi!

Link para o comentário
Compartilhar em outros sites

  • 0

Na verdade, realizei outros testes e o Sorted corrigiu apenas um deles.

Os SubItems não são carregados, apenas o Text de cada ListItem.

Sendo assim, tentei definir uma variável x como ListItem e a usei da seguinte forma:

Dim x As ListView
   
   Set x = lvwDocumentos.ListItems.Add (Indice)
   
   With x
        .Text = "Teste"
        .SubItems(1) = Date
        .SubItems(2) = "Teste"
   End With

Isso resolveu o problema! Inclusive, trabalhou muito bem com as API's que adicionam ícones na ListView, sem usar a ImageList.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...