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:
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 SubAlgué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.