Пользователь может переключать флажок щелчком мыши. Если флажок выключен, то после щелчка он становится включенным, и наоборот. При этом соответственно изменяется значение свойства Checked. Кроме того, флажок можно переключить и с помощью клавиши <Пробел>.
Флажком можно управлять программно, устанавливая свойству Checked требуемые значения.
Сделать флажок недоступным для изменения (заблокировать) можно, присвоив свойству Enabled значение false.
При изменении состояния переключателя возникает событие OnClick, независимо от того, в какое состояние он переходит. В обработчике события OnClick обычно располагаются операторы, выполняющие проверку состояния переключателя и осуществляющие требуемые действия.
Например, изменим текст при изменении состояния переключателя:
// - - - - Object Pascal - - - -
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked
then CheckBox1.Caption := 'Флажок №1 установлен'
else CheckBox1.Caption := 'Флажок №1 снят';
end;
// - - - - - - - C++ - - - - - - -
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
if (CheckBox1->Checked)
CheckBox1->Caption = "Флажок №1 установлен";
else
CheckBox1->Caption = "Флажок №1 снят";
}
Поместим на форму еще 2 флажка и напишем для них аналогичный код (рис. 12).
По своей работе компоненты RadioButton очень похожи на CheckBox. У них тоже есть свойство Checked, которое отображает их состояние, однако кнопки RadioButton представляют собой переключатели с зависимой фиксацией. Они обычно располагаются по отдельным группам, визуально выделенным на форме. Выбор переключателя является взаимоисключающим, т. е. при выборе одного переключателя другие становятся невыбранными. Delphi поддерживает автоматическое группирование переключателей. Каждый переключатель, помещенный в контейнер, включается в находящуюся на нем группу. Контейнерами обычно служат такие компоненты, как форма Form, панель Panel и группа GroupBox.
Когда в группе выбран один из зависимых переключателей, то, в отличие от независимого переключателя, его состояние нельзя изменить повторным щелчком. Отмена выбора зависимого переключателя происходит только при выборе другого переключателя из этой же группы.
Заметим, что для компонента RadioButton событие OnClick генерируется только при выборе переключателя. Повторный щелчок на переключателе не приводит к возникновению данного события.
Чтобы не добавлять вручную каждый переключатель, можно использовать компонент RadioGroup , представляющий собой группу переключателей.
Управление числом и названиями переключателей производится с помощью свойства Items типа TStrings, которое позволяет получить доступ к отдельным переключателям в группе. Это свойство содержит строки, отображаемые как заголовки переключателей. Отсчет строк в массиве начинается с нуля: Items[0], Items[1] и т. д. Для манипуляции со строками можно использовать такие методы, как Add и Delete.
Доступ к отдельному переключателю можно получить через свойство ItemIndex, содержащее номер выбранного в данной группе переключателя. По умолчанию свойство ItemIndex имеет значение –1 и ни один из переключателей группы не является выбранным.
Свойство Columns типа integer задает число столбцов, на которое разбиваются переключатели при расположении в группе (по умолчанию 1).
Например, пусть при создании формы в группу RadioGroup1 включается 6 переключателей, расположенных в две колонки; шестой переключатель становится выбранным:
// - - - - Object Pascal - - - -
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
for i := 1 to 6 do
RadioGroup1.Items.Add('Строка №' + IntToStr(i));
RadioGroup1.Columns := 2;
RadioGroup1.ItemIndex := 5;
end;
// - - - - - - - C++ - - - - - - -
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for (int i = 0; i < 6; i++)
RadioGroup1->Items->Add("Строка ¹" + IntToStr(i));
RadioGroup1->Columns = 2;
RadioGroup1->ItemIndex = 5;
}
Результат работы программы приведен на рис. 13.
При разработке приложения часто возникает задача объединения, или группирования, различных элементов управления. Группирование может понадобиться, например, при работе с переключателями на форме или при создании панели инструментов.
Объединение элементов выполняется с помощью специальных компонентов – контейнеров. Контейнер представляет собой компонент, который позволяет размещать на своей поверхности другие компоненты, объединяет эти компоненты в группу и становится их владельцем.
В предыдущем разделе уже был рассмотрен специализированный компонент – контейнер RadioGroup, используемый для организации группы зависимых переключателей. Для различных объектов система Delphi предлагает также набор универсальных контейнеров (группа GroupBox, панель Panel, область с прокруткой ScrollBox, фрейм Frame).
Отметим, что форма также является контейнером, с которого обычно и начинается конструирование интерфейсной части приложения. Форма – владелец всех расположенных на ней компонентов.
Компонент Panel представляет собой контейнер, в котором можно размещать другие элементы управления.
Панель имеет край с двойной рамкой внутренней и внешней. Внутренняя рамка обрамляет панель, а внешняя отображается вокруг внутренней.
Ширина каждой рамки в пикселах задается свойством BevelWidth. По умолчанию ширина рамки равна 1.
Свойства BevelInner и BevelOuter определяют вид внутренней и внешней рамки, соответственно. Каждое из этих свойство может принимать следующие значения.
bvNone – фаска отсутствует;
bvLowered – фаска утоплена;
bvRaised – фаска приподнята.
По умолчанию свойство BevelInner имеет значение bvNone, а свойство BevelOuter – значение bvRaised.
Между рамками может быть промежуток, ширина которого в пикселах определяется свойством BorderWidth. По умолчанию ширина промежутка равна нулю – промежуток отсутствует.
Примеры различного оформления рамки с помощью свойство BevelInner, BevelOuter и BevelWidth приведены на рис. 14.
Панель можно использовать и для вывода текста (свойство Caption). В этом случае управление расположением заголовка панели осуществляется с помощь свойства Alignment. Если заголовок панели не нужен, то значением свойства Caption должна быть пустая строка.
Многие Windows-приложения для выполнения таких операций, как открытие и сохранение файлов, используют стандартные диалоги выбора имени файла. В среде Delphi данные диалоги расположены на странице Dialogs Палитры компонентов.
Для использования стандартного диалога соответствующий ему компонент должен быть помещен на форму, а его свойствам установлены нужные значения. После этого следует связать вызов диалога с каким-либо событием. Чаще всего таким событием является выбор пункта меню или нажатие кнопки.
Компонент
OpenDialog
реализует диалог открытия файла. При
запуске этого диалога появляется окно,
в котором можно выбрать имя открываемого
файла (рис. 15). В случае успешного закрытия
диалога (нажатия кнопки Open)
в качестве результата возвращается
выбранное имя файла.
Компонент
SaveDialog
предлагает стандартный диалог сохранения
файла, который отличается от диалога
открытия файла только своим заголовком.
Рассмотрим основные свойства компонентов OpenDialog и SaveDialog.
Свойство FileName указывает имя и полный путь файла, выбранного в диалоге. Программа может использовать это свойство для доступа к файлу и целью читать из него данные (OpenDialog) или записывать в него (SaveDialog).
Свойство Title задает заголовок окна. Если свойство Title не установлено, то по умолчанию используется заголовок Open для OpenDialog и заголовок Save - для SaveDialog.
Свойство InitialDir определяет каталог, содержимое которого отображается при вызове окна диалога. Если каталог не задан, то отображается содержимое текущего каталога.
Свойство DefaultExt задает расширение, автоматически подставляемое к имени файла, если пользователем расширение имени не указано.
Свойство Filter содержит маски имен файлов. В процессе проектирования это свойство задается с помощью редактора фильтра (рис. 16), который вызывается нажатием кнопки с многоточием около имени этого свойства в Инспекторе объектов.
В колонке FilterName записывается тот текст, который увидит пользователь в выпадающем списке Тип файлов. В правой колонке записываются шаблоны фильтра. По умолчанию значением Filter является пустая строка, что соответствует отображению имен файлов всех типов.
Свойство Options применяется для настройки параметров, управляющих внешним видом и функциональными возможностями диалога. Каждый параметр может быть включен или выключен.
Диалоги выбора имени файла для открытия или сохранения файла вызываются на экран методом Execute. Эта функция в качестве результата возвращает логическое значение, позволяющее определить, как закрыт диалог. Если пользователь в процессе диалога нажат клавишу Open или Save, то функция Execute возвращает значение true. Если диалог был закрыт любым другим способом, то функция возвращает значение false.
Например, при нажатии на кнопку Button1 появляется диалог открытия файла OpenDialog1. При выборе имени файла его содержимое загружается в компонент Memo1.
// - - - - Object Pascal - - - -
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end.
// - - - - - - - C++ - - - - - - -
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (OpenDialog1->Execute())
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
}