Основы алгоритмизации и программирования - Учебное пособие (Струков В.М.)

4. работа с кнопками

Кнопка является одним из основных элементов диалога во время выполнения приложения. С помощью кнопок пользователь подтверждает или отменяет решение о выполнении той или иной команды. Всем пользователям Windows знакомы такие кнопки, например, как Ok и Cancel. В Delphi предусмотрена возможность работать с двумя типами кнопок:

командные кнопки;

кнопки-переключатели.

4.1. Командные кнопки

Нажатие командной кнопки приводит к немедленному выполнению некоторой операции. Типичным примером командной кнопки является кнопка Ok.

В Delphi реализованы 3 вида командных кнопок:

стандартная командная кнопка Button;

командная кнопка с рисунком BitBtn

кнопка быстрого доступа. SpeedButton.

Для реализации стандартных командных кнопок в Delphi имеется компонент Button  в палитре Standard. На форме такие кнопки выглядят следующим образом:

Основным свойствам кнопки Button является Caption типа string. Это свойство содержит наименование кнопки (например, Cancel). Оно доступно в окне инспектора объектов и во время выполнения программы.

Создание обработчика события кнопки

Обработчик события – это процедура, которая реализует действие, выполняемое при наступлении данного события. Delphi автоматически создает шаблон-заготовку каждого обработчика события (исходный текст программы соответствующей процедуры), предусмотренного в закладке Events/События Инспектора объектов. Генерация шаблона-заготовки выполняется двойным щелчком мыши в поле значения соответствующего события закладки Events/События в Инспекторе объектов.

Наиболее часто происходящим событием для кнопки Button является OnClick – щелчок левой кнопкой мыши в области кнопки. Обработчик события OnClick является самым простым и удобным средством для размещения в тексте приложения программной реализации Вашей задачи. Для того, чтобы попасть в текст программы заготовки обработчика события OnClick кнопки Button нужно дважды щелкнуть по кнопке на форме или в поле значения события OnClick в закладке Events (События) Инспектора объектов. Сразу после этого Вы окажетесь в окне редактора кодов в автоматически сформированном тексте заготовки обработчика события OnClick:

Здесь Вы можете набрать текст программы, которая будет выполнена при нажатии данной кнопки щелчком мыши во время выполнения приложения.

В качестве примера создания простейшего обработчика события рассмотрим задачу вычисления суммы двух чисел: введем два целых числа с помощью компонента Edit и по команде – нажатию кнопки “Вычислить» вычислим сумму введенных чисел, а результат вычисления выведем на экран процедурой ShowMessage. Форма, реализующая эту задачу будет выглядеть следующим образом:

 Поместим текст программы, реализующий эту задачу, в обработчик OnClick кнопки Button(Вычислить):

Запустим приложение на выполнение. Введем два произвольных числа в поля ввода, и щелкнем кнопку “Вычислить». В итоге получим на экране следующее окно:

Командная кнопка с рисунком – это кнопка Button, усовершенствованная путем добавления к имени кнопки рисунка. Этот вид кнопки реализован с помощью копоненты BitBtn  , которая расположена в палитре Additional. BitBtn - потомок кнопки Button. Рисунок, который сопровождает имя кнопки может быть сформирован двумя способами:

путем вставки его из произвольного bmp-файла:

 

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

 

В первом случае вид рисунка определяется свойством Glyph, активизация которого вызывает появление окна редактора картинки кнопки с рисунком:

Нажав кнопку Открыть, можно выбрать файл с расширением bmp, который содержит требуемую картинку. Имя кнопки в этом случае задается свойством Caption.

Взаимное расположение имени кнопки и картинки определяется свойствами Margin, Layout и  Spacing. По умолчанию картинка располагается слева от имени кнопки.

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

Если предлагаемое по умолчанию имя кнопки Вас не устраивает, то его можно изменить с помощью свойства Caption.

Кнопка быстрого доступа реализована посредством компонента SpeedButton             палитры Additional. Используется обычно для создания панелей инструментов или отдельных «горячих» кнопок, для которых фиксируется нажатое состояние. Основные свойства и техника применения аналогичны вышеописанным кнопкам. Отличия:

на кнопке обычно изображается только рисунок без текста;

имеется средство фиксации нажатого состояния кнопки – свойства GroupIndex и AllowAllUp: если GroupIndex >0 и  AllowAllUp=True, то по щелчку мышкой по кнопке формируется изображение нажатой кнопки, которое фиксируется до следующего щелчка мыши. Повторный щелчок мыши по кнопке возвращает ее в исходное состояние.

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

4.2. Кнопки-переключатели (флажки).

Эти кнопки используются для формирования режимов работы приложений. Они позволяют выбрать одно или несколько значений из предлагаемого набора. Типичным примером применения таких кнопок-переключателей является любая закладка в окне команды Параметры из меню Сервис редактора MS Word:

