Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

DiVM / OOP / 12_116608_1_51491

.pdf
Скачиваний:
27
Добавлен:
11.05.2015
Размер:
6.45 Mб
Скачать

Шаг 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