Ну наверное каждый сталкивался с тем, что надо выполнить какую либо процедуру после того, как главная форма будет отображена.
Самый распространенный способ реализации - использование таймера. Устанавливаем его на 1 мс. В теле его выполняем нужную процедуру и потом его выключаем.
Но я для себя нашел другой способ - ПОТОКИ.
Итак пример.
Есть форма, которая должна отображать процесс загрузки данных и старт сервисов. Если записать процедуру загрузки в OnCreate формы - все загрузится до того, как форма отобразится. В OnShow - тоже самое. Форма нарисуется по окончании загрузки. Нам нужно, что-то что будет выполнять загрузку параллельно. Это потоки.
Начинаем.
Объявляем новый класс
TMyThread = class(TThread)
protected
procedure Execute;
end;
Объявим глобальную переменную
var
LoadThread: TMyThread;
Описываем что будет выполняться в потоке
procedure TLoadThread.Execute;
begin
inherited;
repeat
if Form1.Showing then //Если показалась форма
try
sleep(5000); // для наглядности задержка
{ тут процедуры загрузки }
finally
Form1.LoadFinished := true; // Флаг об окончании загрузки
Form1.lbCurrentStatus.Caption := 'Сервер запущен'; // Показываем пользователю, что загрузилось все
sleep(1000);
Application.Minimize; // сворачиваю приложение
end;
until Form1.LoadFinished = true;
end;
С потоком все.
К нашей форме добавим флаг LoadFinished
property LoadFinished: boolean read FLoadFinished write FLoadFinished;
В OnCreate формы создадим и запустим поток.
procedure TForm1.FormCreate(Sender: TObject);
begin
LoadFinished := false;
LoadThread := TLoadThread.Create;
LoadThread.FreeOnTerminate := true;
LoadThread.Priority := tpNormal;
// LoadThread.Start;
end;
Самый распространенный способ реализации - использование таймера. Устанавливаем его на 1 мс. В теле его выполняем нужную процедуру и потом его выключаем.
Но я для себя нашел другой способ - ПОТОКИ.
Итак пример.
Есть форма, которая должна отображать процесс загрузки данных и старт сервисов. Если записать процедуру загрузки в OnCreate формы - все загрузится до того, как форма отобразится. В OnShow - тоже самое. Форма нарисуется по окончании загрузки. Нам нужно, что-то что будет выполнять загрузку параллельно. Это потоки.
Начинаем.
Объявляем новый класс
TMyThread = class(TThread)
protected
procedure Execute;
end;
Объявим глобальную переменную
var
LoadThread: TMyThread;
Описываем что будет выполняться в потоке
procedure TLoadThread.Execute;
begin
inherited;
repeat
if Form1.Showing then //Если показалась форма
try
sleep(5000); // для наглядности задержка
{ тут процедуры загрузки }
finally
Form1.LoadFinished := true; // Флаг об окончании загрузки
Form1.lbCurrentStatus.Caption := 'Сервер запущен'; // Показываем пользователю, что загрузилось все
sleep(1000);
Application.Minimize; // сворачиваю приложение
end;
until Form1.LoadFinished = true;
end;
С потоком все.
К нашей форме добавим флаг LoadFinished
property LoadFinished: boolean read FLoadFinished write FLoadFinished;
В OnCreate формы создадим и запустим поток.
procedure TForm1.FormCreate(Sender: TObject);
begin
LoadFinished := false;
LoadThread := TLoadThread.Create;
LoadThread.FreeOnTerminate := true;
LoadThread.Priority := tpNormal;
// LoadThread.Start;
end;
Что в итоге мы имеем.
Приложение загружается, появляется форма. Спустя 5 сек, загружаются данные, приложение сворачивается в трей и поток сам уничтожается.
Есть способ намного проще - создаешь форму, убираешь ее из автосоздания. в dpr файле пишешь form.show. программно отображаешь все элементы, когда все сделал - form.hide, и показываешь главную форму.
ОтветитьУдалить