Access
 sql >> Base de Dados >  >> RDS >> Access

Atribuindo imagens aos itens do ListView Tutorial-03

O controle ActiveX ImageList.


Para atribuir imagens ao controle ListView, precisamos da ajuda de outro controle ActiveX:o ImageList Ao controle. Vimos ícones na visualização do Windows Explorer, imagens semelhantes a pastas no estado de pasta fechada, quando você clica na pasta, exibe uma imagem de pasta aberta e diferentes tipos de imagens com base no tipo de arquivo. Não temos muita flexibilidade aqui, mas podemos exibir imagens de ícone nos ColumnHeaders do controle ListView , Lista de itens e ListSubItems membros do objeto ao preencher seu conteúdo.

As imagens de demonstração de amostra.


A imagem de exemplo da listagem dos funcionários da NorthWind Trading com suas fotos (pequenas imagens) no controle ListView:

Tamanhos de imagem maiores aumentarão a altura da linha de registros, mas as fotos podem ser maiores que isso.

Uma imagem de exemplo do controle ListView é fornecida abaixo (no painel do lado direito) que usamos junto com o controle TreeView. O controle TreeView ActiveX foi apresentado a você em uma série anterior de tutoriais sobre o controle TreeView. Você pode encontrar os links List of TreeView Control Tutorial Series na parte inferior desta página.

Na imagem acima, usei imagens de ícone em todas as colunas de dados e nos rótulos de cabeçalho de coluna para demonstrar a possibilidade de exibição de imagem no controle ListView.

Os estados de fechamento e abertura da pasta são exibidos no painel esquerdo nos nós de controle do TreeView e funcionam de maneira diferente dos itens do ListView. A pasta aberta A imagem é exibida quando o nó TreeView recebe um clique. Um segundo clique no mesmo Node exibe a pasta fechada imagem.

A série de tutoriais de programação de controle ListView.

Espero que você tenha passado pelas sessões de tutorial anteriores do controle ListView-1 e 2 e esteja pronto para assumir este novo episódio sobre o uso de ImageList Controle junto com o ListView Ao controle. Os links anteriores do Tutorial são fornecidos abaixo para revisão e para se preparar para continuar com esta Sessão. Alguns dos conceitos básicos do ListView Control já estão apresentados e explicados lá com o Código VBA e você estará em melhor posição para continuar aqui e entender o que está acontecendo aqui.



  1. Tutorial de controle ListView-01.

  2. Tutorial de controle ListView-02.

Dados de origem e formulário de demonstração.


Vamos começar com um novo formulário e a tabela Employees para nosso novo projeto de demonstração de controle ListView. Importe a tabela Employees do banco de dados de exemplo NorthWind.accdb.



  1. Crie uma nova consulta SELECT com o SQL fornecido abaixo e salve-a com o nome EmployeesQ .
    SELECT [TitleOfCourtesy] & " " & [FirstName] & " " & [LastName] AS [Employee Name], 
    Employees.EmployeeID, 
    Employees.Title, 
    Employees.HireDate, 
    Employees.Address, 
    Employees.City, 
    Employees.Region, 
    Employees.PostalCode, 
    Employees.Country, 
    Employees.HomePhone, 
    Employees.Extension, 
    Employees.Notes
    FROM Employees;
    

  2. Se a estrutura da sua tabela Employees for diferente, não importa. Apenas para o primeiro valor de coluna, combinei três valores de coluna para formar o [Nome dos funcionários] como a primeira coluna. Outros valores de nome de coluna você pode tomar como você os tem e em qualquer ordem, todos eles ou menos como você quiser.

  3. Crie um novo formulário e abra-o no modo Design.

  4. Insira um Controle ListView da Microsoft da Lista de controles ActiveX.

  5. Insira um Controle ImageList da Microsoft também da Lista de controles ActiveX.

  6. Redimensione o controle ListView como a imagem de exemplo no formulário abaixo. Mova o controle ImageList e coloque-o no canto superior direito do controle ListView, conforme mostrado na imagem. Você pode colocá-lo em qualquer lugar em um local conveniente no formulário. Ele não aparecerá no formulário quando o formulário estiver no modo de exibição normal.

    • Selecione o Controle ListView e exibir a folha de propriedades.

    • Altere o Nome Valor da propriedade para ListView1.

    • Selecione o Controle ImageList , exiba sua folha de propriedades e altere o Nome Valor da propriedade para ImageList0 .

    • Observação: Ambos os controles acima têm suas próprias folhas de propriedades dedicadas. Seus nomes e valores de propriedade também podem aparecer na Folha de Propriedades do Access. Se fizermos algumas alterações na folha de propriedades do Access, todas elas podem não ser atualizadas nos controles ListView e ImageList. Temos que fazer alterações na própria Folha de Propriedades do Controle.

      Folha de propriedades do controle ListView.


  7. Clique com o botão direito do mouse no controle ListView, realce o Objeto ListViewCtrl opção na lista exibida e selecione Propriedades. O Geral A guia da folha de propriedades do controle ListView se parecerá com a imagem fornecida abaixo.

  8. Altere os valores da propriedade na Guia Geral como mostrado na imagem acima.

    Em primeiro lugar, carregaremos os dados dos Funcionários no controle ListView.

    O código VBA do módulo de formulário


  9. Copie e cole o seguinte código VBA no módulo de classe do formulário:
    Option Compare Database
    Option Explicit
    
    Dim lvwList As MSComctlLib.ListView
    Dim lvwItem As MSComctlLib.ListItem
    Dim ObjImgList As MSComctlLib.ImageList
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    
    
    Private Sub cmdClose_Click()
       DoCmd.Close acForm, Me.Name
    End Sub
    
    Private Sub Form_Load()
     Call LoadListView("EmployeesQ")
    End Sub
    
    Private Sub LoadListView(ByVal tblName As String)
        Dim strFldName As String
        Dim intCounter As Integer
        Dim j As Integer
        Dim strLabel As String
    
    'Assign ListView Control on Form to lvwList Object
    Set lvwList = Me.ListView1.Object
    'Set ObjImgList = Me.ImageList0.Object
        
    'Assign Form Header labels Caption Text
     strLabel = UCase(tblName) & " " & "IN LISTVIEW CONTROL - TUTORIAL-03"
     Me.Label8.caption = strLabel
     Me.Label9.caption = strLabel
     
     With lvwList
        '.Icons = ObjImgList
        '.SmallIcons = ObjImgList
        '.ColumnHeaderIcons = ObjImgList
        .Font = "Verdana"
        .Font.Size = 10
        .Font.Bold = True
     End With
     
     Set db = CurrentDb
     Set rst = db.OpenRecordset(tblName, dbOpenSnapshot)
     
     'Create Column Headers for ListView
     With lvwList
        .ColumnHeaders.Clear 'initialize header area
        For j = 0 To rst.Fields.Count - 1
            strFldName = rst.Fields(j).Name
       'Syntax:
       '.ColumnHeaders.Add Index, Key, Text, Width, Alignment, Icon
            .ColumnHeaders.Add , , strFldName, iif(j=0,3200,2000)
        Next
     End With
     
     'Initialize ListView Control
      While lvwList.ListItems.Count > 0
            lvwList.ListItems.Remove (1)
      Wend
    
     With lvwList
     Do While Not rst.EOF And Not rst.BOF
    
       'Syntax  .ListItems.Add(Index, Key, Text, Icon, SmallIcon)
            Set lvwItem = .ListItems.Add(, , CStr(Nz(rst.Fields(0).Value, "")))
            
       'Add next columns of data as sub-items of ListItem
            With lvwItem
       'Syntax     .Add Index,Key,Text,Report Icon,TooltipText
             For j = 1 To rst.Fields.Count - 1
                .ListSubItems.Add , , CStr(Nz(rst.Fields(j).Value, ""))
             Next
    
           End With
           rst.MoveNext
    Loop
    rst.Close
        'reset lvwItem object
        Set lvwItem = Nothing
    End With
    
    Set rst = Nothing
    Set db = Nothing
    End Sub
    
    

    Observação: As linhas de VBA de cor vermelha do controle ImageList são comentadas de execução por enquanto e vamos habilitá-las em breve.

  10. Salve seu formulário com o nome frmEmployees.

  11. Abra o formulário no modo de exibição normal.

    Os Funcionários A listagem de registros do Q Query será semelhante à seguinte imagem:

