Назад.    Содержание.    Вперед.

УПРАВЛЯЮЩИЕ ЭЛЕМЕНТЫ ДЛЯ ВВОДА ДАННЫХ

Вы получили первое представление об окнах диалога, научились создавать и выполнять простейшие из них. Но вы еще не знаете, как организовать диалог для получения данных от пользователя. Эта задача решается с помощью управляющих элементов для I ввода данных, к изучению которых мы сейчас приступаем. 1

Использование управляющих элементов для ввода данных рассмотрим на примере приложения ALARMS. Эта полезная утилита позволит создать список будильников для уведомления о предстоящих событиях. По сигналу будильника в заданные время и день появится окно с сообщением и прозвучит сигнал. Список будильников будет отображаться в главном окне программы, а установка их параметров будет выполняться в модальном окне диалога. В процессе разработки этого приложения вы познакомитесь с такими управляющими элементами, KaKCheckBox, RadioButton, ComboBox, ListBox, GroupBox, Edit, MaskEdit, UpDown и некоторыми другими. Итак, приступим.

Шаг 1. Сначала приготовьте новый проект с пустой формой, выбрав команду меню File | New Application. Дайте форме идентификатор MainForm, скорректируйте ее размеры и установите следующие значения свойств:

Caption = Clock Alarms; Borderlcons = [biSystemMenu, biMinimize]; BorderStyle = bsSingle;

Position = poDefaultPosOnly

Сохраните модуль формы под именем Main. pas, а проект — под именем Alarms. dpr.

Шаг 2. В форме MainForm будет отображаться список будильников. Для управления списком нужны кнопки: New..., Edit... и Delete. Для быстрого и удобного закрытия формы нужна еще кнопка Close. Поэтому поместите в форму соответствующее число компонентов Button (с идентификаторами NewBtn, EditBtn, DeleteBtn, CloseBtn) и задайте для них надписи, размеры и положение как ниже на рисунке (рис. 7. 16).

Сделайте кнопку New... кнопкой ввода, установив в компоненте NewBtn свойство Default в значение True. Чтобы обеспечить закрытие главной формы при нажатии кнопки Close, определите следующий обработчик события OnClick в компоненте CloseBtn:

procedure TMainForm. CloseBtnClick (Sender: TObject);

begin

Close;

end;

Шаг З. Необходимые подготовительные операции сделаны. Теперь перейдем к разработке окна диалога, предназначенного для ввода параметров будильника (он будет вызываться при нажатии кнопок New... и Edit...). С этой целью добавьте в проект новую форму, дайте ей идентификатор SettingsForm, скорректируйте размеры и установите следующие значения свойств:

Caption = Alarm Settings; BorderStyle = bsDialog; Position = poScreenCenter

Нужно как-то назвать модуль, в котором определена форма SettingsForm. Для этого просто сохраните модуль на диске под нужным именем, например Settings. pas.

Шаг 4. Добавьте в форму кнопки ОК и Cancel и установите их свойства так, как показано на рисунке (рис. 7. 17).

Шаг 5. Форма с кнопками готова, займемся размещением управляющих элементов для ввода данных. Прежде всего подумаем, какие параметры должны устанавливаться в диалоге. К ним относятся: текстовое сообщение, которое появится по сигналу будильника, время сигнала с точностью до минуты, признак того, нужно ли проигрывать звуковой сигнал, периодичность выдачи сигналов (ежедневно, в заданный день недели или в конкретный день). Учли все? Да. Тогда разместите на форме компоненты, обеспечивающие ввод перечисленных параметров (чтобы все управляющие элементы поместились, увеличьте высоту формы) (рис. 7. 18).

Эскиз окна диалога создан (с помощью выносок на рисунке пояснены названия компонентов, в скобках указаны их программные идентификаторы). Окинув его взором, вы обнаружите, что знакомых вам компонентов немного — это Bevel, Label и Button. Зато новыххоть отбавляй: CheckBox, RadioButton, Edit, MaskEdit, GroupBox, ComboBox, UpDown, Calendar. Однако не пугайтесь, мы обо всех расскажем и вы убедитесь, что обращаться с ними вовсе не сложно.

ПОРЯДОК ПЕРЕБОРА УПРАВЛЯЮЩИХ ЭЛЕМЕНТОВ

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

Порядковый номер очереди, в которой управляющий элемент получает фокус ввода, устанавливается с помощью целочисленного свойства TabOrder (нумерация начинается с нуля). Этот номер действует относительно владельца (формы или компонента). Например, порядок перебора компонентов MessageEdit и TimeMaskEdit задается относительно формы, а порядок перебора компонентов MonthCombo, YearEdit, Calendar — относительно их владельца GroupBox.

Иногда бывает необходимо исключить управляющий элемент из очереди на фокус ввода. Этим управляет свойство TabStop. Если установить его в значение False, управляющий элемент не сможет получить фокус ввода.

Изначально порядок перебора соответствует порядку добавления компонентов на форму, но его можно изменить, устанавливая значения свойства TabOrder в управляющих элементах. Если управляющих элементов в окне диалога очень много, то это занятие может стать довольно утомительным. В этом случае удобнее пользоваться окном Edit Tab Order, которое открывается по команде меню Edit | Tab Order... (рис. 7. 19).

Шаг 6. В этом окне задайте порядок перебора управляющих элементов формы SettingsForm такой, как показан на рисунке.

Ну хорошо, скажете вы, допустим, порядок перебора задан. А как управлять передачей фокуса ввода программно? Очень просто. Чтобы передать фокус ввода требуемому управляющему элементу, у него нужно вызвать метод SetFocus. Кстати, при управлении фокусом ввода очень полезным может оказаться свойство формы ActiveControl.,, которое указывает сфокусированный в текущий момент управляющий элемент. Это свойство доступно из Инспектора Объектов, и часто используется для указания управляющего элемента, который первым получит фокус ввода (в обход номера очереди). Если значение свойства не задано, то первым фокус ввода получает управляющий элемент, в котором значение свойства TabOrder равно нулю.

Шаг 7. Хотя окно диалога Alarm Settings еще не готово, вам, наверное, не терпится его опробовать и убедиться, что перебор управляющих элементов происходит в нужном порядке. Для этого нужно связать выполнение диалога с нажатием в главной форме кнопки New.... Поэтому подключите модуль Settings в модуле Main и определите следующий обработчик события OnClick для кнопки NewBtn:

procedure TMainForm. NewBtnClick ( Sender: TObject);

begin

SettingsForm: = TSettingsForm. Create (Self);

try

SettingsForm. ShowModal;

finally

SettingsForm. Free;

end;

end;

Шаг 8. Теперь откомпилируйте и запустите приложение (см. каталог \Chap7\Dialog hi компакт- диске). В окне Clock Alarms нажмите кнопку New.... Вашему взору предстанет окно диалога Alarm Settings (рис. 7. 20).

 

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

НЕЗАВИСИМЫЕ ПЕРЕКЛЮЧАТЕЛИ

Независимые переключатели (check boxes) используются для установки параметров, характеризуемых двумя значениями — “Да” и “Нет” (True и False). Независимые переключатели создаются с помощью компонента CheckBox, расположенного в Палитре Компонентов на странице Standard (рис. 7. 21).

Характерные свойства этого компонента собраны в таблице:

Свойство

Описание

Alignment

Определяет, с какой стороны от переключателя находится текст: taRightJustify - справа, taleftJustify - слева.

AllowGrayed

Если равно True, то переключатель имеет три состояния.

Caption

Текст рядом с переключателем.

Checked

Определяет, включен ли переключатель.

State

Содержит текущее состояние переключателя.

Обычно переключатель имеет два состояния: включен или выключен. Текущее состояние определяется значением свойства Checked. Если оно равно Тше, то переключатель включен, иначе — выключен. Бывает, что переключатель имеет еще и третье состояние — неопределенное (grayed). В этом состоянии переключатель закрашивается серым цветом. Если переключатель имеет три состояния, то вместо свойства Checked используется свойство State, а в свойстве AllowGrayed (разрешает неопределенное состояние) устанавливается значение True.

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

В нашем примере компонент CheckBox используется для установки параметра Play Sound, управляющего выдачей звукового сигнала. Мы назвали его SoundCheck (рис. 7. 22).

Шаг 9. Чтобы при первом появлении окна диалога режим Play Sound был включен, установите в компоненте SoundCheck свойство Checked в значение True.

ЗАВИСИМЫЕ ПЕРЕКЛЮЧАТЕЛИ

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

В отдельности каждый зависимый переключатель представляется компонентом RadioButton, расположенным в Палитре Компонентов на странице Standard (рис. 7. 23).

Характерные свойства компонента RadioButton описаны в таблице:

Свойство

Описание

Alignment.

Определяет, с какой стороны от переключателя находится текст: taRightJustify - справа, taleftJustify - слева.

Caption

Текст рядом с переключателем.

Checked

Определяет, включен ли переключатель.

На форму всегда помещаются несколько компонентов RadioButton, соответствующих возможным значениям устанавливаемого параметра. Например, на форме SettingsForm содержится три таких компонента (EverydayRadio, WeeklyRadio и DateRadio), которые используются для выбора периодичности срабатываний будильника (рис. 7. 24).

Шаг 10. Текущее состояние зависимого переключателя контролируется свойством Checked. Если в одном зависимом переключателе оно устанавливается в True, то во всех остальных зависимых переключателях этой же группы оно устанавливается в False. Установите в компоненте EverydayRadio свойство Checked в True — этот зависимый переключатель будет включен по умолчанию.

Шаг 11. Когда пользователь включает щелчком зависимый переключатель, его свойство Checked получает значение True и в компоненте генерируется событие OnClick. Обрабатывая это событие, можно установить любую зависимость между состоянием зависимого переключателя и состоянием других управляющих элементов формы. Например, когда включен режим Everyday, управляющие элементы для ввода дня недели и даты должны быть запрещены. Когда включен режим Weekly on, должен быть разрешен выбор дня недели, но запрещена установка даты. Наконец, когда включен режим Date, установка дня недели должна быть запрещена, а установка даты — разрешена. Чтобы достигнуть такой согласованности в работе, определите для зависимых переключателей EverydayRadio, WeeklyRadio и DateRadio единый обработчик события OnClick:

procedure TSettingsForm. RecurringRadioClick (Sender: TObject);

begin

WeeklyCombo. Enabled: = Sender = WeeklyRadio;

MonthCombo. Enabled: = Sender = DateRadio;

YearEdit. Enabled: = Sender = DateRadio;

YearUpDown. Enabled: = Sender = DateRadio;

Calendar. Enabled: = Sender = DateRadio;

end;

Шаг 12. Разумеется, компоненты WeeklyCombo, MonthCombo, YearEdit, YearUpDown и Calendar должны первоначально находиться в запрещенном состоянии. Поэтому, удерживая клавишу Shift, выберите названную группу компонентов и установите свойство Enabled в значение False.

Теперь запустите приложение и проверьте правильность его работы на данном шаге.

ГРУППЫ ЗАВИСИМЫХ ПЕРЕКЛЮЧАТЕЛЕЙ

Зависимые переключатели как правило объединяются в группы. Для быстрой организации группы зависимых переключателей очень удобен компонент RadioGroup, расположенный в Палитре Компонентов на странице Standard (рис. 7. 25).

Его характерные свойства кратко описаны в таблице:

Свойство

Описание

Align

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

Caption

Подпись к группе зависимых переключателей.

Columns

Число колонок в группе зависимых переключателей.

Itemlndex

Номер выбранного элемента, начиная с нуля. Если все переключатели находятся в выключенном состоянии, то значение свойства равно -1.

Items

Массив подписей к зависимым переключателям.

Компонент RadioGroup удобен тем, что заменяет группу компонентов RadioButton. Расположение зависимых переключателей, которые он отображает, подбирается автоматически с учетом заданного в свойстве Columns количества колонок. Номер активного зависимого переключателя хранится в значении свойства Itemlndex. Следующая картинка не относится к приложению Alarms, а просто поясняет, что такое компонент RadioGroup (рис. 7. 26).

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

ГРУППЫ УПРАВЛЯЮЩИХ ЭЛЕМЕНТОВ

Компонент GroupBox служит для создания группы управляющих элементов, он расположен в Палитре Компонентов на странице Standard (рис. 7. 27).

Компонент GroupBox имеет визуальное сходство с компонентом Bevel и выглядит как рамка с заголовком (текст заголовка задается в свойстве Caption) (рис. 7. 28).

Однако, в отличие от Bevel, компонент GroupBox является владельцем. Это, например, означает, что установка его свойства Visible в значение False прячет группу со всеми расположенными внутри управляющими элементами, а не только рамку с заголовком.

 

ОДНОСТРОЧНЫЙ И МНОГОСТРОЧНЫЙ РЕДАКТОРЫ ТЕКСТА

Для ввода неформатированного текста предназначены компоненты Edit и Memo. Они представляют собой соответственно однострочный и многострочный редакторы (кроме них существует еще компонент RichEdit, предназначенный для ввода и отображения форматированного текста, но о нем мы поговорим отдельно).

Однострочный редактор (Edit) служит для ввода различных слов, фраз и другого относительно короткого текста. Он не имеет полос прокрутки, но разрешает прокручивать текст по горизонтали клавишами перемещения курсора влево и вправо. Компонент Edit расположен в Палитре Компонентов на странице Standard (рис. 7. 29).

Характерные свойства компонента Edit описаны в таблице:

Свойство

Описание

AutoSelect

Если равно True, то при активизации редактора находящийся в нем текст автоматически выделяется.

AutoSize

Если равно True, то высота редактора автоматически подгоняется по высоте текста.

СharCase

Преобразует текст к прописным или строчным буквам: ecUpperCase - к прописным буквам, eclowerCase - к строчным буквам, ecNormal -преобразование символов не выполняется.

HideSelection

Если равно True, то при потере редактором активности выделение текста снимается.

MaxLength

Максимальное количество символов, которое пользователь может ввести. Если оно равно 0, то пользователь может ввести текст неограниченной длины.

OEMConvert

Если равно True, то символы текста преобразуются в кодовую таблицу OEM.

PasswordChar

Если не равно #0, то указанный в этом свойстве символ отображается вместо каждого символа текста. Применяется для ввода пароля.

ReadOnly

Если равно True, то пользователь не сможет изменить текст в редакторе.

Text

Редактируемый текст.

Редактируемый текст содержится в свойстве Text. Его максимальная длина определяется значением свойства MaxLength.

Иногда компонент Edit используется для отображения нередактируемого текста. Для этого свойство Readonly устанавливается в True. Вы спросите, чем он в таком состоянии лучше компонента Label? А тем, что может получать фокус ввода. Кроме того, с помощью присутствующего в редакторе текстового маркера можно выделить блок текста и поместить его в Буфер Обмена.

Компонент Edit легко приспособить для ввода паролей. Для этого достаточно установить в свойстве PasswordChar вместо символа #0 какой-нибудь другой символ, обычно символ звездочки (*). Символ, заданный в свойстве PasswordChar отображается вместо символов обычного текста, что мешает подсмотреть пароль посторонним.

Шаг 13. На форме SettingsForm компонент Edit применяется для ввода текстового сообщения будильника. Выберите его в Инспекторе Объектов и в значении свойства Text впишите Reminder! . Этот текст будет появляться в редакторе сразу при появлении окна диалога.

Шаг 14. Изменение текста во время работы приложения приводит к генерации в компоненте Edit события OnChange. Обрабатывая это событие, можно, например, устроить работу окна диалога таким образом, что кнопка ОК будет запрещена, если в редакторе нет текста. Чтобы реализовать такое поведение нашего диалога, определите для компонента MessageEdit следующий обработчик события OnChange:

 procedure TSettingsForm.MessageEditChange (Sender: TObject) ;

begin

OkBtn.Enabled := Length(MessageEdit.Text) <> 0;

end;

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

Назад.    Содержание.    Вперед.