Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
33
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

Лекция №10 Тема: Формы

План:

1. Использование форм

2. Характеристики формы

3. Организация взаимодействия форм

4. Особенности модальных форм

5. Процедуры и функции, реализующие диалоги

1. Использование форм

Форма является важнейшим визуальным компонентом. Формы представляют собой видимые окна Windows и являются центральной частью практически любого приложения. Термины "форма" и "окно" являются синонимами и обозначают одно и то же.

Форма представляется компонентом Form класса TForm, на основе формы начинается конструирование приложения. На форме размещаются визуальные компоненты, образующие интерфейсную часть приложения, и системные (невизуальные) компоненты. Таким образом, форма представляет собой компонент Delphi, служащий контейнером для всех других компонентов. Т.о. создание нового приложения начинается с того, что Delphi автоматически предлагает пустое окно — форму Form. В принципе возможно создание и безоконного приложения, однако большинство приложений имеет видимое на экране окно, содержащее его интерфейсную часть.

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

Application.Initialize;

Application.CreateForm(TForml, Formi);

Application.CreateForm(TForm2, Form2);

Application.Run;

Программно можно сделать главной любую форму приложения, указав вызов метода createForm создания этой формы первым. Например, для задания Form2 в качестве главной формы можно записать следующий код:

Application.Initialize;

Application.CreateForm(TForm2, Form2);

Application.CreateForm(TForml, Forml);

Application.Run;

При конструировании приложения более удобно указать главную форму в окне параметров проекта, вызываемом командой Project | Options (Проект | Параметры). Главная форма выбирается в раскрывающемся списке Main Form на странице Form, после этого Delphi автоматически вносит в файл проекта соответствующие изменения.

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

2. Характеристики формы

Как и любой другой визуальный компонент, форма имеет свойства, методы и события, наиболее общие из которых рассмотрены в главе, посвященной интерфейсным элементам. Например, форма имеет такие свойства, как Caption и Color, событие onKeyPress. Кроме общих для всех визуальных компонентов. Форма имеет и специфические, определяемые ее особым значением, свойства, методы и события. Часть их характеризует форму как главный объект приложения, например, свойство Bordericons, другая часть присуща форме как контейнеру других компонентов, например, свойства AutoScroli и ActiveControl.

При добавлении новой формы в проект Delphi по умолчанию автоматически создает один экземпляр класса (Forml, Form2 и т. д.), внося соответствующие изменения в файл проекта, например

Application.CreateForm(TForml, Forml);

Управлять процессом автоматического создания форм можно, непосредственно редактируя файл проекта, что не рекомендуется делать неопытным программистам, или выполняя настройки в окне параметров проекта (список Autocreate forms на странице Form). Если форма переведена из этого списка в список доступных форм проекта (список Available forms), то оператор ее создания исключается из файла проекта, и программист в ходе выполнения приложения должен динамически создать экземпляр этой формы.

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

Пример. Создание экземпляра формы.

procedure TForml.ButtonlClick(Sender: TObject);

begin

// Форма создается, однако на экране не отображается

Form2 := TForm2.Create(Application);

Form2.Caption := 'Новая форма';

end ;

Форма Form2 принадлежит объекту приложения и имеет заголовок Новая форма.

При создании и использовании формы происходят следующие события типа TNotifyEvent, указанные в порядке их возникновения:

    • OnCreate;

    • OnShow;

    • OnResize;

    • OnActivate;

    • OnPaint.

Событие OnCreate при создании формы возникает один раз, остальные события происходят каждый раз при отображении формы, при ее активизации и прорисовке соответственно.

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

Пример. Процедура обработки события OnCreate формы Form2.

procedure TForm2.FormCreate(Sender :TObject);

begin

Form2.Caption := 'Пример формы';

ComboBox2.Items.LoadFromFile('list.txt') ;

Buttons.Enabled := false;

end;

При создании форма получает новый заголовок пример формы, в комбинированный список ComboBox2 загружаются данные из файла list.txt, а кнопка Buttons блокируется.

Из всех созданных форм Delphi при выполнении приложения автоматически устанавливает видимой главную форму, для этого свойству visible этой формы устанавливается значение True. Для остальных форм значение этого свойства по умолчанию равно False, и после запуска приложения другие формы первоначально на экране не отображаются. Программист после создания форм по мере необходимости сам должен обеспечивать их отображение и скрытие в процессе работы приложения, управляя свойством visible.

