... Pague apenas R$47,00 uma única vez e tenha acesso por 1 ano aos vídeos e arquivos exemplos do site ...

Clique aqui e obtenha mais detalhes.


Vídeo - Criando Ribbons parte 5 - Imagens de campo tipo anexo

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 (leia a nota)

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.

Nota: Este vídeo tem duração total de 7 minutos. Porém, aqui pela página, você terá acesso apenas aos 2 minutos iniciais.  Caso queira assistir o vídeo na íntegra, basta adquirir o kit MontaRibbons.  Veja os detalhes da compra, clicando aqui.


 

 

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

MontaRibbons

Todas as informações necessárias para você adquirir esta incrível ferramenta.

Vídeo-aula 1


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
 

Vídeo-aula 2


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
 

Vídeo-aula 3


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).

 

Vídeo-aula 4


Uso de imagens externas (GIF, JPEG, PNG e ICO)
 

Vídeo-aula 6


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.
 

 


 

 


7 comentários

Flavio Nascimento    15/08/2010 12:43:37

Grande mestre.. avelino....

Ta muito manêro de verdade e com certeza irei usar alguma técnica.

Avelino   16/02/2012 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.

Avelino Sampaio   16/02/2012 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.


PAULO SERGIO DE FREITAS JUNIOR   13/01/2014 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

Andrea   02/08/2014 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   03/08/2014 07:20:12

Andrea,

e o seu office é de 32 ou 64 bits ?

No aguardo

Andrea   17/08/2014 21:05:03

Olá Avelino,

Desculpa a demora para responder.

Então utilizo o Office 32 e 64 Bits.

Obrigada.


Envie seu comentário: