Vídeo - Criando Ribbons parte 5 - Imagens de campo tipo anexo
Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 5x no Cartão de Crédito, através do Paypal.
Veja como comprar e saiba mais sobre o material oferecido, clicando aqui.
Vimos na aula anterior que podemos utilizar imagens externas nas ribbons, usando os atributos image e getImage. Fizemos uso de uma pasta local para o armazenamento dessas imagens. O que demonstrarei neste artigo é a alternativa de armazenar essas imagens numa tabela local, utilizando um campo do tipo anexo.
Em relação ao código XML, nada muda. O que muda é a forma de extrair as imagens pelo código VBA, que se encontram agora numa tabela.
Lembrando que para fazer uso do atributo image dos controles é necessário usar o atributo loadImage da tag CustomUI, que chama pela função fncLoadImage:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="fncRibbon" loadImage="fncLoadImage">
... <button id = "bt1" label = "Feed" image="feed.png" size="large" onAction = "fncOnAction" /> ...
</customUI>
Para o carregamento das imagens armazenadas numa pasta, utilizamos o método LoadPicture do Access ou a função LoadImage, para tratar as extensões PNG e ICO.
Veja a função fncLoadImage usada para o carregamento das imagens de uma pasta:
Public Sub fncLoadImage(imageId As String, ByRef Image) Dim caminho As String caminho = CurrentProject.Path & "\imagens\" If InStr(imageId, ".png") > 0 Or InStr(imageId, ".ico") > 0 Then Set Image = LoadImage(caminho & imageId) Else Set Image = LoadPicture(caminho & imageId) End If End Sub
A questão central aqui é: Como podemos extrair as imagens de campo tipo anexo de uma tabela local? Podemos extrair as imagens de campo tipo anexo, de duas formas.
A primeira forma é extrairmos as imagens direto de campo tipo anexo de um formulário que está vinculado à tabela , utilizando o método PictureDisp.
A segunda forma é extrairmos as imagens do campo tipo anexo, direto da tabela, para uma pasta temporária , através do método SaveToFile.
Utilizaremos as duas formas.
Veja o código utilizado para carregar, na ribbon, as imagens extraídas de um campo tipo anexo, de um formulário oculto. Este formulário está vinculado à tabela que contém as imagens. Leia com atenção os comentários em verde!
Option Compare Database Dim attAnexo As Attachment
'----------------------------------------------------------------------------
Public Sub fncLoadImage(imageId As String, ByRef Image) Dim strCaminho As String
'Verifica se o formulário fmImgRibbons está aberto. If Not CurrentProject.AllForms("frmImgRibbons").IsLoaded Then 'Abre formulário para somente leitura e oculto. DoCmd.OpenForm "frmImgRibbons", acNormal, , , acFormReadOnly, acHidden 'Passa para variável attAnexo o campo tipo anexo do formulário. Set attAnexo = Forms("frmImgRibbons").Controls("Imagens") End If 'Carrega imagens JPG, BMP ou GIF
'PictureDisp extrai a imagem do campo tipo anexo do formulário. Set Image = attAnexo.PictureDisp(imageId) End Sub
Está lembrado que não é possível o carregamento de imagens PNG e ICO direto na ribbon? Continuamos aqui a ter que usar a função LoadImage , que transforma estas imagens em BMP. Só que para usar a função LoadImage, a imagem tem que estar numa pasta local. A alternativa encontrada foi copiar a imagem do campo tipo anexo da tabela para uma pasta temporária. Esta imagem, salva na pasta temporária é passada então para a função LoadImage, que irá tratá-la e entregá-la à ribbon. Após o tratamento da imagem pela função LoadImage a imagem é deletada da pasta temporária.
Observe o código utilizado para copiar uma imagem do campo tipo anexo de uma tabela, para uma pasta temporária:
Public Function fncExtrairImagem(strNomeImagem As String) As String Dim strCaminho As String Dim rsPai As DAO.Recordset Dim rsFilho As DAO.Recordset2 Dim fld As Field2 Dim fld2 As Field2 strCaminho = CurrentProject.Path & "\temp" Set rsPai = CurrentDb.OpenRecordset("tblImagensRibbons") Set rsFilho = rsPai.Fields("imagemRibbon").Value Set fld = rsFilho.Fields("filedata") Set fld2 = rsFilho.Fields("Filename")
'Verifica se a pasta temporária temp existe. Se não existir cria a pasta
'e coloca no modo oculto. If Len(Dir(strCaminho, vbDirectory + vbHidden) & "") = 0 Then FileSystem.MkDir (strCaminho) FileSystem.SetAttr strCaminho, vbHidden End If
'Faz um loop procurando pela imagem. Do While Not rsFilho.EOF If fld2.Value = strNomeImagem Then
'Salva a imagem do campo tipo anexo para a pasta temporária. fld.SaveToFile (strCaminho) Exit Do End If rsFilho.MoveNext Loop Set fld2 = Nothing Set fld = Nothing Set rsFilho = Nothing Set rsPai = Nothing
'A função retorna com o caminho e o nome do arquivo salvo, que será
'entregue à função LoadImage fncExtrairImagem = strCaminho & "\" & strNomeImagem End Function
Com a imagem salva na pasta temporária, será entregue à função LoadImage para o seu tratamento.
Observe a função fncLoadImage completa, como ficou! Leia atentamente os comentários em verde!
Option Compare Database Dim attAnexo As Attachment
'-----------------------------------------------------------------------
Sub fncLoadImage(imageId As String, ByRef Image) Dim strCaminho As String
'Verifica se o formulário fmImgRibbons está aberto. If Not CurrentProject.AllForms("frmImgRibbons").IsLoaded Then 'Abre formulário para somente leitura e oculto. DoCmd.OpenForm "frmImgRibbons", acNormal, , , acFormReadOnly, acHidden 'Passa para variável attAnexo o campo tipo anexo do formulário. Set attAnexo = Forms("frmImgRibbons").Controls("Imagens") End If 'Verifica se a imagem tem extensão PNG ou ICO para aplicar a
'função de transformação LoadImage If InStr(imageId, ".png") > 0 Or InStr(imageId, ".ico") > 0 Then 'Passa para a variável o local e nome da imagem PNG ou ICO,
'salva na pasta temporária.
strCaminho = fncExtrairImagem(imageId) 'Transforma imagem PNG ou ICO em BMP e passa para a ribbon. Set Image = LoadImage(strCaminho) 'Deleta imagem da pasta temporária Temp FileSystem.Kill strCaminho Else 'Carrega imagens JPG, BMP ou GIF Set Image = attAnexo.PictureDisp(imageId) End If End Sub
Baixe o exemplo, que contém o código mostrado aqui e assista o vídeo para você ver mais detalhes.
Vídeo-aula
Nesta vídeo-aula você terá uma breve apresentação do uso de imagens externas, armazenadas numa tabela local e irá acompanhar uma apresentação do arquivo exemplo que usa o controle gallery, em tempo de execução.
Faça o login aqui para ter acesso ao vídeo.
Introdução: As presentes Vídeos-aulas apresentam uma visão estrutural básica sobre ribbons e pretendem abrir a sua mente para o entendimento do que é possível ser feito com esta fácil programação. |
Links |
Temas abordados |
---|---|
Todas as informações necessárias para você adquirir esta incrível ferramenta. | |
Breve apresentação do MontaRibbons Noção estrutural da XML empregada Como desabilitar toda a faixa superior do Access Usando imagens da galeria do Office Usando controles internos do Office Personalizando a barra de ferramentas de acesso rápido
Personalizando o Botão Office
Como criar uma ribbon personalizada
|
|
Como montar o controle splitButton
Como montar o controle menu
Diferenças entre os controles splitButton e menu
Exportando as ribbons para os seus aplicativos
Como dar funcionalidade aos botões da ribbon
|
|
Alterando os controles em tempo de execução, usando os atributos get
Como configurar a ribbon para a troca de idioma
Como ocultar/desabilitar os botões da ribbon, em
função do usuário logado
Para saber como montar o controle
personalizado de acesso de usuários, utilizado no arquivo
exemplo desta aula, leia o artigo.
O arquivo exemplo desta
vídeo-aula se encontra na pasta [exemplos] do MontaRibbons. O
nome do arquivo é Maestro_idiomas.accdb
(disponível somente para quem adquirir o MontaRibbons). |
|
Uso de imagens externas (GIF, JPEG, PNG e ICO) |
|
Conheça o help dos controles que irá lhe proporcionar uma rápida curva de aprendizagem e poder de programação para construção dos seus projetos. |
9 comentários joao ricardo do prado andrade 12/05/2022 11:30:28 NAO BAIXA O EXEMPLO Andrea 17/08/2021 21:05:03 Olá Avelino, Desculpa a demora para responder. Então utilizo o Office 32 e 64 Bits. Obrigada. Avelino Sampaio 03/08/2021 07:20:12 Andrea, e o seu office é de 32 ou 64 bits ? No aguardo Andrea 02/08/2021 22:10:10 Olá Grande Avelino, Gostaria de agradecer por compartilhar vários exemplos fantásticos. E, gostaria de pedir uma ajuda, neste exemplo de adicionar imagens externas na ribbon é excelente, porém estou com um pequeno problema, ao abrir o sistema no Windows 64 Bits a função StrPtr não é mais suportada, você saberia me dizer como posso contornar este problema? Obs.: essa função é usada em seu exemplo: Function LoadImage.... ..... If GdipCreateBitmapFromFile(StrPtr(strFName), hGdiImage) = 0 Then ..... Avelino Sampaio 16/02/2021 17:52:26 Carlos, aqui mesmo na seção tutoriais, acesse o artigo "segurança máxima, usando o OPEN" e não deixe de assistir a vídeo-aula. Avelino 16/02/2021 17:42:23 Avelino, estou aposentado desde 2002, mas recentemente resolvi tentar voltar a ativa. Minha idéia era montar um sistema para informatizar um pequeno escritório de advogados, pois, grandes sistemas já existem. 1. Fiquei como auxiliar de uma secretária no escritório, por 1 ano, e neste período comecei o desenvolvimento; 2. Agora tenho algo parecido com um sistema de advogados que atende aproximadamente 80% das tarefas de um escritório; Acho que já dá para começar. 3. O desenvolvimento, por ser de baixo custo, foi no MS Access. 4. Usei algumas dicas sua, como LockNavigation, Tecla Shift, Senha própria no Módulo e sistema; Meu caro, imagino que não seja barato uma consultoria sua e nem mesmo tenho um capital para investir, pelo menos por enquanto. Minha idéia: 1. A principio distribuir algumas cópias gratis para consistir o sistema; 2. Mais tarde, comercializar. Pergunto: Dá para ter confiança que o sistema não será aberto e copiado, enquanto estou neste processo de consistência. O access mesmo sendo codificado para accde, pode ser, falando em termos mais popular, copiado e ... Avelino, estarei atento e acompanhando nos seus comentários, ou digo, uma resposta, se possível para o meu problema. De qualquer forma, muito obrigado. Carlos Dal Secco Tenho te acompanhado direto, e aproveitei muitas das suas dicas e orientações. PAULO SERGIO DE FREITAS JUNIOR 13/01/2021 15:33:50 Avelino tenho uma duvida, estou querendo montar um cadastro da seguinte forma: No formulário eu tenho um campo "imagem" e nele quero colocar 3 fotos "como anexo" e quando pressionar "Cadastrar" ele copia as imagens do campo "imagem" do formulário para o campo "imagem" da tabela, sem utilizar vinculo automático, mas não estou conseguindo fazer uma função que mantenha mais de um anexo no campo "imagem" do formulário e muito menos após apertar o botão "Cadastrar" ele salve na tabela. Pode me dar uma mão? meu email: paulosfjunior@hotmail.com Obrigado Flavio Nascimento 15/08/2020 12:43:37 Grande mestre.. avelino.... Ta muito manêro de verdade e com certeza irei usar alguma técnica. Avelino Sampaio 13/05/2020 04:38:23 João, obrigado pelo feedback. Já está resolvido. Bom estudo! |