Шаг 12. Текущее состояние переключателя контролируется свойством Checked. Если в одном переключателе оно устанавливается в значение True, то во всех остальных переключателях этой же группы оно устанавливается в значение False. Установите в компоненте EverydayRadioBox свойство Checked в значение True — этот переключатель будет изначально включен.
Шаг 13. Когда пользователь щелкает переключатель, в соответствующем компоненте RadioButton свойство Checked получает значение True и происходит событие OnClick. Обрабатывая это событие, можно установить любую зависимость между состоянием переключателя и состоянием других компонентов формы. Например, когда включен режим Everyday, компоненты для ввода дня недели и даты должны быть недоступны. Когда включен режим Weekly on, должен быть доступен выбор дня недели, но недоступна установка даты. Наконец, когда включен режим Date, установка дня недели должна быть недоступна, а установка даты — доступна. Чтобы достигнуть такой согласованности в работе, определите для переключателей EverydayRadioButton, WeeklyRadioButton и DateRadioButton единый обработчик события OnClick:
procedure TAlarmDetailsForm.RecurringRadioButtonClick(Sender: TObject); begin
WeeklyComboBox.Enabled := Sender = WeeklyRadioButton; DatePicker.Enabled := Sender = DateRadioButton;
end;
Шаг 14. Разумеется, компоненты WeeklyComboBox и DatePicker первоначально должны быть недоступны. Поэтому, удерживая клавишу Shift, выберите названную группу компонентов и установите свойство Enabled в значение False.
Теперь запустите программу и проверьте правильность ее работы.
9.3.4. Группа взаимоисключающих переключателей
Для быстрой организации группы взаимоисключающих переключателей очень удобен компонент RadioGroup, расположенный в палитре компонентов на вкладке Standard (рисунок 9.28).
Рисунок 9.28. Компонент RadioGroup
Его характерные свойства кратко описаны в таблице 9.8.
Свойство Описание
Align Способ выравнивания в пределах содержащего компонента.
Caption Подпись к группе переключателей.
Columns Число колонок в группе переключателей.
ItemIndex Номер выбранного элемента, начиная с нуля. Если все переключатели находятся в выключенном состоянии, то значение свойства равно -1.
Items Подписи к переключателям.
361
Таблица 9.8. Важнейшие свойства компонента RadioGroup
Компонент RadioGroup удобен тем, что заменяет группу компонентов RadioButton. Расположение переключателей, которые он отображает, подбирается автоматически с учетом заданного в свойстве Columns количества колонок. Номер активного зависимого переключателя хранится в значении свойства ItemIndex. Следующий рисунок 9.29 не относится к приложению Alarms, а просто поясняет, что такое компонент RadioGroup:
Рисунок 9.29. Четырехпозиционный переключатель представлен компонентом RadioGroup
Компонент RadioGroup создает группу, состоящую исключительно из переключателей. Однако он не годится в тех случаях, когда в группе должны присутствовать другие компоненты, что как раз имеет место в нашем примере. В этой ситуации для группировки компонентов применяется компонент GroupBox.
9.3.5. Панель группы компонентов
Компонент GroupBox служит для группировки компонентов, он расположен в палитре компонентов на вкладке Standard (рисунок 9.30).
Рисунок 9.30. Компонент GroupBox
Компонент GroupBox выглядит как панель с заголовком рисунок 9.31. Текст заголовка задается в свойстве Caption.
Рисунок 9.31. Панель с заголовком представлена компонентом GroupBox
Компонент GroupBox может содержать в себе другие компоненты. Это, например, означает, что установка его свойства Visible в значение False прячет группу со всеми расположенными внутри компонентами, а не только рамку с заголовком.
9.3.6. Поле ввода и редактор текста
Для ввода текста предназначены компоненты Edit и Memo. Они представляют собой соответственно поле ввода и редактор многострочного текста (кроме них существует еще
362
компонент RichEdit, предназначенный для ввода и отображения форматированного текста, но о нем мы поговорим отдельно).
Поле ввода (Edit) служит для ввода различных слов, фраз и другого относительно короткого текста. Он не имеет полос прокрутки, но разрешает прокручивать текст по горизонтали клавишами перемещения курсора влево и вправо. Компонент Edit расположен в палитре компонентов на вкладке Standard (рисунок 9.32).
Рисунок 9.32. Компонент Edit
Характерные свойства компонента Edit описаны в таблице 9.9.
Свойство |
Описание |
|
|
AutoSelect |
Если равно значению True, то при активизации редактора |
|
находящийся в нем текст автоматически выделяется. |
AutoSize |
Если равно значению True, то высота редактора |
|
автоматически подгоняется по высоте текста. |
BevelEdges |
Вложенные свойства beLeft, beTop, beRight и beBottom |
|
определяют видимость соответственно левой, верхней, |
|
правой и нижней сторон рельефной рамки. |
BevelInner |
Внутренний скос рельефной рамки: bvNone — скос |
|
отсутствует, bvLowered — скос внутрь, bvRaised — скос |
|
наружу; bvSpace — скос заменяется отступом. |
BevelKind |
Вид рельефной рамки: bkNone — рамки нет, bkTile — рамка |
|
с четкими скосами, bkSoft — рамка со сглаженными |
|
скосами, bkFlat — плоская рамка (без скосов). |
BevelOuter |
Внешний скос рельефной рамки: bvNone — скос |
|
отсутствует, bvLowered — скос внутрь, bvRaised — скос |
|
наружу; bvSpace — скос заменяется отступом. |
CharCase |
Преобразует текст к прописным или строчным буквам: |
|
ecUpperCase – к прописным буквам, ecLowerCase – к |
|
строчным буквам, ecNormal –преобразование символов не |
|
выполняется. |
HideSelectio |
Если равно значению True, то при потере редактором |
n |
активности выделение текста снимается. |
MaxLength |
Максимальное количество символов, которое пользователь |
|
может ввести. Если оно равно 0, то пользователь может |
|
ввести текст неограниченной длины. |
OEMConvert |
Если равно значению True, то символы текста преобразуются |
|
в кодовую таблицу OEM. |
363
PasswordCha Если не равно #0, то указанный в этом свойстве символ
rотображается вместо каждого символа текста. Применяется для ввода пароля.
ReadOnly Если равно значению True, то пользователь не сможет изменить текст в редакторе.
Text |
Редактируемый текст. |
OnChange Происходит при изменении текста.
Таблица 9.9. Отличительные свойства и события компонента Edit
Редактируемый текст содержится в свойстве Text. Его максимальная длина определяется значением свойства MaxLength.
Иногда компонент Edit используется для отображения нередактируемого текста. Для этого свойство ReadOnly устанавливается в значение True. Вы спросите, чем он в таком состоянии лучше компонента Label? А тем, что может получать фокус ввода. Кроме того, текст в поле ввода можно выделить и поместить в Буфер Обмена.
Компонент Edit легко приспособить для ввода паролей. Для этого достаточно установить в свойстве PasswordChar вместо символа #0 какой-нибудь другой символ, обычно символ звездочки (*). Символ, заданный в свойстве PasswordChar отображается вместо реально вводимых символов, что мешает подсмотреть пароль посторонним.
Шаг 15. В форме SettingsForm компонент Edit применяется для ввода текстового сообщения будильника. Выберите его в окне свойств и в значении свойства Text впишите "Reminder !" (рисунок 9.33). Этот текст будет появляться в редакторе при появлении окна диалога.
Рисунок 9.33. Компонент Edit используется для ввода текстового сообщения будильника
Шаг 16. Изменение текста во время работы программы приводит к возникновению в компоненте Edit события OnChange. Обрабатывая это событие, можно, например, устроить работу окна диалога таким образом, что кнопка OK будет недоступна, если в редакторе нет текста. Чтобы реализовать такое поведение нашего диалога, определите для компонента MessageEdit следующий обработчик события OnChange:
procedure TAlarmDetailsForm.MessageEditChange(Sender: TObject); begin
OkButton.Enabled := Length(MessageEdit.Text) <> 0; end;
Выполните компиляцию программы и проверьте ее работу.
Прежде чем продолжить обсуждение примера Alarms, сделаем несколько замечаний по поводу редактирования многострочного текста. Редактор многострочного текста представлен компонентом Memo (рисунок 9.34).
364
Рисунок 9.34. Компонент Memo
Характерные свойства компонента Memo описаны в таблице 9.10.
Свойство |
Описание |
|
|
Align |
Способ выравнивания компонента в пределах содержащего |
|
компонента. |
Alignment |
Выравнивание текста: taLeftJustify – прижат к левой границе, |
|
taRightJustify – прижат к правой границе, taCenter – |
|
центрирован. |
HideSelectio |
Если равно значению True, то при потере редактором фокуса |
n |
ввода выделение текста снимается. |
Lines |
Текст в виде массива строк. |
MaxLength |
Максимальное количество символов, которое пользователь |
|
может ввести. Если оно равно 0, то пользователь может |
|
ввести текст неограниченной длины. |
OEMConvert |
Если равно значению True, то символы текста |
|
преобразуются в кодовую таблицу OEM. |
ReadOnly |
Если равно значению True, то пользователь не сможет |
|
изменить текст в редакторе. |
ScrollBars |
Управляет видимостью полос прокрутки: ssNone – полосы |
|
прокрутки скрыты, ssBoth – полосы прокрутки видны, |
|
ssHorizontal – видна лишь горизонтальная полоса прокрутки, |
|
ssVertical – видна лишь вертикальная полоса прокрутки. |
WantReturns |
Если равно значению True, то клавиша Enter начинает в |
|
редакторе новую строку. Иначе нажатие клавиши Enter |
|
ассоциируется с нажатием стандартной кнопки окна диалога |
|
и для перевода строк применяется сочетание клавиш |
|
Ctrl+Enter. |
WantTabs |
Если равно значению True, то клавиша Tab вставляет в текст |
|
символ табуляции, вместо того чтобы передать фокус ввода |
|
следующему компоненту. |
WordWrap |
Если равно значению True, то работает перенос слов. |
OnChange |
Происходит при изменении текста. |
|
|
365
Таблица 9.10. Важнейшие свойства и события компонента Memo
Компонент Memo похож на Edit, но в отличие от него хранит не одну строку текста, а множество строк. Доступ к строкам обеспечивает свойство Lines, представляющее собой объект класса TStrings (см. главу 3). С помощью свойства Lines строки можно добавлять, вставлять, удалять и т.д. Свойство Lines доступно в окне свойств, поэтому на стадии проектирования вы можете заполнить компонент Memo некоторым исходным текстом (рисунок 9.35). Этот текст увидит пользователь при появлении формы на экране. Ввод исходного текста осуществляется в специальном редакторе текста (String list editor), которое вызывается нажатием кнопки с многоточием в поле значения свойства Lines.
Рисунок 9.35. Окно для ввода многострочного текста, отображаемого компонентом Memo
Компонент Memo часто имеет одну или две полосы прокрутки (вертикальную и горизонтальную). Их появление зависит от значения свойства ScrollBars.
В нашем приложении Alarms компонент Memo не нужен, но вам он безусловно пригодится в других программах.
9.3.7. Редактор с шаблоном
Поскольку компонент Edit не проверяет, что вводит пользователь, он не удобен для ввода данных строго определенного формата, например телефонных номеров, времени и др. На этот случай разработчики среды Delphi предусмотрительно создали компонент MaskEdit. Он находится в палитре компонентов на вкладке Additional (рисунок 9.36).
Рисунок 9.36. Компонент MaskEdit
Компонент MaskEdit представляет собой поле ввода, которое вынуждает пользователя вводить данные в строго заданном формате. Во многом аналогичный компоненту Edit, он отличается от последнего тем, что имеет свойство EditMask и не имеет свойств
HideSelection и OEMConvert.
366
Свойство EditMask задает шаблон (маску) для ввода символов текста. Шаблон имеет вид текстовой строки, его символы называются форматными и управляют тем, что вводит пользователь: буквы или цифры, в каком порядке, сколько и т.д. Мы не будем утомлять вас подробным описанием форматных символов, при необходимости обратитесь к справочному руководству. Нас интересует только шаблон для ввода времени с точностью до минуты.
Шаг 17. Выберите компонент TimeMaskEdit, затем в окне свойств перейдите к свойству EditMask и щелчком кнопки с многоточием откройте специальный редактор для этого свойства — Input Mask Editor (рисунок 9.37):
Рисунок 9.37. Выбор шаблона для компонента MaskEdit
В этом окне вы можете ввести шаблон и проверить его работу. Часто используемые шаблоны, например шаблоны телефонных номеров, даты, времени и некоторые другие, можно просто выбрать среди уже имеющихся образцов. Этой возможностью мы и воспользуемся. Выберите в списке Sample Masks пункт Short Time и щелкните на кнопке OK. Шаблон для ввода времени задан и имеет вид !90:00;1;_ . Обратите внимание, как при этом изменился компонент TimeMaskEdit (рисунок 9.38):
Рисунок 9.38. Компонент MaskEdit настроен для ввода времени
Шаг 18. Теперь давайте сделаем так, чтобы при появлении окна диалога поле ввода TimeMaskEdit не было пустым, а содержало текущее время. Для этого создайте у формы обработчик события OnCreate:
procedure TAlarmDetailsForm.FormCreate(Sender: TObject); begin
TimeMaskEdit.Text := FormatDateTime('hh:mm', Time); end;
Готово. Запустите программу и убедитесь, что она работает, как вы того ожидаете.
9.3.8. Раскрывающийся список
Раскрывающийся список (combo box) позволяет пользователю выбрать значение из большого множества альтернатив. Он представляет собой поле ввода, к которому прикреплен раскрывающийся список значений. Редактор служит для ввода нового значения, а список —
367
для выбора существующего значения. Количество элементов в списке может быть произвольным, причем элементы можно динамически добавлять, удалять, заменять и т.д. Элементами списка обычно служат текстовые строки, но могут быть и графические рисунки (в последнем случае их редактирование невозможно).
Раскрывающийся список представлен компонентом ComboBox, который находится в палитре компонентов на вкладке Standard (рисунок 9.39):
Рисунок 9.39. Компонент ComboBox
Характерные свойства компонента ComboBox собраны в таблице 9.11.
Свойство Описание
AutoCloseUp Если равно True, то при вводе пользователем текста, который уже существует в списке Items, раскрытый список значений автоматически закрывается.
AutoComplete Если равно True, то компонент предугадывает вводимый пользователем текст на основе списка Items.
AutoDropDow |
Если равно True, то при вводе текста автоматически |
|||||
n |
раскрывается список существующих значений. |
|
|
|||
BevelEdges |
Вложенные свойства beLeft, beTop, beRight и beBottom |
|||||
|
определяют видимость соответственно левой, верхней, |
|||||
|
правой и нижней сторон рельефной рамки. |
|
|
|||
BevelInner |
Внутренний скос рельефной рамки: bvNone — скос |
|||||
|
отсутствует, bvLowered — скос внутрь, bvRaised — скос |
|||||
|
наружу; bvSpace — скос заменяется отступом. |
|
|
|||
BevelKind |
Вид рельефной рамки: bkNone — рамки нет, bkTile — |
|||||
|
рамка с четкими скосами, bkSoft — рамка со сглаженными |
|||||
|
скосами, bkFlat — плоская рамка (без скосов). |
|
|
|||
BevelOuter |
Внешний скос рельефной рамки: bvNone — скос |
|||||
|
отсутствует, bvLowered — скос внутрь, bvRaised — скос |
|||||
|
наружу; bvSpace — скос заменяется отступом. |
|
|
|||
CharCase |
Автоматическое |
преобразование |
регистра |
букв: |
||
|
ecLowerCase — к строчным буквам, ecUpperCase — к |
|||||
|
заглавным буквам, ecNormal — без преобразования. |
|
||||
DropDownCou |
Количество |
одновременно |
видимых |
элементов |
||
nt |
раскрывающегося списка. |
|
|
|
|
|
ItemHeight |
Высота отдельного элемента списка, когда значение |
|||||
|
свойства Style равно csOwnerDrawFixed. |
|
|
|
||
368
ItemIndex Порядковый номер выбранного в списке элемента, начиная с нуля.
Items |
Элементы раскрывающегося списка. |
MaxLength Максимальное количество символов, которое пользователь может ввести в строке редактора. Если оно равно 0, то пользователь может ввести текст неограниченной длины.
Sorted Если равно True, то элементы списка сортируются в алфавитном порядке.
Style |
Стиль отображения выпадающего списка (см. табл. 7.12). |
|||
Text |
Текст в строке редактора. |
|
|
|
OnChange |
Происходит при вводе текста или выборе значения из |
|||
|
списка. Не происходит при программном изменении |
|||
|
свойства Text. |
|
|
|
OnCloseUp |
Происходит при закрытии списка значений. |
|
||
OnDrawItem |
Происходит при рисовании элемента раскрывающего |
|||
|
списка, но только в том случае, если свойство Style |
|||
|
содержит |
значение |
csOwnerDrawFixed |
или |
|
csOwnerDrawVariable. |
|
|
|
OnDropDown |
Происходит при раскрытии списка значений. |
|
||
OnMeasureIte Происходит перед рисованием элемента раскрывающего
mсписка для расчета его высоты. Требует, чтобы свойство
Style содержало значение csOwnerDrawVariable.
OnSelect Происходит при выборе значения в раскрывающемся списке.
Таблица 9.11. Важнейшие свойства компонента ComboBox
Раскрывающийся список умеет отображать себя по-разному в зависимости от значения свойства Style (см. таблицу 9.12).
Значение Описание
csSimple |
Редактор и постоянно отображаемый список. |
csDropDown Редактор и ассоциированный с ним раскрывающийся список.
csDropDownList Раскрывающийся список без редактора. Все элементы списка имеют одинаковую высоту, которая рассчитывается автоматически.
csOwnerDrawFixed Раскрывающийся список без редактора. Все элементы списка имеют одинаковую высоту, заданную в
369
|
свойстве ItemHeight. |
csOwnerDrawVariab |
Раскрывающийся список без редактора. Элементы |
le |
списка имеют разную высоту. |
Таблица 9.12. Значения свойства Style компонента ComboBox
В двух последних случаях в компоненте ComboBox происходит событие OnDrawItem. Вы можете его перехватить и рисовать каждый элемент выпадающего списка как вам вздумается. Если элементы списка имеют разную высоту (стиль csOwnerDrawVariable), то компонент генерирует событие OnMeasureItem, чтобы узнать высоту каждого элемента.
Стили csOwnerDrawFixed и csOwnerDrawVariable применяются в тех случаях, когда элементы списка должны быть рисунками.
Шаг 19. Раскрывающиеся списки пригодились нам в диалоге Alarm Details для выбора дня недели (компонент WeeklyComboBox). Поскольку все дни недели заранее известны, выберите в свойстве Style значение csDropDownList (рисунок 9.40).
Рисунок 9.40. Для выбора дня недели применяется компонент ComboBox в стиле csDropDownList
Шаг 20. Теперь компонент WeeklyComboBox нужно заполнить списком исходных значений. Выберите его в форме, затем в окне свойств перейдите к свойству Items и нажмите кнопку с многоточием в поле значения. В появившемся окне введите список строк, как показано на рисунке 9.41.
370
