Создать анимированный заставку Delphi 7 - PullRequest
4 голосов
/ 19 ноября 2011

Я пытаюсь создать анимированный экран-заставку, пока мое приложение загружает его базу данных. Я уже создал заставку, но я хочу, чтобы изображение «двигалось» слева направо во время преобразования БД. Некоторое время я искал, но все, что я смог найти, это индикатор выполнения ...

Вот мой код:

SplashScreen := TSplashScreen.Create(Application) ;
SplashScreen.Show;
Application.Initialize;
SplashScreen.Update;
SplashScreen.lblStatus.Caption:='Loading...';
SplashScreen.Update;
SplashScreen.lblStatus.Caption:='Updating database...';
SplashScreen.Update;
Application.Initialize;
Application.CreateForm(TfmMain, fmMain);
Sleep(1000);

Application.CreateForm(TfmPrefs, fmPrefs);
Application.CreateForm(TfmCode, fmCode);
Application.CreateForm(TfmEmps, fmEmps);
Application.CreateForm(TfmRest, fmRest);
Application.ShowMainForm:=FALSE;

SplashScreen.Hide;
SplashScreen.Free;
Application.Run;

В форме splashscrren я создал 5 дубликатов одного и того же изображения, и пока создается основная форма, я хочу, чтобы изображение было видимым и не отображалось попеременно ... например:

while my db loads... begin
Splashscreen.Image1.Visible:=FALSE;
SplashScreen.Update;
Sleep(25);
SplashScreen.Image1.Visible:=FALSE;
SplashScreen.Update;
SplashScreen.Image2.Visible:=TRUE;....

и так далее!

Есть мысли?

1 Ответ

4 голосов
/ 19 ноября 2011

Выполнение тяжелой работы в главном потоке во время запуска (например, инициализация базы данных и многих форм) плохо работает с заставками. Основной поток слишком занят, чтобы что-либо делать с графическим интерфейсом. Помещение Sleep в код не будет работать, так как это остановит основной поток для выполнения какой-либо работы.

Это оставляет вам два варианта:

  1. Выполните инициализацию базы данных в другом потоке. Иногда хорошим вариантом является также только инициализация основной формы. Поток базы данных может отправлять сообщения о ходе выполнения в форму-заставку с помощью вызовов PostMessage.

  2. Запустить заставку в отдельном потоке. Это довольно сложно, потому что вы не можете использовать VCL из другого потока. А также вы должны избегать блокировки очереди сообщений. К счастью, Питер Белоу (Peter Below) привел хороший пример того, как сделать многопоточный экран-заставку , используя только вызовы Windows API.

В этом SO-потоке содержится дополнительная информация: display-splash-screen-in-delphi-when-main-thread-is-busy .

...