Muitos sabem que podemos usar uma imagem bmp de mesmo nome e na mesma pasta da aplicação para que ela seja exibida no lugar da tela inicial do Access, certo? Certo. Mas, e se quisermos que essa imagem fique visível por mais tempo? Podemos colocar um formulário sem borda e sem nenhum elemento como barras de rolagem, caixa de navegação de registros, etc, com essa imagem nas suas dimensões naturais. O formulário deve estar com Popup=Sim e Auto centralizar=Sim.
Bem, o problema é que a janela do Access abre antes do formulário splash, causando um efeito desagradável. Para contornar isso, podemos usar um atalho para abrir a aplicação, pois nas propriedades do atalho podemos definir que ela seja aberta minimizada. Como o formulário é popup, ele fica visível na tela. Estaria tudo muito bom se não fosse o detalhe de que o usuário poderia clicar no ícone da aplicação na barra de tarefas e abri-la antes de completar o efeito. Então, o que faremos para evitar isso? Podemos incluir um módulo com uma função que oculte a janela do Access. Agora, alem de minimizada, ela vai ficar oculta. Aí você me pergunta: "ora, por que já não fez isso antes? Ocultar a janela do Access, para que não precise usar atalho e abri-la minimizada?" E eu respondo: "Por uma razão muito simples: toda função que colocamos em uma aplicação é executada depois que a aplicação abre. Portanto, não iria barrar a abertura da janela antes da abertura do splash screen". Bom, agora é só programar nosso splash para ficar aberto por uns 5 segundos e então abrir o formulário principal e fechar a si mesmo, certo? Bem, se a intenção for manter a janela do Access oculta, a resposta é: certo. Mas, se por algum motivo, como por exemplo a necessidade de se usar menus personalizados ou ribbons presentes na janela do Access, precisarmos que ela fique visível novamente, teremos que reexibi-la. Acontece que ela está minimizada. Então, precisaremos maximizá-la, certo? Certo. E como faremos isso via código? O vba tem uma instrução que faz isso:
A questão é saber aonde e quando colocar essa instrução, pois nos testes ela não funcionou nem no evento "Ao carregar" e nem no evento "Ao abrir" do formulário. Acredito que isso aconteça pelo motivo de que o formulário precisaria estar completamente carregado para executá-la. Eu pensei na possibilidade de usar a instrução no evento "No timer" do splash, antes de fechá-lo, mas tambem não rolou. Então, a ideia que me surgiu foi colocá-la no evento "No timer" do formulário principal, quando então ele estaria completamente carregado. Para não atrasar a ação, defini o timer para 1, ou seja, um milésimo de segundo. Funcionou, mas como sempre, tem um porem: o formulário se abre antes da janela ser maximizada, com a área de trabalho do Windows ou outras aplicações abertas ao fundo. Achei o efeito desagradável. Então pensei, vou abrir o formulário principal em modo oculto e coloco-o visível depois da janela maximizada, no evento "No timer" do formulário principal. Acontece que os eventos se iniciam de forma simultânea e como a abertura do formulário é mais rápida do que a maximização da janela do Access, o efeito estranho continuou. A saída foi inserir um contador para maximizar a janela e aguardar alguns décimos de segundos para abrir o formulário. Dessa forma, deu tudo certo conforme eu queria.
Deixo abaixo um exemplo com todos os elementos necessários, incluindo o atalho. Caso necessite, altere o caminho da aplicação nas propriedades do atalho. Uma outra vantagem em usar atalhos, é que podemos personalizar o ícone dele.
https://www.dropbox.com/s/jb6e7c31pqdwp8x/SPlashScreenMudaIcon.zip?dl=1
Bem, o problema é que a janela do Access abre antes do formulário splash, causando um efeito desagradável. Para contornar isso, podemos usar um atalho para abrir a aplicação, pois nas propriedades do atalho podemos definir que ela seja aberta minimizada. Como o formulário é popup, ele fica visível na tela. Estaria tudo muito bom se não fosse o detalhe de que o usuário poderia clicar no ícone da aplicação na barra de tarefas e abri-la antes de completar o efeito. Então, o que faremos para evitar isso? Podemos incluir um módulo com uma função que oculte a janela do Access. Agora, alem de minimizada, ela vai ficar oculta. Aí você me pergunta: "ora, por que já não fez isso antes? Ocultar a janela do Access, para que não precise usar atalho e abri-la minimizada?" E eu respondo: "Por uma razão muito simples: toda função que colocamos em uma aplicação é executada depois que a aplicação abre. Portanto, não iria barrar a abertura da janela antes da abertura do splash screen". Bom, agora é só programar nosso splash para ficar aberto por uns 5 segundos e então abrir o formulário principal e fechar a si mesmo, certo? Bem, se a intenção for manter a janela do Access oculta, a resposta é: certo. Mas, se por algum motivo, como por exemplo a necessidade de se usar menus personalizados ou ribbons presentes na janela do Access, precisarmos que ela fique visível novamente, teremos que reexibi-la. Acontece que ela está minimizada. Então, precisaremos maximizá-la, certo? Certo. E como faremos isso via código? O vba tem uma instrução que faz isso:
DoCmd.RunCommand acCmdAppMaximize
A questão é saber aonde e quando colocar essa instrução, pois nos testes ela não funcionou nem no evento "Ao carregar" e nem no evento "Ao abrir" do formulário. Acredito que isso aconteça pelo motivo de que o formulário precisaria estar completamente carregado para executá-la. Eu pensei na possibilidade de usar a instrução no evento "No timer" do splash, antes de fechá-lo, mas tambem não rolou. Então, a ideia que me surgiu foi colocá-la no evento "No timer" do formulário principal, quando então ele estaria completamente carregado. Para não atrasar a ação, defini o timer para 1, ou seja, um milésimo de segundo. Funcionou, mas como sempre, tem um porem: o formulário se abre antes da janela ser maximizada, com a área de trabalho do Windows ou outras aplicações abertas ao fundo. Achei o efeito desagradável. Então pensei, vou abrir o formulário principal em modo oculto e coloco-o visível depois da janela maximizada, no evento "No timer" do formulário principal. Acontece que os eventos se iniciam de forma simultânea e como a abertura do formulário é mais rápida do que a maximização da janela do Access, o efeito estranho continuou. A saída foi inserir um contador para maximizar a janela e aguardar alguns décimos de segundos para abrir o formulário. Dessa forma, deu tudo certo conforme eu queria.
Deixo abaixo um exemplo com todos os elementos necessários, incluindo o atalho. Caso necessite, altere o caminho da aplicação nas propriedades do atalho. Uma outra vantagem em usar atalhos, é que podemos personalizar o ícone dele.
https://www.dropbox.com/s/jb6e7c31pqdwp8x/SPlashScreenMudaIcon.zip?dl=1
Nova versão que altera o ícone do app em formulários, relatórios e systray: http://dl.dropbox.com/u/5454503/SPlashScreenMudaIcon.zip |
Última edição por criquio em 20/7/2018, 17:51, editado 3 vez(es)