Форма-заставка (splashscreen) часто используется при загрузке больших программ для того, чтобы развлечь пользователя интересной картинкой, сообщить ему полезную информацию о программе, об адресах и сайтах производителя, наконец, призвать к регистрации программы. Вы, конечно, много раз видели такие заставки - они появляются при установке программ и запуске MSWord, CorelDraw, AdobePhotoshopили Delphi.
Вы и сами можете включить в свой проект заставку ничуть не хуже любой «фирменной».
Возьмём за основу нашего проекта познавательную программу, с помощью которой мы успешно вычисляли жирность человеческого тела. Загрузите её в Delphiи скопируйте все файлы в новую папку Plot- на этот раз мы займёмся расчётом плотности человеческого тела (на самом деле - удельного веса, но для практических нужд всё едино).
Она близка к плотности воды (1 г на куб. см) и зависит от соотношения количества жира (плотность 0,890 г на куб. см) и мускулов (плотность 1,100 г на куб. см). Формула для подсчёта средней плотности человеческого тела такова:
p= (8,90 xzh+ 11 х (100 - zh)) г/см3.
Легко видеть, что в интерфейсе предыдущей программы нужно сделать минимальные изменения:
Свойство Captionформы - Плотность тела Captionметки Label2 - Плотность тела (г/куб.см) =
Name lblZhir - IblPlot,а её Caption - 1.05.
Остальные элементы на форме - те же, что и раньше
Естественно, придётся поработать и с кодом модуля формы. ле privateнужно объявить процедуру, вычисляющую плотность тела:
private
{private declarations}
procedure Plot;
Внимательный читатель должен был заметить, что до этого нужные значения вычислялись в функции и затем возвращались в вызывающую её процедуру. Но ещё более внимательный читатель, безусловно, обратил внимание и на то, что дальше они использовались совершенно одинаково - просто выводились на экран. Приходилось одни и те же действия повторять в каждой процедуре. На этом можно сэкономить - будем показывать вычисленное значение там же, где мы его вычисляем. И так как теперь возвращать ничего не нужно, то функцию следует превратить в процедуру:
//ВЫЧИСЛИТЬ ПЛОТНОСТЬ ТЕЛА procedureTForml.Plot;
var
v, zh, p: single; begin
//вычислить жирность тела:
if RadioGroup1.ItemIndex= 0 then begin //- мужской пол v:= (rost*3 - 450 + age) * 0.25 + 45; zh:= (ves - v) / ves * 100 + 15 end else begin
//- женскийпол
v:= (rost*3 - 450 + age) * 0.225 + 40.4; zh:= (ves - v) / ves * 100 + 22 end;
//скорректировать значения: if zh< 0 then zh:= 0; if zh> 100 then zh:= 100;
//вычислить плотность тела: p:= 8.90 * zh + 11 * (100 - zh);
p:= p / 1000;
lblPlot.Caption:= copy(floattostr(p),1,4);
end;
Вам нужно только добавить выделенные строки, чтобы получить достойный результат. Математике вас, конечно, учить не надо, а касательно последней строки можно кое-что сказать: в ней число pпреобразуется в строку, из которой выделяются только первые 4 знака, чтобы избавиться от длинной вереницы совершенно бесполезных цифр.
По понятным причинам (беда, если вы их не поняли!) все строчки
//вычислить жирность:
lblZhir.Caption:= inttostr(round(zhir))
следует заменить строчками:
//вычислить плотность:
Plot
Запускайте на радость ближним своим новое приложение и проверяйте, утонут ли они в воде (пресной), как и подобает культурному человеку, или будут плавать на поверхности - подобно пресловутому батончику MilkyWay. Только не удивляйтесь, что никакой заставки вы не увидели - её и нет.
Если жажда новизны ещё не оставила вас, то давайте продолжим мудрить в области программирования. Прежде всего, добавьте к проекту новую пустую форму (о том, как это сделать, говорилось уже много раз), назовите ее frmSplash(или как угодно по-другому) и сохраните проект на диске.
У сплаш-формы свойство BorderStyleнужно установить в bsNone, чтобы убрать полосу заголовка вместе с кнопками. Размеры и оформление формы могут быть любыми. Неплохо смотрится подходящая картинка в рамке, для которой годится компонент Panel(найдите его в Палитре компонентов!) со свойствами:
Align = alClient Bevellnner = bvLowered Color = clSilver
и компонент Bevel(для горизонтальной полоски под рисунком) со страницы Additional:
Left= 0 Height= 2 Style= bsRaised
На панель поместите компонент Image, а в него загрузите заранее приготовленную картинку. Для прояснения ваших намерений подпишите картинку (компонент Label). В итоге в окне Конструктора формы вы увидите такую заставку для вашей программы:
Так как большинство ваших программ будет загружаться настолько быстро, что заставка успеет только мелькнуть на экране, то нам следует позаботиться о продлении её бренного существования. Отмерять срок её жизни удобно с помощью компонента Timer. Щёлкните дважды на его значке:
в Палитре компонентов, и он появится на форме.
Ещё одна особенность форм-заставок состоит в том, что их нужно создавать самостоятельно, а не автоматически. Поэтому выполните команду Главного меню Project> Options... и в диалоговом окне ProjectOptions, на странице Formsвыделите название формы-заставки в левом списке и, нажав кнопку 0, перенесите его в правый список AvailableForms.
Ваша форма не будет создаваться автоматически при запуске программы, теперь это ваша забота.
А где вы должны сделать это? При создании главной формы? - Но заставка должна появиться до того! И вот тот редкий случай, когда придётся «лезть» в файл проекта. Выполните команду Главного меню Project> ViewSource, файл проекта откроется в окне Редактора кода. Допишите в него выделенные строчки:
program Project1;
uses
Forms,
Unitl in 'Unitl.pas'
{Form1},
Unit2 in 'Unit2.pas'
{frmSplash};
{$R *.RES}
begin
frmSplash := TfrmSplash.Create(Application);
frmSplash.Show;
frmSplash.Update;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
frmSplash.Hide;
frmSplash.Free;
Application.Run;
end.
Смысл их действия таков. Создаём форму-заставку и отрисовываем её, чтобы она появилась на экране. Затем выполняем стандартные операции по инициализации приложения и, когда всё готово к его запуску, убираем форму-заставку с экрана и выгружаем её из памяти компьютера (и из своей собственной).
Мы должны учесть ещё два обстоятельства. Во-первых, нужно поместить заставку в центре экрана (установите свойство Positionв poDesktopCenter), во-вторых, нужно задержать её на экране, так как обычное приложение загружается очень быстро. Для этого нужно написать такой код в модуле формы-заставки:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type
TfrmSplash = class(TForm)
Panel1: TPanel;
Bevel1: TBevel;
Label1: TLabel;
Image1: TImage;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormHide(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmSplash: TfrmSplash; implementation {$R *.DFM}
//ВЫКЛЮЧИТЬ ТАЙМЕР, ЕСЛИ ВРЕМЯ ЗАКОНЧИЛОСЬ procedure TfrmSplash.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:= False end;
//МОЖНО ЛИ ЗАКРЫТЬ ФОРМУ?
procedure TfrmSplash.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:= Timer1.Enabled = False end;
//УБРАТЬ ФОРМУ, КОГДА КОНЧИТСЯ ВРЕМЯ procedure TfrmSplash.FormHide(Sender: TObject);
begin
repeat
Application.ProcessMessages; until frmSplash.CloseQuery end;
end.
Обязательно увеличьте значение свойства Intervalтаймера до 4000-5000 мс (в Инспекторе объектов). В этом случае форма-заставка просуществует на экране 4 или 5 секунд. Поначалу свойство Enabledтаймера равно True, и он включится при появлении заставки на экране. После отсчёта установленного интервала времени таймер выключится, и свойство Enabledпримет значение False.За этим внимательно следит процедура FormHide, обрабатывающая событие OnHide, вызываемое при выполнении процедуры frmSplash.Hide. В ней проверяется, можно ли закрыть форму-заставку, а «добро» на это даёт процедура TfrmSplash.FormCloseQuery, которая ждёт, пока таймер отработает заданное время.Вот теперь ваше приложение обязательно предъявит пользователю свою «визитную карточку»!