Пользователю предоставляется набор режимов, из которых он может выбрать нужные ему путем установки «галочки»  напротив желаемого режима . В других случаях пользователь может выбрать только одно из предлагаемого множества значений. В первом случае мы имеем дело с независимыми переключателями, а во втором случае – с зависимыми переключателями.

Независимые переключатели в Delphi реализованы посредством компонента CheckBox  из палитры Standard. Если на форме (либо в другом контейнере) имеется несколько таких переключателей, то каждый из них функционирует независимо от других. На форме компонент CheckBox изображается в виде квадрата с галочкой (или без неё) и с текстовым обозначением -  .

Состояние независимого переключателя может задаваться тремя способами:

в Инспекторе объектов на этапе визуального конструирования;

оператором программы, задающим состояние переключателя;

щелчком мыши по самому переключателю в процессе выполнения приложения.

Состоянием переключателя управляют четыре свойства: Enabled, AllowGrayed, State  и Checked. Свойство Enabled определяет доступность (True) или недоступность (False) переключателя во время выполнения программы. Если переключатель доступен, то его состояние определяется остальными тремя свойствами. Свойства State и Checked – взаимозависимы, т.е. изменение одного из них приводит к изменению другого. В общем случае независимый переключатель может находиться в одном из трех возможных состояний: включен, выключен и нейтрален. В каких конкретно состояниях может находиться переключатель, определяет свойство AllowGrayed. Если его значение равно True, то переключатель может быть переведен в состояние «нейтрален» любым из трех перечисленнях выше способов. Если же AllowGrayed=False, то переключатель может находиться только в одном из двух состояний – включен или выключен.

Значения свойств State и Checked в зависимости от состояния переключателя показано в следующей таблице:

Состояние переключателя

Значение свойства

State

Значение свойства

Checked

включен

CbChecked

True

выключен

CbUnchecked

False

нейтрален

CbGrayed

False

Свойство Caption определяет надпись на кнопке.

Для проверки состояния переключателя в программе можно использовать оператор следующего вида:

If CheckBox1. Checked= True Then . . .  else . . .;

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

 

Зависимые переключатели предназначены для реализации альтернативного выбора - позволяют выбрать только одно из предлагаемого множества значений. Они реализованы в Delphi посредством компонента RadioButton   из палитры Standard. Обычно используется в составе группы кнопок. Группа зависимых переключателей может выглядеть на форме, например, следующим образом:

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

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

В отличие от независимого переключателя состояние выбранного (включенного) зависимого переключателя нельзя изменить повторным щелчком мыши.

Основными свойствами компонента RadioButton  являются свойства Caption, Enabled и Checked, порядок использования которых такой же, как и у компонента CheckBox.

4.3. Способы группирования переключателей.

Для локализации размещения группы переключателей предназначены две компоненты: GroupBox и RadioGroup.

Компонент GroupBox в общем случае предназначен для визуального выделения группы функционально связанных произвольных визуальных компонентов и представляет собой поименованный прямоугольник, внутри которого размещаются группируемые компоненты. Ниже на рисунке приведен пример группировки групп компонент двух типов – группы независимых переключателей (Группа1) и группы стандартных командных кнопок (Группа2).

Основные свойства компонента GroupBox такие же как и многих других – Caption, Color, Font и т.п. Какими-либо важными специфическими свойствами этот компонент не обладает.

Размещается в палитре Standard.

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

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

Имя группы (прямоугольника) задается свойством Caption.

Обозначения кнопок внутри группы и их количество определяется свойством Items, которое представляет собой массив строк и является комплексным свойством. Нумерация элементов массива начинается с нуля. Значение этого свойства может быть сформировано в Инспекторе объектов с помощью редактора списка, который вызывается щелчком мыши по значку  в поле значения свойства Items:

Свойство Columns позволяет размещать кнопки в несколько колонок, если их много.

Для определения выбранной кнопки во время выполнения программы используется свойство ItemIndex. По умолчанию его значение равно -1, что означает, что ни одна из кнопок не выбрана. Значение этого свойства можно задавать и до выполнения программы в Инспекторе объектов. Программным путем его значение может быть сформировано с помощью следующего оператора:

RadioGroup1.Itemindex:=2;

Тем самым мы “включим» третий переключатель.

Для проверки состояния переключателей группы (включен или выключен) на этапе выполнения приложения можно использовать оператор вида:

If RadioGroup1.Itemindex>=0 Then

Case RadioGroup1.Itemindex of

         0: . . .;

         1: . . .;

         2: . . .;

end;

Пример использования переключателей.

Решим следующую задачу. Имеется два вещественных числа. Над ними можно выполнить одно из трех действий: сложение, умножение, деление. Ввод чисел будем выполнять с помощью двух компонент Edit. Выбор действия, которое необходимо выполнить, будем осуществлять с помощью группы радиокнопок (компонента RadioGroup). Текст программы, реализующей данную задачу, поместим в обработчик события  кнопки Button:

 

Результат работы приложения будет выглядеть на экране следующим образом: