Инициализация окон в Delphi

Создайте новый проект. Сохраните модуль главной формы под именем 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;

Рассмотрим этот код построчно.

 

  1. Создается окно spiashForm. У этого окна не будет владельца, потому что оно показывается даже до того, как создано главное окно. Поэтому в качестве пара­метра методу create мы указываем значение nil.
  2. Отображаем окно на экране не модально, чтобы окно отобразилось, а приложе­ние продолжало работать.
  3. Перерисовка окна с помощью вызова метода Repaint.
  4. Инициализация приложения.
  5. Создается главная форма TMainForm.
  6. Делаем задержку, чтобы окно SpiashForm могло хоть немного "зависнуть" на экране. Для этого мы используем процедуру sleep, а в качестве параметра ука­зывается время задержки в миллисекундах. Одна секунда равна 1000 миллисе­кунд. Для использования этой функции в раздел uses нужно добавить модуль
  7. Windows.
  8. Прячем форму SpiashForm вызовом метода Hide.
  9. Уничтожаем окно.
  10. Запускаем приложение.

Запустите программу, и вы сначала увидите окно SpiashForm (на него помещен текст TLabel с надписью "Идет загрузка"), а потом уже появится главное окно.

СОВЕТ. Когда создаются окна (вызываются CreateForm), программа выполняет обра­ботчики события oncreate всех создаваемых форм. Если у вас приложение слишком большое и операции в этих обработчиках выполняются длительное время, то желатель­но показывать информацию о ходе выполнения этих операций в окне SpiashForm. В этом случае первым делом создается именно это окно, и оно отображается на экране. Пользователь видит, что идет загрузка, и спокойно ждет ее окончания.

Когда инициализируется форма, то в этот момент вызывается ее конструктор. Если у вас в проекте 20 форм и конструктор каждой из них выполняет какие-то долгие по времени операции, то создается ощущение, что программа зависла. Не­обходимо либо оптимизировать код для повышения скорости загрузки программы, либо информировать пользователя о том, что программа не висит, а идет загрузка.

 

Если вы не будете информировать о ходе загрузки, и на экране ничего появлять­ся не будет, то пользователь может подумать, что программа зависла, и попытаться запустить ее еще раз. Это в свою очередь может привести к краху всего вычисли­тельного процесса. Например, попытка запустить дважды программу, которая ра­ботает с СОМ-портом. В этом случае вторая копия уже не сможет открыть порт (СОМ-порт можно открыть только один раз). Поэтому лучше лишний раз создать окно с отображением хода загрузки, чем выслушивать недовольство пользователей по поводу работы вашей программы.

 

Как можно увеличить скорость загрузки? Сразу напрашиваются следующие ва­рианты.

 

Инициализировать только основные формы. Очень хорошая идея. Незачем ини­циализировать 150 форм, когда из них будет реально использоваться не более 10, а остальные если и будут вызываться, то очень редко. Это излишние потери времени при загрузке и расходы памяти во время работы. Пусть у вас автомати­чески создаются только необходимые формы. ? Выполнять все операции в обработчике события Onshow. Логичное решение, ведь при инициализации формы вызывается ее конструктор и обработчик собы­тия oncreate, а значит, если эти методы будут выполняться быстро, то и загруз­ка программы ускорится. Но если перенести код в обработчик события onshow, то будут задержки при отображении окна, причем при каждом отображении. Можно ухитриться и проверять в Onshow, если инициализация уже была, то про­пустить этот код и просто отобразить окно.

 

Второй вариант— неплохой, но не забывайте, что MDI-окна создаются сразу ВИДИМЫМИ, поэтому если ОНИ В списке AutoCreate, то во время загрузки программы для таких окон будет вызван как конструктор, так и отображение окна, т. е. и обра­ботчик OnShow.

Formstyle на fsMDichild, то свой­ство visible тоже автоматически становится равным true.

 

Учитывайте этот нюанс. Если вы случайно сделали окно дочерним, а потом по­меняли обратно на fsNormai, то после запуска это окно сразу же отобразится на экране (если форма в списке автоматически создаваемых), потому что свойство visible останется равным истине.

dle

Помоги проекту! Расскажи друзьям об этом сайте: