МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ Томский политехнический университет ____________________________________________________...
73 downloads
177 Views
223KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ Томский политехнический университет _______________________________________________________
УТВЕРЖДАЮ Декан АВТФ ________________ Мельников Ю.С. “__” ______2002 г.
ИСПОЛЬЗОВАНИЕ УСЛОВНЫХ ОПЕРАТОРОВ В OBJECT PASCAL
Методические указания к лабораторной работе № 132 по курсу “Программирование и основы алгоритмизации” для студентов направления 550200 “Автоматизация и управление”
Томск - 2002
УДК 681.3 Использование условных операторов в Object Pascal. Методические указания к лабораторной работе № 132 по курсу “Программирование и основы алгоритмизации ” для студентов направления 550200 “Автоматизация и управление”
Составитель Н.М. Семёнов Рецензент к.т.н., доцент Е.И. Громаков
Методические указания рассмотрены и рекомендованы методическим семинаром кафедры интегрированных компьютерных систем управления “___” ___________ 2002 г. Зав. кафедрой
А.М. Малышенко
ОГЛАВЛЕНИЕ 1 Оператор if ....................................................................................... .... 4 2 Использование оператора if ............................................................ .... 5 2.1 Интерактивное создание программы BUTTON1 .......... ..... 5 2.2 Ввод кода программы BUTTON1 ................................... ..... 7 2.3 Выполнение программы BUTTON1 .................................... 8 3 Оператор case ..................................................................................... . 8 4 Программа CASE1 ............................................................................ . 9 4.1 Создание программы CASE1 ............................................ ... 9 4.2 Настройка компонента Notebook ....................................... 10 4.3 Добавление компонента TabSet (набора закладок) ........... 11 4.4 Задание содержимого блокнота ........................................ . 11 4.5 Синхронизация закладок со страницами блокнота ........... 12 4.6 Добавление в форму новых управляющих элементов .......13 4.7 Добавление поведения кнопки Close ............................... .. 14 4.8 Добавление обработчика событий OnClick для кнопки Add .................................................................. 15 4.9 Запуск программы ............................................................. 17 5 Контрольные вопросы .................................................................... ... 17 6 Дополнительные задания ............................................................. .... 18 7 Литература ..................................................................................... .... 18
Использование условных операторов в Object Pascal Цель работы: Настоящая лабораторная работа призвана познакомить студентов с особенностями использования условных операторов в Object Pascal и развить навыки работы со средой Delphi. Возможности программы были бы весьма ограничены, если бы всё, что она могла делать, сводилось лишь к монотонному выполнению её операторов одного за другим. Обычно в программе требуется изменить ход выполнения в зависимости от значения логического условного выражения, которое фактически действует как переключатель, выбирающий различные пути выполнения программы. В Object Pascal (и в Delphi) имеются две условные управляющие конструкции, также называемые структурами принятия решений: 1) оператор if, 2) оператор case. Выполнение обеих конструкций зависит от оценки входящих в них выражений.
1 Оператор if Синтаксис оператора if соответствует языку Turbo Pascal. Поэтому ограничимся лишь некоторыми замечаниями относительно вложенных операторов if. Операторы if могут быть вложены друг в друга произвольное число раз. Однако вложенный оператор if, подобный приведённому ниже, содержит потенциальную неоднозначность: if Condition1 then if Condition2 then Statement1 else Statement2; Из приведённого фрагмента кода не ясно (если не брать в расчёт отступы, которые не имеют значения для транслятора), к какому из двух операторов if принадлежит ключевое слово else. Когда будет выполняться операция Statement2 - всякий раз, когда Condition1 равно False, или только в том случае, когда Condition1 равно True, а Condition2 - False? Эта неоднозначность устраняется транслятором, который обрабатывает предыдущий пример эквивалентно следующему: if Condition1 then begin if Condition2 then Statement1 else Statement2; end; Другими словами, else всегда принадлежит последнему “открытому” оператору if, который ещё не имеет части else. Оператор Statement2 выполняется только при условии, что Condition1 равно True, а Condition2 - False.
4
Хотя операторы if могут быть вложены любое число раз, лучше сводить их вложенность до минимума, поскольку даже при аккуратно проставленных отступах бывает нелегко понять, какому именно оператору if принадлежат различные части then и else. Поэтому возьмите за правило никогда не использовать вложенность на более чем один уровень. В сложных случаях, требующих многократных вложений, Вы всегда можете воспользоваться процедурами и функциями.
2 Использование оператора if Программа BUTTON1 иллюстрирует использование оператора if. Рис. 1 показывает, как должен выглядеть экран этой программы.
Рис. 1. Программа - пример BUTTON1. 2.1 Интерактивное создание программы BUTTON1 Для создания этой программы выполните следующие действия: 1. Создайте новый проект с пустой формой. 2. Сохраните модуль формы проекта под именем BUTTON1F.PAS и файл проекта - под именем BUTTON1.DPR. 3. Щёлкните кнопкой мыши на странице Additional палитры компонентов. 4. Поместите в форму вблизи её нижнего края два компонента BitBtn (битовые кнопки). Delphi назовёт их BitBtn1 и BitBtn2. Измените их свойства Name на BtnToggle и BtnClose соответственно. 5. Измените свойство Kind компонента BtnToggle на bkOK, а его свойство Caption - на &Hide. 6. У компонента BtnClose измените свойство Kind на bkCancel и свойство Caption на &Close. 7. Поместите в форму компонент Label страницы Standard палитры компонентов, расположив её над битовыми кнопками. Этот компонент автоматически получит имя Label1. 8. Измените свойство Name компонента Label1 на LblHint. 9. Измените свойство AutoSize компонента LblHint на False, а свойство Alignment - на taCenter. 10. Разместите LblHint в форме таким образом, чтобы она заполнила как можно больше места над кнопками. 11. Измените у LblHint (для этого щёлкните на метке, расположенной на форме) свойство Caption на приведённый ниже текст подсказки для пользователя:
5
Press the Close button to close the window. Press the other button to hide/unhide the text of this explanation. В таблице 1 приведены значения свойств компонентов формы BUTTON1. Таблица 1. Свойства компонентов программы BUTTON1. Компонент Form
Label
Hide/Show Button
Close Button
Окончание табл.1. Компонент
Свойство Name ActiveControl Left Top Caption Color Name Left Top Width Height Alignment AutoSize WordWrap Caption
Name Left Top Width Height TabOrder Kind Caption Default ModalResult OnClick Name Left Top Width Height TabOrder Kind Свойства компонентов Свойство Cancel Caption
Установка FrmHideShow BtnToggle 200 79 ‘Text Hide/Show’ clYellow LblHint 68 32 293 55 taCenter False True ‘Press the Close button to close the window. Press the other button to hide/unhide the text of this explanation.’ BtnToggle 113 96 89 33 0 bkOk &Hide True mrOK BtnToggleClick BtnClose 227 96 89 33 1 bkCancel программы BUTTON1. Установка True &Close
6
ModalResult OnClick
mrCancel BtnCloseClick
2.2 Ввод кода программы BUTTON1 Ниже приведены шаги, которые Вам надо проделать, чтобы ввести код программы BUTTON1: 1. Дважды щёлкните мышью на кнопке Close. Система Delphi ответит Вам созданием скелета обработчика событий BtnCloseClick. Появится редактор кода с курсором, расположенным между словами begin и end. 2. Вставьте в обработчик событий BtnCloseClick следующий оператор: Close Теперь, если при работающей программе нажать на кнопку Close, форма закроется и программа завершит работу. 3. Откройте окно Дизайнера форм, чтобы перейти в окно с формой; затем дважды щёлкните мышью на кнопке BtnToggle. Delphi создаст скелет обработчика событий BtnToggleClick. Опять появится редактор кода с курсором, помещённым между словами begin и end. 4. Находясь в редакторе кода, введите следующий текст программы в созданный Delphi обработчик событий BtnToggleClick: if LblHint.Visible then begin LblHint.Visible:=False; BtnToggle.Caption:='&Show'; end else begin LblHint.Visible:=True; BtnToggle.Caption:='&Hide'; end; Только что введённая часть программы будет выполняться в ответ на нажатие кнопки BtnToggle. Нажатие кнопки BtnToggle во время выполнения программы будет включать и выключать текст подсказки LblHint. Этот эффект достигается использованием условного оператора if. Условие в операторе if проверяет, включен ли в данный момент текст подсказки LblHint, по значению её свойства Visible. Если текст подсказки виден, то выполняются операторы раздела if - then, который меняет Visible на False, тем самым убирая текст подсказки с экрана. Одновременно с этим надпись на кнопке BtnToggle меняется с Hide на Show. Если же текст подсказки не виден, то выполняется раздел else, который изменяет свойство Visible компонента LblHint на True и меняет надпись на кнопке BtnToggle с Show на Hide. 2.3 Выполнение программы BUTTON1
7
Ниже приведены шаги, которые надо проделать при запуске программы: 1. Не забудьте сохранить проект перед испытанием программы. 2. Оттранслируйте и запустите программу. 3. Щёлкните мышью на кнопке Hide и убедитесь, что надпись на ней изменилась на Show и текст подсказки исчез. Эти изменения являются следствием выполнения раздела if-then оператора if-then-else в обработчике событий BtnToggleClick. 4. Щёлкните мышью на кнопке Show и убедитесь, что текст подсказки появился вновь. На этот раз сработал раздел else оператора if. 5. Для выхода из программы щёлкните мышью на кнопке Close.
3 Оператор case Необходимость более сжатых условных выражений становится очевидной, если надо выбирать не из двух, а из большего числа альтернативных путей выполнения. Оператор case - вторая из доступных вObject Pascal структур условного управления - выбирает один из нескольких возможных путей выполнения (ветвей) в зависимости от значения селекторного выражения. Общий синтаксис оператора case приведён ниже: case СелекторноеВыражение of Значение11, Значение12, . . . Значение1N:Оператор1; Значение21, Значение22, . . . Значение2М:Оператор2; . . . else ОператорПоУмолчанию1; ОператорПоУмолчанию2; . . . ОператорПоУмолчаниюN; end. В операторе case может только присутствовать раздел else - специальный раздел с операторами, выполняемыми по умолчанию, то есть в том случае, когда значение селекторного выражения не соответствует ни одному из списков значений ветвей условного выполнения. Этот раздел вводится с помощью зарезервированного слова else. Блок else внутри оператора case гарантирует, что все возможные случаи учтены, то есть, что независимо от значения селектора по крайней мере один из условных переходов будет выполнен. Избегайте ветвей с многими операторами везде, где это возможно. С точки зрения читаемости программы гораздо лучше преобразовать группы выполняемых операторов каждой ветви в отдельные процедуры и затем вызывать эти процедуры уже как одиночные команды - в ветвях оператора case.
8
В громоздких операторах case, в которых каждая ветвь представляет собой большой блок со сложным кодом, гораздо труднее разобраться, поскольку назначение ветвей этого условного переключателя - оператора case - перестаёт быть очевидным. Нельзя использовать значения типа string в качестве элементов списка условий (меток варианта). Величины в списке условий (метки варианта) должны быть порядкового типа, это означает, что они должны быть эквивалентны целым числам или прямо отображаться на какое - либо подмножество целых чисел.
4 Программа CASE1 Эта программа в своём первом варианте иллюстрирует концепцию использования оператора case. Этот пример познакомит Вас с некоторыми стандартными компонентами Delphi и покажет, как соединить компоненты между собой, заставляя их работать совместно. Идея представленной здесь программы - еженедельника CASE1 проста: обеспечить возможность ввода элементов, месяц за месяцем, в виде списка. Программа может служить отправной точкой для построения таких разнообразных систем, как планировщик работ, дневник расходов, календарь встреч, планировщик бюджета и т. п. Главная форма программы CASE1 показана на рис. 2.
Рис. 2. Главная форма программы CASE1. 4.1 Создание программы CASE1 Чтобы создать программу CASE1, надо проделать следующие шаги: 1. Создайте новый проект с пустой главной формой. 2. Сохраните файл вновь созданной формы в каталоге, предназначенном для проекта CASE1, под именем MAIN.PAS и файл проекта - под именем CASE1.DPR. (Для этого в меню Файл выберите опции «Сохранить как…», «Сохранить проект как…»). 3. Щёлкните кнопкой мыши в окне Дизайнера форм, чтобы выбрать форму целиком. При этом в комбо - окне списка компонентов Инспектора объектов выберите Form1. 4. Измените свойство Caption формы на CASE1 Yearbook, и свойство Name - на FormMain. 5. Поместите в форму компонент Notebook (блокнот). Для этого сначала выберите страницу палитры Win 3.1, после чего щёлкните кнопкой мыши на
9
пиктограмме компонента Notebook для выбора его, а затем щёлкните на форме приблизительно в том месте, где Вы хотите разместить этот компонент. 4.2 Настройка компонента Notebook Порядок описания Notebook следующий: 1. Выберите в форме компонент Notebook1, затем выберите в Инспекторе объектов его свойство Pages. Щёлкните дважды справа от названия свойства либо нажмите маленькую кнопку с тремя точками, расположенную после поля. При этом вызовется Notebook Editor (редактор настройки компонента Notebook, Редактор блокнота) и откроется его окно, показанное на рис. 3. По умолчанию в блокноте задана только одна страница под названием Default.
Рис. 3. Редактор настройки компонента Notebook - Notebook Editor. 2. Выберите страницу Default и щёлкните на клавише Edit. Появится диалоговое окно Edit Page, показанное на рис. 4.
Рис. 4. Диалоговое окно Edit Page Редактора блокнота. 3.Напишите в поле Page Name слово Jan. Не беспокойтесь о номере контекстной подсказки - пока просто оставьте его равным 0 (нулю). 4. Щёлкните на клавише ОК для сохранения изменений свойств страницы. 5. Теперь щёлкните на кнопке Add диалогового окна Редактора блокнота для добавления новой страницы. Появится окно Add Page, позволяющее ввести название страницы. Введите в качестве названия Feb, оставив номер контекстной подсказки равным 0 (нулю).
10
6. Повторите предыдущие шаги, создав страницы для остальных месяцев года. Назовите их Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov и Dec соответственно. 7. По окончании добавления страниц в блокнот нажмите кнопку Close, окно редактора блокнота закроется. 4.3 Добавление компонента TabSet (набора закладок) Порядок действий для включения TabSet в свою форму: 1. Используя Дизайнер форм, добавьте в форму компонент TabSet. Для этого выберите его на странице Win 3.1 палитры компонентов, после чего щёлкните кнопкой мыши в форме прямо под уже размещённым здесь компонентом Notebook. 2. Измените свойство Align компонента Tabset на alBottom. При этом компонент TabSet1 выровняется по нижнему краю формы. Обратите внимание: - поскольку Вы ещё не задали ни одной закладки, размещённый в форме компонент TabSet1 представляет собой светло - серый прямоугольник без надписи. В принципе, на этой стадии можно выбрать свойство Tabs для TabSet, вызвав соответствующий редактор свойств, и ввести названия клавиш, которые соответствуют страницам блокнота. Однако при таком подходе растёт вероятность возникновения несоответствий между метками в TabSet и страницами блокнота. В этом проекте вместо того, чтобы сейчас явно задавать метки TabSet, мы синхронизируем эти два компонента позднее на программном уровне. А пока не беспокойтесь о том, что компонент TabSet не заполнен. 4.4 Задание содержимого блокнота Содержимое блокнота задаётся следующим образом: 1. Выберите в Дизайнере форм компонент Notebook1. Убедитесь, что его свойство ActivePage в окне Инспектора объектов установлено равным Jan. Если нет, выберите страницу Jan, щёлкнув на кнопке со стрелкой, расположенной рядом с полем значения свойства, и выберите из открывшегося списка страницу Jan. 2. Поместите компонент Label в верхнюю часть поля блокнота в окне Дизайнера форм. 3. Смените свойство Name новой метки с Label1 на LblJan, а её свойство Caption установите равным January. 4. Поместите компонент ListBox на страницу блокнота - под меткой, но так, чтобы он оставался в верхней части страницы блокнота. Смените его имя с ListBox1 на LstJan. 5. Снова выберите Notebook1 в Дизайнере форм. Измените свойство ActivePage на Feb. Все компоненты на странице блокнота должны исчезнуть, и Вы снова увидите пустую страницу. 6. Повторите предыдущие шаги для страницы February - добавьте метку и назовите её LblFeb, добавьте ListBox и назовите его LstFeb. 7. Измените свойство Caption компонента LblFeb на February. От этого утомительного занятия можно избавиться. Есть более быстрый способ размещения компонентов на оставшихся страницах блокнота. Для этого надо научиться копировать один и тот же набор компонентов на каждую страницу. Вместо добавления
11
компонентов из палитры по отдельности Вы можете копировать их все с одной страницы на другую. 1. Выберите два компонента на странице Feb, поочерёдно щёлкнув на них при нажатой клавише Shift. 2. После выбора обоих компонентов выберите «Копировать» в меню Delphi «Правка». Команда «Копировать» поместит выбранную группу компонентов в буфер обмена (Clipboard) Windows. 3. Снова выберите Notebook1. Измените свойство ActivePage на Mar. Компоненты страницы Feb пропадут и появится пустая страница Mar. 4. При выбранном компоненте Notebook1 выберите «Вставить» в меню Delphi «Правка». Компоненты, которые Вы скопировали со страницы Feb, будут помещены на страницу Mar. 5. Щёлкните кнопкой мыши вне поля блокнота, но внутри окна Дизайнера форм, чтобы отменить выбор группы только что вставленных команд. 6. Выберите компонент Label и смените имя метки на LblMar, а её свойство Caption - на March. 7. Выберите компонент ListBox и измените его свойство Name на LstMar. 8. Не забывайте почаще спасать свой проект. Для этого используйте команду «Сохранить все» в меню «Файл». Содержимое блокнота определено. Теперь надо обеспечить: Появление закладок компонента TabSet во время выполнения программы. Синхронизацию страниц блокнота с закладками таким образом, чтобы при выборе определённой закладки показывалась соответствующая ей страница. 4.5 Синхронизация закладок со страницами блокнота Сейчас компонент TabSet программы CASE1 не только не синхронизирован с блокнотом, но его закладки вообще отсутствуют. Надо решить обе эти проблемы. 1. Выберите компонент ТabSet1 в окне Дизайнера форм. 2. Перейдите в окно Инспектора объектов и щёлкните на закладке страницы «События». При этом Инспектор объектов покажет эту страницу. 3. Дважды щёлкните на правой колонке рядом со свойством события OnClick. Система Delphi создаст скелет метода TabSet1Click и откроет редактор кода, чтобы Вы смогли ввести содержимое этого метода. 4. Внутри вновь созданного метода TabSet1Click введите следующую строку: Notebook1.PageIndex := TabSet1. TabIndex; Этот оператор присваивает значение свойства TabIndex компонента TabSet1 свойству PageIndex компонента Notebook1. Это всё, что надо сделать, чтобы добиться синхронизации страницы блокнота с текущей закладкой из TabSet во время выполнения программы. Теперь каждый щелчок мышью на закладке будет приводить к переключению блокнота на соответствующую страницу. Вам надо ещё задать начальные условия, чтобы закладки были доступны в TabSet, и чтобы TabSet был первоначально синхронизирован с блокнотом при старте программы. Для этого выполните следующие шаги:
12
1. Выберите форму, щёлкнув для этого мышью на пустой области формы в окне Дизайнера форм, или непосредственно выбрав FormMain с помощью выпадающего списка в верхней части окна Инспектора объектов. Замечание. Вы можете выбирать родительские компоненты выбранного в данный момент элемента, нажимая клавишу Esc. Рано или поздно, после того, как Вы нажмёте Esc достаточное число раз, выберется сама форма, поскольку она является родительской для всех остальных компонентов. 2. Щёлкните на закладке «События» Инспектора объектов для выбора страницы «События». 3. Дважды щёлкните на пустой области в правой колонке справа от имени события OnCreate. При этом будет создан скелет метода обработки события TFormMain.FormCreate. 4. Используя окно редактора кода, вставьте две приведённые ниже строки во вновь образованную процедуру: TabSet1.Tabs := Notebook1.Pages; TabSet1.TabIndex := Notebook1.PageIndex; Первый оператор копирует содержимое свойства Pages Notebook1 в свойство Tabs TabSet1. Это всё, что надо сделать, чтобы гарантировать, что метки на закладках компонента TabSet1 будут в точности соответствовать названиям страниц блокнота. Вторая строка введённого Вами кода гарантирует, что независимо от того, какую страницу Вы сделаете активной в процессе программирования (свойство ActivePage компонента Notebook1), будет также выбрана и соответствующая этой странице закладка. Теперь Вам надо решить, какой месяц из блокнота сделать выбранным при старте программы. Вы можете управлять этим выбором, установив свойство ActivePage в Notebook1 с помощью Инспектора объектов. Независимо от Вашего выбора, введённые ранее операторы обеспечат правильное отображение TabSet1 на экране в процессе работы программы. Введённые вами три строки кода - это всё, что требуется для обеспечения синхронизации между блокнотом и компонентом TabSet. Этот способ будет работать даже в том случае, если Вы позднее решите удалить или добавить страницы блокнота. Соответствующий блокноту TabSet будет модифицироваться автоматически. 4.6 Добавление в форму новых управляющих элементов Теперь разберёмся с управлением двенадцатью (по числу месяцев в году) окнами списков, которые Вы включили в свой блокнот. 1. Поместите компонент GroupBox страницы Standard палитры компонентов Delphi в область формы, не занятую блокнотом. Delphi назовёт её GroupBox1. Сотрите имя GroupBox1 свойства Caption. 2. Поместите компонент Edit страницы Standard палитры компонентов в группирующее окно GroupBox1. Смените свойство Name нового компонента на EditItem и очистите его свойство Text. 3. Поместите в GroupBox1 управляющий элемент Label, взятый всё с той же страницы Standard палитры компонентов. Смените его свойство Caption на Item: . Теперь надо добавить ряд из трёх кнопок в группирующее окно, в котором уже есть метка и окно редактирования. 13
4. Нажав клавишу Shift, щёлкните на пиктограмме кнопки на странице Standard палитры компонентов. В дополнение к пиктограмме кнопки, которая теперь выглядит нажатой, вокруг пиктограммы появится прямоугольник из точек, указывающий на специальный режим курсора мыши. В этом режиме Вы можете разместить несколько компонентов последовательно, не выбирая их каждый раз на палитре. 5. Отпустите клавишу Shift. Щёлкните кнопкой мыши три раза подряд внутри группового окна в форме. При каждом щелчке в форму будет добавляться кнопка. Пока что не беспокойтесь о положении этих кнопок или об их правильном выравнивании. Вы всегда сможете настроить эти визуальные характеристики позднее. Обратите внимание на то, что выделение пиктограммы кнопки на палитре не отменяется автоматически. 6. После третьего щелчка мыши остановитесь. Специальный курсор Вашей мыши всё ещё включен, но Вам не нужны больше кнопки. Вы должны явным образом отменить выбор активного компонента, щёлкнув для этого на самой левой пиктограмме со стрелкой в палитре компонентов Delphi. Ваша мышь снова будет работать как обычный указатель. 7. Теперь отмените выбор кнопки. Итак, Вы поместили в свою форму, в группирующее окно, три кнопки. Delphi назвала эти кнопки Button1, Button2 и Button3. Измените их свойства следующим образом: 1. Смените имя (т.е. свойство Name) компонента Button1 на BtnAdd и его свойство Caption на &Add. 2. Смените имя компонента Button2 на BtnChange и его свойство Caption на &Change. 3. Смените имя компонента Button3 на BtnDelete и его свойство Caption на &Delete. Для окончательного оформления внешнего вида главной формы сделайте следующее: 1. Поместите компонент BitBtn в свободное место формы, вне блокнота и группирующего окна. 2. Смените свойство Name только что добавленного компонента BitBtn1 на BtnClose, его свойство Kind на bkCancel и его свойство Caption на Close. 4.7 Добавление поведения кнопки Close Чтобы обеспечить функционирование кнопки Close, выполните следующие шаги: 1. Дважды щёлкните в Дизайнере форм на последней из добавленных кнопок BtnClose. При этом Delphi создаст пустой обработчик событий OnClick, назвав его TFormMain.BtnCloseClick. 2. Введите в редактор кода между словами begin и end в новом обработчике событий следующий оператор: Close; Этот оператор придаёт форме специфическое поведение - теперь, когда пользователь щёлкнет на кнопке Close, форма закроется и программа прекратит свою работу. 4.8 Добавление обработчика событий OnClick для кнопки Add 14
Для добавления обработчика событий для кнопки Add выполните следующие шаги: 1. Дважды щёлкните в форме на кнопке Add (BtnAdd). 2. Вставьте во вновь созданный метод TFormMain.BtnAddClick код, приведённый в листинге 1.
обработки
событий
Листинг 1. Обработчик события OnClick кнопки Add. __________________________________________________________________________ 1: procedure TFormMain.BtnAddClick(Sender: TObject); 2: begin 3: if EditItem.Text <> ''then begin 4: case (Notebook1.PageIndex+1) of 5: 1: LstJan.Items.Add(EditItem.Text); 6: 2: LstFeb.Items.Add(EditItem.Text); 7: 3: LstMar.Items.Add(EditItem.Text); 8: 4: LstApr.Items.Add(EditItem.Text); 9: 5: LstMay.Items.Add(EditItem.Text); 10: 6: LstJun.Items.Add(EditItem.Text); 11: 7: LstJul.Items.Add(EditItem.Text); 12: 8: LstAug.Items.Add(EditItem.Text); 13: 9: LstSep.Items.Add(EditItem.Text); 14: 10: LstOct.Items.Add(EditItem.Text); 15: 11: LstNov.Items.Add(EditItem.Text); 16: 12: LstDec.Items.Add(EditItem.Text); 17: end; 18: EditItem.Text:=''; 19: end; 20: end; ___________________________________________________________________________ Строки листинга 1, которые Вы вставили в подпрограмму BtnAddClick, приводят к добавлению содержимого окна редактирования EditItem - строки символов к окну списку той страницы Notebook1, которая в настоящий момент активна и видна на экране. Когда Вы дважды щелкнули на кнопке Add, Delphi cоздала только строки 1, 2 и 20 листинга 1. Строки с 3 по 19 Вам пришлось ввести самим. Внутри блока begin - end процедуры BtnAddСlick стоят две вложенные конструкции условного выбора. В строке 3 начинается оператор if, область видимости которого, заключённая внутри пары ключевых слов begin - end, оканчивается в конце процедуры на строке 19. Оператор if проверяет, не является ли свойство Text в EditItem пустой строкой (в строке 3 пустая строка указана, как два символа апострофа). Иными словами, условное выражение оператора if принимает значение True, если внутри окна редактирования EditItem есть текст. Если пользователь что - нибудь введёт в окне редактирования, будет выполняться содержимое оператора if - then - оператор case с двенадцатью возможными вариантами, занимающий строки с 4 по 17. Этот оператор case призван проиллюстрировать основное содержимое лабораторной работы.
15
Назначением оператора сase, начинающегося в строке 4, является выбор подходящего списка, одного из 12 - ти, имеющихся в Notebook1. После того, как подходящий список идентифицирован, в него добавляется строка, содержащаяся в свойстве Text в EditItem. Селектор оператора case в строке 4 выбирает индекс текущей страницы блокнота. Индексы страниц блокнота начинаются с 0, т.е. первая страница имеет индекс 0, следующая - 1 и т.д. Поскольку месяцы года обычно нумеруются, начиная с единицы, к индексу страницы блокнота добавляется 1, чтобы ветви оператора case было ещё легче понять при чтении кода. Внутри оператора case содержится 12 выполняемых ветвей, определяемых 12 возможными значениями селектора. Блок else не требуется, поскольку блокнот содержит ровно 12 страниц, и поэтому не приходится ожидать, что значение селектора оператора case выйдет за пределы интервала 1..12. Каждая ветвь оператора case содержит по оператору, но при щелчке мышью на кнопке Add только один из этих операторов будет выполнен. Каждая выполняемая ветвь оператора case представляет собой длинное выражение, назначение которого - занести содержимое строки, хранящейся в окне редактирования, в нужное окно списка. Номер списка зависит от значения селектора оператора case, которое в свою очередь зависит от того, какая страница блокнота в настоящий момент активна. Рассмотрим один из почти идентичных операторов ветвей: LstMar.Items.Add(EditItem.Text); Он имеет следующие части: LstMar.Items - идентифицирует нужный список, .Add - операция, которую надо выполнить, ( - начало списка параметров для нужной операции, EditItem.Text - параметр для нужной операции, ) - конец списка параметров. Поясним назначение каждого из элементов этого оператора с помощью таблицы 2 Таблица 2. Синтаксические элементы оператора в строке 7 листинга 1. Элемент Описание LstMar Этот элемент идентифицирует конкретное окно редактирования - окно LstMar, расположенное на странице March блокнота. Точка отделяет объект, на который Вы ссылаетесь (окно LstMar), от . одного из его свойств, к которому Вы хотите обратиться - свойство Items. Items Этот элемент - название свойства окна редактирования LstMar, к которому Вы хотите обратиться. Это свойство окна редактирования является набором строк. Точка отделяет название объекта, на который Вы ссылаетесь (набор . Items окна редактирования), от последующего названия метода. Add Этот элемент - название метода (или действия), который Вы вызываете для объекта, указанного перед точкой - набор Items. Обработчику действия нужен один строчный параметр. ( Левая скобка открывает список параметров, которые Вам надо передать
16
EditItem . Text ) ;
методу Add. В нашем случае есть только один параметр: EditItem.Text. EditItem - имя компонента, из которого Вы хотите читать значение Text. Точка отделяет объект, на который Вы ссылаетесь (компонент EditItem в этом случае), от названия его свойства, к которому Вы хотите обратиться . Text - имя свойства EditItem, которым Вы интересуетесь. Свойство Text содержит то, что введено в окне редактирования. Правая скобка закрывает список параметров метода Add. Точка с запятой заканчивает эту ветвь оператора case.
На этом закончим создание программы CASE1. Заметим, что сейчас кнопки Change и delete не функционируют - никаких команд к этим кнопкам не присоединено. Эти кнопки могут понадобиться при выполнении последующих лабораторных работ. 4.9 Запуск программы Для запуска программы выполните следующие шаги: 1. Прежде чем запускать программу, убедитесь, что Вы сохранили свой проект. 2. Запустите программу и проверьте, что надписи на закладках действительно отображаются правильным образом, и что при выборе различных закладок блокнот переключается на нужную страницу. Синхронизация страниц блокнота с закладками обеспечивается обработчиком OnClick компонента TabSet1 - методом TabSet1Click основной формы. 3. Введите какой - нибудь текст в окне редактирования и щёлкните на кнопке Add. При этом текст перейдёт в текущий активный список, как и полагается. Это поведение является результатом действия обработчика событий OnClick кнопки Add метода BtnAddClick основной формы. 4. Для окончания работы программы щёлкните на кнопке Close. Код обработчика событий OnClick выполнится, закрыв основную форму и, следовательно, прекратив работу программы.
5 Контрольные вопросы 1.Верно ли утверждение: ”В операторе case в качестве селекторов можно использовать только числа”? 2. Верно ли утверждение: “ Все значения меток варианта в операторе case должны быть уникальными. Ни одно из них не должно повторяться”? 3. Когда рекомендуется вместо оператора if применять оператор case? 4. Для чего нужен компонент TabSet в программе CASE1? 5. Что надо сделать, чтобы после старта программы Notebook1 отображалась страница Juny?
6 Дополнительные задания 1. Напишите на Delphi программу, которая принимает вводимые пользователем символы и выводит на экран: а) ‘CHARACTER’ - если введена строчная буква; б) ‘CAPITAL’ - если введена заглавная буква; в) ‘DIGIT’ - если введена цифра. 17
2. Напишите на Delphi программу для расчёта платёжной ведомости. Главная форма её должна содержать два окна редактирования: одно - для ввода количества отработанных часов, а другое - для ввода стоимости одного часа. Программа должна вычислять и показывать заработную плату. Каждый час, отработанный сверхурочно выше нормы в 37,5 часов, должен оплачиваться по ставке, превышающей обычную в 1,5 раза.
7 Литература 1.Возневич Э. Delphi. Освой самостоятельно. - М.: Восточная Книжная Компания, 1996. - 736 с. 2. Рубенкинг Н. Программирование в Delphi для “чайников”. -К.: Диалектика, 1996. - 304 с. 3. Фаронов В. Delphi 6: учебный курс. – СПб.: Питер, 2002. – 512 с.
ИСПОЛЬЗОВАНИЕ УСЛОВНЫХ ОПЕРАТОРОВ В OBJECT PASCAL Методические указания Составитель Николай Михайлович Семёнов
Подписано к печати Формат 60*84/16. Бумага писчая №2. Плоская печать. Усл. печ. л. . Уч. - изд. л. . Тираж экз. Заказ № . Бесплатно. Ротапринт ТПУ. 634034, Томск, пр. Ленина,30.
18