Учебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1
![]()
|
Edit Tab Order, которое открывается по команде меню Edit|TabOrder... (рисунок 9.22). ![]() Рисунок 9.22. В окне EditTabOrder выставляется порядок перебора компонентов формы Шаг 8. В этом окне задайте порядок перебора компонентов формы AlarmDetailsForm таким, как показан на рисунке. Ну хорошо, скажете вы, допустим, порядок перебора задан. А как управлять передачей фокуса ввода программно? Очень просто. Чтобы передать фокус ввода требуемому компоненту, у него нужно вызвать метод SetFocus. Кстати при управлении фокусом ввода очень полезным может оказаться свойство формы ActiveControl, которое указывает активный компонент. Это свойство доступно в окне свойств и часто используется для указания компонента, который первым получит фокус ввода (в обход номера очереди). Если значение свойства не задано, то первым фокус ввода получает компонент, в котором значение свойства TabOrder равно нулю. Шаг 9. Хотя окно диалога Alarm Details еще не готово, вам, наверное, не терпится его опробовать и убедиться, что перебор компонентов происходит в нужном порядке. Для этого нужно связать выполнение диалога с нажатием в главной форме кнопки New.... Поэтому подключите модуль AlarmDetails в модуле Main и определите следующий обработчик события OnClick для кнопки NewButton: procedure TMainForm.NewButtonClick(Sender: TObject); begin AlarmDetailsForm := TAlarmDetailsForm.Create(Self); try AlarmDetailsForm.ShowModal; finally AlarmDetailsForm.Free; end; end; Шаг 10. Теперь выполните компиляцию и запустите программу. В окне Clock Alarms нажмите кнопку New... . Вашему взору предстанет окно диалога Alarm Settings (рисунок 9.23). ![]() Рисунок 9.23. Рабочий прототип окна для установки параметров будильника Диалог запускается, фокус ввода перемещается в нужном порядке, но в целом компоненты работают не так, как надо. Ничего удивительного, ведь мы ими почти не занимались. Поэтому дальше мы приступаем к детальному изучению различных типов компонентов. На этом пути полигоном для испытаний нам послужит окно диалога Alarm Details. 9.3.2. Переключатели Переключатели (check boxes) используются для установки параметров, характеризуемых двумя значениями – "Да" и "Нет" (True и False). Переключатели создаются с помощью компонента CheckBox, расположенного в палитре компонентов на вкладке Standard (рисунок 9.24). ![]() Рисунок 9.24. Компонент CheckBox Характерные свойства этого компонента собраны в таблице 9.6.
Таблица 9.6. Важнейшие свойства компонента CheckBox Обычно переключатель имеет два состояния: включен или выключен. Текущее состояние определяется значением свойства Checked. Если оно равно значению True, то переключатель включен, иначе — выключен. Бывает, что переключатель имеет еще и третье состояние — неопределенное (grayed). В этом состоянии переключатель закрашивается серым цветом. Если переключатель имеет три состояния, то вместо свойства Checked используется свойство State, а в свойстве AllowGrayed (разрешает неопределенное состояние) устанавливается значение True. Когда при работе программы пользователь щелкает переключатель, в нем изменяются значения свойств Checked и State, а также происходит событие OnClick. Обрабатывая это событие, можно установить любую зависимость между состоянием переключателя и состоянием других компонентов. В нашем примере компонент CheckBox используется для установки параметра Play Sound, управляющего выдачей звукового сигнала (рисунок 9.25). Мы назвали его SoundCheckBox. ![]() Рисунок 9.25. Переключатель PlaySound представлен компонентом CheckBox Шаг 11. Чтобы при первом появлении окна диалога, режим Play Sound был включен, установите в компоненте SoundCheck свойство Checked в значение True. 9.3.3. Взаимоисключающие переключатели Взаимоисключающие переключатели (radio buttons) служат для установки взаимоисключающих параметров. Они обычно объединяются в группы и позволяют пользователю выбрать одно значение из фиксированного (причем немногочисленного) набора вариантов. При включении одного такого переключателя остальные переключатели этой же группы выключаются. Группа переключателей создается с помощью нескольких компонентов RadioButton. Компонент RadioButton находится в палитре компонентов на вкладке Standard (рисунок 9.26). ![]() Рисунок 9.26. Компонент RadioButton Характерные свойства компонента RadioButton описаны в таблице 9.7.
Таблица 9.7. Важнейшие свойства компонента RadioButton В форму всегда помещаются несколько компонентов RadioButton, соответствующих возможным значениям устанавливаемого параметра. Например, в форме AlarmDetailsForm содержится три таких компонента (EverydayRadioButton, WeeklyRadioButton и DateRadioButton), которые используются для выбора периодичности срабатываний будильника (рисунок 9.27). ![]() Рисунок 9.27. Переключатели Everyday, Weekly и Date представлены компонентами RadioButton Внимание! Выбор положения переключателя осуществляется с помощью клавиш со стрелками. Шаг 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.
Таблица 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. Они представляют собой соответственно поле ввода и редактор многострочного текста (кроме них существует еще компонент RichEdit, предназначенный для ввода и отображения форматированного текста, но о нем мы поговорим отдельно). Поле ввода (Edit) служит для ввода различных слов, фраз и другого относительно короткого текста. Он не имеет полос прокрутки, но разрешает прокручивать текст по горизонтали клавишами перемещения курсора влево и вправо. Компонент Edit расположен в палитре компонентов на вкладке Standard (рисунок 9.32). ![]() Рисунок 9.32. Компонент Edit Характерные свойства компонента Edit описаны в таблице 9.9.
Таблица 9.9. Отличительные свойства и события компонента Edit Редактируемый текст содержится в свойстве Text. Его максимальная длина определяется значением свойства MaxLength. Иногда компонент Edit используется для отображения нередактируемого текста. Для этого свойство ReadOnly устанавливается в значение True. Вы спросите, чем он в таком состоянии лучше компонента |