Даже если форма не видима, ее компонентами можно управлять, например, из других форм.

Другим способом управления видимостью форм на экране являются соответственно методы show и Hide. Процедура show отображает форму в немодальном режиме, при этом свойству visible устанавливается значение True, а сама форма переводится на передний план. Процедура Hide скрывает форму, устанавливая ее свойству visible значение False.

Если окно уже видимо, то вызов метода show переводит форму на передний план и передает ей фокус управления.

Пример. Отображение и скрытие форм.

procedure TFormi.btnShowFormsClick(Sender rTObject);

begin

Form2.Visible := true;

Form3.Show;

end;

procedure TFormi.btnHideFormsClick(Sender :TObject);

begin

Form2.Visible := false;

FormS.Hide;

end;

Нажатие кнопок btnShowForms и btnHideForms, расположенных на форме Form, приводит соответственно к отображению и скрытию форм (удалению с экрана) Form2 и Form3.

В момент отображения формы на экране, когда ее свойство visible принимает значение True, возникает событие onshow. Соответственно при скрытии формы, когда ее свойство visible принимает значение False, возникает Событие OnHide.

Каждый раз при получении фокуса ввода формой, например, при нажатии кнопки мыши в области формы, происходит ее активизация и возникает событие onActivate. При потере фокуса формой возникает событие OnDeActivate.

Событие OnPaint возникает при необходимости перерисовки формы, например, при активизации формы, если до этого часть ее была закрыта другими окнами.

Для закрытия формы используется метод close, который удаляет форму с экрана. Процедура close делает форму невидимой, не уничтожает созданный ее экземпляр, и форма может быть снова вызвана на экран, например, с помощью методов show или showModal.

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

Пример. Закрытие формы

procedure TForm2.btnCloseClick(Sender: TObject);

begin

Form2.Close;

end;

Кнопка btnclose закрывает форму Form2. Для этой кнопки полезно задать соответствующий заголовок (свойство caption), например, Закрыть.

Уничтожение формы можно выполнить с помощью метода Free, после чего работа с этой формой невозможна, и любая попытка обратиться к ней или ее компонентам вызовет исключительную ситуацию (ошибку). Необходимость уничтожения формы может возникнуть при оформлении заставок или при разработке больших приложений, требующих экономии оперативной памяти.

Пример. Удаление экземпляра формы.

procedure TForm3.btnDestroyClick(Sender: TObject};

begin

Form3.Free;

end;

Кнопка btnDestroy уничтожает форму Forms. Для этой кнопки полезно задать соответствующий заголовок, например, Удалить.

При закрытии и уничтожении формы происходят следующие события, указанные в порядке их возникновения:

    • OnCloseQuery;

    • OnClose;

    • OnDeActivate;

    • OnHide;

    • OnDestroy.

Событие ondoseQuery типа TdoseQueryEvent возникает в ответ на попытку закрытия формы. Обработчик события получает логическую переменную-признак candose, определяющую, может ли быть закрыта данная форма. По умолчанию эта переменная имеет значение True, и форму можно закрыть. Если установить параметру candose значение False, то форма остается открытой. Такую возможность можно использовать, например, для подтверждения закрытия окна или проверки, сохранена ли редактируемая информация на диске. Событие OnCloseQuery вызывается всегда, независимо от способа закрытия формы.

Пример. Процедура закрытия формы

procedure TForm2.FormCloseQuery(Sender: TObject; var Candose: Boolean);

begin

Candose := MessageDlg('Вы хотите закрыть форму?', mtConfirmation,

[mbYes, mbNo], 0) = mrYes;

end;

Здесь при закрытии формы Form2 выдается запрос на подтверждение операции, который представляет собой модальное диалоговое окно с текстом "Вы хотите закрыть форму?" и двумя кнопками — Yes и No. В случае подтверждения нажатием кнопки Yes форма закрывается, в противном случае закрытия формы не происходит.

