Dando loading enquanto ClientDataset carrega

16/06/2011

76

Bom, gostaria de por uma tela de "PROCURANDO" enquanto abro o ClientDataSet .
Obs: pensei em threads ... 
Responder

Post mais votado

05/05/2013

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
Responder

Mais Posts

16/06/2011

Nigro

Não precisa. Faça um form simples, apenas com um GIF animado, por exemplo, aquele da lupa, o próprio banco de dados vai te dar um delay, assim. Supondo que esse form se chame "TelaABertura"
.
.
.
.
 
TelaAbertura := TTelaAbertura.Create(Self);
TelaAbertura.ShowModal;
ClientDataSet.Open;
FreeAndNil(TelaAbertura);
.
.
.
.
.
Responder
já tentei isso e não funcionou, ele chama a tela de loading, ex: TFrmLoading, porém fica nela e não sai mesmo depois de muitooo tempo. 
Tentei fazer FrmLoading.Show;
funcionou normalmente, porém os icones da tela de FrmLoading não aparecem (como se ela estivesse por trás dos outros forms).

Responder
tente assim:

var
  JanelasCongeladas: Pointer;
begin
  TelaAbertura := TTelaAbertura.Create(Self);

  // desabilita todas as telas, exceto TelaAbertura
  JanelasCongeladas := DisableTaskWindows( TelaAbertura.Handle );

  try
    TelaAbertura.BorderIcons := []; // pode estar diretamente no TelaAbertura
    TelaAbertura.BorderStyle := bsSizeToolWin; // pode estar diretamente no TelaAbertura
    TelaAbertura.Show; // exibe a tela
    TelaAbertura.Repaint; // desenha novamente a tela

    ClientDataSet.Open; // abre o dataset
  finally
    EnableTaskWindows( JanelasCongeladas ); // reabilita todas as telas
    FreeAndNil( TelaAbertura ); // elimina TelaAbertura e libera a memoria
  end;
end;




usando essa técnica você pode até mesmo ter uma barra de progresso na sua "tela de processamento", sendo incrementada pelo programa chamador. assim:

var
  JanelasCongeladas: Pointer;
begin
  TelaAbertura := TTelaAbertura.Create(Self);

  // desabilita todas as telas, exceto TelaAbertura
  JanelasCongeladas := DisableTaskWindows( TelaAbertura.Handle );

  try
    TelaAbertura.BorderIcons := []; // pode estar diretamente no TelaAbertura
    TelaAbertura.BorderStyle := bsSizeToolWin; // pode estar diretamente no TelaAbertura

    // configuro a ProgressBar (lembrando que em TelaAbertura agora há um TProgressBar)
    TelaAbertura.ProgressBar1.Max := 15; // numero de passagens possíveis
    TelaAbertura.ProgressBar1.Step := 1; // unidades a serem incrementadas por StepIt
    TelaAbertura.ProgressBar1.Position := 0; // posição inicial do progresso

    TelaAbertura.Show; // exibe a tela
    TelaAbertura.Repaint; // desenha novamente a tela

    // processo que levará em torno de 15seg, alimentando a barra
    // de progresso de TelaAbertura a partir do processo abaixo
    while not ProcessoFinalizado do
    begin
      TelaAbertura.ProgressBar1.StepIt; // incrementa a barra de progresso
      Sleep(1000); // aguarda 1 seg (para demonstrar um tempo de processamento)

      Application.ProcessMessages; // processa as mensagens da fila
    end;
  finally
    EnableTaskWindows( JanelasCongeladas ); // reabilita todas as telas
    FreeAndNil( TelaAbertura );// elimina TelaAbertura e libera a memoria
  end;
end;



Responder
Funcionando perfeitamente amigo, era disso que precisava, mais se você pudesse explicar algumas coisas ;

 1 - Porque utilizar o DisableTaskWindow e EnableTaskWindow
2 - QUal função do Repaint

Responder
Funcionando perfeitamente amigo, era disso que precisava, mais se você pudesse explicar algumas coisas ;

 1 - Porque utilizar o DisableTaskWindow e EnableTaskWindow
2 - QUal função do Repaint



você precisa usar o Show no lugar de ShowModal. com isso, se você não desabilitar as telas (DisableTaskWindow e EnableTaskWindow), o formulário de 'progresso' pode não aparecer e, se aparecer, o usuário pode clicar em outro ponto da tela e fazer com que o formulário de 'progresso' fique atrás do form principal.

a função do repaint está descrita no comentário do código: redesenha a tela.

Responder

25/06/2011

Anderson Nunes

Com thread seria mais simples e mais facil, alguem sabe por que não deveria usar thread neste caso? Eu achei a dica do colega muito grande e complicada para a simplicidade da tarefa.


Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar