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

Clique aqui e obtenha mais detalhes.


FondoAccess.dll com as imagens em campo tipo anexo

Confesso que em termos de designer sou um desastre.  Este foi um dos principais motivos que me fez  migrar rapidamente para o Access 2007.  O uso de ribbons, formulários contínuos zebrados, campos com rich text, fundo em azul, cores suavizadas e muitos outros benefícios visuais, foram um alento para mim, haja vista que requerem o mínimo de esforço para implementá-los.

Uma artifício visual que eu usava bastante no Access 2003 era o uso de uma dll, chamada de FondoAccess, pois com praticamente nenhuma programação, era possível alterar o fundo de tela  (cinza feioso) por um que fizesse sentido visual para o aplicativo.   Esta dll, no Access 2007, apresentou uma falha de não recompor a imagem de fundo, ao fechar formulários, e acabei  tendo que abandoná-la.

No início de 2009, um cliente havia me perguntado se era possível introduzir a sua logomarca, substituindo o fundo azul do Access, e loucamente afirmei que sim.    Fui pra casa me perguntando por  que raios havia feito tal afirmativa, sabendo que o recurso que  tinha para isso havia falhado no Access 2007.

Depois de muito pensar e realizar alguns testes, descobri uma solução para continuar fazendo o uso do FondoAccess no Access 2007.   A solução que criei foi a de montar um formulário nas dimensões de um ponto que ficasse em movimento constante, forçando a dll a recompor a tela de fundo.  Esta solução tem funcionado para os clientes que presto serviço, sem apresentar problema algum.  Por isso, então, resolvi divulgá-la aqui.

Veja na lista abaixo algumas das propriedades que foram alteradas para que o formulário (frmFoco) tenha as dimensões de um ponto.

Largura = 0,051 cm
Estilo de borda = nenhum
Altura = 0,1 cm
 

Para gerar um movimento constante do formulário, criei a seguinte rotina no evento "No timer":

Private Sub Form_Timer()
   Randomize
   'Posiciono no canto esquerdo superior e acrescento um pequeno
   'movimento no sentido vertical com o rnd()
   Me.Move Left:=0, Top:=(50 * Rnd())
End Sub

Para fazer uso desta dll é necessário registrá-la no Windows e depois referenciá-la no Access.  

Utilize o executar do Windows para registrar a dll com o comando regsvr32.exe.  Exemplo:

regsvr32.exe c:\fundo\fondoaccess.dll

Usando /u você desinstala a dll, se desejar.

regsvr32.exe c:\fundo\fondoaccess.dll /u

Para referenciar a dll no Access, abra o VBA e no menu ferramenta escolha referências.  Clique no botão procurar e selecione fondoAccess.dll na pasta fundo.

Usando Access

 

Veja abaixo como são poucas as funções utilizadas para manipular a imagem de fundo com a dll FondoAccess:

Option Compare Database

Public fundo As New FondoAccess.CMDIWindow
-------------------------------------------------------------------
Function fncCarregaFundo(NomeImagem As String)
  on error resume next
  fundo.DrawMode = 1
  fundo.ImagePath = fncLocalFundo & NomeImagem
  fundo.Hook (Application.hWndAccessApp)
End Function
-------------------------------------------------------------------
Public Function fncDescarregaFundo()
  fundo.Unhook
End Function
-------------------------------------------------------------------
Public Function fncLocalFundo() As String
  fncLocalFundo = CurrentProject.Path & "\imagens\fundo\"
End Function

No evento "Ao Abrir" do formulário frmFoco, carregamos a imagem de fundo.

Private Sub Form_Open(Cancel As Integer)
  Call fncCarregaFundo(DLookup("NomeImg", "tblImagensDeFundo"))
End Sub

E no evento "Ao Fechar" do formulário, descarregamos a imagem de fundo.

Private Sub Form_Close()
  Call fncDescarregaFundo
End Sub

Como são poucas as imagens de fundo, resolvi armazená-las numa tabela , usando um novo tipo de campo do Access 2007/2010, chamado de anexo.    Neste campo, podemos armazenar vários tipos de arquivos, dentre eles, imagens de diversos tipos (bmp, gifs, jpeg e png).