Событие OnClose типа TCloseEvent возникает непосредственно перед закрытием формы. Обычно оно используется для изменения стандартного поведения формы при закрытии. Для этого обработчику события передается переменная Action типа TdoseAction, которая может принимать следую­щие значения:

    • caNone — форму Закрыть Нельзя;

    • caHide — форма делается невидимой;

    • caFree — форма уничтожается, а связанная с ней память освобождается;

    • caMinimize — окно формы минимизируется.

При закрытии окна методом close переменная Action по умолчанию получает значение caHide, и форма делается невидимой. При уничтожении формы, например, методом Destroy, переменная Action по умолчанию получает значение caFree, и форма уничтожается.

Когда закрывается главная форма приложения, все остальные окна закрываются без вызова события OnClose.

Пример. Процедура закрытия формы.

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

begin

if Memo1.Modified then Action := caNone else Action := caHide;

end;

При закрытии формы Form2 проверяется признак модификации содержимого редактора Memoi. Если информация в Memoi была изменена, то форма не закрывается.

При каждом изменении размеров формы в процессе выполнения приложения возникает событие onResize типа TNotifyEvent. В обработчике этого события может размещаться код, например, выполняющий изменение положения и размеров управляющих элементов окна, не имеющих свойства Align.

Стиль формы определяется свойством Formstyle типа TFormStyle, принимающим следующие значения:

    • fsNormai — стандартный стиль, используемый для большинства окон, в том числе и диалоговых;

    • fsMDichild — дочерняя форма в многодокументном приложении;

    • fsMDiForm — родительская форма в многодокументном приложении;

    • fsStayOnTop — форма, которая после запуска всегда отображается поверх других окон. Обычно используется при выводе системной информации или информационной панели программы (заставки).

Каждая форма имеет ограничивающую рамку. Вид и поведение рамки определяет свойство Borderstyle типа TFormBorderstyie. Оно может принимать следующие значения:

    • bsDialog — диалоговая форма;

    • bssingie — форма с неизменяемыми размерами;

    • bsNone — форма не имеет видимой рамки и заголовка и не может изменять свои размеры. Часто используется для заставок;

    • bssizeabie — обычная форма с изменяемыми размерами (по умолчанию). Имеет строку заголовка и может содержать любой набор кнопок;

    • bsTooiwindow — форма панели инструментов;

    • bssizeiooiwin — форма панели инструментов с изменяемыми размерами.

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

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

Пример. Изменение размеров формы.

procedure TForm2. btnResizeFormClick(Sender: TObject);

begin

Form2.Width := Form2.Width + 100;

end;

При нажатии на кнопку btnResizeForm ширина формы Form2 увеличивается на 100 пикселов, даже если для этой формы свойство Borderstyle имеет Значение, равное bsDialog, bsSingle ИЛИ bsNone.

Если установить диалоговый стиль формы, то она не становится модальной и позволяет пользователю переходить в другие окна приложения. Для запуска формы, в том числе и любой диалоговой, в модальном режиме следует использовать метод ShowModal. Таким образом, стиль определяет внешний вид формы, но не ее поведение.

В области заголовка могут отображаться 4 вида кнопок. Возможный набор кнопок определяет свойство Bordericons типа TBordericons, которое может принимать комбинации следующих значений:

    • biSystemMenu — окно содержит кнопки системного меню;

    • biMinimize — окно содержит кнопку минимизации (свертывания);

    • biMaximize — окно содержит кнопку максимизации (восстановления);

    • biHе1р — окно содержит кнопку справки, которая отображает вопроси­тельный знак и вызывает контекстно-зависимую справку.

Системное меню представляет собой набор общих для всех окон Windows команд, например, Свернуть или Закрыть. При наличии у окна системного меню в области заголовка слева отображается пиктограмма приложения, при щелчке на которой и появляются команды этого меню, а в области заголовка справа имеется кнопка закрытия формы (рис. 4).

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

Рис. 4. Системное меню формы

Обычно стиль формы и набор кнопок заголовка задаются на этапе разработки приложения через Инспектор объектов. При этом на проектируемой форме всегда видны обычная рамка и три кнопки (минимизации, максимизации и закрытия формы), независимо от значения свойств FormStyle и Bordericons. Заданные стиль формы и набор кнопок становятся видимыми при выполнении программы.

Форма включает клиентскую и неклиентскую области. Неклиентская область занята рамкой, заголовком и строкой главного меню. В клиентской области обычно размещаются различные управляющие элементы, происходит вывод текста или отображение графики. При необходимости в клиентской области могут появляться полосы прокрутки. Аналогично тому, как свойства Width и Height определяют размеры всей формы, свойства Clientwidth и ClientHeight типа integer задают соответственно ширину и высоту в пикселах клиентской части формы.

Форма включает клиентскую и неклиентскую области. Неклиентская область занята рамкой, заголовком и строкой главного меню. В клиентской области обычно размещаются различные управляющие элементы, происходит вывод текста или отображение графики. При необходимости в клиентской области могут появляться полосы прокрутки. Аналогично тому, как свойства width и Height определяют размеры всей формы, свойства Clientwidth и ClientHeight типа integer задают соответственно ширину и высоту в пикселах клиентской части формы.

Пример. Вывод в заголовке формы информации о размерах ее клиентской области.

procedure TForml.FormCreate(Sender: TObject);

begin

Forml.Caption := 'Клиентская область — ' + IntToStr(Forml.ClientWidth) +' x '+ IntToStr(Forml.CiientHeight);

end;

Отображаемое формой меню задается свойством Menu типа TMainMenu. При разработке приложения размещение компонента MainMenu главного меню на форме вызывает автоматическое присвоение нужного значения (Menu:=MainMenui) свойству Menu формы, что отображается в Инспекторе объектов.

Каждая форма отображает в левой стороне области заголовка свою пиктограмму, определяемую свойством icon типа TIcon. Если форма не является главной в приложении, то эта пиктограмма отображается при минимизации формы. Для любой формы свойство icon можно задать с помощью Инспектора объектов или динамически (при выполнении приложения). Если пиктограмма не задана, то форма использует пиктограмму, указанную в свойстве icon объекта Application. Последняя выводится также при минимизации и отображении в панели задач Windows значка главной формы приложения.

Пример. Динамическая загрузка пиктограммы.

procedure TForml.FormCreate(Sender: TObject);

begin

Forml.Icon.LoadFromFile('с:\Picturel.ico');

end;

Здесь при создании формы Forml пиктограмма загружается из файла c:\Picturel.ico.

Размещение и размер формы при отображении определяет свойство Position типа TPosition. Свойство имеет следующие основные значения:

    • poDesigned — форма отображается в той позиции и с теми размерами, которые были установлены при ее конструировании (значение по умолчанию). Положение и размеры формы определяются свойствами Left, Tор, Width и Height. Если приложение запускается на мониторе с более низким разрешением, чем тот, на котором оно разрабатывалось, часть формы может выйти за пределы экрана;

  • poScreenCenter — форма выводится в центре экрана, ее высота и ширина (свойства Height и width) не изменяются;

  • poDefault — Windows автоматически определяет начальную позицию и размеры формы, при этом программист не имеет возможность контролировать эти параметры. В связи с отмеченным, это значение не допускается для форм многодокументных приложений;

  • poDefauitPosOnly — Windows определяет начальную позицию формы, ее размеры не изменяются;

  • poDefaultsizeOniy — Windows определяет начальные ширину и высоту формы и помещает форму в позицию, определенную при разработке.

Свойство Active типа Boolean позволяет определить активность формы. В любой момент времени активной может быть одна форма, при этом ее заголовок выделяется цветом, чаще всего синим. Если свойство Active имеет значение True, то форма активна (находится в фокусе ввода), если False — то неактивна. Это свойство относится ко времени выполнения и доступно для чтения. Если требуется активизировать форму программно,

Следует использовать свойство windowstate или метод Show (showmodal).

Свойство windowstate типа Twindowstate определяет состояние отображения формы и может принимать одно из трех значений:

  • wsNormli — обычное состояние (по умолчанию);

  • wsMinimized — минимизация;

  • wsMaximized — максимизация.

Пример. Управление состоянием формы.

procedure TForml.btnMiniFormClick(Sender: TObject);

begin

Form2.WindowState := wsMinimized;

end;

procedure TForml.btnNormalFormClick(Sender: TObject);

begin

Form2.WindowState := wsNormai;

end;

Кнопки btnMiniForm и btnNormaiForm на форме Formi соответственно минимизируют и восстанавливают нормальное состояние формы Form2. Форма, для которой изменяется состояние отображения на экране, предварительно должна быть создана методами createForm или create. Если форма не создана, то при работе с ней произойдет исключительная ситуация, несмотря на то, что переменная формы объявлена в модуле. Если форма создана, но не отображается на экране, то изменения ее состояния (свойство WindowState) вступают в силу, однако пользователь этого не видит до тех пор, пока форма не будет отображена на экране. Форма, как контейнер, содержит в себе другие управляющие элементы. Оконные элементы управления (потомки класса TwinControl) могут получать фокус ввода (фокус). Свойство ActiveControl типа TwinControl определяет, какой элемент на форме находится в фокусе управления. Для выбора элемента, находящегося в фокусе ввода (активного элемента), можно устанавливать этому свойству нужное значение в процессе выполнения программы, например:

Forml.ActiveControl := Edit2;

Эту же операцию выполняет метод setFocus, который устанавливает фокус ввода на оконный элемент управления, например:

Edit2.SetFocus;

В случае, когда размеры окна недостаточны для отображения всех содержащихся в форме интерфейсных компонентов, у формы могут появляться полосы прокрутки. Свойство AutoScroll типа Boolean определяет, появляются ли они автоматически. Если свойство AutoScroll имеет значение True (по умолчанию), то полосы прокрутки появляются и исчезают автоматически, и программист может не заботиться об этом. Необходимость в полосах прокрутки может возникнуть, если пользователь уменьшит размеры формы так, что не все элементы управления будут полностью видимы. В случае, когда программист установит свойству AutoScroll значение False, он сам должен решать проблему просмотра информации, управляя горизонтальной и вертикальной полосами прокрутки через свойства HorzscrollBar и VertScrollBar Типа TControlScrollBar формы.

Для программного управления полосами прокрутки можно использовать метод ScrollInView. Процедура ScrollInView (AControl: TControl) aвтомaтически изменяет позиции полос прокрутки так, чтобы заданный параметром AControl управляющий элемент стал виден в отображаемой области.

Свойство KeyPreview типа Boolean определяет, будет ли форма обрабатывать события клавиатуры, прежде чем их обработают элементы управления формы. Если свойство имеет значение False (по умолчанию), то клавиатурные события поступают к активному элементу управления (находящемуся в фокусе ввода). При установке свойству KeyPreview значения True форма получает сообщения о нажатии клавиш в первую очередь и может на них реагировать, что обычно используется для обработки комбинаций клавиш, независимо от активности управляющих элементов формы.

Форма не может обрабатывать нажатие клавиши <Таb> в связи с ее особым назначением.

Пример. Обработка нажатия клавиш.

// Не забудьте установить свойству KeyPreview значение True procedure TForml. FormKeyPress (Sender: TObject; var Key: Char);

begin

MessageDlg ('Нажата клавиша ' + Key, mtlnformation, [itibOK] , 0) ;

end;

Форма Formi обрабатывает нажатие алфавитно-цифровых клавиш, отображая введенный символ в диалоговом окне.

Пример. Приложение — цифровые часы.

Приложение похоже на часы, входящие в состав Windows, и состоит из одной формы (рис. 5), на которой размещены надпись Label, таймер Timer1 и главное меню MainMenu1. Таймер используется для отсчета времени, его интервал задан равным 1000, и событие onTimer генерируется один раз в секунду. В обработчике этого события текущее значение времени отображается в надписи Label1.

Рис. 5. Вид формы при разработке

Меню состоит из трех пунктов: Заголовок (mnuCaption), Исходный размер (mnuinitiaisize) и Закрыть (mnuciose). В скобках приведены значения свойства Name указанных пунктов меню.

Пункт Заголовок предназначен для включения и выключения отображения заголовка и меню формы. Первоначально этот пункт отмечен галочкой, а форма отображает заголовок и меню (рис. 6, слева). Если выбрать пункт Заголовок, то галочка пропадет, а заголовок и меню становятся невидимыми, изменяется также граница окна (рис. 6, справа). В этом случае пользователь не сможет изменять размеры окна и перемещать его по экрану. Для восстановления прежнего вида формы нужно дважды щелкнуть мышью на ней или на надписи Label1.

Рис. 6. Варианты формы

Ниже приводится код модуля udock формы Forml. Для наглядности многие свойства компонентов получают свои значения при создании формы в обработчике события onCreate. В действительности эти действия проще выполнить при разработке приложения с помощью Инспектора объектов.

