Pergunta

Talvez seja muito fácil para você, mas estou trabalhando duro em um projeto (para fins educacionais) que está consultando o ADSI com o componente TADSISEARCH, por vários dias. Estou tentando mostrar uma tela 'Aguarde', aguarde. Embora eu tenha tentado todas as possibilidades, mas não consegui ter sucesso. Tentei usar o TADSISEARCH em um thread, mas o thread está terminando antes do acabamento do AdSisSearch. Eu acho que o Tadsissearch não é seguro. O que você acha? Além disso, de outra maneira que eu criei o Form2 e usei um thread para atualizá -lo, mas o GIF animado está parando enquanto o formulário principal foi pesquisando adsi. O que você pode dizer sobre isso? Como posso fazer uma tela, por favor, aguarde enquanto o AdsiseSearch está funcionando e manter o formulário principal respondendo. Application.processmessages ou Timer também não é uma maneira. Muito obrigado pela leitura e respostas.

Foi útil?

Solução

A interface gráfica do usuário deve ser atualizada pelo thread principal. Você deve colocar seu código de pesquisa em um encadeamento separado e, enquanto o thread do pesquisador estiver funcionando, seu thread principal pode mostrar a animação junto com a mensagem "Por favor, aguarde".

Seu thread do pesquisador pode notificar o thread principal quando a pesquisa é feita por qualquer uma das técnicas de sincronização disponíveis. O mais simples é definir um método na sua classe de thread que interrompe a animação na interface do usuário e passe esse método para sincronizar no final do método executado do seu thread do pesquisador.

Seu código de thread do pesquisador será algo assim:

type
  TMyThread = class(TThread)
  private
    procedure NotifyEndOfThread;
  protected
    procedure Execute; override;
  end;

implementation

uses MainFormUnit;

procedure TMyThread.NotifyEndOfThread;
begin
  MainForm.ShowAnimation := False;
end;

procedure TMyThread.Execute;
begin
  try
    {Add your search code here}
  finally
    Synchronize(NotifyEndOfThread);
  end;
end;

E o código do seu tópico principal será assim:

TMainForm = class(TForm)
...
private 
  FShowAnimation : Boolean;
  procedure SetShowAnimation(Value: Boolean);
public
  property ShowAnimation : Boolean read FShowAnimation write SetShowAnimation;
end;

procedure TMainForm.SetShowAnimation(Value: Boolean);
begin
  FShowAnimation := Value;
  if FShowAnimation then
    {Add animation code here}
  else
    {Stop animation}
end;

Outras dicas

Talvez você possa tentar isso:

Tela splash de rosca para Delphi
http://cc.embarcadero.com/item/20139

Eu uso isso em um aplicativo de tela sensível ao toque/terminal (Thin Client, Wi -Fi, Remobjects etc.) e funciona bem! Também consegui um GIF animado funcionando.

Como o thread pode terminar antes que a pesquisa seja concluída? Se a pesquisa for executada no thread e você tiver apenas uma instância do thread, ele deve funcionar.

Você não pode apenas fazer um

f := TMyWaitForm.Create(self);
try
   f.Show();
   ...start the TADSISearch...
finally
   FreeAndNil(f);
end;

Colocando um GIF animado no TMYWaitForm (que se exibe)?

Eu tenho uma forma de progresso ao criar sites no meu programa de criação da web, e isso funciona como um charme.

Você pode considerar mostrar algumas informações de estado sobre o formulário de espera (se o componente/software TADSISEARCH tiver uma função ou evento de chamada que possa ser atribuído).

Exibir um relógio em execução mostrando a quantidade de tempo que o processo está levando, também é um toque agradável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top