No formulário, que seleciona o fundo a ser exibido (frmImgFundo), usei o novo controle anexo, com origem no campo anexo da tabela de imagens,  proporcionando um mecanismo nativo de inclusão, exclusão e visualização das imagens, sem programação.  Observe:

Usando Access

 

A questão mais complicada foi como usar a imagem do arquivo anexo, pois não é possível o uso direto, devido ao mecanismo de compactação utilizado pelo Access.   A solução encontrada foi a de extrair, através de programação, a imagem selecionada e gravá-la numa pasta chamada fundo.  A dll então carrega a imagem desta pasta.  

veja abaixo o código utilizado para a extração e gravação da imagem na pasta fundo:

Private Function fncGravaFundo()
Dim rsfrm As DAO.Recordset2
Dim rsFilho As DAO.Recordset2
Dim fld As Field2

Set rsfrm = Me.Recordset
Set rsFilho = rsfrm.Fields("imgFundo").Value
Set fld = rsFilho.Fields("filedata")
'percorre a lista de imagens do quadro de imagens
Do While Not rsFilho.EOF
  'compara a posição absoluta com o valor do campo idimg
  If rsFilho.AbsolutePosition = Idimg Then
    'verifica se existe uma imagem já gravada na pasta fundo
    'Se existir DELETA
    If Len(Dir(fncLocalFundo, vbArchive) & "") > 0 Then
      Kill fncLocalFundo & "*.gif"
    End If
    'salva a imagem escolhida do quadro de imagens, na pasta fundo
    fld.SaveToFile (fncLocalFundo)
  End If
  rsFilho.MoveNext
Loop
Set fld = Nothing
Set rsFilho = Nothing
Set rsfrm = Nothing
End Function

Veja na figura, o exemplo do fundo modificado:

Usando Access


Download

Sobre o vídeo

Este vídeo tem duração total de 5 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 UsandoAccess. Veja os detalhes da compra, clicando aqui.


 

 

Para saber mais sobre campo anexo clique aqui

 


 

 


39 comentário(s)

Avelino Sampaio   13/01/2010 14:47:49

Se o Windows Vista estiver com a UAC ativa, ocorrerá um erro (0x080004005) ao tentar registrar a dll.

Procure no google como desabiltar a UAC

Após registrar a dll volte a ativar a UAC

Sucesso

Daniel Augusto   13/01/2010 21:04:27

Avelino

Parabéns pelo dica, era exatemente isso que estava precisando.

Mais uma vez, Parabéns.

Abraços

Adélio da Costa Gonzaga   18/01/2010 22:57:05

Cada vez você se supera mais! Já disse: quando crescer quero ser igual a você (rsss)...

Mas, amigo, tive uma idéia e quero saber sua opinião: se, em vez de uma imagem, colocássemos uma página de internet (html)... como poderíamos fazer isso?

Na verdade a idéia não é minha. Os sistemas que uso em meu escritório (Alterdata) possuem essa funcionalidade. Isso deixa o sistema SEMPRE com um visual inovador, já que basta alterar a página da internet e o sistema também estará de cara nova.

Tá lançado o desafio!!!

Avelino Sampaio   19/01/2010 07:22:32

Adélio,

Acho que isso seria viável no fundo de um formulário e não no fundo do Access.

Tem colegas de fórum que fazem maravilhas, usando imagens criadas em programas de designer.

A Microsoft promete esta revolução para o Access 2010

Grato

Leonardo Costa   11/02/2010 06:45:40

Onde eu acho esse arquivo fundo.dll?

Avelino Sampaio   11/02/2010 11:24:49

Leonardo,

está no arquivo exemplo que eu ofereço, nesta mesma página.

Bom estudo

david   23/04/2010 19:20:41

estou com duvidas referente a a dll não consigo fazer, o erro que ocorre que a dll é um arquivo me help

Avelino Sampaio   26/04/2010 07:24:32

David,

entre em contato pelo link "contato" e me passe mais informações.

no aguardo

Victor Hugo Peña   26/05/2010 06:58:05

Exelente video y ejemplo , hace mucho buscaba un ejemplo asi, de antemano muchas gracias-


Saludos


Avelino Sampaio   26/05/2010 15:35:58

Víctor,

Estoy muy feliz de ayudar.

Gracias

Paulo Machado   06/11/2010 23:39:00

Avelino o seu site é muito bom, tenho uma grande admiração por pessoas que tem uma grande experiência em programação de access e compartilha o conhecimento para usuários que nem eu que está engatinhando neste universo (programador de Access).

Abraço

Sero   22/11/2010 03:43:40

Estimado Avelino, felicitarlo y agradecerle por los ejemplos brindados en vuestra pagina.
NO estoy pudiendo registrar la dll en la version de mi SO, la cual es Windows 7 Home Premium de 64 bits- El error que me tira al intentar registrar es: "Es posible que FondoAccess.dll no sea compatible con el sistema operativo el cual esta ejecutando..."
Sabe cual puede ser el problema con mi pc?

Avelino Sampaio   22/11/2010 07:12:50

Hola

Copia el archivo "fondoaccess.dll" a la carpeta SysWOW64.

Desactivar UAC en Windows (reiniciar).

Utilice la línea de comando.

regsvr32.exe c:\windows\SysWow64\fondoaccess.dll

Si el Access es de 64 bits no funcionará debido a cambios en APIs.

Éxito

Sero   22/11/2010 23:11:44

He realizado los pasos que me ha indicado pero no tuve suerte...
seguiré intentando para ver donde se encuentra la falla.
Nota: cabe destacar que en una pc de escritorio con win xp la dll funciona de maravilla.

Avelino Sampaio   23/11/2010 08:02:01

Sero,

Pida ayuda en el siguiente sitio.

http://www.mvp-access.com/foro/

Márcio Melo - RJ   24/04/2011 17:39:41

Boa páscoa! só um comentário sobre essa técnica, observei que ela toma boa parte do processador e amenizei o efeito ao colocar o tempo no [intervalo do cronômetro] de 50 para 500, surtiu um ótimo efeito que pode ser verificador no gerenciador de tarefas do windows na guia processos (CPU) e performace. Gostei muito da idéia, mais acho importante observar se não vai comprometer o desempenho do banco de dados.
Montei minha primeira Ribbon que ficou tão linda que procurei analisar esse fundo para completar o conjunto, o monta Ribbons ta muito show e em conjunto com o maestro esta imbátivel. Avelino muito obrigado por suas aulas, vim aprendendo na insistência e agora tenho a oportunidade do profissionalismo, parabéns!

Avelino Sampaio   25/04/2011 07:19:32

Márcio,

Valeu pela ótima observação. Estarei alterando o exemplo, utilizando um tempo maior.

Sucesso

Zé maria   01/07/2011 11:47:54

Eu gostaria de saber como faço para inserir um campo que eu possa carregar imagens, obrigado a quem m e ajudar.

Avelino Sampaio   06/07/2011 08:03:00

Zé Maria,

Vc pode utilizar o campo tipo Anexo, conforme mostrado no artigo. Se a quantidade de imagens for numerosa, o melhor é armazená-las numa pasta e então carregá-las através do comando PICTURE, para um campo tipo "imagem" do formulário.

me!CampoImagem.picture ="c:\suaPasta\nomeImagem.gif"

Sucesso!

jamisson vieira   05/12/2011 02:34:18

cara vc não é de mais vc é de menos, porque tudo o que é de menos é raro e vc........ sem explicações.

vc me ajudou de maisssssssssssssssssssssssssssssssssssss da conta

Gilson Batista   02/01/2012 18:32:14

Avelino, o fundo accesso funciona normalmente em janela Sobreposta, mas quando mudo para Guia na Opção Janela o formulario não muda nem monstra a imagem. Como faço para resolver???

Avelino Sampaio   03/01/2012 07:11:54

Gilson,

funciona somente para janela sobreposta. Neste outro caso acredito que o melhor seja inserir a imagem direto nos formulários.

Sucesso!

Leonardo Ramalho   08/03/2012 22:25:29

Avelino,

Já tenho um BD praticamente pronto, como faço para utilizar este seu exemplo? Colei as tabelas e os forms, mas não deu certo. Obrigada!

Avelino Sampaio   10/03/2012 09:26:44

Leonardo,

registrou a DLL no windows ? Se registrou, ativou a a dll na lista de referênvias do VBA ?

Qual erro o Access informa?

Alexandre Magno   23/03/2012 15:38:37

Amigo,
Gostaria de saber se tem como modificar a ribbon do access 2010 com XML, mas sem programa adicional algum, só com office. É para um projeto que eu estou tentando desenvolver na escola. Desde já agradeço a sua atenção. Obrigado.

Avelino Sampaio   23/03/2012 16:25:49

Alexandre,

aqui mesmo no site, na seção Tutorias, tem artigos sobre ribbons para vc estudar e aplicar.

Bom estudo!

Daniel Petralanda Santos   20/08/2012 21:37:49

Amigo Avelino,

Achei muito interessante o seu exemplo, mas não gosto muito da idéia de utilizar DLLs.

Achei alguns exemplos na internet com muitas API's e mesmo assim costumam dar erros...

Fiz um exemplo utilizando apenas uma API do windows em cima de um form com a imagem, o único problema de minha solução é que preciso utilizar a mesma no evento ontimer do form.

segue uma humilde dica.

Meu e-mail para enviar este exemplo caso seja do seu gosto.
petralanda@gmail.com

Sds,
Daniel Petralanda Santos

Elias Rodrigues   07/11/2012 16:47:17

Avelino
Porque você não cria um Exemplo para o Office 2003, 90% dos Usuários access usam o 2003! Por Favor aguardamos...

Walter   01/02/2013 00:16:28

Avelino, Parabéns pelo seu maravilhoso trabalho e muitíssimo obrigado pelo Telemax. Fis os passos conforme disse, mas não muda a imagem, ainda fica com o fundo azul. Criei uma pasta "Fundo" dentro de C:\Telemax\Fundo e coloquei todas as imagens juntamente com a "FondoAccess.dll". Registrei a dll no windows e referenciei para C:\Telemax\Fundo mas não funciona.

Angelo   20/04/2013 15:21:26

Avelino, Parabéns pelo seu trabalho tenho certeza que como eu, muitos já tirarão muitas dúvidas em seu fórum.
Bem... Gostaria de saber se é possível criar um campo do tipo Attachement via código. Já pesquisei em vários fóruns e não consegui uma resposta que resolvesse meu problema.
A resposta mais próxima de resolver o que eu preciso é utilizar o Alter table definindo o tipo de campo como longbinary. Mas desta forma não consigo anexar mais de um documento no memo registro.
Criar um campo em uma tabela definindo este como Anexo e copiar Anexos de uma tabela remota (em outro BD) para a tabela criada é possível?

Fábio   21/04/2013 10:32:34

Avelino, onde escrevo a "Private Function fncGravaFundo()" ?

Andre Luiz Goulart   16/12/2013 11:32:07

Avelino, consegui fazer o processo normalmente, mais dependendo do tamanho da imagem ela aparece lado a lado na tela ou então corta uma parte da imagem, como posso resolver isso?

Albani Wilian   21/01/2014 16:03:45

Avelino, mais uma vez parabéns meu caro...
Gostaria de saber se funciona no access 2013?

DANIEL FERNANDO FRANCISCO   21/07/2015 08:26:10

Parabéns pelo seu trabalho! Muito bom mesmo... Passar o conhecimento adquirido é um dom e reflete com imensidão o nível de sua humildade.

Adriano    04/09/2015 16:42:57

Nao consigo achar esse arquivo de dll por nada

FRANCISCO SANTOS   18/11/2015 17:45:30

Alguém saber como gravar fundo access no access2010, tentei tudo até com a DLL.

Avelino Sampaio   21/11/2015 06:31:09

Francisco,

esqueça este projeto para versão 2010 ou superior. A DLL não está devidamente adaptada para atender estas versões superiores.





Rafael Uehara   02/02/2016 19:09:52

Como colocar imagem de fundo na tela da Ribbon com access 2010?

Paulo Maia   22/04/2017 12:03:58

Meu Access é 2010 x32 e meu W10 x64

Não Funciona Aqui ! .......


Envie seu comentário: