FondoAccess.dll com as imagens em campo tipo anexo
Adquira a assinatura vitalícia do site e passe a ter acesso aos arquivos exemplos, vídeos, revistas, livros e ao kit de montagem de ribbons. Você terá suporte por e-mail, caso necessite tirar dúvidas pontuais. Clique AQUI e veja como obter um dos nossos planos. Clique AQUI e faça uma visita a seção Downloads do site e verifique as centenas de arquivos que estará à sua disposição. Clique AQUI e faça uma visita a seção Vídeos do site e veja a lista que estará disponível ao se tornar o nosso assinante vitalício. Clique AQUI e saiba mais detalhes sobre o kit de montagem de ribbons (deixe seus aplicativos com aspecto profissional).
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:
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
Os dez artigos mais visitados
MontaRibbons v.7.0 - Assistente completo para criar ribbons no Access
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Segurança máxima, usando o OPEN
Vídeo - Aprenda sobre filtragens
Uma ajuda para quem está começando um negócio ou um projeto
Vídeo - Programação de relatórios - Parte 1
Desabilitando a faixa(ribbon) superior do Access
Adquira o kit UsandoAccess e aprenda em alta velocidade
Integrando o Access com Servidor MySQL - Introdução
Como carregar o seu menu sem que ele vá para lista de suplementos
39 comentário(s) Paulo Maia 22/04/2017 12:03:58 Meu Access é 2010 x32 e meu W10 x64 Não Funciona Aqui ! ....... Rafael Uehara 02/02/2016 19:09:52 Como colocar imagem de fundo na tela da Ribbon com access 2010? 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. FRANCISCO SANTOS 18/11/2015 17:45:30 Alguém saber como gravar fundo access no access2010, tentei tudo até com a DLL. Adriano 04/09/2015 16:42:57 Nao consigo achar esse arquivo de dll por nada 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. Albani Wilian 21/01/2014 16:03:45 Avelino, mais uma vez parabéns meu caro... Gostaria de saber se funciona no access 2013? 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? Fábio 21/04/2013 10:32:34 Avelino, onde escrevo a "Private Function fncGravaFundo()" ? 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? 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. 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... 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 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! 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 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? 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 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! 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??? 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 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! 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 25/04/2011 07:19:32 Márcio, Valeu pela ótima observação. Estarei alterando o exemplo, utilizando um tempo maior. Sucesso 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 23/11/2010 08:02:01 Sero, Pida ayuda en el siguiente sitio. http://www.mvp-access.com/foro/ 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 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 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? 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 Avelino Sampaio 26/05/2010 15:35:58 Víctor, Estoy muy feliz de ayudar. Gracias 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/04/2010 07:24:32 David, entre em contato pelo link "contato" e me passe mais informações. no aguardo 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 11/02/2010 11:24:49 Leonardo, está no arquivo exemplo que eu ofereço, nesta mesma página. Bom estudo Leonardo Costa 11/02/2010 06:45:40 Onde eu acho esse arquivo fundo.dll? 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 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!!! 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 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 |