terça-feira, 3 de abril de 2012

É muito comum ver diversos sistemas que possuem tela de abertura com uma barra de carregamento, sendo que não há nada carregando.. ou seja... a barra de progresso se torna um enfeite ou frescura.
Mas agora, vou demonstrar como criar uma barra de progresso que realmente mostra que está carregando alguma coisa.

Primeiramente, temos que criar o formulário de abertura, vou criar um formulário 'mais ou menos' só para demonstração.

Ao invés de utilizar ProgressBar, vou utilizar um TGauge que fica na paleta Samples. O Form vai se chamar frmSlpash, o Gauge se chamará Gauge1.


Vamos abrir o arquivo .dpr e visualizar seu conteúdo. Clique com o Botão direito e selecione View Source.

Sabemos que esse é o arquivo que executa nossa aplicação, assim como o carregamento dos Formulários.
Dentro da estrutura begin e end temos o seguinte código.

begin
  // inicia a aplicação
  Application.Initialize;
  // mostra na barra de tarefas
  Application.MainFormOnTaskbar := True;
  // carrega os formulários
  Application.CreateForm(TfrmSplash, frmSplash);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm5, Form5);
  Application.CreateForm(TForm6, Form6);
  // executa a aplicação
  Application.Run;
end.

Agora, vamos tratar do formulário frmSplash. Para carregar a barra, vamos alterar seu valor a cada carregamento a formulário que nossa aplicação carrega, e vamos mudar o status e a porcentagem, da seguinte maneira.

Primeiramente vamos declarar no arquivo .drp a uses SysUtils, que vai ser responsável pelo comando Sleep(); que vamos usar.
Podemos dizer que o comando Sleep é um Delay, que aguarda um certo momento para prosseguir com a aplicação.

begin
  // cria a tela de abertura antes
  frmSplash := TfrmSplash.Create(Application);
  // mostra a tela de abertura
  frmSplash.Show;
  frmSplash.Refresh;
  // Começa com 1%
  frmSplash.Gauge1.Progress := 1;
  // espera...
    Sleep(100);
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
//Application.CreateForm(TfrmSplash, frmSplash);
  // cria o form2
  Application.CreateForm(TForm2, Form2);
  // altera a ProgressBar
    frmSplash.Gauge1.Progress := 8;
    // espera...
    Sleep(500);
 
  Application.CreateForm(TForm3, Form3);
  // altera a ProgressBar
  frmSplash.Gauge1.Progress := 34;
  // espera...
  Sleep(500);

  Application.CreateForm(TForm4, Form4);
  // altera a ProgressBar
  frmSplash.Gauge1.Progress := 51;
  // espera...
  Sleep(500);

  Application.CreateForm(TForm5, Form5);
  // altera a ProgressBar
  frmSplash.Gauge1.Progress:= 73;
  // espera...
  Sleep(500);
  Application.CreateForm(TForm6, Form6);
  // altera a ProgressBar
  frmSplash.Gauge1.Progress := 100;
  // espera...
  Sleep(500);
 
 // esconde o form
  frmSplash.Hide;
  frmSplash.Free;
  Application.Run;
end.

Desta maneira, a barra TGauge será carregada após a criação de cada formulário.
Você também pode alterar o Caption de um Label a cada vez que um formulário for criado, dessa maneira:

  // cria o form2
  Application.CreateForm(TForm2, Form2);
  // altera a ProgressBar
  frmSplash.Gauge1.Progress := 8;
  // altera o status
  frmSplash.lblStatus.Caption := 'Carregando Forumlario2...';
  // espera...
  Sleep(500);


É isso aí galera, abraço e até a próxima!

7 comentários:

  1. Amigo...muito legal seu post...

    mas esta com certeza não é a melhor forma de carregar sua aplicação
    pois você está criando todas a unidades já na inicialização do sistema...isso fará com que fique muuuito pesado em aplicações grandes...pois tudo que por descuido for colocado nos eventos Create dos forms...será executado ...e isso não é bom. Então o correto é briar a aplicação apenas com main-form...depois criar e liberar os outros forms conforme a necessidade.

    abraço!

    ResponderExcluir
  2. Anônimo11.4.12

    Uma sugestão: em vez de colocar os Sleep(...), que fazem a aplicação demorar mais de 2.5 seg a arrancar, coloque um Application.ProcessMessages; por forma a fazer o "refresh" à form splash.

    ResponderExcluir
  3. Anônimo12.4.12

    Outra coisa também, é que no Firemonkey, os formulários não são mais instanciados no momento do Application.CreateForm, e sim depois do Application.Run, portanto ao firemonkey sua idé não se aplica mais.

    ResponderExcluir
  4. Anônimo17.5.12

    Olá, gostaria de avisar que nenhum link de download de e-book está funcionando. Poderia reupar? Muito obrigada

    ResponderExcluir
  5. Anônimo31.5.12

    Muito legal este post..
    Mas queria acrescentar aqui que para trocar as mensagens do carregamento dos forms vc tem que colocar um refresh no caption desta forma:

    frmSplash.lblStatus.Refresh;

    se nao, nao sai do caption inicial.

    Obrigado!

    ResponderExcluir
  6. Anônimo4.9.15

    Deveria se chamar: "Criando um SplashScreen inCorretamente - Delphi". Haha!

    ResponderExcluir
  7. Bizarro!!!! Meudeusudocéu. E o sujeito ainda declara que é o modo correto de fazer. Só pode ser brincadeira.

    ResponderExcluir