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.

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:

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:

Baixe aqui o exemplo e assista ao vídeo de apresentação da técnica empregada.
Para saber mais sobre campo anexo clique aqui
Os dez artigos mais visitados
MontaRibbons v3.1 - Assistente completo para criar ribbons no Access
Utilizando Classe no Access - Introdução
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Criando Ribbons parte 1 - Conhecendo a estrutura Xml
Vídeo - Segurança máxima, usando o OPEN
DVD - Coletânea de artigos, vídeos e exemplos do site
Vídeo - Manutenção e Sistema de Backup com Barra de Progresso
Vinculando tabelas com barra de progresso ( front-end x back-end )
Vídeo - Criando Ribbons parte 4 - Imagens externas em pasta local
Gerar relatórios em pdf e enviar por email
|
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 |