среда, 21 января 2015 г.

Выполнение процедуры после сразу после отображения формы

Ну наверное каждый сталкивался с тем, что надо выполнить какую либо процедуру после того, как главная форма будет отображена.

Самый распространенный способ реализации - использование таймера. Устанавливаем его на 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 сек, загружаются данные, приложение сворачивается в трей и поток сам уничтожается.

1 комментарий:

  1. Есть способ намного проще - создаешь форму, убираешь ее из автосоздания. в dpr файле пишешь form.show. программно отображаешь все элементы, когда все сделал - form.hide, и показываешь главную форму.

    ОтветитьУдалить