Revisão do código VBA


Já passamos pelo código VBA acima nas sessões anteriores do Tutorial de controle ListView-01 e 02, exceto por algumas linhas na declaração do controle ImageList, inicialização e algumas linhas para Font-Name, Font-Size e Font- Configurações de estilo. Outra mudança que fizemos no código VBA anterior aqui é o LoadListView() programa, ele precisa de um nome de tabela/consulta como parâmetro. Todos os tipos de consulta, exceto consultas de ação, tabelas de acesso e nomes de tabelas vinculadas são válidos. O nome da Tabela ou da Consulta é passado quando o programa é chamado do Form_Load() Procedimento do evento.

Todos os nomes de campo de tabela/consulta são usados ​​como ColumnHeader Label Text (o terceiro parâmetro) em ColumnHeaders.Add() método. O primeiro parâmetro Índice e segundo parâmetro Chave Os valores não são usados. Os números de sequência do Índice serão inseridos pelo sistema automaticamente.

O quarto parâmetro é a Largura da Coluna valor em pixels e atribuímos arbitrariamente o valor de largura da primeira coluna de 3200 pixels e para todas as outras colunas 2000 pixels. A primeira coluna exibe o Nome do funcionário e precisa de mais largura para exibi-lo corretamente.

O Alinhamento e Ícone valores de parâmetro para cabeçalhos de coluna que não usamos aqui. Por padrão, o Alinhamento à esquerda é assumido. As opções de alinhamento disponíveis são fornecidas abaixo.
  • 0 - lvwColumnLeft
  • 1 - lvwColumnRight
  • 2 - lvwColumnCenter



Você pode ver as opções acima nos Cabeçalhos de Coluna Guia na folha de propriedades do controle ListView. Para visualizar as opções acima:

  • Clique em Inserir coluna Button, digite algum nome de coluna temporário na caixa de texto abaixo.

  • Clique no botão Alinhamento Propriedade e veja as opções acima.

  • Clique no botão Remover coluna Botão para excluir o nome da coluna temporária.

  • Observação: Se você quiser adicionar rótulos de cabeçalho de coluna manualmente, em vez de carregar nomes de campo por meio de código VBA, digite-os um por um aqui. Eles aparecerão como rótulos de cabeçalho de coluna quando você exibir dados.

A visualização de amostra do Ícone A imagem no lado esquerdo dos nomes das colunas de cabeçalho pode ser vista no painel do lado direito na segunda imagem de demonstração no topo desta página.

A primeira coluna EmployeesQ (Nome do funcionário) é considerada como ListItems.Text em seu Adicionar Método. Neste método também omitimos o Índice e Chave Valores de parâmetro. Os números de índice serão adicionados automaticamente pelo sistema como números de série.

A partir do segundo campo todos os valores das colunas são carregados através do ListSubItems.Add() método do controle ListView.

Observação: Todos os valores são adicionados ao ListItems.Text e em ListSubItems.Text parâmetro apenas como tipo de dados de texto, independentemente de seu tipo de dados original na tabela/consulta de origem. No Código, estamos realizando uma verificação de validação nos Valores dos Campos, caso algum deles contenha um Nulo Value e converta-o em valor de texto com o CStr() função integrada.

O controle ImageList.


A Lista de Imagens As instruções de inicialização de controle que comentamos no programa principal são mostradas na cor vermelha no segmento de código fornecido abaixo. Vamos explicá-los e habilitá-los quando estivermos prontos com nossos preparativos para carregar Imagens no Controle ImageList.
'Assign ListView Control on Form to lvwList Object
Set lvwList = Me.ListView1.Object
'Set ObjImgList = Me.ImageList0.Object
    
'Assign Form Header labels Caption Text
 strLabel = UCase(tblName) & " " & "IN LISTVIEW CONTROL - TUTORIAL-03"
 Me.Label8.caption = strLabel
 Me.Label9.caption = strLabel
 
 With lvwList
    '.Icons = ObjImgList
    '.SmallIcons = ObjImgList
    '.ColumnHeaderIcons = ObjImgList
    .Font = "Verdana"
    .Font.Size = 10
    .Font.Bold = True
 End With
 

A primeira instrução com a cor vermelha acima inicializa a ObjImgList Objeto com controle ImageList ImageList0 no formulário frmEmployees . Antes de fazer alterações no código, vamos ver quais opções temos para fazer upload de algumas imagens no controle ImageList.

Sobre o envio de imagens.


A próxima etapa é carregar algumas imagens de amostra no controle ImageList. Isso pode ser feito de um desses dois jeitos.

Antes de tentar esta etapa, crie ou obtenha pelo menos duas imagens pequenas (qualquer um dos tipos de imagem populares como .jpg, jpeg, .bmp, .png , etc.), de preferência .bmp tipo. As opções de tamanho de imagem disponíveis no controle ImageList, na seção Geral guia da folha de propriedades, são 16 x 16 , 32 x 32 , 48 x 48 pixels ou Personalizado Tamanho.

Clique com o botão direito do mouse no controle ImageList, destaque a opção ImageListCtrl Object, e selecione Propriedades. Antes de selecionar qualquer imagem para upload, selecione um dos tamanhos de imagem acima na página Geral Guia.


  • Se você tiver imagens grandes e quiser manter o tamanho original da imagem, selecione Personalizado Opção.
  • Selecionar qualquer uma das outras opções reduzirá a imagem ao tamanho selecionado. Isso pode reduzir a qualidade da imagem. O uso de imagens muito grandes pode ocupar mais espaço no controle ListView quando exibido.
  • As imagens do tipo ícone serão mais ideais para uso.
  • Experimente com imagens grandes, pequenas e muito pequenas e com diferentes opções para obter alguma experiência na seleção de imagem/opção correta para suas necessidades.



Você pode usar uma das duas maneiras de fazer upload das imagens no ImageList Control:

1. Carregar imagens do disco por meio do procedimento VBA.


O exemplo de procedimento VBA será semelhante ao segmento de código fornecido abaixo, retirado do Tutorial de controle do TreeView:
  
  Set objImgList = Me.ImageList0.Object
  objImgList.ListImages.Clear
  
strFolder = "D:\Access\TreeView\"
With objImgList
    With .ListImages
         .Add Index:=1, Key:="FolderClose", Picture:=LoadPicture(strFolder & "folderclose2.bmp")
         .Add Index:=2, Key:="FolderOpen", Picture:=LoadPicture(strFolder & "folderopen2.bmp")
         .Add Index:=3, Key:="ArrowHead", Picture:=LoadPicture(strFolder & "arrowhead.bmp")
    End With
End With

With tvw 'TreeView Control
    .ImageList = objImgList 'assign imagelist Object to TreeView Imagelist Property
End With

A primeira instrução inicializa a objImgList Objeto com ImageList0 controle no formulário.

A próxima instrução garante que as imagens existentes no controle de lista de imagens, se houver, sejam limpas na preparação para upload do disco. Para que essa abordagem funcione sempre, as imagens devem estar sempre disponíveis no disco.

A objImgList.ListImages.Add() é chamado para fazer upload de imagens do disco usando os parâmetros nomeados. Quando os nomes dos parâmetros são usados ​​no Add() os valores dos parâmetros podem ser fornecidos em qualquer ordem, como Index:=1 pode ser dado no final da linha ou Key:="FolderClose" como o primeiro item e assim por diante. Sem os nomes dos parâmetros, a ordem dos parâmetros do método Add() será a seguinte:
         .Add 1, "FolderClose", LoadPicture(strFolder & "folderclose2.bmp")

Para exibir a imagem em nosso listView controle, podemos usar o número de índice de imagem 1 ou o valor da chave "FolderClose" Texto como o ícone ou SmallIcon valores de parâmetro em ListItems.Add() método.

Usamos o método acima no Tutorial de controle TreeView anteriormente. Você pode visitar essa página e baixar o banco de dados de demonstração.

Esse método carrega as imagens na instância de objeto ImageList na memória e o objeto físico no formulário não é alterado. As Imagens de Origem no Disco devem estar sempre disponíveis sempre que os frmEmployees está aberto.

2. Carregando imagens do disco manualmente.

Este é um exercício único, encontrar as imagens no disco e carregá-las no controle ImageList.
A principal vantagem é que, uma vez que as imagens são carregadas no ImageList Control, elas permanecem intactas. O controle ImageList com Imagens pode ser copiado e colado para outros projetos se as mesmas imagens forem necessárias para mais de um projeto. Não é necessário carregar as imagens do Disco novamente. O Controle ImgeList com Imagens também pode ser compartilhado com amigos.

Então, vamos para o melhor método de upload manual de imagens. Crie dois .bmp imagens com resolução de 50 x 50 pixels (image1.bmp , imagem2.bmp ) e mantenha-o pronto em sua pasta, diga D:\Access\ para referência.

  1. Abra frmFuncionários na visão de projeto.

  2. Clique com o botão direito do mouse no controle ImageList, realce ImageListCtrl Object opção e selecione Propriedades.

  3. No Geral selecione a guia Personalizado Opção para fazer upload de imagens com a resolução original.

    O Geral visualização guia do controle ImageList.

    As Imagens guia Visualização do controle ImageList

    Observação: Depois de experimentar as imagens carregadas no controle ListView, se você quiser experimentar outras opções 48 x 48, 32 x 32, 16 x 16, você deve remover todas as imagens carregadas primeiro e depois ir para o Geral guia, selecione a opção necessária e, em seguida, carregue as imagens novamente. As imagens selecionadas serão reduzidas ao tamanho da imagem selecionada.

    Como você pode ver na guia de imagens de amostra, carreguei duas imagens selecionando Inserir imagem Botão de comando e escolhendo as imagens do meu disco.

    A primeira imagem está no estado selecionado e ligeiramente na posição elevada. O controle Index mostra o valor 1 e a caixa de texto Key mostra o texto First . O valor Index aparecerá automaticamente, mas o valor Key (algum valor significativo que você pode memorizar facilmente e relacionar a imagem aos dados) pode ser inserido manualmente.

    Podemos usar o número do índice ou o valor do texto da chave no Ícone e no SmallIcon Parâmetro de ListItems.Add() método.

    Mesmo que você planeje usar a sequência numérica do índice, a sequência de upload de imagem deve ser sincronizada com os dados que você planeja carregar no controle ListView, como o nome dos funcionários deve corresponder às fotos na sequência correta.

    Um método melhor no caso dos Funcionários, seu nome pode ser usado como texto-chave e muito fácil de relacionar com o registro. As imagens generalizadas não precisam corresponder a esse tipo de verificação de relacionamento, mas seus nomes de chave ajudarão a indicar o que elas fazem, como folder_closed ou folder_opened .

  4. Clique nas Imagens aba.

  5. Clique em Inserir Imagem e encontre seu D:\Access\Image1.bmp imagem e selecione-a, clique no botão Abrir Botão para carregar a imagem no controle ImageList.

  6. Digite algum valor de texto na Chave caixa de texto (os valores-chave devem ser exclusivos).

  7. Repita as etapas 5 e 6 para a segunda imagem, digite o valor-chave.

    Estamos prontos com nosso controle ImageList com imagens de amostra e prontos para exibi-las no controle ListView.

    Atribuindo objeto ImageList às propriedades do objeto ListView.


    As seguintes propriedades do objeto ListView devem ser atribuídas com o objeto ImageList para usar as referências de imagem no controle ListView:
    1. ListView.ColumnHeaderIcons
    2. ListView.Ícones
    3. ListView.SmallIcons

    A próxima etapa é atribuir o Objeto ImageList para o objeto ListView necessário no código VBA por meio das propriedades do objeto:lvwList .ColumnHeaderIcons , lvwLista .Ícones , lvwLista .smallIcons antes de podermos usar as referências de imagem (valores de índice ou chave) no ColumnHeaders.Add() , ListItems.Add() e ListSubItems.Add() métodos. Já adicionamos o código VBA necessário no programa principal e os mantivemos desabilitados. Tudo o que precisamos fazer é habilitar essas linhas de código removendo o símbolo de comentário delas e adicionando as referências de imagem necessárias no Adicionar acima parâmetros do método.
  8. Remova os símbolos de comentário ( ' ) de todas as quatro linhas de código VBA mostradas acima com a cor vermelha no LoadListView() Procedimento.
  9. Modifique as seguintes instruções, mostradas com cor vermelha no programa principal LoadListView() conforme mostrado com o Índice de ícones número 1 e 2 no Ícone e SmallIcon posições de parâmetro, respectivamente, como no segmento de código com letras pretas em negrito dadas abaixo:
     With lvwList
     Do While Not rst.EOF And Not rst.BOF
    
       'Syntax  .ListItems.Add(Index, Key, Text, Icon, SmallIcon)
           ' Set lvwItem = .ListItems.Add(, , CStr(Nz(rst.Fields(0).Value,"")))
           'Change to 
             Set lvwItem = .ListItems.Add(, , CStr(Nz(rst.Fields(0).Value,"")), 1, 2)
            
       'Add next columns of data as sub-items of ListItem
            With lvwItem
       'Syntax     .Add Index,Key,Text,Report Icon,TooltipText
             For j = 1 To rst.Fields.Count - 1
               ' .ListSubItems.Add , , CStr(Nz(rst.Fields(j).Value, ""))
               'Change to           
                 .ListSubItems.Add , , CStr(Nz(rst.Fields(j).Value, "")),,"Click"
             Next
    
           End With
           rst.MoveNext
    Loop
    rst.Close

Como você tem apenas duas imagens, a Primeira Imagem com número de índice 1 é usado como o Ícone Parâmetro e 2 está no SmallIcon posição do parâmetro. O ícone A imagem é exibida somente quando você altera a opção de exibição ListView para 0 - lvwIcon. No método ListSubItems.Add() não adicionamos uma referência de imagem e para o próximo parâmetro o texto da dica de ferramenta "Clique " é adicionado. O Texto de clique será exibido quando o ponteiro do mouse estiver em qualquer uma das colunas, a partir da segunda coluna.

Após fazer as alterações acima no Código VBA Salve o Formulário frmEmployees com as alterações.

Abra o formulário no modo de exibição normal. A visualização deve se parecer com a imagem de exemplo na parte superior desta página.

O pequenoÍcone será visível em todas as outras opções de ListView. Verifique os dados de exemplo de imagens ListView de funcionários fornecidos abaixo.

0 - lvwIcon View

2 - lvwList View


A primeira imagem no topo desta página é a 03 - lvwReport Visualizar. Somente nesta exibição, todos os valores de coluna são exibidos no DataSheet como exibição.

Altere o formulário para o modo de design. Exiba a folha de propriedades do controle ListView. Altere as opções de visualização e experimente cada visualização e descubra como são as diferentes visualizações.

Baixe o banco de dados de demonstração.



  1. Tutorial de controle do Microsoft TreeView
  2. Criando menu de acesso com controle TreeView
  3. Atribuindo imagens a nós TreeView
  4. Atribuindo imagens aos nós TreeView-2
  5. Marca de seleção de controle TreeView Adicionar exclusão
  6. Acesso suspenso do TreeView ImageCombo
  7. Reorganizar nós TreeView por arrastar e soltar
  8. Controle de ListView com MS-Access TreeView
  9. Eventos de arrastar e soltar do controle ListView
  10. Controle TreeView com subformulários