Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК ПП1 (C++ БД).doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
5.01 Mб
Скачать

2.3. Средства группирования компонентов

Для многих задач встречается ситуация, когда некоторой группой компонентов надо управлять одновременно, например «показать» или «спрятать» все компоненты. Типичный вариант такой задачи – это организация надёжного ввода. При работе с приложением вообще ввод допустим не всегда. Часто попытка ввода не «во время», может привести к двусмысленности или неопределённости. Тогда лучше всего предотвратить такие ошибки – это не показывают на экране окон ввода.

В подобных случаях нужные компоненты объединяют и размещают на некотором компоненте, называемом «контейнером». Далее операции, производимые над контейнером, автоматически распространяются на все содержащиеся в нём компоненты. Такой приём упрощает программирование и делает его более надёжным.

Основным контейнером, имеющимся в любом приложении, является форма (TForm).

Формы

С точки зрения пользователя форма это окно, в котором он работает с приложением. Каждой новой форме, вводимой в приложение, соответствует свой модуль (*.cpp) со своим заголовочным файлом (*.h) и с текстовым описанием компонентов, расположенных на форме (*.dfm).

Рассмотрим некоторые свойства, методы и события, присущие формам.

Основные свойства форм

Свойство, назначение

Возможные значения

Пояснения

BorderStyle

определяет общий вид окна и разрешённые операции

bsSizable

Обычное окно Windows с полосой заголовка и возможностью изменять размеры

bsDialog

Неизменяемое по размеру окно

bsSingle

Размеры не изменяются за счет мыши, но могут меняться системными кнопками в заголовке

bsToolWindow

То же, что bsSingle, но с меньшим по величине заголовком

bsSizeToolWin

То же, что bsSizable, но с меньшим по величине заголовком . Системные кнопки отсутствуют

bsNone

Отсутствует полоса заголовка

BorderIcons

определяет набор кнопок, которые имеются в полосе заголовка

bySystemMenu

Кнопка системного меню с крестиком, прекращающая работу программы, связанной с окном

byMinimize

Кнопка «Свернуть» убирает окно с экрана, заменяя его пиктограммой в полосе задач

byMaximize

Кнопка «Развернуть» –увеличивает окно до размеров экрана

byHelp

Кнопка справки

FormStyle

определяет характер исользования окна

fsNormal

Обычное окно (по умолчанию)

fsMIDIForm

Родительская форма многооконного приложения (MIDI-приложения), при котором открывается несколько немодальных окон (как WinWord)

fsMIDIChild

Дочерняя форма MIDI-приложения

fsStayOnTop

Окно, всегда остающееся поверх остальных

WindowState определяет вид, в котором окно появляется при выполнении приложения

wsNormal

Нормальный вид окна (по умолчанию)

wsMinimized

Окно свёрнуто в пиктограмму

wsMaximized

Окно раскрыто во весь экран

AutoScroll определяет, будут ли на форме в процессе выполнения автоматически появляться полосы прокрутки в случае, если не все компоненты помещаются в нем

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

Icon задает пиктограмму формы

Остальные свойства форм, такие как Color, Font, Visible и множество других, аналогичны соответствующим свойствам других компонентов и представить их назначение не вызывает сложности.

Управление формами

По умолчанию все формы создаются автоматически при запуске приложения и первая из введенных в приложение форм считается главной. Главная форма отличается от прочих рядом свойств:

  • Во-первых, именно этой форме передается управление в начале выполнения приложения.

  • Во-вторых, закрытие пользователем главной формы означает завершение выполнения приложения.

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

Изменить принятые по умолчанию параметры форм можно в окне Опций проекта, которое вызывается командой Project|Options главного меню (рис.5).

Рис. 5. Окно опций проекта

На данном рисунке открыта страница параметров приложения в целом. Здесь можно изменить икону, сопутствующую приложению (Icon), указать наименование файла справки, встраиваемого в приложение (Help file) и записать русское название проекта (Title), которое будет появляться в окнах сообщений, вызываемых командами типа ShowMessage.

В верхнем выпадающем списке Main forms можно выбрать главную форму среди других форм, имеющихся в проекте (рис. 6).

Рис. 6. Назначение формы Form2 в качестве главной формы проекта

События, связанные с формами

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

Событие

Перевод

Ситуация, вызывающая событие

OnCreate

при создании

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

OnShow

при показе

предъявление формы на экране

OnPaint

при прорисовке

подготовка рисунка формы на скрытых страницах видеопамяти

OnActivate

при активации

первоначальный вход в форму; установка фокуса на форму

OnResize

при изменении размеров

изменение видимых размеров

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

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

Если же форма открыта методом Show, то фокус может быть передан любому другому открытому окну. Такая ситуация возникает при разработке MIDI-приложений, программирование таких конструкций существенно сложнее и в данном пособии не рассматривается.

Методом Hide форму в любой момент можно сделать невидимой. В этот момент в ней возникает событие OnHide.

Чтобы прекратить выполнение программы, запущенной в окне, необходимо «закрыть» форму методом Close(). При этом в закрывающейся форме возникает такая последовательность событий:

закрываются активированные в форме файлы и базы данных, при этом новая информация, созданная во время работы, физически копируется из оперативной памяти на жесткий диск, чем обеспечивается надёжность сохранения информации;

освобождается память, выделенная под объекты при открытии формы, то есть объекты «разрушаются».

Из этого описания следует, что закрывать окно надо по специальной команде «Закрыть», инициирующей метод Close. Такая команда может быть вызвана кнопкой или пунктом меню. Не следует закрывать окно системной кнопкой «Крестик», находящейся в заголовке окна, так как при этом возникает вероятность потери данных. Поэтому для надёжных программ разумно вообще убирать кнопку «Крестик» из заголовка окна.

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

Это присвоенное значение можно будет прочитать как результат, возвращаемый методом ShowModal.

В C++ Builder предопределены некоторые константы, облегчающие трактовку результатов, полученных при закрытии модальной формы:

Числовое значение ModalResult

Системная символьная константа

Пояснение

0

mrNone

Закрытие модальной формы кнопкой нестандартизованной пользователем

1

mrOk

Закрытие модальной формы кнопкой Ok

2

mrCancel

Закрытие модальной формы кнопкой Cancel

3

mrAbort

Закрытие модальной формы кнопкой Abort

4

mrRetry

Закрытие модальной формы кнопкой Retry

5

mrIgnore

Закрытие модальной формы кнопкой Ignor

6

mrYes

Закрытие модальной формы кнопкой Yes

7

mrNo

Закрытие модальной формы кнопкой No

8

mrAll

Закрытие модальной формы кнопкой All

Все приведённые выше пояснения значений ModalResult (кроме значений 0 и 2) носят чисто условный характер. В своем приложении вы можете трактовать ту или иную величину ModalResult каким угодно способом.

Средства группирования компонентов

Основные характеристики наиболее часто используемых средств группирования компонентов приведены в следующей таблице.

Компонент

Объяснение

Описание

GroupBox

групповое окно

Является контейнером, объединяющим группу связанных органов управления, таких, как радиокнопки RadioButton, контрольные индикаторы Checkbox и т.д.

Panel

панель

Является контейнером для группирования органов управления и меньших контейнеров. Панель можно использовать также для построения полос состояния, инструментальных панелей, палитр инструментов

Bevel

рамка

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

TabControl

страница с закладками

Позволяет добавлять закладки в стиле Windows,

для экономии места на рабочем столе

PageControl

многостраничное окно

Позволяет создавать многостраничные формы

Компоненты GroupBox, Panel, Bevel

Для выяснения различий между компонентами Panel, GroupBox и Bevel обратитесь к рис. 7.

Рис. 7. Сравнительное представление компонентов Panel, GroupBox и Bevel

Из представленных на рисунке средств группирования компонентов контейнерами являются лишь два первых – Panel и GroupBox. Различия между ними незначительны, пожалуй что Panel обладает большими изобразительными возможностями. Главное достоинство обоих контейнеров состоит в том, что ко всем компонентам, расположенным в нём, применимы групповые операции. Например, при перетаскивании компонента по экрану синхронно перемещаются и все его внутренние компоненты, что очень удобно при проектировании интерфейса.

В практическом программировании часто приходится либо скрывать какую-то панель, либо вновь показывать её, что легко достигается применением методов Hide() и Show() соответственно.

Рамка Bevel не является контейнером в том смысле, что она не позволяет производить групповые операции над расположенными в ней компонентами. Это действительно только геометрическая рамка, которая визуально объединяет компоненты, но не группирует их.

Свойства всех этих средств являются достаточно очевидными и поэтому в данном методическом комплексе не рассматриваются. Свойства легко настраиваются непосредственно из Инспектора объектов.

Компоненты TabControl, PageControl

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

Как видно из иллюстрации, оба компонента представляют некую записную книжку с закладками. Сравните обе панели – внешне они очень похожи. Количество закладок устанавливается пользователем, они могут быть расположены в несколько рядов, надписи на них могут быть сделаны на русском языке.

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

Посмотрите внимательно на рис. 8. На первой закладке «Файлы» компонента TabControl расположены две текстовых надписи –Панель1 и Закладка 1. На первой закладке компонента PageControl расположены надписи –Панель1 и Закладка1 (на рис.8 эта закладка не показана) . После щелчка по закладке «Записи» оба элемента Панель1 и Закладка 1 компонента TabControl останутся видимыми и сохранят своё местоположение, тогда как вторая страница компонента PageControl окажется пустой.

Рис. 8. Компонент TabControl является одним контейнером, тогда как PageControl содержит столько контейнеров, сколько в нём закладок

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

Вопросы для самопроверки

  1. В чём состоит суть требований к надёжному вводу ?

  2. Укажите показатели качества программы с хорошо организованным вводом данных.

  3. Перечислите основные приёмы решения проблемы защиты ввода.

  4. В чём заключается сущность алгоритмических методов обеспечения надёжного ввода?

  5. Каким образом обработка исключительных ситуаций используется для организации надёжного ввода?

  6. Опишите организацию защиты окон ввода данных от ввода недопустимых символов.

  7. Как используется управление видимостью элементов управления для обеспечения надежности ввода данных?

  8. В чём состоят отличия строк с нулевым окончанием от строк типа AnsiString?

  9. Что является результатом операций сравнения строк?

  10. Приведите примеры встроенных функций обработки строк.

  11. Какие средства можно использовать для объединения компонентов в группы? С какой целью это производится?