Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК ПП1 (C++ БД).doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
5.01 Mб
Скачать

Раздел 3. Управляющие окна

При изучении данного раздела вы должны проработать следующие темы:

3.1. Управление выбором.

3.2. Диалоговые окна.

3.3. Многострочные окна.

Для проверки усвоения материала Вам предстоит ответить на вопросы для самопроверки, приведённые в конце раздела, а затем выполнить лабораторные работы №1.4, №1.5 и №1.6 и тренировочный тест №3. Изучение раздела заканчивается контролем знаний: необходимо ответить на вопросы контрольного теста №3. Максимальное количество баллов, которое вы можете получить по данному разделу, равно 10.5 (1.5 баллов за тестирование и ещё 9 баллов за лабораторные работы).

3.1. Управление выбором

При организации интерфейса для управления базами данных часто встречаются задачи сортировки и выборки. При определении способа сортировки типичным является выбор одного из многих возможных способов, например:

  • сортировка по фамилии,

  • сортировка по шифру,

  • сортировка по группе.

При выборе варианта сортировки, например по фамилии, остальные варианты исключаются. Для организации задач такого рода служит удобный компонент RadioGroup (рис. 9), осуществляющий исключающий выбор.

Компонент исключающего выбора RadioGroup

Главным свойством компонента является список пунктов Items, обладающий теми же параметрами, что и у компонента ListBox. В каждой строке этого списка пользователь указывает наименование пункта, а изображение так называемой «радиокнопки» будет сформировано автоматически.

Рис. 9. Компонент RadioGroup для исключающего выбора

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

Общая панель компонента может содержать регулярно расположенные столбцы и строки с радиокнопками. Надпись в левом верхнем углу рамки панели (см. рис. 9) определяется свойством Caption. Для данного примера, Caption=”Сортировка по”.

Надписи кнопок и их количество определяются свойством Items, имеющим тип TStrings. Щелкнув на кнопке с многоточием около этого свойства в окне Инспектора объектов, вы попадете в редактор списков строк. В нем вы можете занести надписи, которые хотите видеть около кнопок, по одной в строке. Сколько строчек вы запишете  столько и будет кнопок. Например, для компонента RadioGroup1 свойство Items имеет вид

  • шифру

  • фамилии

  • году рождения

  • номеру группы

Кнопки, появившиеся в панели после задания значений Items, можно разместить в несколько столбцов, задав свойство Columns. По умолчанию Columns = 1, т.е. кнопки размещаются друг под другом (рис. 9, компонент RadioGroup1). Для компонента RadioGroup2 параметр Columns = 2, соответственно все кнопки расположилсь в двух столбцах.

Определить, какую из кнопок выбрал пользователь, можно по свойству ItemIndex, которое показывает индекс выбранной кнопки. Индексы, как всегда в C++ Builder, начинаются с 0. По умолчанию ItemIndex = -1, что означает отсутствие выбранной кнопки. Если вы хотите, чтобы в момент начала выполнения приложения какая-то из кнопок была выбрана, то надо установить соответствующее положительное значение ItemIndex. В рассматриваемом примере ItemIndex=2, на рисунке третья радиокнопка (её индекс равен 2) обозначена черной точкой.

Компонент RadioGroup очень удобен, если надписи кнопок имеют примерно одинаковую длину и если число кнопок в каждом столбце (при размещении их в нескольких столбцах) одинаково.

В некоторых случаях желательно нерегулярное расположение кнопок. Такую возможность дают компоненты RadioButton, сгруппированные панелью GroupBox. Панель GroupBox выглядит на форме так же, как RadioGroup, и надпись в ее верхнем левом углу также определяется свойством Caption. Эта панель сама по себе пустая. Ее назначение  служить контейнером для других управляющих элементов, в частности для радиокнопок RadioButton. Чтобы на панели появились радиокнопки, надо «поштучно» перетащить из палитры компонентов столько элементов RadioButton, сколько потребуется кнопок.

Группа из пяти радиокнопок объединяется единым контейнером GroupBox, который обеспечивает исключающий выбор одного варианта из всех возможных. Физическое расположение радиокнопок полностью определяется пользователем, так что такого рода формирование списка для исключающего выбора представляется наиболее универсальным.

Рассмотрим свойства радиокнопки RadioButton. Свойство Caption содержит надпись, появляющуюся около кнопки. Значение свойства Alignment определяет, с какой стороны от кнопки появится надпись: taLeftJustify  слева, taRightJustify  справа (это значение принято по умолчанию). Свойство Checked определяет, выбрана данная кнопка пользователем, или нет. Поскольку в начале выполнения приложения обычно надо, чтобы одна из кнопок группы была выбрана по умолчанию, ее свойство Checked надо установить в true в процессе проектирования.

Компоненты комплексного выбора CheckBox и CheckListBox

Наряду с сортировкой, другой часто встречающейся задачей при доступе к базам данных является выборка или фильтрация. Суть её в том, что пользователь выбирает по своему усмотрению сочетание параметров объектов хранения, которые надо отобрать из общего множества. В этом случае надо иметь компонент, в котором были бы представлены все возможные параметры, а пользователь имел бы возможность выбирать не одно единственное значение, а их произвольное сочетание. Для этой цели хорошо подходит компонент CheckListBox (рис. 10).

Рис. 10. Список индикаторов с флажком CheckListBox предназначен для организации комплексного выбора

Комонент CheckListBox используются в приложениях в основном для того, чтобы пользователь мог включать и выключать какие-то параметры, или для индикации состояния. Основным свойством компоненты является список строк Items типа TStrings, снабженных флажками – индикаторами. Список заполняется вручную при проектировании интерфейса (в течение фазы Design Time), причем пользователь записывает только текст, а изображения флажков формируются автоматически.

Состояния индикаторов определяют два свойства: State и Checked. Оба эти свойства можно рассматривать как индексированные массивы, каждый элемент которого соответствует индексу строки. Общее количество элементов определяется свойством Count. Это свойство доступно только для чтения. Поскольку индексы начинаются с 0, то индекс последнего элемента равен Count - 1.

При каждом щелчке пользователя на индикаторе его состояние изменяется, проходя в общем случае последовательно через три значения:

  • выделенное (появление черной галочки),

  • промежуточное (серое окно индикатора и серая галочка),

  • невыделенное (пустое окно индикатора).

Этим трем состояниям соответствуют три значения свойства компонента State:

  • cbChecked (выделенное),

  • cbGrayed (промежуточное),

  • cbUnchecked (невыделенное).

Впрочем, эти три состояния допускаются только при значении другого свойства AllowGrayed равном true. Если же AllowGrayed = false (значение по умолчанию), то допускается только два состояния: выделенное и не выделенное. И State, и AllowGrayed можно устанавливать во время проектирования или программно во время выполнения.

Промежуточное состояние обычно используется, если индикатор применяется для отображения какой-то характеристики объекта. Например, если индикатор призван показать, какой регистр использовался при написании какого-то фрагмента текста, то в случае, если весь текст написан в верхнем регистре, индикатор может принимать выделенное состояние, если в нижнем  не выделенное, а если использовались оба регистра  промежуточное.

Проверять состояние индикатора можно не только по значению State, но и по значению свойства Checked. Если Checked равно true, то индикатор выбран, т.е. State == cbChecked. Если Checked равно false, то State равно cbUnchecked или cbGrayed. Установка Checked в true во время проектирования или выполнения автоматически переключает State в cbChecked.

Свойства State и Checked можно устанавливать программно или считывать, определяя установки пользователя. Хотя строки Items организованы в запоминающую структуру «список», в компоненте разрешен индексный доступ к отдельной строке, как если бы она была элементом массива. Тогда значение индекса указывается в квадратных скобках. Рассмотрим два оператора:

CheckListBox1->Checked[0]=true;

CheckListBox1->State[1]= cbGrayed;

Вспоминая, что индексы начинаются с 0, делаем вывод, что индикатор первой строки списка CheckListBox1 устанавливается в состояние выбранного, а индикатор второй строки  в промежуточное состояние (рис. 7).

Рис. 11. Программное управление состоянием индикаторов: первый индикатор «выбран», а второй находится в «промежуточном» состоянии

Состояния вех флажков могут быть считаны в цикле, просматривающим весь список.

Например, если список CheckListBox1 предназначен для выбора параметров фильтрации, то перед тем, как осуществлять собственно фильтрацию, полезно вывести на экран вспомогательное сообщение, в котором записывается список выбранных параметров. Воспользуемся системным диалогом MessageDlg, который выдает строку сообщения, записанную в параметре «FilterString», а также набор кнопок, предлагаемых пользователю для выбора дальнейших действий (конструкция процедуры MessageDlg рассматривается только в самых общих чертах). Фрагмент программы, обеспечивающий сборку нужной строки, может быть записан так:

{AnsiString FilterString;

int i;

FilterString="";

for (i=0;i<=CheckListBox1->Count-1;i++)

{ if (CheckListBox1->Checked[i]==true)

// если индикатор в состоянии «выбран», то

//к строке FilterString присоединяется русское

//наименование этого пункта CheckListBox1->Items->Strings[i]

FilterString=FilterString+» «+CheckListBox1->Items->Strings[i];

// конец опреатора if

}//конец цикла по i

MessageDlg("Выбраны признаки фильтрации: \n"+ FilterString+" \n Фильтровать ? ", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0);

}//конец программы

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

Рис. 12. Результат анализа всех пунктов списка CheckListBox при выборе только одного флажка

Если выбрать несколько флажков, то строка – список параметров будет длиннее (рис. 13).

Рис. 13. Результат анализа пунктов списка CheckListBox при выборе нескольких флажков

В компоненте CheckListBox имеется также событие OnClickCheck, возникающее при каждом изменении пользователем состояния индикатора. Его можно использовать для обработки результатов изменения.

Наряду с списком индикаторов CheckListBox, можно использовать и отдельные, не объединённые в список флажки CheckBox. В принципе их использование практически не отличается от работы со списком, за исключением естественного отсутствия индекса в указателе индикатров.