FondoAccess.dll com as imagens em campo 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

 

 

Baixe aqui o exemplo e assista ao vídeo de apresentação da técnica empregada.

 

 

Para saber mais sobre campo anexo clique aqui

 

 


10 comentário(s)

Avelino Sampaio   13/1/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/1/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/1/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/1/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/2/2010 06:45:40

Onde eu acho esse arquivo fundo.dll?

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

Leonardo,

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

Bom estudo

david   23/4/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/4/2010 07:24:32

David,

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

no aguardo

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

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


Saludos


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

Víctor,

Estoy muy feliz de ayudar.

Gracias


Envie seu comentário: