- Кнопки и меню
- Командные и инструментальные кнопки
- Специальные кнопки
- Специфика обработки событий кнопок
- Создание главного меню приложения
- Работа с Редактором Меню в среде VB
- Пример создания оболочки меню в среде VB
- Пример создания оболочки меню в среде BCB
- Создание всплывающих меню в VB
- Создание всплывающих меню в BCB и Delphi
- Нестандартное меню
Специальные кнопки
Опубликовано admin в Втр, 02/09/2010 - 23:12
Приложение 5_04 (BCB).
Специальные кнопки обеспечивают возможность индикации одного или нескольких неальтернативных вариантов (кнопка Check Box), выбора одного из группы альтернативных вариантов (кнопка Option Box в VB и аналогичная кнопка RadioButton в BCB и Delphi) и набора целочисленного значения путем прибавления или вычитания заданной величины из текущего значения (кнопка UpDown). Вид каждой из специальных кнопок среды BCB показан на рис. 5.7.

Рис. 5.7. Специальные кнопки в среде BCB
В левой рамке, — в контейнере GroupBox1, — расположены компоненты CheckBox1, CheckBox2 и CheckBox3. Ширина каждого объекта подобрана таким образом, чтобы пояснительная надпись вместе с квадратной кнопкой помещалась в отведенном прямоугольнике. Свойство Alignment, которое может принимать одно из двух значений — taRightJustify (прижим справа) и taLeftJustify (прижим слева), определяет положение пояснительной подписи (значения свойства Caption) относительно кнопки. Значение свойства Checked=True свидетельствует о наличии галочки в поле кнопки, т.е. о том, что кнопка помечена. Такую пометку может сделать пользователь, щелкнув по непомеченной кнопке во время работы приложения, или программа, присвоив значение True свойству Checked. Повторный щелчок по помеченной кнопке стирает галочку, при этом свойство Checked принимает значение False. Свойство State (Состояние) принимает одно из трех значений — cbChecked (кнопка помечена жирной черной галочкой), cbUnchecked (кнопка не помечена) и cbGrayed (галочка в кнопке сероватого цвета). В последнем случае кнопка не реагирует на щелчки пользователя, но программе она доступна. Если кнопка недоступна (Enabled=False), то изменяется цвет пояснительной надписи.
В правом контейнере GroupBox2 расположены три радиокнопки RadioButton1, RadioButton2 и RadioButton3. Своим названием они обязаны кнопкам переключения диапазонов на старых радиоприемниках. При включении любой радиокнопки одновременно выскакивает ранее нажатая и фиксируется новая кнопка. Двух одновременно нажатых радиокнопок в одной группе быть не должно, т.к. с каждой из них предполагается выполнение несовместимых действий. Для радиокнопок наиболее важными являются свойства Caption (текст пояснительной надписи) и Alignment (способ размещения пояснительной надписи).
В связи с тем, что радиокнопки, как правило, выступают в виде организованной группы, то выделять под них контейнер и размещать на нем каждую кнопку — дело хлопотное. Поэтому в средах BCB и Delphi предусмотрели специальный компонент RadioGroup, совмещающий специфику контейнера и размещенного в нем массива (свойство Items) радиокнопок. Индивидуального имени каждая кнопка массива не имеет, поэтому доступ к таким кнопкам возможен по индексу его элемента:
- RadioGroup1->Items[0] имя первой радиокнопки;
- RadioGroup1->Items[1] имя второй радиокнопки;
- RadioGroup1->Items[2] имя третьей радиокнопки;
Для того, чтоб программным путем добраться до надписи на радиокнопке, приходится использовать еще более длинный идентификатор:
- RadioGroup1->Items->Strings[0] надпись на первой кнопке;
- RadioGroup1->Items->Strings[1] надпись на второй кнопке;
- RadioGroup1->Items->Strings[2] надпись на третьей кнопке;
Приложение 5_05 (BCB).
Кнопки в радиоконтейнере можно расположить в несколько колонок, если задать значение свойства Columns, отличным от 1 (см. рис. 5.8).

Рис. 5.8. Расположение радиокнопок в 2 колонки
Когда пользователь выделил ту или иную радиокнопку в массиве RadioGroup1, то ее индекс хранится в свойстве ItemIndex. Поэтому в программе обработки соответствующего события мы должны делать проверку следующего типа:
if(RadioGroup1->Items->Strings[RadioGroup1->ItemIndex]==”Одинарный интервал”)
В среде Delphi добавку RadioGroup1 можно спрятать в операторе with:
with RadioGroup1 do
if Items.Strings[ItemIndex] = 'Одинарный интервал' then …
.................................
end;
Кстати, такая же конструкция with, обеспечивающая экономию в наборе составных имен, появилась в составе входного языка последних версий VB. Теперь только язык Си обделен таким удобным средством.
Когда в радиоконтейнере не выделена ни одна кнопка, то свойство ItemIndex принимает значение -1.
Если в контейнере, отличном от RadioGroup, размещены радиокнопки, то пояснительная надпись для каждой из них задается индивидуально путем формирования значения соответствующего свойства Caption. В контейнере RadioGroup для формирования количества радиокнопок и создания присоединенных к ним пояснительных подписей, необходимо щелкнуть по значению свойства Items и по появляющейся справа кнопке с тремя точками. В результате будет вызван редактор строк (рис. 5.9), в котором следует набрать только текст подписей (каждая подпись в отдельной строке). После выхода их редактора строк содержимое контейнера RadioGroup формируется автоматически.

Рис. 5.9. Формирование содержимого контейнера RadioButton1
Приложение 5_06 (VB).
В среде Visual Basic эквивалентными объектами являются кнопки CheckBox и OptionButton. В стандартном режиме (Style = Standard) их внешний вид почти такой же (рис. 5.10). Однако они допускают использование в графическом режиме (Style = Graphical), когда с поверхностью кнопки может быть связано до трех рисунков — Picture (появляется на не выделенной кнопке), DownPicture (появляется в момент нажатия кнопки) и Disabled Picture (появляется на заблокированной кнопке). Состояние кнопок VB определяется значением свойства Value. Для кнопок типа CheckBox это свойство может принимать одно из трех значений — 0 (Unchecked), 1 (Checked) и 2 (Grayed). Для кнопок типа OptionButton свойство Value может принимать только два логические значения — True (кнопка выделена) или False (кнопка не выделена). Свойства Caption и Alignment у них совпадают с ранее рассмотренными аналогами. Для того чтобы сгруппировать кнопки того или иного вида на форму помещают контейнер Frame (Рамка) или PictureBox (Рамка для рисунка). Кнопки, помещенные в контейнер, автоматически объединяются в группу.

Рис. 5.10. Вид специальных кнопок в среде VB
Кнопки типа UpDown представлены в штатном наборе компонент BCB/Delphi явно (раздел Win32). В среде Visual Basic сначала придется обновить вкладку General, выполнив команду Components из меню Project и выбрав раздел Microsoft Windows Common Controls-2 5.0 (SP3). На рис. 5.11 видно, что описание объекта UpDown содержится в файле comct232.ocx, расположенном в каталоге Windows\System. Поэтому при переносе такого VB-приложения на другой компьютер придется дополнительно перенести указанный файл.

Рис. 5.11. Выбор раздела, содержащего объект UpDown в VB
Приложение 5_07 (Delphi).
Кнопки типа UpDown (Вверх/Вниз) позволяют изменять текущее числовое значение путем его коррекции на заданное приращение в сторону увеличения или уменьшения. Поверхность кнопки UpDown разделена пополам горизонтальной чертой, над которой нарисован треугольник вершиной вверх (Up). Аналогичный треугольник под чертой «смотрит» вершиной вниз (Down). На рис. 5.12. приведены два варианта расположения кнопки UpDown. Очевидно, что стрелка влево связана с уменьшением текущего значения, а стрелка вправо — с увеличением.

Рис. 5.12. Вертикальное и горизонтальное расположение кнопки UpDown
Выбором варианта управляет свойство Orientation, принимающее одно из двух следующих значений:
- Orientation = udVertical BCB/Delphi (значение по умолчанию);
- Orientation = 0 (cc2orientation Vertical) VB (значение по умолчанию);
- Orientation = udHorizontal BCB/Delphi;
- Orientation = 1 (cc2orientation Horizontal) VB.
Главные свойства, определяющие поведение объекта UpDown, приведены в табл. 5.2.
Таблица 5.2
| Свойство | Пояснение |
| Min | Нижняя граница числового значения |
| Max | Верхняя граница числового значения |
| Position или
Value (VB) |
Текущее числовое значение (показание счетчика) |
| Increment | Приращение, на которое изменяется текущее числовое значение |
| Wrap | Признак, управляющий поведением объекта при достижении текущим числовым значением верхней или нижней границы |
Визуализация текущего числового значения объекта UpDown в средах BCB и Delphi, на наш взгляд, сделана более естественно и менее замысловато. Здесь введено свойство Associate, которое задает ассоциированный (связанный) со счетчиком объект, в котором отображается значение Position. Обычно, в качестве связанного объекта выступает метка (Label) или окно ввода (Edit). Поэтому в поле значения свойства Associate надо выбрать имя нужного объекта, например, Edit1. После привязки окна кнопка автоматически приклеивается к окну справа или слева в зависимости от выбираемого вами значения свойства AlignButton=udRight или AlignButton=udLeft. При этом размер кнопки по высоте автоматически подгоняется к высоте окна.
После старта BCB- или Delphi-приложения в окне автоматически устанавливается минимальное значение, определяемое свойством Min. Значение в окне может изменяться в сторону увеличения (при щелчках по <Up>) или уменьшения (при щелчках по <Down>) с шагом Increment. Попытка отредактировать значение в окне ввода выглядит удавшейся, но первый же щелчок по одному из треугольников кнопки подтверждает, что система помнит текущее значение Position и никак не реагирует на сделанные вами изменения в окне ввода. Действия, эквивалентные щелчкам по кнопке UpDown, могут быть инициированы стрелками управления курсора с клавиатуры (срабатывают только стрелки <вверх> и <вниз> независимо от ориентации кнопки), если значение свойства ArrowKeys равно True. Значение свойства Wrap=True превращает интервал допустимых значений счетчика в кольцо, когда максимальное и минимальное значения становятся соседними. Переход к значению Max+Increment переводит счетчик в положение Min, а переход к значению Min-Increment переводит счетчик в положение Max.
Приложение 5_08 (VB).
В среде Visual Basic привязка ассоциированного объекта, в котором может отображаться текущее значение свойства Value, выполняется с помощью свойства BuddyControl, аналогичного свойству Associate. Однако в VB необходимо дополнительно задать, в каком из свойств связанного объекта будет отображаться текущее значение счетчика, и требуется включить или отключить механизм синхронизации:
BuddyControl=Text1 'Назначение связанного объекта
BuddyProperties=Text 'Назначение свойства для Value
SyncBuddy=True 'Включение синхронизации
После назначения ассоциированного объекта и указания его свойства, связанного с текущим значением счетчика UpDown, необходимо присвоить ассоциированному свойству допустимое числовое значение. Именно оно и окажется начальным значением свойства Value в момент запуска VB-приложения. Если, например, значением свойства Text останется нечисловое Text1, то в качестве стартового значения Value будет выбрано значение Min. Наконец, если ассоциированный объект или его свойство не назначены, то начальное значение Value может быть задано на стадии проектирования.
Если механизм синхронизации включен, то одновременно с изменением текущего значения Value будут происходить изменения и в окне ввода. В отличие от BCB и Delphi в режиме синхронизации пользователь может изменить содержимое поля ввода в пределах интервала [Min, Max], и оно после этого становится новым текущим значением счетчика UpDown.
Заметим, что установка ассоциированного объекта и свойства BuddyProperties в окне Properties на автомате устанавливает значение SyncBuddy=True. Обратная операция SyncBuddy=False также автоматически сбрасывает ассоциированное свойство (BuddyProperties=(None)). Но это происходит только на стадии проектирования. Во время работы программы свойства SyncBuddy и BuddyProperties могут изменяться независимо друг от друга. Поэкспериментируйте с приложением, настраиваемые параметры которого приведены в табл. 5.3. Возможный вид формы приложения с расположенными на ней объектами приведен на рис. 5.13. Окно Text2 используется для отображения фактического состояния текущего значения Value, тогда как содержимое ассоциированного окна Text1 зависит от режима синхронизации.
Таблица 5.3
| Объект | Свойство | Значение |
| Form1 | ||
| Text1 | Text | Text1 или 5 |
| Text2 | Text | Text2 |
| UpDown1 | BuddyControl | Text1 |
| BuddyProperty | Text | |
| Value | 3 |
Текст обработчика события, возникающего при изменении текущего показания счетчика в результате щелчков по кнопке UpDown, приведен ниже:
Private Sub UpDown1_Change()
Text2.Text=UpDown1.Value
UpDown1.SyncBuddy=False ' Попробуйте закомментарить эту строку
End Sub

Рис.5.13. Вид приложения со счетчиком UpDown
Разработчикам объекта UpDown в среде Visual Basic показалось мало того, что было накручено по поводу назначения ассоциированного объекта, и они ввели еще одно логическое свойство AutoBuddy. Если установить его значением True (а по умолчанию оно равно False), то выбор связанного компонента происходит автоматически. Если объект, размещенный перед кнопкой UpDown (его порядковый номер TabIndex на 1 меньше), годится для отображения значения Value, то он и становится ассоциированным компонентом. При этом также автоматически выбирается и значение BuddyProperties. Оно устанавливается равным (None), если SyncBuddy=False, и (Default) при SyncBuddy=True. Хорошо, что для окна ввода связанным свойством по умолчанию (Default) является свойство Text, хотя в явном виде об этом нигде не сказано. Если объект, предшествующий кнопке, нужным требованиям не соответствует, то его поиск продолжается среди элементов, установленных на форму после UpDown, и первый подходящий среди них становится ассоциированным компонентом. На наш взгляд, это — типичное архитектурное излишество в погоне за ненужным универсализмом. Совершенно не объясним и тот факт, что для выбора ассоциированного свойства VB предлагает список всех свойств связанного объекта, хотя многие из них никак не могут представлять и, уж тем более, отображать числовые значения.
