Практика
SplashForm - заставка для программы

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика


Надеюсь никому не нужно объяснять, что такое SplashForm и зачем она нужна. Вы постоянно сталкиваетесь с ними, работая с пакетом Microsoft Office, Delphi и многими другими "большими" программами. Что и говорить, в настоящее время интерфейс программы важен не меньше чем ее функциональность, и красивая заставка добавит еще один плюс вашему приложению.

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

Мне известны два способа, позволяющие сделать заставку, каждый из которых имеет свои положительные и отрицательные моменты. Первый способ, о котором пойдет речь, имеет смысл применять в тех случаях, когда приложение имеет мало форм, быстро загружается, а показать заставку хочется сильно (очень уж она красивая получилась). Тогда делаем следующее. Создаем форму, которая будет играть роль заставки (в примере она называется SplashForm), подключаем ее к главному модулю проекта, и в событии OnCreate пишем следующее.

procedure TForm1.FormCreate(Sender: TObject);
var
  t: cardinal;
begin
   SplashForm := TSplashForm.Create( nil );
   SplashForm.Show;
   t := GetTickCount;
   while ( GetTickCount - t ) < 5000 do
   begin
      Application.ProcessMessages;
      if not SplashForm.Visible then
         Break;
   end;
   SplashForm.Free;
end;

Как видите все просто. К плюсам этого способа относится то, что даже если эту заставку перекрыть другой формой, а потом убрать ее, на форме не останется "серых пятен". К минусам можно отнести то, что на такой форме невозможно отобразить процесс загрузки приложения. Второй способ полностью противоположен первому. Задача отображения процесса загрузки решается элементарно, а вот от "серых пятен" полностью избавиться невозможно (этим страдает и сам Delphi). Второй способ я разберу на примере, имеющемся в Delphi, он расположен в каталоге Delphi6\Demos\Db\MastApp\. Открыв файл проекта, мы увидим следующее.

program Mastapp;

uses
  Forms,
  Main in 'MAIN.PAS' {MainForm},
  Brparts in 'BRPARTS.PAS' {BrPartsForm},
  QryCust in 'QryCust.pas' {QueryCustDlg},
  Edparts in 'EDPARTS.PAS' {EdPartsForm},
  BrCstOrd in 'BrCstOrd.pas' {BrCustOrdForm},
  Edcust in 'EDCUST.PAS' {EdCustForm},
  Edorders in 'EDORDERS.PAS' {EdOrderForm},
  SrchDlg in 'SrchDlg.pas' {SearchDlg},
  Splash in 'SPLASH.PAS' {SplashForm},
  Pickdate in 'PICKDATE.PAS' {BrDateForm},
  About in 'ABOUT.PAS' {AboutBox},
  Pickrep in 'PICKREP.PAS' {PickRpt},
  DataMod in 'DataMod.pas' {MastData: TDataModule},
  CustRpt in 'CustRpt.pas' {CustomerByInvoiceReport: TQuickRep},
  OrderRpt in 'OrderRpt.pas' {OrdersByDateReport: TQuickRep},
  InvcRpt in 'InvcRpt.pas' {InvoiceByOrderNoReport: TQuickRep},
  PickInvc in 'PickInvc.pas' {PickOrderNoDlg};

{$R *.RES}

begin
  Application.Initialize;
  SplashForm := TSplashForm.Create(Application);
  SplashForm.Show;
  SplashForm.Update;
  Application.Title := 'Marine Adventures Order Entry';
  Application.HelpFile := 'MASTAPP.HLP';
  Application.CreateForm(TMastData, MastData);
  Application.CreateForm(TMainForm, MainForm);
  Application.CreateForm(TBrPartsForm, BrPartsForm);
  Application.CreateForm(TQueryCustDlg, QueryCustDlg);
  Application.CreateForm(TEdPartsForm, EdPartsForm);
  Application.CreateForm(TBrCustOrdForm, BrCustOrdForm);
  Application.CreateForm(TEdCustForm, EdCustForm);
  Application.CreateForm(TEdOrderForm, EdOrderForm);
  Application.CreateForm(TSearchDlg, SearchDlg);
  Application.CreateForm(TBrDateForm, BrDateForm);
  Application.CreateForm(TAboutBox, AboutBox);
  Application.CreateForm(TPickRpt, PickRpt);
  Application.CreateForm(TCustomerByInvoiceReport, CustomerByInvoiceReport);
  Application.CreateForm(TOrdersByDateReport, OrdersByDateReport);
  Application.CreateForm(TInvoiceByOrderNoReport, InvoiceByOrderNoReport);
  Application.CreateForm(TPickOrderNoDlg, PickOrderNoDlg);
  SplashForm.Hide;
  SplashForm.Free;
  Application.Run;
end.

Разберем то, что тут написано. После инициализации создается Splash форма, которая держится на экране ровно столько времени, сколько загружается приложение. Чтобы понять, что я имел в виду, говоря о "серых пятнах", запустите приложение, и пока заставка держится на экране, перекройте ее другой формой, и сразу уберите. Частично эту проблему поможет решить процедура Update нашей заставки. Изменим последнюю часть кода следующим образом.

begin
  Application.Initialize;
  SplashForm := TSplashForm.Create( Application );
  SplashForm.Show;
  SplashForm.Update;
  Application.Title := 'Marine Adventures Order Entry';
  Application.HelpFile := 'MASTAPP.HLP';
  Application.CreateForm(TMastData, MastData);
  SplashForm.Update;
  Application.CreateForm(TMainForm, MainForm);
  SplashForm.Update;
  Application.CreateForm(TBrPartsForm, BrPartsForm);
  SplashForm.Update;
  Application.CreateForm(TQueryCustDlg, QueryCustDlg);
  SplashForm.Update;
  Application.CreateForm(TEdPartsForm, EdPartsForm);
  SplashForm.Update;
  Application.CreateForm(TBrCustOrdForm, BrCustOrdForm);
  SplashForm.Update;
  Application.CreateForm(TEdCustForm, EdCustForm);
  SplashForm.Update;
  Application.CreateForm(TEdOrderForm, EdOrderForm);
  SplashForm.Update;
  Application.CreateForm(TSearchDlg, SearchDlg);
  SplashForm.Update;
  Application.CreateForm(TBrDateForm, BrDateForm);
  SplashForm.Update;
  Application.CreateForm(TAboutBox, AboutBox);
  SplashForm.Update;
  Application.CreateForm(TPickRpt, PickRpt);
  SplashForm.Update;
  Application.CreateForm(TCustomerByInvoiceReport, CustomerByInvoiceReport);
  SplashForm.Update;
  Application.CreateForm(TOrdersByDateReport, OrdersByDateReport);
  SplashForm.Update;
  Application.CreateForm(TInvoiceByOrderNoReport, InvoiceByOrderNoReport);
  SplashForm.Update;
  Application.CreateForm(TPickOrderNoDlg, PickOrderNoDlg);
  SplashForm.Update;
  SplashForm.Hide;
  SplashForm.Free;
  Application.Run;
end.

Теперь окно заставки обновляется после создания каждой формы. А как же с процессом загрузки? Все просто, на форме есть метка Label1, и перед созданием каждой формы, будем выводить на нее название создаваемой формы. Код примет следующий вид.

begin
  Application.Initialize;
  SplashForm := TSplashForm.Create( Application );
  SplashForm.Label1.Left := 10;
  SplashForm.Show;
  SplashForm.Update;
  Application.Title := 'Marine Adventures Order Entry';
  Application.HelpFile := 'MASTAPP.HLP';
  SplashForm.Label1.Caption := 'Loading... MastData';
  Application.CreateForm(TMastData, MastData);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... MainForm';
  Application.CreateForm(TMainForm, MainForm);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... BrPartsForm';
  Application.CreateForm(TBrPartsForm, BrPartsForm);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... QueryCustDlg';
  Application.CreateForm(TQueryCustDlg, QueryCustDlg);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... EdPartsForm';
  Application.CreateForm(TEdPartsForm, EdPartsForm);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... BrCustOrdForm';
  Application.CreateForm(TBrCustOrdForm, BrCustOrdForm);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... EdCustForm';
  Application.CreateForm(TEdCustForm, EdCustForm);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... EdOrderForm';
  Application.CreateForm(TEdOrderForm, EdOrderForm);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... SearchDlg';
  Application.CreateForm(TSearchDlg, SearchDlg);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... BrDateForm';
  Application.CreateForm(TBrDateForm, BrDateForm);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... AboutBox';
  Application.CreateForm(TAboutBox, AboutBox);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... PickRpt';
  Application.CreateForm(TPickRpt, PickRpt);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... CustomerByInvoiceReport';
  Application.CreateForm(TCustomerByInvoiceReport, CustomerByInvoiceReport);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... OrdersByDateReport';
  Application.CreateForm(TOrdersByDateReport, OrdersByDateReport);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... InvoiceByOrderNoReport';
  Application.CreateForm(TInvoiceByOrderNoReport, InvoiceByOrderNoReport);
  SplashForm.Update;
  SplashForm.Label1.Caption := 'Loading... PickOrderNoDlg';
  Application.CreateForm(TPickOrderNoDlg, PickOrderNoDlg);
  SplashForm.Update;
  SplashForm.Hide;
  SplashForm.Free;
  Application.Run;
end.

На этом все. Решайте сами, какой способ предпочесть для своей программы. В примере к статье вы найдете программу, демонстрирующую первый способ, и файл проекта для второго способа, которым вы должны заменить уже имеющийся в Delphi файл. Удачи.

.: Пример к данной статье :.


При использовании материала - ссылка на сайт обязательна