unit uClock; interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Menus;

type

ТForml = class(TForm) Labell:

TLabel; Timerl: TTimer;

MainMenul: TMainMenu;

mnuMenu: TMenuItem;

mnuCaption: TMenuItem;

mnuInitialSize: TMenuItem;

mnuClose: TMenuItem;

procedure FormCreate(Sender: TObject);

procedure TimerITimer(Sender: TObject);

procedure FormResize(Sender: TObject);

procedure mnCloseClick(Sender: TObject);

procedure mnSizeOClick(Sender: TObject);

procedure mnCaptionClick(Sender: TObject);

procedure FormDblClick(Sender: TObject); end;

var

Forml: TForml;

implementation

{$R *.DFM}

// Установка начальных значений для формы и ее компонентов

procedure TForml.FormCreate(Sender: TObject);

begin

// Все эти действия можно выполнить через инспектор объектов

Application.Icon.LoadFromFile('Clock.ico') ;

Forml.FormStyle := fsStayOnTop;

Forml.Position := poScreenCenter;

Forml.BorderStyle := bsSizeable;

Forml.Borderlcons := [biSystemMenu];

Forml.Constraints.MinWidth := 100;

Forml.Constraints.MinHeight := 65;

mnuCaption.Checked := true;

Forml.ClientWidth := 100;

Forml.ClientHeight := 45;

Timerl.Interval := 1000;

TimerlTimer(Sender);

// Двойной щелчок на надписи вызывает команду //Заголовок меню

Labell.OnDblClick := mnuCaptionClick; end;

// Изменение размеров надписи Labell при изменении //размеров формы

procedure TForml.FormResize(Sender: TObject);

begin

if (Forml.ClientHeight / Forml.ClientWidth) < (Labell.Height / Labell.Width)

then Labell.Font.Height := Forml.ClientHeight - 2 else Labell.-Font.Height := Round((Forml.ClientWidth — 10) *

Labell.Height / Labell.Width);

Labell.Left := (Forml.ClientWidth - Labell.Width) div 2;

Labell.Top := (Forml.ClientHeight - Labell.Height) div 2;

end;

// Отображение текущего значения времени

procedure TForml.TimerlTimer(Sender: TObject);

begin

Labell.Caption := TimeToStr(Time);

end;

// Отображение и скрытие заголовка и меню формы

procedure TForml.mnuCaptionClick(Sender: TObject);

begin

if mnCaption.Checked then

begin

Forml.BorderStyle := bsNone;

Forml.Menu := nil;

end

else begin

Forml.BorderStyle := bsSizeable;

Forml.Menu := MainMenul;

end;

mnuCaption.Checked := not ronuCaption.Checked;

end;

// Восстановление прежнего размера формы

procedure TForml.mnuInitialSizeClick(Sender: TObject);

begin

Forml.ClientWidth := 100; Forml.ClientHeight := 45;

FormResize(Sender);

end;

// Закрытие формы и прекращение работы приложения

procedure TForml.mnuCloseClick(Sender: TObject);

begin

Close;

end;

// Активизация пункта меню "Заголовок"

// Необходима, когда меню невидимо и должно быть //отображено

procedure TForml.FormDblClick(Sender: TObject);

begin

mnuCaption.Click;

end;

end.

В случае, когда форма отображает заголовок и для нее заданы изменяемые границы, пользователь может изменять размеры формы. При этом соответственно изменяются размеры надписи Label1. Управление размерами надписи осуществляется косвенно, через значение свойства Height шрифта текста. Для предотвращения уменьшения формы до размеров, когда шрифт текста надписи будет слишком мелким и плохо различимым, через свойство constraints установлено ограничение на минимальную высоту и ширину формы. Следует учитывать, что это свойство ограничивает минимальные размеры формы, а не ее клиентской области. При выборе пункта меню Исходный размер форма восстанавливает размеры клиентской области, заданные при разработке.

Пиктограмма приложения и главной формы загружается из файла Clock.ico. В заголовке формы выводятся две кнопки — вызова системного меню и закрытия окна. Форма выводится в центре экрана и расположена поверх всех окон, для этого свойству Formstyle задано значение fsStayOnTop.