Создайте новый проект. Сохраните модуль главной формы под именем MainUnit.pas, а проект под именем spiashProject.dpr. Теперь выберите из меню Project (Проект) пункт View Source (Просмотр исходника), чтобы увидеть исходный код проекта. Вы должны увидеть код, показанный в листинге 9.1.
Листинг 9.1. Исходный код проекта:
program SpiashProject;
uses Forms,
MainUnit in 'MainUnit.pas1 {Forml}; {$R *.res} begin
Application.Initialize; Application.CreateForm(TFormi, Forml); Application.Run; end.
Все это не что иное, как содержимое файла SplashProject.dpr. Первой строкой стоит имя программы program SplashProject. В этой строке ничего менять нельзя, потому что имя файла должно совпадать с написанным здесь именем программы. После этого идет уже знакомый раздел uses, в котором можно подключать необходимые модули. У нас подключены модули Forms (позволяет работать с формами) и MainUnit (модуль главного окна). Если в вашей программе несколько окон, то все они автоматически прописываются здесь в раздел uses, потому что в этом файле описана инициализация окон, и он должен знать о существовании всех окон в программе. Если какое-то окно инициализируется не автоматически, то только в этом случае вы можете убрать модуль этого окна из подключения uses, иначе при компиляции произойдет ошибка.
Между begin и end выполняются три строки.
Application.initialize— запускает инициализацию приложения. Убирать не рекомендуется.
Application.CreateForm (TForm1, Form1) —метод CreateForm инициализирует форму. У него два параметра — имя объекта и имя переменной, которая впоследствии будет указывать на созданный объект. В нашем случае это имя формы TForm1 и имя переменной Form1. Переменная Form1 автоматически описывается в модуле объекта TForm1 (в нашем случае это модуль
MainUnit .pas) в разделе var:
var
Forml: TFormi;
Application.Run — после инициализации всех форм можно запускать выполнение программы С ПОМОЩЬЮ метода Run объекта Application.
Здесь везде используется объект Application. Этот объект всегда существует в ваших программах в единственном экземпляре и создается с помощью строки Application.initialize. С этим объектом мы будет знакомиться постепенно на протяжении всей книги, а сейчас достаточно знать, что он происходит от класса TAppiication и реализует основные функции управления приложением.
Теперь создайте новую форму, выбрав меню File | New | Form, и сохраните ее под именем spiashunit.pas. Снова посмотрите на исходный код проекта, он должен быть таким, как показано в листинге 9.2.
program SplashProject; uses
* Forms, »
MainUnit in 'MainUnit.pas' {Forml}, SplashUnit in 'SplashUnit.pas 1 {Form2};
{$R *.res} begin
Application.Initialize; Application.CreateForm(TForml, Forml); Application.CreateForm (TForm2, Form2); Application.Run; end.
В раздел uses добавилось объявление нового модуля, а между begin и end появился код создания новой формы.
Теперь войдите в свойства проекта (из меню Project (Проект) нужно выбрать пункт Option (Опции)). На вкладке Forms (Формы) в списке Auto-create forms (Автосоздаваемые формы) у нас описано две формы. Выделите Form2 (эта вторая форма, которую мы только что создали) и переместите ее в список Available forms (Доступные формы). Закройте окно свойств кнопкой ОК и посмотрите на исходный код проекта. Вы можете заметить, что строка инициализации второй формы исчезла. Это потому, что мы перенесли ее из списка автоматически создаваемых форм в список доступных форм. То есть наша форма доступна в проекте, но не создается автоматически при старте программы. Таким образом, чтобы использовать Form2, мы ее должны сначала создать.
Чтобы дальше было удобнее работать, переименуйте главную форму Forml в MainForm, а вторую форму Form2 в spiashForm. Так мы не будем путаться, где главная форма, а где форма-заставка. Установите на главную форму кнопку и по ее нажатии напишите следующий код:
procedure TMainForm.ButtonlClick(Sender: TObj ect); begin
Application.CreateForm(TSplashForm, SplashForm);
SplashForm. ShowModal ;
SplashForm.Free;
end;
Здесь в первой строке кода мы инициализируем форму SplashForm. Во второй — созданное окно выводится на экран. И в последней строке происходит уничтожение Окна методом Free.
Но есть еще один способ создания окон, который мы уже использовали, и он предпочтительнее. Напишите следующий код:
procedure TMainForm.ButtonlClick(Sender: TObject);
begin
SplashForm: =TSplashForm. Create (Owner) ;
SplashForm. ShowModal ;
SplashForm.Free;
end;
Здесь переменной SplashForm присваивается результат вызова метода create объекта TSpiashForm. Этому методу нужно передать только один параметр — владельца окна. Если владельца нет, то можно передавать nil (нулевое значение указывает на отсутствие владельца). В нашем случае передается Owner — свойство, в котором хранится указатель на текущее окно. Если главным окном должно быть не текущее окно, то нужно указать имя объекта — Form1.owner.
Давайте сделаем так, чтобы наше окно SplashForm появлялось на время загрузки программы. Подобные окна вы видите при старте таких программ, как Delphj, Word, Excel и других приложений. Для этого зайдите в исходный код проекта и подкорректируйте так, чтобы он соответствовал коду, приведенному в листинге 9.3.
begin
SplashForm:=TSplashForm.Create(nil);
SplashForm. Show ;
SplashForm.Repaint;
Application.Initialize;
Application. CreateForm (TMainForm, MainForm) ;
Sleep(1000);
SplashForm.Hide;
SplashForm.Free;
Application.Run; end;
Рассмотрим этот код построчно.
- Создается окно spiashForm. У этого окна не будет владельца, потому что оно показывается даже до того, как создано главное окно. Поэтому в качестве параметра методу create мы указываем значение nil.
- Отображаем окно на экране не модально, чтобы окно отобразилось, а приложение продолжало работать.
- Перерисовка окна с помощью вызова метода Repaint.
- Инициализация приложения.
- Создается главная форма TMainForm.
- Делаем задержку, чтобы окно SpiashForm могло хоть немного "зависнуть" на экране. Для этого мы используем процедуру sleep, а в качестве параметра указывается время задержки в миллисекундах. Одна секунда равна 1000 миллисекунд. Для использования этой функции в раздел uses нужно добавить модуль
- Windows.
- Прячем форму SpiashForm вызовом метода Hide.
- Уничтожаем окно.
- Запускаем приложение.
Запустите программу, и вы сначала увидите окно SpiashForm (на него помещен текст TLabel с надписью "Идет загрузка"), а потом уже появится главное окно.
Когда инициализируется форма, то в этот момент вызывается ее конструктор. Если у вас в проекте 20 форм и конструктор каждой из них выполняет какие-то долгие по времени операции, то создается ощущение, что программа зависла. Необходимо либо оптимизировать код для повышения скорости загрузки программы, либо информировать пользователя о том, что программа не висит, а идет загрузка.
Если вы не будете информировать о ходе загрузки, и на экране ничего появляться не будет, то пользователь может подумать, что программа зависла, и попытаться запустить ее еще раз. Это в свою очередь может привести к краху всего вычислительного процесса. Например, попытка запустить дважды программу, которая работает с СОМ-портом. В этом случае вторая копия уже не сможет открыть порт (СОМ-порт можно открыть только один раз). Поэтому лучше лишний раз создать окно с отображением хода загрузки, чем выслушивать недовольство пользователей по поводу работы вашей программы.
Как можно увеличить скорость загрузки? Сразу напрашиваются следующие варианты.
Инициализировать только основные формы. Очень хорошая идея. Незачем инициализировать 150 форм, когда из них будет реально использоваться не более 10, а остальные если и будут вызываться, то очень редко. Это излишние потери времени при загрузке и расходы памяти во время работы. Пусть у вас автоматически создаются только необходимые формы. ? Выполнять все операции в обработчике события Onshow. Логичное решение, ведь при инициализации формы вызывается ее конструктор и обработчик события oncreate, а значит, если эти методы будут выполняться быстро, то и загрузка программы ускорится. Но если перенести код в обработчик события onshow, то будут задержки при отображении окна, причем при каждом отображении. Можно ухитриться и проверять в Onshow, если инициализация уже была, то пропустить этот код и просто отобразить окно.
Второй вариант— неплохой, но не забывайте, что MDI-окна создаются сразу ВИДИМЫМИ, поэтому если ОНИ В списке AutoCreate, то во время загрузки программы для таких окон будет вызван как конструктор, так и отображение окна, т. е. и обработчик OnShow.
Formstyle на fsMDichild, то свойство visible тоже автоматически становится равным true.
Учитывайте этот нюанс. Если вы случайно сделали окно дочерним, а потом поменяли обратно на fsNormai, то после запуска это окно сразу же отобразится на экране (если форма в списке автоматически создаваемых), потому что свойство visible останется равным истине.
