:: 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 файл. Удачи.
.: Пример к данной статье :.
|
При использовании материала - ссылка на сайт обязательна
|
|