понедельник, 28 июля 2008 г.

Компонент TForm

Хотя компонент TForm отсутствует в палитре компонентов, но все же имеет присущи для него свойства, события.
Итак, компонент TForm это окно в оконном приложении. Оно может быть минимум одно, максимальное ограничение на количество не накладывается.
Первое созданное окно в приложении автоматически становится главным.
При закрытии главного окна приложение завершает свою работу и занимаемая им память освобождается.

Если необходимо, чтобы главное окно формы автоматически не появлялось на экране, то в событии OnCreate для этого окна,
или в программе DPR до команды создания главного окна необходимо указать следующую строку:

Application.ShowMainForm:=false;

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

Form1.Show;

для отображения этого окна. Здесь Form1 – главное окно приложения.

Данный метод может оказаться полезным для вывода запроса пароля на запуск программы.
Именно это диалоговое окно нужно показать пользователю перед показом главного окна, но не делая его главным окном, т.е. при закрытии окна ввода пароля, приложение не завершает свою работу. И при вводе неверного пароля можно без проблем завершить работу программы командой

Form1.Close;

Или дать команду завуршения работы приложения.

Как уже говорилось в предыдущих уроках, каждый компонент в программе, как и сама форма, имеет уникальное имя, указанное в свойстве Name. Заголовок окна содержится в свойстве Caption. По заголовку окна пользователь узнает о функциональном назначении программы или текущего окна.

Кроме заголовка в верхней части окна находится иконка и кнопки управления состоянием. По умолчанию иконка такая же самая, как и иконка в проекте. Чтобы сменить иконку в текущем окне необходимо в инспекторе объектов выбрать свойство Icon в котором выбрать соответствующий файл-рисунок. Файл должен быть с расширением ICO.

Для того, чтобы сменить иконку в проекте, нужно войти в меню "Project", далее "Options...", на вкладке Application вы видите текущий рисунок файла проекта. Сменить его можно кнопкой "Load Icon...". Иконка проекта хранится в файле ресурсов с расширением RES.

Свойство BorderStyle

bsDialog – У окна нет иконки. Отображена только кнопка управления "Закрыть". Размер окна постоянный.
Такой тип окон применяется чаще всего в диалоговых окнах, например окно запроса на сохранения проекта, если вы пытаетесь выйти из delphi не сделав сохранения.

bsNone – У окна нет иконки, кнопок управления, заголовка. Размер окна постоянный. Закрыть такое окно можно только программно или с помощью комбинации клавиш Alt+F4. Этот тип окон применяется в заставке при запуске программы. На окне расположен компонент TImage, который содержит рисунок.

bsSingle – В окне присутствует иконка, есть заголовок. Кнопки управления свернуть, развернуть (восстановить), закрыть. Размер окна постоянный.

bsSizeable – Тип окна по умолчанию. Имеет все элементы, указанные в предыдущем значении свойства плюс изменение размеров окна.

bsSizeToolWin – Этот тип окна установлен в окне инспектора объектов. Такое окно не имеет иконки, есть заголовок, кнопка управления "закрыть". Можно изменять размер окна.

bsToolWindow – Аналогичный предыдущему значению, за исключением того, что нельзя изменять размеры окна.

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

Свойство BorderIcons

Это свойство является вложенным. Т.е. если вы в инспекторе объектов нажмете на знак +, то откроется еще несколько подсвойств. Свойство BorderIcons имеет смысл устанавливать только в соответствующих значениях свойства BorderStyle.

biSystemMemu – указывает, отображать или нет иконку и кнопки управления окном.

biMinimize – отображать или нет кнопку управления "свернуть".

biMaximize – отображать или нет кнопку "развернуть" ("восстановить").

biHelp – отображать или нет кнопку "помощь".

Возможны два значения для этих свойств: true (истинно) и false (ложно).

Свойство Position

poDefault – Windows само определяет размер и положение окна.

poDefaultPosOnly – произвольное положение окна.

poDefaultSizeOnly – только произвольный размер окна.

poDesigned – такой-же размер и положение, кокой был при разработке. Значение по умолчанию. Вам следует знать, что не на всех компьютерах установлено такое же экранное разрешение, какое есть у вас, и значит окна в программе будут находиться в совершенно другом месте.

poDesktopCenter – окно находится в центре экрана.

poScreenCenter – окно находится в центре экрана. Работает с многодисплейным режимом отображения.

Свойство WindowState

wsMaximized – Окно первоначально будет развернуто во весь экран.

wsMinimized – Окно первоначально будет свернуто в значок.

wsNormal – Окно имеет те же размеры, что и во время разработки. Значение по умолчанию.

Пример

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

Запускаем delphi и создаем новый проект. В новом проекте окно Form1 будет главным окном проекта.

Для события создания окна OnCreate пишем:

procedure TForm1.FormCreate(Sender: TObject);

begin

Application.ShowMainForm:=false; //не отображать главное окно приложения

end;

Выбираем пункт меню "New Form" из меню "File". Появляется новое окно Form2. Его мы будем использовать в качестве ввода пароля. Оформляем его для этого надлежащим образом.

  • Уменьшаем окно так, чтобы оно по размерам было как у подобных окон.
  • Свойство BorderStyle устанавливаем в bsSingle. При этом размер окна во время работы программы будет постоянен.
  • Свойство BorderIcons. Подсвойства biMinimize и biMaximize устанавливаем в false. Это окончательно недопустит изменение состояния окна (свертывание, разворачивание на весь экран).
  • В свойстве Caption пишите любую на ваше усмотрения понятную фразу, например "Введите пароль".
  • Свойство Position в значение poDesktopCenter. При этом окно при любом экранном разрешение всегда изначально будет расположено посередине экрана.
  • На странице палитры компонентов Standart выбираем и устанавливаем в форму компонент TPanel. Убираем у него значение Caption, придаем свойству Align значение alTop и окончательно изменяем его размер на четь больше половины окна.
  • На странице Additional выбираем компонент TBitBtn и устанавливаем в форму две кнопки, ниже панели.
  • Для первой кнопки свойство Kind в bkOk, для второй bkCancel.
  • Для первой кнопки свойство Caption оставляем в для всех понятное значение Ok, для второй пишем "Отмена".
  • На странице Standart выбираем и устанавливаем на компонент Panel компонент TEdit.
  • Для компонента Edit1 меняем свойство PasswordChar на знак * (звездочка). Это принятый во всех программах символ ввода пароля. При наборе пароля вместо символов будет отображаться звездочки.
  • Для компонента Edit1 убираем значение Caption.
  • Для Form2 в свойстве Icon подбираете соответствующую иконку.

Дальше делаем вызов окна ввода пароля на экран. Поскольку мы с вами убрали свойство вывода главного окна,
то после запуска программы на экране не будет ничего. Нам же нужно вывести окно запроса пароля, и мы это делаем с помощью программы DPR.
Вызываем ее на экран с помощью пункта меню "View Source" из меню "Project". В строке до Application.Run пишем:

Form2.Show;

Еще до запуска приложения, но после создания всех окон на экран выводится окно Form2.

Дальше переключаем редактор кода на модуль Unit2, вызываем проектируемое окно клавишей F12,
в инспекторе объектов для компонента Form2 (проектируемая форма) создаем реакцию на событие закрытия окна OnClose и в самой процедуре пишем:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if Form2.ModalResult=mrOk then //если пользователь нажал на кнопку Ok, то

if Edit1.Text='programming.dax.ru' then //если набран необходимый пароль, то

begin

Form1.Show; //показать главное окно

Exit; //выйти из этой процедуры

end;

Application.Terminate; {если все вышеуказанные условия не выполняются, то остановить программу}

end;

Для кнопки BitBtn1 реакция на событие OnClick

procedure TForm2.BitBtn1Click(Sender: TObject);

begin

Form2.ModalResult:=mrOk; //результат работы этого окна

Close; //закрыть это окно

end;

Для кнопки BitBtn2 событие OnClick

procedure TForm2.BitBtn2Click(Sender: TObject);

begin

Close; //закрыть это окно

end;

Поскольку мы окно Form2 вызываем командой Show, а не ShowModal, то присваивание результата работы окна не приведет к автоматическому закрытию и вызову процедуры OnClose. Поэтому после этой команды следует команда закрытия окна Close.

Кратко описание работы программы.

При создании главного окна, программа получает указание об отсутствии необходимости автоматического отображения главного окна после запуска.

Дальше, после создания всех окон (в нашем случае двух) становится видимым окно Form2. Если пользователь нажал на кнопку "Ok" или в поле ввода пароля нажал на клавишу Enter (!), то вызывается обработчик события OnClick, который занесет соответствующее значение в переменную результата работы этого окна и вызовет команду закрытия Close.

В процедуре обработки закрытия окна вначале идет проверка результата, правильности ввода пароля. Если одно и другое условие выполняется, то поступает команда Form1.Show, которая выведет главное окно, после которой команда Exit выведет обработчик события из процедуры, тем самым исключающая дальнейшее выполнение строк этой процедуры.

Если по каким либо причинам, все вышеуказанные условия не выполняются (пользователь закрыл окно кнопкой "Отмена", закрыл окно кнопкой "Закрыть" или нажал комбинацию клавиш Alt+F4, ввел неправильный пароль), то выполняется команда Termanate (терминатор, который убивает работающее приложение :)