Графический интерфейс пользователя должен обновляться основным потоком. Вы должны поместить свой поисковый код в отдельный поток, и пока поток поисковика работает, ваш основной поток может показать анимацию вместе с сообщением «Please wait».
Ваш поисковый поток может уведомить основной поток, когда поиск выполняется любым из доступных методов синхронизации. Самый простой способ - определить метод в вашем классе потока, который останавливает анимацию в пользовательском интерфейсе, и передать этот метод для синхронизации в конце метода Execute вашего потока поисковика.
Код вашего поискового потока будет примерно таким:
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;
И код вашего основного потока будет выглядеть так:
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;