Как мы уже знаем, в исходном коде программы возможно использование вложенных инструкций if. Данный подход не всегда эффективен, особенно тогда, когда число вариантов дальнейшего выполнения программы достаточно велико. Разработчики это предусмотрели и внесли в библиотеку языка цикл case Delphi, способствующую эффективной реализации множественного выбора.
Цикл case Delphi имеет общий вид:
откуда:
- Селектор подразумевает выражение, от значения которого зависит дальнейший вариант выполнения программы (т.е. определяет последовательность инструкций, которой будет руководствоваться программа в процессе своего выполнения);
- Список N обозначает список констант. Если они представлены в виде диапазона чисел, то список можно опустить и вместо него следует подстановка первой и последней констант диапазона, разделенных двумя точками (список 1, 2, 3, 4 можно заменить диапазоном 1..4).
Последовательность выполнения инструкции case такова:
- Вначале производится вычисление значения выражения-селектора;
- Затем происходит последовательное сравнение этого значения с константами, входящими в список констант.
- Далее, если произошло совпадение значения выражения-селектора с одной из констант списка, то осуществляется выполнение соответствующей этому списку группы инструкций, и на этом инструкция caseзавершает свое выполнение.
- Если произошло несовпадение значения выражения ни с одной из констант из всех списков, то производится выполнение последовательности инструкции, следующей за служебным словом else.
Использование синтаксиса инструкции case дает возможность не использовать служебное слово else вместе с соответствующей ему последовательностью инструкций. Тогда, если значения выражения-селектора не равно ни одной из констант из всех списков, то осуществляется выполнение следующей за служебным словом caseинструкции программы. Ниже представлен алгоритм, который реализует цикл case Delphi.
Примеры цикла case Delphi:
Приведем примеры использования инструкции case в различных ее вариантах.
Пример 1.
Пример 2.
Пример 3.
Теперь рассмотрим уже известную программу перевода веса из фунтов в килограммы на примере инструкции case. Данная программа будет учитывать тот факт, что в разных странах величина одного фунта измеряется по-разному. Например, в Англии 1 фунт = 453,592 гр, в России 1 фунт = 409,5 гр, в Дании, Исландии и Германии 1 фунт = 500 гр. На рисунке ниже представлено диалоговое окно программы, позволяющее выбрать страну на основе списка Страна.
Выбор страны осуществляется при помощи списка — компонента ListBox. Значок этого компонента расположен на вкладке Standard (рис. ниже — указан курсором).
Добавление списка ListBox на форму приложения проводится так же, как и добавление других компонентов: командной кнопки, поля редактирования и т. д. В таблице ниже представлены свойства списка — компонента ListBox.
Больший интерес вызывают свойство Items и свойство Itemindex. Первое из этих свойств включает в себя элементы списка, а второе свойство определяет, как номер был выбран из списка. В случае, когда не выбран ни один элемент из списка, свойство Itemindex принимает значение, равное -1. Что удобно и эффективно, список можно сформировать в процессе создания формы, либо в момент работы программы. Чтобы сформировать список в процессе создания форма, необходимо в окне Object Inspector осуществить выбор свойства Items нажать на кнопку запуска редактора, позволяющим редактировать список строк (рис. ниже).
Появилось диалоговое окно String List Editor (рис. ниже).
В этом окне необходимо ввести список, печатая каждый его элемент в одной строке, нажимая на клавишу Enterпри переходе на новую строку. Когда был введен последний элемент списка, на клавишу Enter не рекомендуется нажимать. Завершив ввод всех элементов списка, нажмите на кнопку OK. В таблице ниже представлены компоненты, располагающиеся на форме приложения нашей программы:
Следующая таблица содержит значений свойств компонентов, которые были использованы в программе:
Процедура перевода веса, выполняющаяся при нажатии на кнопку Вычислить, осуществляет произведение веса в фунтах на коэффициент, который представляет собой количество килограммов, содержащихся в одном фунте.
Листинг программы перевода веса из фунтов в килограммы:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label2: TLabel; Edit1: TEdit; // поле ввода веса в фунтах Button1: TButton; // кнопка Вычислить Label1: TLabel; LabelS: TLabel; ListBox1: TListBox; // список стран Label4: TLabel; // поле вывода рез-та — веса в килограммах procedure FormCreate(Sender: TObject); procedure ButtonlClick(Sender: TObject); private {Private declarations } public { Public declarations } end; var Form1: TForml; implementation {$R *.DFM} procedure TForml.FormCreate(Sender: TObject); begin {ListBox1.items.add('Россия'); ListBox1.items.add('Австрия'); ListBox1.iterns.add('Англия'); ListBox1.items.add('Германия'); ListBox1.iterns.add ('Дания'); ListBoxl.iterns.add('Исландия'); ListBox1.iterns.add ('Италия'); ListBox1.items.add ('Нидерланды'); } ListBox1.itemindex:=0; end; procedure TForm1.ButtonlClick(Sender: TObject); var funt:real; // вес в фунтах kg:real; // вес в килограммах k:real; // коэффициент пересчета begin case ListBoxl.Itemindex of 0: k:=0.4095; // Россия 1: k:=0.453592; // Англия 2:k:=0.56001; // Австрия 3..5,7:k:=0.5; // Германия, Дания, Исландия, Нидерланды 6: k:=0.31762; // Италия end; funt:=StrToFloat(Editl.Text); kg:=k*funt; label4.caption:=Edit1.Text + ' ф. — это ' + FloatToStrF(kg,ffFixed, 6,3) + 'кг.'; end; end.
После загрузки в исходном тексте программы обратите внимание на процедуру FormCreate, обрабатывающую событие, которое возникает во время создания формы (ее создание осуществляется автоматически в процессе запуска программы).
Данная процедура не только инициализирует переменные программы, но и может использоваться для добавления необходимых элементов списка. В листинге данной программы, как Вы можете заметить, инструкции создания списка помещены в комментарии. Это сделано для того, чтобы список был организован редактором строк в процессе создания формы.