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.
Pergunta
Xistyle
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:
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 XistyleLink para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
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.