
- •Дважды кликните по Button1 на форме.
- •procedure TForm1.Button1Click(Sender:TObject);
- •var a, b, c : real;
- •begin
- •a := StrToFloat(Edit1.Text);
- •b := StrToFloat(Edit2.Text);
- •Edit3.Text := FloatToStr(c);
- •Дважды кликните по Button2 на форме.
- •procedure TForm1.Button2Click(Sender:TObject);
- •var a, b, c : real;
- •begin
- •a := StrToFloat(Edit1.Text);
- •b := StrToFloat(Edit2.Text);
- •Edit3.Text := FloatToStr(c);
- •Дважды кликните по Button3 на форме.
- •procedure TForm1.Button3Click(Sender:TObject);
- •var a, b, c : real;
- •begin
- •a := StrToFloat(Edit1.Text);
- •b := StrToFloat(Edit2.Text);
- •Edit3.Text := FloatToStr(c);
- •Дважды кликните по Button4 на форме.
- •procedure TForm1.Button4Click(Sender:TObject);
- •var a, b, c : real;
- •begin
- •a := StrToFloat(Edit1.Text);
- •b := StrToFloat(Edit2.Text);
- •Edit3.Text := FloatToStr(c);
- •Дважды кликните по Button5 на форме.
- •var a, b, c : real;
- •begin
- •a := StrToFloat(Edit1.Text);
- •b := StrToFloat(Edit2.Text);
- •c:=Power(a,b);
- •Edit3.Text := FloatToStr(c);
- •procedure TForm1.Button1Click(Sender:TObject);
- •begin
- •{Очистить содержимое Memo1}
- •Memo1.Clear;
- •Memo1.Lines.Add (Edit1.Text);
- •Memo1.Lines.Add (ComboBox1.Text);
- •procedure TForm1.Button3Click(Sender:TObject);
- •begin
- •{Очистить содержимое компонента Memo1}
- •Memo1.Clear;
- •procedure TForm1.Button4Click(Sender:TObject);
- •begin
- •{Закрыть форму}
- •Close;
- •begin
- •If RadioGroup1.ItemIndex=0
- •Then Form1.Color:=clSilver;
- •If RadioGroup1.ItemIndex=1
- •Then Form1.Color:=clAqua;
- •If RadioGroup1.ItemIndex=2
- •Then Form1.Color:=clYellow;
- •If RadioGroup1.ItemIndex=3
- •Then Form1.Color:=clRed;
- •begin
- •RadioGroup1.ItemIndex:=ScrollBar1.Position;
- •procedure TForm1.Button2Click(Sender:TObject);
- •begin
- •if CheckBox1.State=cbChecked
- •then Memo1.Font.Color:=clPurple
- •else Memo1.Font.Color:=clBlack;
- •if CheckBox2.State=cbChecked
- •then Memo1.Font.Style:=[fsBold]
- •else Memo1.Font.Style:=[];
- •if RadioButton1.Checked
- •then Memo1.Color:=clWhite;
- •1. Пусть даны три числа. Написать программу, которая определяла бы вид треугольника (равносторонний, равнобедренный, разносторонний, прямоугольный, тупоугольный, остроугольный), если данные числа могут быть длинами сторон треугольника.
- •Подписано к изданию 23.04.2013.

• |
Min |
Минимальное значение диапазона измене- |
|
Position |
ния числовой величины. |
• |
Текущее значение числовой величины. |
Свяжем полосу прокрутки с номером цвета фона формы.
10. |
Установите |
максимальное |
Свойство Max. Значение 3 |
||
значение |
диапазона изменения |
(компонент ScrollBar1 |
|||
номера цвета фона формы |
должен быть выделен!) |
||||
11. |
Напишите |
|
procedure TForm1.ScrollBar1Change |
||
код обработки |
|
(Sender:TObject); |
|
||
события |
On- |
|
begin |
|
|
Change |
ком- |
|
{Присвоить текущее значение указателя |
||
понента |
|
|
ScrollBar1 номеру активной радиокнопки в |
||
ScrollBar1 |
– |
|
группе RadioGroup1} |
||
полосы |
про- |
|
RadioGroup1.ItemIndex:=ScrollBar1.Position; |
||
крутки Фон |
|
end; |
|
||
12. |
Сохраните |
результаты работы |
Файл|Сохранить все |
||
13. |
Проверьте работу программы |
Запуск|Запуск (F9) |
|||
|
Ожидаемый результат при |
выполнении программы – это |
изменение цвета фона формы при передвижении ползункаиндикатора скроллинга.
В примере работы 3 будет оформлена группа элементов Сервис, в которую войдут помимо четырех командных кнопок, еще две радиокнопки, управляющие фоном компонента Memo1 и два флажка, влияющих на вид начертания и цвет текста в поле Memo1. Макет формы, после выполнения примера работы 3, показан на рис.1.2.4.
|
План примера 3. |
|
1-4. |
Добавление в группу Сервис по два зависимых и незави- |
|
|
симых переключателя. |
|
5-7. |
Создание и проверка обработчика события OnClick эле- |
|
|
мента Button2. |
|
Пример работы 3: |
Подсказка |
|
1. Добавьте на форму два ком- |
Страница Standard |
|
понента класса TRadioButton |
|
42

2. Измените стандартные над- |
Свойство Caption (соот- |
|
писи кнопок на Белый фон по- |
ветствующая радиокнопка |
|
ля и Салатовый фон поля |
должна быть выделена) |
|
3. Добавьте в форму два компо- |
Страница Standard |
|
нента класса TCheckBox |
|
|
4. Измените подписи на Фио- |
Свойство Caption (соот- |
|
летовый цвет и Жирный |
ветствующий |
флажок |
шрифт |
должен быть выделен) |
Рис. 1.2.4. Макет формы после выполнения примера 3.
Независимый переключатель класса TCheckBox позволяет пользователю указать свой выбор випа «да-нет» или «да- нет-не знаю». Если в блоке содержится несколько компонен-
43

тов класса TCheckBox, то состояние каждого из них не зависит от состояний остальных.
Некоторые свойства объекта класса TCheckBox:
•Alignment Положение текста (taLeftJustify – слева,
•AllowGrayed
•Checked
•State
taRightJustify – справа).
Разрешение (либо запрет) использования состояния Не знаю.
Выбор флажка в схеме да-нет (True –
да, False - нет).
Выбор пользователя в схеме да-нет-не знаю (cbChecked - да, cbGrayed – не знаю, cbUnchecked - нет).
Ниже приведен текст программы - обработчика события OnClick для кнопки Обновить данные, изменяющей фон поля вид текста в Memo1 в зависимости от состояния добавленных на форму радиокнопок и флажков.
5. Напи- |
procedure TForm1.Button2Click(Sender:TObject); |
шите код |
begin |
обработ- |
{Если флажок Фиолетовый цвет выбран, то из- |
ки собы- |
менить цвет текста в поле Memo1 на фиолето- |
тия |
вый, в противном случае – на черный} |
OnClick |
if CheckBox1.State=cbChecked |
команд- |
then Memo1.Font.Color:=clPurple |
ной |
else Memo1.Font.Color:=clBlack; |
кнопки |
{Если флажок Жирный текст выбран, то начер- |
Обно- |
тание текста в Memo1 изменить на полужир- |
вить |
ное, в противном случае – на обычное} |
данные. |
if CheckBox2.State=cbChecked |
Для это- |
then Memo1.Font.Style:=[fsBold] |
го дваж- |
else Memo1.Font.Style:=[]; |
ды |
{Если радиокнопка Белый фон поля активна, то |
кликните |
цвет фона Memo1 установить белым} |
по |
if RadioButton1.Checked |
Button2 |
then Memo1.Color:=clWhite; |
44

на маке- {Если радиокнопка Салатовый фон поля актив- те фор- на, то цвет фона компонента Memo1 устано-
мы вить салатовым}
if RadioButton2.Checked then Memo1.Color:=clLime;
end;
6. |
Сохраните результаты работы |
Файл|Сохранить все |
7. |
Проверьте работу программы |
Запуск|Запуск (F9) |
На данном этапе в зависимости от заданной комбинации активных флажков и радиокнопок должен меняться вид оформления поля Контроль ввода данных после нажатия на кнопку Обновить данные.
Компоненты MainMenu и PopupMenu.
Для завершения создание проекта осталось создать главное меню и контекстное меню формы (рис. 1.2.5).
План примера 4.
1-8. Создание главного меню формы – работа с компонентом
MainMenu1.
9-15. Копирование созданных ранее обработчиков событий для пунктов главного меню приложения.
16-19. Составление контекстного меню формы – работа с ком-
понентом PopupMenu1.
20-26. Копирование созданных ранее обработчиков событий для пунктов контекстного меню формы.
Пример работы 4: Подсказка
1. Добавьте на форму невизу- Страница Standard альный компонент MainMenu1
Компонент класса TMainMenu невизуальный, поэтому его можно разместить в любом месте формы. При добавлении пунктов в MainMenu1 ниже строки заголовка появится строка меню формы.
Если добавить на форму несколько экземпляров класса TMainMenu, то в верхней части формы можно увидим только
45

тот, который указан в свойстве Menu формы. Проверьте, что свойство Menu формы автоматически получило значение
MainMenu1.
Рис. 1.2.5. Макет формы после выполнения примера 4.
Главное меню формы в учебном проекте состоит из двух пунктов - Файл с командой Выход и Настройки с командами
Отразить текст и Обновить данные.
2. Откройте– |
|
Дважды кликните по компоненту |
Редактор меню |
MainMenu1 на форме |
|
3. Напишите |
назва- |
Впишите в свойство Caption значение |
ние первого |
пункта |
&Файл и нажмите Enter |
меню – Файл |
|
|
46

Знак & означает, что следующую за ним букву нужно показать подчеркнутой.
Рис. 1.2.6. Окно Редактора меню.
4. |
Создайте |
в |
Из контекстного меню пункта Файл вы- |
|
пункте |
меню |
берите пункт Создать подменю. Впиши- |
||
Файл команду |
те в свойство Caption пункта NewItem2 |
|||
Выход |
|
|
значение Выход и нажмите Enter |
|
5. Создайте |
|
Из контекстного меню пункта Файл вы- |
||
пункт меню |
|
берите пункт Вставить новый пункт |
||
Настройки |
|
(после). Впишите в свойство Caption |
||
|
|
|
|
пункта NewItem3 значение &Настройки |
|
|
|
|
и нажмите Enter |
|
Для добавления команд в меню Настройки нужно соз- |
|||
дать подменю. |
|
|||
6. |
Добавьте |
в |
Из контекстного меню пункта Настройки |
|
меню |
|
|
выберите пункт Создать подменю. Выде- |
|
Настройки |
ко- |
лите пункт NewItem4. Введите значение |
||
манду |
Отра- |
свойства Caption – Отразить текст и на- |
||
зить текст |
|
жмите Enter |
||
7. Добавьте раз- |
Из контекстного меню пункта Отразить |
|||
делитель |
после |
текст выберите пункт Вставить новый |
||
пункта |
Отра- |
пункт (после). Введите дефис (-) в свой- |
||
зить текст |
|
ство Caption пункта NewItem5 |
||
8. |
Добавьте |
в |
Из контекстного меню пункта NewItem5 |
|
меню |
|
|
выберите пункт Вставить новый пункт |
|
Настройки |
ко- |
(после). Введите значение свойства |
||
манду |
Обно- |
Caption пункта NewItem6 – Обновить |
||
вить данные |
данные |
47

При закрытии окна Редактора меню пункты меню появятся на форме. Для создания ветвящихся меню (выпадающих подменю) нужно в окне Редактора меню создавать подменю для отдельных пунктов.
Для написания программы, выполняющейся при выборе пункта меню, достаточно открыть меню на макете формы и дважды кликнуть по нужному пункту меню. В окне кода формы автоматически будет создан шаблон процедуры обработки данного пункта меню.
В учебном проекте обработчики команд меню были созданы ранее для командных кнопок. Поэтому в обработчиках выбора пунктов меню будут указаны лишь ссылки на нужные процедуры.
9. В качестве обработчика |
Дважды кликните по компо- |
|||||
выбора |
команды |
Выход |
ненту MainMenu1 на форме. |
|||
пункта меню Файл задай- |
Выберите в меню Файл пункт |
|||||
те обработчик |
события |
Выход. В Инспекторе объектов |
||||
OnClick кнопки Выход |
на вкладке События из списка, |
|||||
|
|
|
расположенного справа от со- |
|||
|
|
|
бытия OnClick, выберите об- |
|||
|
|
|
работчик Button4Click |
|
||
10. Просмотрите код обра- |
Закройте Редактор меню. На |
|||||
ботчика |
выбора |
пункта |
макете |
формы |
выберите |
|
Выход меню Файл |
Файл|Выход |
|
|
|||
11. Проверьте работу про- |
F9 или . Выйдите из програм- |
|||||
граммы. |
|
|
мы, выбрав Файл|Выход |
|
||
12. Для обработки выбора |
Выберите |
в Редакторе |
меню |
|||
пункта |
Отразить текст |
нужный пункт. В Инспекторе |
||||
меню Настройки укажите |
объектов |
на вкладке События |
||||
обработчик |
события |
из списка для события OnClick, |
||||
OnClick кнопки Отразить |
выберите |
обработчик |
But- |
|||
текст |
|
|
ton1Click |
|
|
|
13. Проверьте работу про- |
F9 или . |
Заполните поля вво- |
||||
граммы |
|
|
да, а затем Memo1 по команде |
48

|
|
Настройки|Отразить текст |
||
14. Для обработки выбора |
Выберите |
в Редакторе |
меню |
|
пункта Обновить данные |
нужный пункт. В Инспекторе |
|||
меню Настройки укажите |
объектов |
на вкладке События |
||
обработчик |
события |
из списка для события OnClick, |
||
OnClick кнопки |
Обно- |
выберите |
обработчик |
But- |
вить данные |
|
ton2Click |
|
|
15. Проверьте работу про- |
. Сделайте настройки в груп- |
|||
граммы |
|
пе Сервис и обновите вид поля |
||
|
|
Memo1 по команде Настройки| |
||
|
|
Обновить данные |
|
Невизуальный компонент класса TPopupMenu используется для создания контекстных меню, вызываемых правым кликом мыши. Контекстное меню может быть создано для разных визуальных компонент формы. В учебном проекте будет создано контекстное меню формы, которое будет со-
стоять из команд Отразить текст и Обновить данные.
16. Добавьте невизуальный
компонент PopupMenu1 |
|
Страница Standard |
17. Откройте Редактор меню |
Дважды кликните по компо- |
|
|
|
ненту PopupMenu1 на форме |
Редактор контекстного меню устроен аналогично редак- |
||
тору главного меню. |
|
|
18. Измените стандартное |
Введите значение Отразить |
|
название NewItem1 |
на |
текст в свойство Caption и |
Отразить текст |
|
нажмите Enter |
19. Создайте вторую коман- |
Вставить новый пункт (по- |
|
ду контекстного меню |
– |
сле). Свойство Caption: Об- |
Обновить данные |
|
новить данные. Enter |
Для создания шаблона процедуры обработки выбора пункта контекстного меню нужно открыть меню на макете формы и дважды кликнуть по данному пункту.
В учебном проекте обработчики команд контекстного меню были созданы ранее для командных кнопок. Поэтому,
49
также как и при конструировании главного меню приложения, будут добавлены ссылки на готовые обработчики.
20. Для обработки выбора |
Дважды кликните по Popup- |
|||||
команды Отразить |
текст |
Menu1. Выберите в Редакторе |
||||
контекстного меню укажи- |
меню пункт NewItem1. В Ин- |
|||||
те |
обработчик |
события |
спекторе объектов на вкладке |
|||
OnClick кнопки Отразить |
События из списка для собы- |
|||||
текст |
|
|
тия OnClick, выберите обра- |
|||
|
|
|
|
ботчик Button1Click |
||
21. Просмотрите код выбо- |
Двойной клик по пункту в Ре- |
|||||
ра |
команды |
Отразить |
дакторе меню |
|
||
текст |
|
|
|
|
|
|
22. Для обработки выбора |
Выберите в |
Редакторе меню |
||||
команды Обновить |
дан- |
пункт NewItem2. В Инспекто- |
||||
ные |
контекстного |
меню |
ре объектов на вкладке Собы- |
|||
укажите обработчик собы- |
тия из списка для события |
|||||
тия OnClick кнопки Обно- |
OnClick, выберите обработчик |
|||||
вить данные |
|
|
Button2Click |
|
|
|
23. Просмотрите код выбо- |
Двойной клик по пункту в Ре- |
|||||
ра |
команды |
Обновить |
дакторе меню |
|
||
данные |
|
|
|
|
|
|
24. Свяжите PopupMenu1 с |
Для выделения формы кликните |
|||||
контекстным меню формы |
в свободном |
от |
компонент |
|||
|
|
|
|
месте формы. Для свойства |
||
|
|
|
|
формы PopupMenu |
нужно из |
|
|
|
|
|
списка выбрать PopupMenu1 |
||
25. Проверьте работу про- |
F9. Проверьте работу контек- |
|||||
граммы |
|
|
стного меню формы! |
|||
26. |
Сохраните |
результаты |
Файл|Сохранить все |
|||
работы |
|
|
|
|
|
В каталоге, где хранятся файлы учебного проекта, можно обнаружить исполняемый exe-файл Windows-приложения. Файл озаглавлен также как проект и имеет стандартную пик-
тограмму: или
. Попробуйте запустить!
50

§ 1.3. Компоненты закладки Additional
Данная часть книга посвящена знакомству с основными компонентами страницы Additional (Дополнительные), которые также как и компоненты закладки Standard используются в процессе разработки интерфейса приложения.
Рассмотрим назначение изучаемых компонент.
BitBtn – Командная кнопка с надписью и гравировкой
(наличие события OnClick позволяет подключать пользовательские программы-обработчики).
Bevel – Бордюр (используется для обрамления части формы).
SpeedButton – Кнопка с пиктограммой (используется при создании кнопок быстрого доступа на панелях инструментов).
Image - Рисунок (предоставляет возможность добавления и обработки рисунков в приложении).
Shape - Фигура (служит для включения на форму стандартных фигур – прямоугольников, эллипсов и др.).
StringGrid – Сетка строк (позволяет отображать текст в табличном виде).
LabeledEdit – Однострочное текстовое поле с надпи-
сью (предназначено для ввода текста).
MaskEdit – Однострочный текстовый редактор (позво-
ляет вводить текст по заданной маске).
ScrollBox – Контейнер с полосами прокрутки (предна-
значен для группировки элементов с целью экономии места на форме).
Подключение форм. Компонент BitBtn
В учебном проекте продолжается работа над проектом
51

Компоненты закладки Standard, создание которого описано в § 1.2 (рис.1.2.1). В проект будет добавлена новая форма, на которой будут собраны компоненты закладки Additional. Будет рассмотрен процесс связывания форм в одном приложении. На рис. 1.3.1 показаны изменения на форме Компоненты закладки Standard в виде добавленной кнопки со стрелкой Дальше.
Рис.1.3.1. Окно приложения из § 1.2 с добавленной кнопкой перехода на новую форму Дальше.
На рис. 1.3.2 показано окно новой формы учебного проекта. Ниже описана логика взаимодействия компонент на новой форме.
Описание учебного проекта:
1. Кликом по кнопке вместо первой формы должна появиться вторая. Клик по кнопке
52

выполняет обратный переход. Кликом по кнопке
окно второй формы можно закрыть, а все приложение выгрузить из памяти.
Рис.1.3.2. Окно формы Компоненты закладки Additional.
2. Вверху формы Компоненты закладки Additional нахо-
дится панель, которая включает две быстрых кнопки и
, фигура
и рисунок
, символизирующий логотип фирмы. При первом вызове окна новой формы кнопка
(Показать логотип) невидима. При нажатии на кнопку
(Убрать логотип) на панели становится видимой кнопка
(Показать логотип), рисунок
исчезает, а у фигуры
меняется цвет с желтого на зеленый. Клик по кнопке
приводит к тому, что рисунок
становится
53

видимым и восстанавливается желтый цвет заливки фигуры
.
3. Ниже панели расположена сетка строк, имеющая 6 столб-
цов – Фамилия И.О., Должность, Отдел, Филиал, Телефон, За-
работная плата. Слева от сетки строк находится три поля: Фа-
милия И.О., Телефон, Заработная плата. Поля Телефон и Зара-
ботная плата снабжены маской ввода, подсказывающей формат вводимой величины. Информация из полей обеих форм отображается в сетке строк кликом по кнопке Ввести данные. Очистить содержимое сетки строк можно кликом по кнопке
Очистить сетку.
4. Внизу формы расположены кнопки навигации и контейнер с полосами прокрутки, в котором можно получить доступ к кнопкам Запись в файл, Считывание из файла, Помощь.
Создание учебного проекта разбито на четыре примера работы (что соответствует пунктам описания учебного проекта).
План примера 1.
1-7. Создание на форме Form1 кнопки . 8-11. Добавление в проект второй формы Form2.
12-14. Подключение форм друг к другу.
15-19. Добавление на форму Form2 кнопки .
20-23. |
Создание на форме Form2 кнопки |
. |
|
24-27. |
Завершение работы приложения из двух форм. |
||
Пример работы 1: |
|
Подсказка |
|
1. Откройте Lazarus |
Пуск|Программы|Lazarus| |
||
|
|
Lazarus |
|
2.Откройте проект, создан- Проект|Открыть проект...
ный в предыдущей работе
3.Сделайте запасную копию Скопируйте папку с файлами
проекта |
проекта через Мой компьютер |
54

4. |
Положите на форму |
|
Form1 кнопку с гравиров- |
Страница Additional |
|
кой BitBtn1 |
|
|
5. |
Сделайте на кнопке над- |
Свойство Caption |
пись Дальше |
|
Кнопка BitBtn1 представляет собой командную кнопку с гравировкой. Через особенное свойство Glyph можно связать компонент с небольшим растровым изображением, отображаемым на поверхности кнопки. Гравировка может быть стандартной, взятой из каталога C:\lazarus\images. Можно создать гравировку для кнопки самостоятельно с помощью простого графического редактора, например, стандартного приложения Paint.
Экземпляр класса TBitBtn может находиться в одном из четырех состояний – нормальное, запрещенное, выбранное и утопленное. Поэтому максимальное количество различных гравировок на кнопке, характеризующих ее состояние, может равняться четырем. Свойство NumGlyphs устанавливает количество гравировок. Различные гравировки рисуются в виде одного растра, вытянутого по горизонтали. Если гравировка квадратная и для кнопки рисуется все 4 разновидности, то длина горизонтального растра будет в 4 раза больше, чем ширина. Стандартный размер одной гравировки 16х16 пикселей.
6. Положите на кнопку стан- |
Щелкните по кнопке с тремя |
|
дартную гравировку |
со |
точками справа от свойства |
стрелкой вправо |
|
Glyph |
В открывшемся окне Диалог загрузки изображения нуж-
но кликнуть по кнопке Загрузить. В диалоговом окне выбора файла найдите каталог C:\lazarus\images. Посмотрите стандартные гравировки и выберите подходящую по смыслу.
Открыть. ОК.
7. Прижмите гравировку к Свойство Layout. Значение |
|
правому краю кнопки |
blGlyphRight |
55

|
Некоторые свойства компонента класса TBitBtn: |
|
|||||
• |
Margin |
Расстояние |
в |
пикселях |
от |
края кнопки |
до |
|
Spacing |
гравировки |
|
|
|
|
|
• |
Расстояние |
в |
пикселях |
от |
гравировки |
до |
|
|
|
надписи |
|
|
|
|
|
|
Рассмотрим создание проекта из нескольких форм. |
|
|||||
8. Добавьте в проект новую форму |
Файл| Создать |
|
|||||
|
|
|
|
|
форму… |
|
|
9. В строке заголовка формы напишите |
Свойство Caption |
||||||
Компоненты закладки Additional |
|
|
|
|
|||
10. Сохраните форму в каталог, где на- |
Файл|Сохранить |
||||||
ходится проект, под именем unit2.pas |
все |
|
Для того чтобы вторая форма появлялась в середине экрана, нужно изменить ее свойство Position. По умолчанию свойство установлено в poDesigned. Это означает, что координаты отображения формы во время выполнения программы будут совпадать с координатами отображения формы во время ее создания.
11. Сделайте так, чтобы вторая формы |
Свойство формы |
отображалась в центре экрана |
Position. Значение |
poScreenCenter
Для того чтобы формы «видели» друг друга, нужно к модулю каждой из них подключить модуль другой.
Переключение между окном формы и окном редактора модуля формы осуществляется с помощью клавиши F12.
Если формы «спрятались» друг за друга, то найти нужную можно по команде Просмотр|Формы.
12. Подключите к |
В окне Редактора исходного кода |
|
модулю |
второй |
Lazarus на странице Unit2 ниже im- |
формы модуль пер- |
plementation наберите |
|
вой |
|
uses unit1; |
56

13. |
Подключите к |
В окне Редактора исходного кода |
||
модулю |
первой |
Lazarus на странице Unit1 ниже im- |
||
формы |
модуль |
вто- |
plementation наберите |
|
рой |
|
|
|
uses unit2; |
14. |
Напишите |
обра- |
procedure TForm1. BitBtn1Click (Sender: |
|
ботчик |
события On- |
TObject); |
||
Click кнопки Дальше, |
begin |
|||
скрывающий форму |
{Убрать с экрана окно Form1} |
|||
Form1 и показываю- |
Form1.Hide; |
|||
щий форму Form2 |
{Показать на экране окноForm2} |
|||
|
|
|
|
Form2.Show; |
|
|
|
|
end; |
Организуем переход в обратную сторону так, чтобы клик по кнопке Назад в окне второй формы приводил бы к отображению первой.
15. |
Сделайте активной форму |
Клик в окне формы или |
||
Компоненты закладки Ad- |
Просмотр|Формы |
|
||
ditional |
|
|
|
|
16. Добавьте на формукнопку |
Страница Additional |
|
||
BitBtn1 |
|
|
||
17. |
Сделайте на кнопке над- |
Свойство Caption |
|
|
пись Назад |
|
|
|
|
18. |
Положите на кнопку |
Свойство Glyph. Загрузить. |
||
стандартную гравировку со |
C:\lazarus\images. |
Выбор |
||
стрелкой влево |
файла. Открыть. ОК. |
|
||
19. |
Напи- |
procedure TForm2. |
BitBtn1Click (Sender: TObject); |
|
шите про- |
begin |
|
|
|
цедуру |
{Убрать с экрана окно Form2} |
|
||
для кноп- |
Form2.Hide; |
|
|
|
ки Назад |
{Показать на экране окноForm1} |
|
||
|
|
Form1.Show; |
|
|
|
|
end; |
|
|
На данном этапе при запуске программы должно открываться окно первой формы, а затем по нажатию на кнопку
57

Дальше первое окно исчезает и в центре экрана появляется второе. Клик по кнопке Назад скрывает окно второй формы и выводит первую.
При закрытии окна одной формы, другая остается в памяти, хотя и является скрытой. Научимся корректно завершать работу проекта, состоящего из нескольких форм. Для этого добавим на вторую форму кнопку Закрыть.
20. Добавьте на форму |
Страница Additional |
BitBtn2 |
|
У компонента класса TBitBtn есть еще одно интересное свойство Kind, позволяющее указать одну из 8 стандартных гравировок кнопки. Если пользователь сам выбирал гравировку, то значение свойства Kind автоматически изменится на bkCustom.
21. |
Положите на |
BitBtn2 |
Установите значение bkClose |
стандартную гравировку |
для свойства Kind |
||
22. |
Сделайте на кнопке над- |
Свойство Caption |
|
пись Закрыть |
|
|
|
23. |
Напишите обработчик со- |
procedure Form1.BitBtn2Click |
|
бытия OnClick кнопки Вы- |
(Sender: TObject); |
||
ход, закрывающий |
форму |
begin |
|
Form2 |
|
{Закрыть форму Form2} |
|
|
|
|
Form2.Close; |
|
|
|
end; |
Для корректной работы кнопки Закрыть для события OnClose формы Form2 нужно написать обработчик, завершающий работу приложения и выгружающий его из памяти.
24. Откройте вкладку События |
Клик в свободном месте |
инспектора объектов для формы |
формы (для выбора фор- |
Form2 |
мы). Клик по закладке Со- |
|
бытия |
58

25. |
Напишите об- |
procedure TForm2.FormClose (Sender: TOb- |
|
работчик события |
ject; var CloseAction: TCloseAction); |
||
OnClose формы |
begin |
|
|
Form2 |
{Завершить работу приложения} |
||
|
|
Application.Terminate; |
|
|
|
end; |
|
26. |
Сохраните формы |
и проект |
Файл|Сохранить все |
27. |
Проверьте работу программы |
Запуск|Запуск (F9) |
Первый этап работы закончен. В примерах работы 2-4 будет рассмотрено создание второй формы учебного проекта.
Компоненты Bevel, Image, Shape, SpeedButton
Пример работы 2 посвящен компонентам, расположенным на панели вверху формы Компоненты закладки Additional (рис. 1.3.3).
Рис.1.3.3. Окно формы после выполнения примера 2.
План примера 2.
1-3. Обрамление кнопок Назад и Выход с помощью компонента Bevel1.
59

4-7. Создание панели с заголовком Логотип фирмы. 8-10. Работа с компонентом Image1.
11-14. Создание фигуры Shape1.
15-17. Добавление быстрой кнопки SpeedButton1 со стандартной гравировкой.
18-25. Изготовление собственной гравировки.
26-28. Добавление быстрой кнопки SpeedButton2 с пользовательской гравировкой.
29-32. Написание обработчиков для быстрых кнопок и тестирование работы приложения.
Пример работы 2: |
Подсказка |
1. Сделайте запасную копию про- |
Используйте Мой ком- |
екта |
пьютер |
Познакомимся с классом TBevel, предназначенным для выделения группы элементов формы.
2. Оформите кнопки Назад и Вы- |
Страница Additional |
ход с помощью компонента Bevel1 |
|
3. Положите выше кнопок надпись |
Страница Standard |
Label1 - Кнопки навигации |
Свойство Caption |
|
Некоторые свойства компонента класса TBevel: |
hape |
Вид компонента. Значения – bsBox (объемный пря- |
моугольник), bsFrame (прямоугольник), bsTopLine |
|
|
(верхняя линия), bsButtomLine (нижняя линия), |
|
bsLeftLine (линия слева), bsRightLine (линия справа) |
tyle |
Стиль (bsRaised - выпуклый, bsLowered - вдавленный) |
|
Для создания линейки быстрых кнопок воспользуемся компонентом класса TPanel закладки Standard.
4. Положите на форму панель |
Страница Standard |
Panel1 для быстрых кнопок |
|
5. Удалите надпись на панели |
Свойство Caption |
6. Выровняйте панель по верхнему |
Значение alTop свойства |
краю формы |
Align |
60

7. Сделайте на Panel1 заголовок в |
Страница Standard |
виде панели Логотип фирмы |
|
На рис. 1.3.3 компонент Panel2 имеет вдавленный вид, что получается установкой значения bvLowered свойства BevelOuter. Компонент Bevel1 имеет выпуклый вид за счет выбранного значения bsRaised свойства Style.
Расположим справа от заголовка Логотип фирмы – картинку с эмблемой фирмы (см. рис. 1.3.3). Для этого будет использован компонент класса TImage, способный отображать растровую графику.
8. Положите справа от заголовка компонент Image1
Основным свойством компонента класса TImage является свойство Picture, связывающее компонент и рисунок на нем. Логическое свойство Stretch разрешает (либо запрещает) масштабирование изображения в зависимости от размеров компонента класса TImage.
В качестве изображения для компонента класса TImage можно взять любой графический файл в одном из форматов
.ico, .ppm, .pgm, .pbm, .png, .xpm, .bmp.
9. Свяжите компонент |
Свойство Picture. Выберите под- |
Image1 с рисунком |
ходящий графический файл |
10. Разрешите масштаби- |
Установите значение True свой- |
рование рисунка |
ства Stretch |
Справа от компонента Image1 расположим стандартную фигуру класса TShape. Свойство Shape фигуры определяет ее вид– stRectangle (прямоугольник), stSquare (квадрат), stRoundRect (прямоугольник с округлыми краями), stRoundSquare (квадрат с округлыми краями), stEllipse (эллипс), stCircle (окружность).
11. Положите справа от рисунка
Image1 компонент Shape1
61

12. Определите вид фигуры - |
Установите значение |
окружность |
stCircle для свойства Shape |
Группа свойств Pen (перо) определяет стиль границы фигуры, а группа свойств Brush (кисть) – стиль заливки.
13. Сделайте цвет границы зеле- |
Значение clGreen свойства |
ным |
Color группы Pen |
14. Определите желтый цвет за- |
Значение clYellow свойства |
ливки фигуры |
Color группы Brush |
Создадим кнопки управления элементами Image1 и Shape1. Положим на панель инструментов быструю кнопку
SpeedButton1 , клик по которой будет скрывать логотип фирмы, менять заливку окружности на зеленый цвет и прояв-
лять кнопку возврата в исходное состояние |
. |
|
15. Добавьте на панель кнопку |
Страница Additional |
|
SpeedButton1 |
Быстрые кнопки класса TSpeedButton похожи по свойствам на кнопки класса TBitBtn. Отличительной чертой кнопок TSpeedButton является возможность фиксации утопленного состояния.
Кнопки класса TSpeedButton можно группировать. Зафиксированная в нажатом состоянии кнопка отпускается при выборе другой кнопки из группы. Значение 0 свойства GroupIndex определяет вариант одиночной фиксируемой кнопки.
Логическое свойство AllowAllUp определяет порядок освобождения кнопки. При значении True утопленная кнопка освобождается только при нажатии другой кнопки группы. При значении False кнопка освобождается повторным кликом.
Положим на добавленную быструю кнопку стандартную гравировку, например, из файла menu_abort_build.png,
находящегося в каталоге C:\lazarus\images\menu.
62

16. |
Положите |
на |
кнопку |
Свойство Glyph |
SpeedButton1 подходящую |
грави- |
|
||
ровку |
|
|
|
|
17. Включите SpeedButton1 в группу |
Значение 1 свойства |
|||
быстрых кнопок |
|
|
GroupIndex |
При выборе быстрой кнопки из группы она переходит в состояние «утопленная», а все остальные кнопки возвращаются в «нормальное» состояние.
Создадим на панели инструментов вторую быструю
кнопку , клик по которой будет отображать рисунок с эмблемой логотипа фирмы и восстанавливать первоначальный желтый цвет заливки фигуры.
18. Положите слева от кнопки
SpeedButton1 кнопку Speed- Страница Additional
Button2
С помощью графического редактора Paint создадим свою пользовательскую гравировку для второй быстрой кнопки. Гравировка будет представлять собой горизонтальный растр 64х16 пикселей, состоящих из 4-х разноцветных букв Л (Логотип).
Рис.1.3.4. Пользовательская гравировка для быстрой кнопки.
19. Запустите Paint |
Пуск|Программы|Стандартные| |
|
Paint |
20. Измените размеры |
Рисунок|Атрибуты. Ширина: 64, |
файла |
высота: 16 |
63

21. |
Увеличьте масштаб |
Инструмент |
(масштаб). На |
|
|
панели атрибутов установите |
|
просмотра |
максимальное увеличение |
||
22. |
Отобразите сетку |
Вид|Масштаб|Показать сетку |
|
пикселей на холсте |
|
|
|
23. |
В размерах 16х16 |
|
|
нарисуйте синюю букву |
|
|
|
Л . Используйте цвет- |
|
|
|
ной и белый карандаш |
|
|
|
|
|
|
|
24. |
Скопируйте букву и |
Выделите букву, удерживайте Ctrl |
|
измените ее цвет |
и снимайте копии. Для заливки ис- |
||
|
|
пользуйте инструмент |
Изображение должно состоять из четырех одинаковых квадратных зон (гравировок для четырех состояний кнопки).
В центре каждой зоны поместите большую букву Л (синюю,
серую, красную, фиолетовую).
25. |
Сохраните |
рисунок |
в |
файл |
Файл|Сохранить |
|
my_pic.bmp |
|
|
|
как... |
|
|
26. |
Положите |
на |
кнопку |
Свойство Glyph |
|
|
SpeedButton2 созданную гравировку |
|
|
||||
|
Измените значение свойства |
NumGlyphs (количество |
|
|||
гравировок). Наберите количество гравировок: 4. |
|
|||||
27. |
Включите кнопку SpeedBut- |
Установите значение 1 |
|
|||
ton2 в группу |
|
|
свойства GroupIndex |
|
||
28. |
Сделайте кнопку SpeedBut- |
Установите значение False |
|
|||
ton2 невидимой |
при запуске |
свойства Visible |
|
|||
программы |
|
|
|
|
|
Добавим коды обработки для выбора кнопок SpeedButton1 и SpeedButton2.
64

29. |
Напиши- |
procedure TForm2.SpeedButton1Click (Sender: |
те |
обработ- |
TObject); |
чик события |
begin |
|
OnClick |
{Если кнопка SpeedButton1 нажата, то выпол- |
|
кнопки |
нить действия} |
|
SpeedBut- |
if SpeedButton1.Down = True then |
|
ton1 |
begin |
|
(Убрать ло- |
{Сделать видимой вторую быструю кнопку |
|
готип) |
SpeedButton2} |
|
|
|
SpeedButton2.Visible := True; |
|
|
{Сделать невидимой картинку Image1} |
|
|
Image1.Visible := False; |
|
|
{Изменить цвет заливки фигуры Shape1 } |
|
|
Shape1.Brush.Color := clLime |
|
|
end; |
|
|
end; |
30. |
Напиши- |
procedure T Form2.SpeedButton2Click (Sender: |
те |
обработ- |
TObject); |
чик события |
begin |
|
OnClick |
{Если кнопка SpeedButton2 нажата, то выпол- |
|
кнопки |
нить действия} |
|
SpeedBut- |
if SpeedButton2.Down = True then |
|
ton2 |
begin |
|
(Показать |
{Сделать видимой картинку Image1} |
|
логотип) |
Image1.Visible := True; |
|
|
|
{Восстановить желтый цвет заливки фигуры} |
|
|
Shape1.Brush.Color := clYellow |
|
|
end; |
|
|
end; |
31.Сохраните изме- Файл|Сохранить все
нения проекта
32.Проверьте работу . Протестируйте работу быстрых
программы кнопок
65

Следующий пример работы посвящен работе с новыми полями ввода и сеткой для отображения строк.
Набор классов, а также пиктограммы для некоторых из них, изменялись от версии к версии в Lazarus. Так, класс
TMaskEdit появился только в версии lazarus-0.9.28.2.
Компоненты LabeledEdit, MaskEdit и StringGrid
Дополним форму Компоненты закладки Additional
полями для ввода личной информации о сотруднике – Фами-
лия И.О., Телефонный номер, Заработная плата. Организуем вывод всей информации о сотруднике, собранной из полей двух форм в сетку строк.
После завершения примера работы 3 наша форма должна выглядеть так, как показано на рисунке 1.3.5.
План примера 3.
1-4. Добавление компонента Edit1 – поля Фамилия И.О. 5-12. Работа с полями LabeledEdit1 и MaskEdit1 – Телефон и
Заработная плата.
13-16. Оформление сетки строк StringGrid1.
17-22. Добавление кнопок BitBtn3,4 – Ввести данные и Очистить сетку.
23-26. Написание обработчиков нажатий кнопок BitBtn3,4 и тестирование работы программы.
Рис.1.3.5. Окно формы после выполнения примера 3.
66

Пример работы 3: |
Подсказка |
|
1. |
Сделайте запасную копию |
Используйте Мой компью- |
проекта |
тер |
|
2. |
Положите на форму одно- |
Страница Standard |
строчный текстовый редактор |
|
|
Edit1 |
|
|
3. Очистите компонент Edit1 |
Свойство Text |
|
4. |
Подпишите добавленное поле |
Страница Standard |
Фамилия И.О. |
Класс TLabel |
|
5. |
Положите на форму поле с |
Страница Additional |
надписью LabeledEdit1 |
|
|
6. |
Измените подпись поля La- |
Свойство Caption в группе |
beledEdit1 на Телефон |
свойств EditLabel |
|
7. |
Укажите образец для ввода |
Наберите значение 2-567- |
номера телефона |
### для свойства Text |
|
8. |
Задайте максимально допус- |
Наберите значение 9 для |
тимую длину вводимого текста |
свойства MaxLength |
При запуске программы на исполнение образец для ввода будет виден в поле только как текст по умолчанию, который можно изменить, дополнить или удалить. Попробуйте!
Для создания неизменяемых масок ввода, в которых можно лишь изменить метасимволы, служит класс
TMaskEdit.
В ключевом свойстве EditMask класса TMaskEdit можно сформировать маску шаблона для ввода текста. Маска состоит из трех частей, разделенных точкой с запятой. Первая часть содержит маску ввода. Вторая – «0» или «1». «0» означает, что в свойство Text записывается текст, введенный пользователем без маски ввода. «1» - в свойство Text записывается текст с символами маски. В третьей части указывается метасимвол, который должен быть заменен пользователем при вводе текста.
67

Приведем некоторые специальные символы, использующиеся при составлении масок. L – поле должно содержать букву, l – поле может содержать букву, 0 – поле должно содержать цифру, 9 – поле может содержать цифру, a – поле может содержать букву или цифру, с – поле может содержать любой символ, \ - следующий символ надо включить в маску.
Пусть в учебном примере все номера служебных телефонов начинаются, с 567. В этом случае шаблон маски выглядит так: \2\-\5\6\7\-999;1;#. В поле Телефон работающего приложения пользователь увидел бы шаблон: 2-567-###. Пользователь смог бы ввести вместо # только цифры.
9. Положите на форму поле с |
Страница Additional |
маской ввода MaskEdit1 |
|
10. Очистите компонент |
Свойство Text |
MaskEdit1 |
|
11. Подпишите добавленное по- |
Страница Standard |
ле Заработная плата |
Класс TLabel |
Если в Вашей версии Lazarus нет класса TMaskEdit, оформите поле с помощью TLabeledEdit.
Для того чтобы задать маску ввода щелкните по кнопке с тремя точками правее свойства EditMask компонента MaskEdit1. При этом запускается редактор маски ввода. Здесь можно ввести шаблон ввода. Для поля Заработная плата введем, например, маску 999999 р.;0;_. В окне работающей программы пользователь увидит пользователь _________ р.
12. Задайте маску ввода заработ- Свойство EditMask ной платы
Добавим на форму сетку строк – компонент класса TStringGrid, который предназначен для отображения на экране таблиц, в ячейках которых находятся строки (последовательности символов). В учебном примере в сетку строк для контроля ввода данных будет выводиться ФИО, должность, отдел, филиал, номер телефона и заработная плата сотрудника.
68

13. Добавьте на форму сетку |
Страница Additional |
строк StringGrid1 |
Таблица StringGrid1 разделена на две части – фиксированную и рабочую. В фиксированной части (серая заливка) расположены названия строк и столбцов. В рабочей части – текстовые данные таблицы. Если размеры рабочей части больше размеров компонента, то автоматически появляются полосы прокрутки.
|
Некоторые свойства класса TStringGrid: |
|
• |
BorderStyle |
Стиль внешней рамки таблицы |
• |
ColCount, |
Количество столбцов, |
|
RowCount |
строк таблицы |
•ColWidth[i], Одномерный массив, i-й элемент ко- RowHeights[i] торого содержит ширину столбца,
|
FixedCols, |
высоту строки номер i |
• |
Количество столбцов, строк в фикси- |
|
|
FixedRows |
рованной зоне. |
• |
Cells[i,j] |
Матрица, обеспечивающая доступ к |
|
|
данным из ячеек таблицы StringGrid |
Оформим внешний вид компонента StringGrid1.
14. Задайте в таблице StringGrid1 - |
Свойства ColCount и |
6 столбцов и 4 строки |
RowCount |
15. Уберите фиксированный столбец |
Установите значение 0 |
(нет заголовков строк) |
свойства FixedCols |
Для ввода заголовков столбцов и изменения их ширины достаточно дважды кликнуть по сетке строк на макете формы. Откроется окно редактора StringGrid, в котором можно непосредственно ввести название столбца и с помощью мыши изменить ширину столбца.
16. Задайте названия столбцов |
Двойной клик по StringGrid1 на макете |
в сетке строк и измените ши- |
формы. Введите заголовки: Фамилия |
рину столбцов в зависимости |
И.О., Должность, Отдел, Филиал, Те- |
от размера заголовков |
лефон, Заработная плата. Для изменения |
|
ширины столбца подведите курсор мыши |
|
к границе и потяните границе в нужную |
|
сторону. ОК |
69

Добавим ниже сетки строк две кнопки BitBtn3 – Ввести данные и BitBtn4 – Очистить сетку.
17. |
Положите |
ниже |
сетки |
Страница Additional |
|
строк кнопку BitBtn3 |
|
||||
18. |
Сделайте на кнопке над- |
Свойство Caption |
|
||
пись Ввести данные |
|
|
|
||
19. |
Положите на кнопку под- |
Свойство Glyph. |
Загрузить. |
||
ходящую гравировку |
|
Открыть. ОК |
|
||
20. |
Положите |
ниже |
сетки |
Страница Additional |
|
строк кнопку BitBtn4 |
|
||||
21. |
Сделайте на кнопке над- |
Свойство Caption |
|
||
пись Очистить сетку |
|
|
|
||
22. |
Положите на кнопку под- |
Свойство Glyph. |
Загрузить. |
||
ходящую гравировку |
|
Открыть. ОК |
|
Клик по кнопке Ввести данные должен отображать со-
держимое полей Фамилия И.О., Должность, Отдел, Филиал, Те-
лефон, Заработная плата в сетке строк. Для этого необходим соответствующий обработчик события OnClick кнопки
BitBtn3.
Строки и столбцы таблицы StringGrid1 нумеруются, начиная с нуля.
В матрице StringGrid1.Cells первый индекс определяет номер столбца, а второй номер строки.
23. Напиши- |
procedure TForm2.BitBtn3Click(Sender: TObject); |
|
те обработ- |
begin |
|
чик события |
{Копирование в ячейки таблицы StringGrid1 содержимого |
|
OnClick |
|
полей} |
кнопки |
|
StringGrid1.Cells[0,1] := Edit1.Text; |
BitBtn3 |
- |
StringGrid1.Cells[1,1] := Form1.Edit1.Text; |
Ввести |
|
StringGrid1.Cells[2,1] := Form1.ListBox1. |
данные |
|
Items[Form1.ListBox1.ItemIndex]; |
|
|
StringGrid1.Cells[3,1]:=Form1.ComboBox1.Text; |
|
|
StringGrid1.Cells[4,1] := LabeledEdit1.Text; |
|
|
StringGrid1.Cells[5,1] := MaskEdit1.Text; |
|
|
end; |
70

Создадим обработчик нажатия кнопки Очистить сетку.
24. |
Напишите |
procedure TForm1.BitBtn4Click (Sender: |
||
обработчик со- |
TObject); |
|
||
бытия |
OnCl |
begin |
|
|
ick |
|
кнопки |
StringGrid1.Clean; |
|
BitBtn4 |
|
end; |
|
|
25. |
Сохраните формы и проект |
Файл|Сохранить все |
||
26. |
Проверьте работу программы |
|
При тестировании проекта обратите внимание на то, что в поле MaskEdit1 можно вводить только цифры или ничего. Свойство Text компонента MaskEdit1 не содержит символов маски (р.) среди данных, отображаемых в колонке Заработная плата таблицы StringGrid1.
Компонент ScrollBox. Запись и считывание из файла
Познакомимся со свойствами класса TScrollBox (кон-
тейнер с полосой прокрутки). Экземпляры класса TScrollBox
экономят место на форме, так как позволяют включать в себя другие компоненты, суммарный размер которых может превосходить размеры контейнера.
В контейнер ScrollBox1 в учебном проекте будут добав-
лены командные кнопки – Запись в файл, Считывание из файла, Помощь.
После выполнения примера работы 4 окно формы Компоненты закладки Additional будет выглядеть так, как показано на рисунке 1.3.6.
План примера 4
1-2. Добавление компонента ScrollBox1.
3-10. Создание внутри контейнера ScrollBox1 панели с названиями кнопок.
11-19. Оформление кнопок Запись в файл, Считывание из файла и Помощь.
20-25. Написание обработчиков для кнопок и тестирование работы приложения.
71

Рис.1.3.6. Окно формы после выполнения примера 4.
Пример работы 4: |
Подсказка |
1.Сделайте запасную копию Используйте Мой компьютер проекта
2.Положите на форму кон- Страница Additional
тейнер с полосой прокрутки
ScrollBox1
Некоторые свойства класса ScrollBox:
•HorzScrollBar Группа свойств горизонтальной по-
лосы прокрутки
• VertScrollBar Группа свойств вертикальной полосы прокрутки
Обратите внимание на размеры компонента ScrollBar1
(свойства Height и Width).
Положим на форму для заголовков кнопок компонент Panel3, размеры которого превышают размеры контейнера
ScrollBox1.
72

3. |
Положите |
на |
контейнер |
Выделите ScrollBox1. Стра- |
ScrollBox1 |
панель |
Panel3, |
ница Standard |
|
длина которой больше чем у |
||||
ScrollBox1 |
|
|
|
|
4. Удалите надпись на панели |
Очистите свойство Caption |
|||
5. |
Настройте |
автоматическое |
Выделите ScrollBox1. Выбе- |
|
появление полосы прокрутки |
рите True для свойства |
|||
|
|
|
|
AutoScroll |
Автоматически должна появиться горизонтальная полоса прокрутки у компонента ScrollBox1.
Рис.1.3.7. Оформление панели внутри контейнера ScrollBox1.
Положим на панель два компонента Bevel2,3. Один из которых будет имеет вид вертикальной полосы слева, а другой справа. Панель при этом разобьется на три объемные части. Каждую из частей нужно будет подписать, используя при этом компоненты класса TLabel.
6. |
Положите на Panel3 |
Выделите Panel3. Добавьте компо- |
||
левую |
вертикальную |
нент Bevel2. Измените значение |
||
полосу Bevel2 |
|
свойства Shape на bsLeftLine |
||
7. |
Положите на Panel3 |
Выделите Panel3. Добавьте компо- |
||
правую |
вертикальную |
нент Bevel3. Измените значение |
||
полосу Bevel3 |
|
свойства Shape на bsRightLine |
||
8. Создайте надпись За- |
Выделите Panel3. Добавьте компо- |
|||
пись в файл |
|
нент Label4. Измените значение |
||
|
|
|
|
свойства Caption |
9. |
Сделайте |
надпись |
Выделите Panel3. Добавьте компо- |
|
Считывание из файла |
нент Label5. Измените значение |
|||
|
|
|
|
свойства Caption |
10. |
Сделайте |
надпись |
Выделите Panel3. Добавьте компо- |
|
Помощь |
|
|
нент Label6. Измените значение |
|
|
|
|
|
свойства Caption |
73

Расположим кнопки BitBtn5-7 внутри контейнера ScrollBox1 ниже панели с надписями. Клик по кнопкам должен будет запускать соответствующий обработчик.
11. |
Добавьте |
кнопку |
|
Выделите ScrollBox1. |
||
BitBtn5 |
|
|
|
|
Страница Additional |
|
|
|
|
|
|
|
|
12. |
Удалите |
надпись |
|
Очистите свойство Caption |
||
BitBtn5 |
|
|
|
|
|
|
13. |
Положите на кнопку |
|
Свойство Glyph. Загрузить. |
|||
подходящую |
гравиров- |
|
C:\lazarus\images. Открыть. ОК |
|||
ку |
|
|
|
|
|
|
14. |
Добавьте |
кнопку |
|
Выделите ScrollBox1. |
||
BitBtn6 |
|
|
|
|
Страница Additional |
|
|
|
|
|
|
|
|
15. |
Удалите |
надпись |
|
Очистите свойство Caption |
||
BitBtn6 |
|
|
|
|
|
|
16. |
Положите на кнопку |
|
Свойство Glyph. Загрузить. |
|||
подходящую |
гравиров- |
|
C:\lazarus\images. Открыть. ОК |
|||
ку |
|
|
|
|
|
|
17. |
Добавьте |
кнопку |
|
Выделите ScrollBox1. |
||
BitBtn7 |
|
|
|
|
Страница Additional |
|
|
|
|
|
|
|
|
18. |
Удалите |
надпись |
|
Очистите свойство Caption |
||
BitBtn7 |
|
|
|
|
|
|
19. |
Положите на кнопку |
|
Свойство Glyph. Загрузить. |
|||
подходящую |
гравиров- |
|
C:\lazarus\images. Открыть. ОК |
|||
ку |
|
|
|
|
|
|
Клик по кнопке Помощь будет выводить окно с известной поговор- |
||||||
кой«Что ни делается, все к лучшему…» и одной кнопкой ОК. |
||||||
20. |
Напишите |
обра- |
procedure TForm2.BitBtn7Click (Sender: |
|||
ботчик |
события |
TObject); |
||||
OnClick |
кнопки |
begin |
|
|||
BitBtn7 |
|
– |
ShowMessage('Что ни делается, |
|||
Помощь |
|
|
все к лучшему…') |
|||
|
|
|
|
end; |
|
74
Создадим процедуру, которая будет записывать инфор-
мацию о сотруднике (содержимое первой строки сетки
StringGrid1) в файл people.txt.
Для корректной работы программы нужно описать переменную t для работы с текстовым фалом.
21. Опишите перед |
В окне редактора исходного кода Lazarus: |
|||
implementation |
var |
|||
переменную |
|
Form1: TForm1; |
||
t типа text |
|
t : text; |
||
|
|
|
|
implementation |
22. |
Напи- |
procedure TForm2.BitBtn5Click(Sender: |
||
шите |
обра- |
TObject); |
||
ботчик со- |
{опишем целочисленную переменную i} |
|||
бытия |
On- |
var i:integer; |
||
Click |
кноп- |
begin |
|
|
ки |
BitBtn5 |
{Связывание переменной t с файлом на диске} |
||
– |
Запись в |
AssignFile(t,'people.txt'); |
||
файл |
|
{Если файл people.txt существует, то открыть |
||
|
|
|
его для пополнения, иначе создать новый файл} |
|
|
|
|
if FileExists('people.txt') |
|
|
|
|
then append(t) else rewrite(t); |
|
|
|
|
{Запись информации из первой строки сетки |
|
|
|
|
StringGrid1 в файл people.txt} |
|
|
|
|
for i:=0 to 5 do |
|
|
|
|
writeln(t,StringGrid1.Cells[i,1]); |
|
|
|
|
{Закрытие файла} |
|
|
|
|
CloseFile(t); |
|
|
|
|
{Вывод сообщения в информационном окне} |
|
|
|
|
ShowMessage('Запись успешно добавлена!') |
|
|
|
|
end; |
|
75
23. |
Напи- |
procedure TForm2.BitBtn6Click(Sender: |
||
шите |
обра- |
TObject); |
|
|
ботчик |
со- |
{опишем целочисленные переменные k и i, а |
||
бытия |
On- |
также строковую переменную s} |
||
Click кноп- |
var k, i : integer; s : string; |
|||
ки |
BitBtn6 |
begin |
|
|
– |
Считы- |
{Связывание переменной t с файлом на диске} |
||
ва-ние |
из |
AssignFile(t,'people.txt'); |
||
файла |
|
{Если файл people.txt существует, то открыть |
||
|
|
|
его для чтения, иначе прервать выполнение |
|
|
|
|
процедуры} |
|
|
|
|
if FileExists('people.txt') |
|
|
|
|
then reset(t) else |
|
|
|
|
begin ShowMessage('Файл не найден!'); |
|
|
|
|
Exit |
|
|
|
|
end; |
|
|
|
|
{Установка количества строк в StringGrid1} |
|
|
|
|
StringGrid1.RowCount:=1; |
|
|
|
|
{Обнуление указателя номера строки} |
|
|
|
|
k:=0; |
|
|
|
|
{Чтение информации из файла в сетку строк} |
|
|
|
|
repeat |
|
|
|
|
StringGrid1.RowCount := StringGrid1. Row- |
|
|
|
|
Count+1; |
|
|
|
|
k:=k+1; |
|
|
|
|
for i := 0 to 5 do |
|
|
|
|
begin readln(t,s); |
|
|
|
|
StringGrid1.Cells[i,k]:=s; |
|
|
|
|
end; |
|
|
|
|
until eof(t); |
|
|
|
|
{Закрытие файла} |
|
|
|
|
CloseFile(t); |
|
|
|
|
end; |
|
24. Сохраните |
проект |
Файл|Сохранить все |
76

25. Проверьте работу приложения
Заполните все поля для ввода в обеих формах приложения. Отобразите информацию в сетке строк. Сохраните информацию в файл. Через Мой компьютер найдите папку с файлами проекта. Среди файлов должен находиться созданный программой файл people.txt, который можно открыть двойным кликом в приложении Блокнот. Попробуйте!
Измените информацию в полях Должность, Отдел,
Филиал первой формы и Фамилия И.О., Телефон, Зара-
ботная плата второй формы. Повторно отобразите информацию в сетке строк и сделайте запись в файл. Теперь кликом по кнопке Считывание из файла отобразите информацию из файла в сетке строк. Очистите сетку.
Удалите файл people.txt через Мой компьютер. Затем попробуйте отобразить информацию в сетке строк. Просмотрите текст помощи.
На этом создание учебного приложения можно считать завершенным. Если не все у Вас получалось – не расстраивайтесь, сделайте скидку на новизну изучаемого материала. Рассмотренные в этой главе учебные проекты включали в себя сведения из учебного материала, который будет подробно рассматриваться только в последующих главах.
Для того чтобы уверенно писать собственные программы – обработчики событий для разных компонент формы необходимо, как минимум, познакомиться с основными алгоритмическими конструкциями – следованием, ветвлением и циклами, на базе которых строиться большая часть любой программы.
Именно этому посвящена следующая глава, в которой наряду с основными алгоритмическими конструкциями рассматриваются также и простые типы данных: целые и вещественные числовые, логический, символьный, перечислимый.
77

Глава 2. ОСНОВЫ АЛГОРИТМИЗАЦИИ
Теория алгоритмизации начинается с работ Д. Гильберта, который на рубеже XX-го века поставил вопрос: «Можно ли построить алгоритм, создающий необходимый алгоритм к любой, точно поставленной задаче?» Такая постановка задачи неразрешима, т.к. практически она сводится к логическому парадоксу брадобрея, который бреет всех тех, кто не бреет себя. Вопрос: «Бреет ли брадобрей сам себя?»
Получается парадоксальная ситуация: для существования генератора алгоритмов, его самого не должно быть.
Поэтому до сих пор любая компьютерная технология строится на базе трех составляющих: алгоритмической, программной и аппаратной.
Алгоритм - это сформулированная на некотором языке инструкция, представляющая собой конечную последовательность выполнимых элементарных операций для решения задачи, общую для некоторого класса возможных исходных данных.
Существуют разные формы записи алгоритмов:
•Словесная - инструкция на естественном языке;
•Графическая – схема из условных изображений;
•Псевдокоды - полуформализованная инструкция на условном алгоритмическом языке, включающие в себя математические обозначения, фразы естественного языка, элементы языка программирования;
•Программная - текст на языке программирования. Многие опытные программисты считают, что для более
эффективной разработки собственных приложений, необходимо, начинать работу с основательного планирования логики работы приложения, детализации процесса решения задачи, составления алгоритмов решения подзадач, а только после этого браться за кодировку. Импровизация под силу лишь великим Мастерам!
78
Решение задачи можно разбить на следующие этапы.
I.Постановка задачи. Определение цели решения задачи, набора исходных данных и результатов, общего подхода к решению задачи.
II.Математическое описание задачи. Создание математиче-
ской модели решаемой задачи, которая может быть реализована средствами языка программирования.
III.Алгоритмизация задачи. Разработка алгоритма решения задачи, приводящего к поставленной цели. Алгоритм может быть записан в виде блок-схемы или на псевдокоде.
IV. Программирование. Написание алгоритма с помощью конструкций языка программирования.
V.Разработка тестов. Определение выходных данных для некоторых наборов исходных данных. Этап служит для проверки правильности разработанного алгоритма и программы.
VI. Кодирование. Набор программы в экранном редакторе интегрированной инструментальной среды Турбо Паскаль. Запись программы на диск.
VII. Тестирование и отладка программы. Обнаружение и исправление ошибок в тексте программы. При наличии ошибки среда программирования при запуске программы на исполнение выдает сообщение об ошибке.
VIII. Получение и анализ результатов. Оценка правильности выдаваемых программой результатов при разных значениях исходных данных.
Сложные задачи решаются методом последова-
тельной детализации (решение делится на крупные блоки, большие блоки разбиваются на более мелкие, детально прорабатываются простые задачи, входящие в состав мелких блоков).
Как правило, для наглядности блоки (логически закон-
ченные фрагменты программы) снабжаются комментариями.
79
В программах должна быть предусмотрена защита от ошибок при вводе. Если введенное значение не является допустимым, программа должна повторно запросить значение.
Все вводимые и выводимые данные должны сопровождаться поясняющим их значение текстом.
Программа должна иметь приятный, дружественный интерфейс. По современным стандартам программирования пользователь должен «видеть и действовать», а не «знать и помнить».
Таким образом, любая программа представляет собой закодированный алгоритм, а логическая структура любого алгоритма представляет собой комбинацию трех базовых структур: следование, ветвление, цикл.
Базовая структура "следование" образуется последовательностью действий, исполняемых линейно - одно за другим.
Базовая структура "ветвление" обеспечивает в зависимости от результата проверки условия выполнение одной из нескольких альтернативных ветвей работы алгоритма.
Базовая структура "цикл" поддерживает многократное выполнение некоторой совокупности действий, которая называется телом цикла.
Программа называется линейной, если в ее основе лежит алгоритм только с базовой структурой «следование».
§2.1. Линейные программы
Вданном параграфе речь пойдет об основных понятиях языка программирования Free Pascal, числовых типах данных, арифметических функциях и операциях, правилах оформления арифметических выражений. Здесь рассказывается также об операторе присваивания, особенностях ввода и вывода информации в приложениях Lazarus.
80

Общие сведения о Free Pascal
Основа языка программирования Паскаль разработана Н. Виртом. Язык неоднократно модифицировался и появлялись разные версии (диалекты) языка. На базе Паскаля корпорацией Borland разработан язык Object Pascal, на котором пишутся программы-обработчики в визуальной среде программирования Delphi. Object Free Pascal является диалектом языка Object Pascal и именно на нем пишутся программы в
Lazarus.
Язык программирования Паскаль относится к языкам высокого уровня (ЯВУ). Программы, написанная на языке высокого уровня, более приближенна к естественному языку в плане составления и оформления предложений языка. Поэтому программы на языках высокого уровня писать проще, чем на языке среднего уровня (например, на С) или на языке низкого уровня (например, на Ассемблере). Программа, написанная на языке программирования низкого уровня, содержит непосредственно исполняемые машинные команды.
Рис.2.1.1. Схема погружения задания пользователя.
Инструкции языка программирования представляют собой служебные слова, которые трактуются средой программирования в строго определенном смысле. После запуска
81
программы на исполнение, программа автоматически переводится в машинные коды (рис.1.3.1).
Трансляция – процесс перевода программы, написанной на языке высокого уровня, в машинные коды. Одна из разновидностей трансляции называется компиляция (про-
грамма в этом случае переводится в машинные коды цели-
ком, а затем исполняется). Все синтаксические ошибки обнаруживаются на этапе трансляции программы.
Компилятор отслеживает лишь синтаксические ошибки. Отвечать на вопрос: “Правильно ли решена задача?” - придётся разработчику программы.
Большие и малые буквы компилятором не различаются!
Как и во всех европейских языках, текст программы на Паскале состоит из слов и знаков препинания. Если между словами нет знака препинания, их должен разделять хотя бы один пробел или конец строки.
В алфавит языка Паскаль входят десятичные и шестнадцатеричные цифры, буквы, специальные символы + - * / = , ‘ . : ; < > [ ] ( ) { } @ $ #, а также пары символов <> <= >= := (* *) (.
.), пробелы и зарезервированные слова (инструкции, имеющие строго определенный смысл).
Основным понятием в программировании является понятие величины. Каждая величина характеризуется своим именем, значением и типом.
Имя величины является ее уникальным идентификатором. Идентификатор - это последовательность латинских букв и цифр, начинающаяся с буквы, несовпадающая ни с каким зарезервированным словом. В именах можно использовать некоторые разрешенные символы, например, знак подчеркивания _. Знак подчеркивания удобно использовать для создания имен из нескольких слов.
Свое значение каждая величина принимает во время работы программы. Если значение величины меняется в про-
82
грамме, то величина называется переменной, в противном случае - постоянной (константой).
Константа – конкретное значение определенного типа. Переменная – сплошной поименованный участок оперативной памяти, предназначенный для хранения информа-
ции определенного типа.
Тип величины определяет множество значений, которые может принять величина. Величины простого типа в каждый момент времени имеют одно значение. Величины структурированного типа отличаются множественностью значений.
Можно провести параллели между алгоритмическими конструкциями и структурами данных. Запись похожа на составной оператор. Обе конструкции состоят из нескольких компонент, которые могут различаться. Оператору выбора соответствует запись с вариантами. Циклу с параметром - массив. Циклам с предусловием и с постусловием - файл. Рекурсии соответствуют динамические структуры данных.
Учебные курсы по программированию обычно состоят из разделов, в которых изучаются отдельные типы данных или реализации алгоритмических конструкций в конкретном языке программирования.
Паскаль является типизированным языком, в котором перед использованием все величины должны быть описаны с указанием их типа. Поэтому знание классификации типов величин играет важную роль в понимании логики составления программ.
К простым типам данных относятся порядковые и вещественные типы.
Порядковые типы данных отличаются от других типов тем, что их возможные значения можно перенумеровать. Порядковые типы включают целые типы (разные диапазоны целых чисел), логический тип (два значения – Истина/Ложь), символьный тип (значением величины является один символ),
83

перечислимый тип (задает список возможных значений), тип-диапазон (задает интервал возможных значений), ссылочный тип (значением является адрес ячейки памяти).
Структурированные типы данных включают масси-
вы (многомерные таблицы пронумерованных однотипных значений), записи (совокупность величин разного типа), множества (наборы однотипных ненумерованных значений), файлы (набор компонент одного типа, в том числе и структурированного, который можно передать на диск или логическое устройство).
ВПаскале есть строковый тип, предназначенный для работы с текстами и похожий на одномерный массив, состоящий из символов.
ВПаскале имена (уникальные идентификаторы) имеют не только переменные величины и константы, а также типы, метки, объекты, процедуры и модули.
Метка – обозначение начала участка кода в программе, на который осуществляется принудительный переход при исполнении программы.
Процедура – подпрограмма, в которой создается новая инструкция, «понимаемая» программой. Величины, содержащие входные и выходные значения процедуры, называются параметрами процедуры.
В{ } или в (* *) в программе приводятся комментарии
(поясняющий текст, возможно, на русском языке). На ход работы программы комментарии не влияют. После символа // комментарий может идти до конца текущей строки.
Операторы – зарезервированные слова, содержащие указание что-либо сделать. Например, оператор безусловного перехода имеет вид: goto метка.
Операторные скобки – это пара зарезервированных слов begin (начало) и end (конец). Каждому begin должен соответствовать end. Операторные скобки используются при создании группы последовательно выполняемых операторов.
84

Символ ; (точка с запятой) обозначает конец инструкции. Этот символ может опускаться перед end и никогда не ставится перед служебным словом else (иначе). Лишний символ ; считается пустым оператором и к ошибке не приводит.
Структура процедуры на языке Паскаль:
Заголовок procedure имя_подпрограммы;
Раздел описаний
•Описание Label числа или идентификаторы через
меток |
|
запятую; |
• |
Описание |
Const имя_1 = значение; ...; имя_n = |
констант |
значение; |
•Описание Type имя = тип пользователя;...;
типов
•Описание Var имя_1, ..., имя_n : тип1;...; переменных.
•Описание Procedure имя_процедуры
внутренних проце- |
[(список параметров с описанием |
|
дур: заголовок про- |
… |
типов)]; |
цедуры, блок опи- |
|
|
саний процедуры, |
begin |
операторы процедуры; |
раздел операторов. |
end; |
|
Раздел операторов |
Begin |
последовательность операторов; |
|
End; |
|
Получается, что подпрограммы могут вкладываться друг в друга как куклы-матрешки. Любая программа на Пас-
калеэто заголовок и блок (состоящий из раздела описаний и раздела операторов).
В конце всей программы обязательно ставится точка
(обозначающая конец кода программы).
Описательная часть блока не является обязательной, то есть раздел описаний может отсутствовать или некоторые неиспользуемые описания могут быть опущены.
85

Исполняемая часть блока (раздел операторов) является обязательной. Таким образом, самый короткий блок на Паскале выглядит так: begin end.
В программе на языке Паскаль надо описывать все используемые переменные! Для описанной переменной в оперативной памяти резервируется область под хранение значений величины. Длина резервируемой области определяется типом переменной.
Числовые типы данных. Арифметические выражения
Целые типы отличаются друг от друга количеством байт в оперативной памяти, которые отводятся под хранение значения. Длиной кода определяется и диапазон возможных
значений типа. |
|
|
Название целого |
Длина в |
Диапазон значений |
типа |
байтах |
|
Byte |
1 |
0…255 |
ShortInt |
1 |
-128…127 |
Word |
2 |
0…65535 |
SmallInt |
2 |
-32768…32767 |
Integer |
4 |
-2147483648…2147483647 |
LongInt |
4 |
-2147483648…2147483647 |
LongWord |
4 |
0…4294967295 |
Cardinal |
4 |
0…4294967295 |
Int64 |
8 |
-263…263-1 |
Предусмотрены следующие арифметические операции, у
которых оба операнда (числа, переменные, константы или арифметические выражения, над которыми проводится операция) целые и результат целый: + сложение, - вычитание, * умножение, div целочисленное деление, mod остаток от целочисленного деления.
86
Обычное деление / применимо к операндам целого типа, но результат деления всегда является значением вещественного типа.
Если операция применяется к операндам разного типа, то результат будет иметь тип более мощного операнда.
Выход за границы типа переменной при вычислении может приводить к некорректной работе программы.
Существуют арифметические функции, у которых аргумент целый и результат целый: succ() следующее за аргументом число, pred() предыдущее число. Функция odd() возвращает значение True (истина), если аргумент функции – нечетное число. Функция Random(n) возвращает псевдослучайное число, равномерно распределенное в диапазоне 0…n-1. abs() - абсолютная величина (модуль), sqr() - возведение в квадрат. Тип двух последних функции совпадает с типом аргумента.
Аргумент функции всегда пишется в круглых скобках!
Двумя важными характеристиками вещественного типа являются точность (максимально возможное количество значащих цифр) и диапазон (разброс возможного зна-
чения порядка чисел). В памяти вещественное число представлено тремя структурными частями: знак, порядок числа и
мантисса числа (набор значащих цифр).
Название |
Длина |
Количество |
Диапазон |
веществен- |
в бай- |
значащих |
|
ного типа |
тах |
цифр |
|
Single |
4 |
7-8 |
1.5*10-45…1.7*1038 |
Real48 |
6 |
11-12 |
1.5*10-45…3.4*1038 |
Comp |
8 |
19-20 |
-2*1063+1…2*1063-1 |
Double |
8 |
15-16 |
5*10-324…1.7*10308 |
Real |
8 |
15-16 |
5*10-324…1.7*10308 |
Currency |
8 |
19-20 |
-922337203685477… |
|
|
|
922337203685477 |
87
Extended |
|
10 |
|
19-20 |
|
3.6*10-4951 … |
|
|
|
||||
|
|
|
|
|
|
1.1*104932 |
Форма записи вещественного числа с фиксированной точкой представляет собой десятичное представление вещественного числа с целой и дробной частью, разделенными точкой. Например, 462.7
В тексте программы целая часть отделяется от дробной – точкой, при вводе данных через поля ввода в окне работающей программы – запятой.
Форма записи вещественного числа в экспоненциальном формате выглядит так: записывается мантисса числа, справа к ней добавляется латинская буква "E" или "e" и целое число, обозначающее порядок числа. Например, число 462.7 можно записать, как 4.627Е2, что будет означать 4.627*102.
К вещественным операндам применимы все арифметические операции ( + , - , * , / ).
Существуют арифметические функции, у которых аргумент и результат вещественные: уже известные нам abs(), sqr(), random(), а также sqrt() квадратный корень, sin() синус, cos() косинус, arctan() арктангенс, ln() натуральный логарифм, exp() экспонента, frac() дробная часть числа, int() целая часть числа.
Аргументы тригонометрических функций задаются в радианах!
Существует две функции, преобразующие вещественный аргумент в целочисленный результат: trunc() - отбрасывание дробной части, round() - округление.
Арифметическое выражение – это запись, которая может содержать переменные, константы, арифметические операции и функции, числа и круглые скобки.
Арифметические выражения, содержащие операцию / записываются в строку.
88

x2 + y2
Например, выражение 1− x2 −2 y2 , записанное по пра-
вилам Паскаля, будет выглядеть так:
(sqr(x)+sqr(y))/(1-(sqr(x)-sqr(y))/2).
В арифметическом выражении нельзя опускать знак * операции умножения.
Для сокращения числа круглых скобок в арифметических выражениях используется традиционное старшинство арифметических операций: в первую очередь выполняются операции *, div, mod, /, затем + и -. Идущие подряд операции одного приоритета выполняются слева направо.
Упражнения.
1. |
Записать по правилам Паскаля выражение: |
|||||||||
|
а) 1+ x + |
|
, |
б) |
1− |
1+ sin x |
. |
|||
|
x +1 |
|||||||||
|
Ответы: |
|
|
|
1,5 −7,2x |
|||||
|
|
|
|
|
|
|
||||
|
а) 1+abs(x)+sqrt(abs(x+1)); |
|
|
|
|
|||||
|
б) (1-sqrt(1+abs(sin(abs(x)))))/(1.5-7.2*x). |
|||||||||
2. |
Записать на языке Паскаль следующие формулы: |
|||||||||
|
а) 2 log |
|
x |
, |
|
б) x300 , |
в) 5х , |
|
г) 5 α−3 . |
|
|
2 |
5 |
|
|
||||||
|
|
|
|
|
|
|
|
|
Ответы:
а)2*ln(x/5)/ln(2); б) exp(300*ln(x));
в) exp(x*ln(5)); г) exp(-3/5*ln(alpha)).
3.Написать выражения, записанные по правилам Паскаля, в традиционной математической форме:
а) a *b / (c +d) − sqrt(sin((a +b) / c)) ,
б) cos(abs(x * x * x + 3) −1) / y / x .
Ответы:
|
ab |
|
|
|
|
cos( |
|
x3 +3 |
|
−1). |
|
|
|
|
|
|
|
|
|||||
а) |
− |
sin a +b |
; |
б) |
|||||||
|
|
||||||||||
c +d |
|
|
|
|
|||||||
|
|
c |
|
|
|
|
xy |
89
4.Вычислить значение выражений:
а) trunc(4.8) −round(5.7) −1;
б) trunc(−4.8) −round(−5.7) +abs(−3) ,
в) 30 div |
60 + succ(2) − pred(5) ; |
|
|
г) 24 / (3*4) −24 / 3 / 4 +24 / 3*4. |
|
|
|
Ответы: |
|
|
|
а) -3; |
б) 5; |
в) –1; |
г) 32. |
Набор математических функций, «понимаемых» средой программирования, можно увеличить, подключив математический модуль Math (см. § 1.1, пример работы 2).
Оператор присваивания, особенности ввода и вывода информации в приложениях Lazarus
Оператор присваивания состоит из пары неразделяемых символов :=. Оператор присваивания записывает в ячейку памяти, отведенную под переменную величину, фактическое значение этой величины.
Формат (способ записи, синтаксис) оператора присваи-
вания: Переменная := значение;
Оператор присваивания значение, стоящее в левой части, присваивает переменной, стоящей в правой части.
Если справа будет стоять арифметическое выражение, то сначала происходит вычисление значения арифметического выражения, а затем пересылка этого значения в память.
Переменной целого типа недопустимо присваивать значение вещественного типа. Обратная операция является допустимой.
Упражнения.
1. Какие из следующих последовательностей символов являются правильно записанными операторами присваивания:
а) a := b; |
г) a*x + b := 0; |
ж) z := z + 1,2; |
б) a = c + 1; |
д) z := 0; |
з) y := y; |
в)a : b - sqr(2) |
е) z := z + 1; |
и) –y := y; |
90
Ответы: а, д, е, з.
2.Задать с помощью операторов присваивания следующие действия:
а) переменной a присвоить значение разности, а переменной b - полусуммы значений x и y;
б) переменной а присвоить значение удвоенного произведения значений переменных x и y, а переменной b - значение
0;
в) удвоить значение переменной а и изменить ее знак.
Ответы: |
|
а) a := x - y; b := (x + y) / 2; |
б) a := 2*x*y; b := 0; |
в) a := - 2 * a ; |
|
Ввод и вывод информации в приложениях Lazarus
выполняется через свойства компонент формы или через диалоговые окна.
Примеры команд для ввода данных: a := StrToInt ( Edit1.Text ) ; {var a: integer}
b := StrToFloat ( LabeledEdit1.Text ) ; {var b: real} c := RadioGroup1.ItemIndex ; {var c: integer}
Примеры команд для вывода данных:
ShowMessage ( IntToStr (a) ) ; {var a: integer} Label1.Caption := FloatToStr (a*b) ; {var a,b: real} Edit1.Text := 'Результат' + FloatToStr(b) ; {var b: real} ShowMessage ('Введите целое число!');
Текст при выводе заключается в апострофы! Если в список вывода входят переменные или арифметические выражения, то в окне вывода появятся их значения.
Входной и выходной потоки данных часто интерпретируются как последовательность символов. Поэтому при вводе и выводе чисел в этом случае используют функции преобразования типа: StrToInt () – строку в целое число, IntToStr () – целое число в строку, StrToFloat () – строку в вещественное число, FloatToStr () – вещественное число в строку.
91
Для принудительного перехода на новую строку при выводе текста «в столбик» в список вывода достаточно включить chr(13), где «13» - код клавиши Enter в стандарте ASCII.
Например, ShowMessage ('Результат:' + chr(13) + IntToStr(b));
Значения переменных вещественного типа по умолчанию выводятся на экран с большим количеством цифр после запятой или в экспоненциальном формате.
Для форматированного вывода вещественного числа используется функция FloatToStrF (). Вывод на экран значения вещественной переменной b с тремя знаками после запятой, можно оформить, например, так:
FloatToStrF ( b , ffFixed , 5 , 3);
Последний аргумент – это требуемое количество цифр после запятой, предпоследний – общее число выводимых символов. Такому формату удовлетворяет, например, число
0.483.
Составление линейных программ
Линейные программы представляют собой последовательность простых инструкций.
Рассмотрим пример оформления решения задачи, приводящей к линейной программе.
Тема. Линейные программы.
Условие задачи. Целой переменной присвоить сумму цифр целого трехзначного числа.
1.Постановка задачи. Цель – вычислить сумму цифр заданного целого трехзначного числа. Исходная информация – целое трехзначное число. Искомую сумму можно найти, зная цифры заданного трехзначного числа. Цифры можно получить как остатки от последовательного целочисленного деления заданного числа на десять.
2.Математическое описание. Примем следующие обо-
значения для:
•заданного целого трехзначного числа – k,
•количества единиц в заданном числе – k1,
92

•количества десятков в заданном числе – k2,
•количества сотен в заданном числе – k3,
•частного от последовательного целочисленного деления числа на десять – r,
•суммы цифр заданного трехзначного числа – s.
Тогда s = k1 + k2 + k3. Опишем процесс нахождения количества единиц, десятков и сотен в заданном числе k. k1=остаток от деления k на 10. r=частное от деления k на 10. k2=остаток от деления r на 10. r=частное от деления r на 10. k3=остаток от деления r на 10.
3. Интерфейс приложения
Настройка свойств формы Form1:
• Caption Сумма цифр целого трехзначного числа
•Color clSkyBlue
Настройка свойств метки Label1:
• |
Caption |
Число: |
• |
Font |
Arial, 16 пт |
|
Настройка свойств поля для ввода числа Edit1: |
|
• |
Text |
очистить |
• |
Font |
Arial, 16 пт |
Настройка свойств поля для кнопки Button1:
•Caption Вычислить Настройка свойств метки Label2:
•Caption очистить
• Font |
Arial, 16 пт, цвет: синий |
93

4. Блок-схема.
5. Программа.
procedure TForm1.Button1Click(Sender: TObject); var k, k1, k2, k3, r, s : integer;
begin
{ввод целого трехзначного числа} k := StrToInt(Edit1.Text);
{вычисление количества единиц}
94

k1:=k mod 10;
{вычисление количества десятков} r := k div 10; k2 := r mod 10;
{вычисление количества сотен} r := r div 10; k3 := r mod 10;
{вычисление суммы цифр} s := k1+k2+k3;
{вывод суммы цифр целого трехзначного числа}
Label2.Caption:='Сумма трех последних цифр = ' + IntToStr(s);
end;
6. Тест.
Ключевые фрагменты решения задач по теме «Линейные программы»
1. Решить методом Крамера систему линейных уравнений
ax +by = c, |
относительно неизвестных |
x, y . |
|
вида |
f |
||
dx +ey = |
|
|
procedure TForm1.Button1Click(Sender: TObject); var a, b, c, d, e, f, delta, x, y: integer;
begin
{ввод исходных данных}
a := StrToFloat (Edit1.Text); b := StrToFloat (Edit2.Text); c := StrToFloat (Edit3.Text); d := StrToFloat (Edit4.Text); e := StrToFloat (Edit5.Text); f := StrToFloat (Edit6.Text);
95
{решение задачи} delta := a * e – b * d;
x := (c * e – b * f) / delta; y := (a * f – c * d) / delta;
{вывод результатов}
ShowMessage (FloatToStrF(x,ffFixed,4,1)+ ‘, ’+ FloatToStrF(x, ffFixed,4,1));
end;
2. Даны a,b,α . Найти площадь треугольника, две стороны которого равны a и b , а угол между этими сторонами равен α . Считать, что α - градусная мера угла.
uses
Classes, …, Math;
…
procedure TForm1.Button1Click(Sender: TObject); var a, b, alpha, s : real;
begin
{ввод исходных данных}
a := StrToFloat (Edit1.Text); b := StrToFloat (Edit2.Text); alpha := StrToFloat (Edit3.Text);
{решение задачи}
s := a * b * sin ( DegToRad (alpha) ) / 2;
{вывод результатов}
ShowMessage (‘Площадь = ’+ FloatToStrF(s, ffFixed,4,2)); end;
3. Вычислить определитель третьего порядка. procedure TForm1.Button1Click(Sender: TObject);
var a11, a12, a13, a21, a22, a23, a31, a32, a33, res : real; begin
{ввод исходных данных}
a11:=StrToFloat(Edit1.Text); a12:=StrToFloat(Edit2.Text); a13:=StrToFloat(Edit3.Text); a21:=StrToFloat(Edit4.Text);
96

a22:=StrToFloat(Edit5.Text); a23:=StrToFloat(Edit6.Text); a31:=StrToFloat(Edit7.Text); a32:=StrToFloat(Edit8.Text); a33:=StrToFloat(Edit9.Text);
{решение задачи}
res := a11*a22*a33 + a21*a32*a13 + a12*a23*a31 - a13*a22*a31 - a11*a23*a32 – a12*a21*a33;
{вывод результатов}
Label2.Caption:='Определитель матрицы = '+FloatToStrF(res, ffFixed,4,1);
end;
Рис.2.1.2. Интерфейс приложения для решения задачи № 3.
4. Даны координаты двух векторов (a1 , a2 ) и (b1 ,b2 ). Опре-
делить угол α между векторами. uses
Classes, …, Math;
…
procedure TForm1.Button1Click(Sender: TObject); var a1, a2, b1, b2, alpha : real;
begin
{ввод исходных данных}
a1:=StrToFloat(Edit1.Text); a2:=StrToFloat(Edit2.Text); b1:=StrToFloat(Edit3.Text); b2:=StrToFloat(Edit4.Text);
97
{решение задачи}
alpha := arccos( (a1*b1+a2*b2) / sqrt (sqr(a1)+sqr(a2)) / sqrt(sqr(b1) + sqr(b2)) );
{вывод результатов}
ShowMessage('Alpha = '+FloatToStrF(alpha, ffFixed,3,0)); end;
5. Вычислить производную степенной функции xn в заданной точке x0 .
uses
Classes, …, Math;
…
procedure TForm1.Button1Click(Sender: TObject); var x0, n, diff : real;
begin
{ввод исходных данных}
x0 := StrToFloat(Edit1.Text);
n := StrToFloat(Edit2.Text);
{решение задачи} diff:=n * Power (x, n-1);
{вывод результатов}
Edit3.Text := FloatToStrF (diff, ffFixed, 7, 2) ; end;
6. Вычислить дробную часть среднего арифметического и дробную часть среднего геометрического трех заданных чисел.
procedure TForm1.Button1Click(Sender: TObject); var a, b, c, k : real;
begin
{Ввод первого числа} a:=StrToFloat(Edit1.Text); {Ввод второго числа} b:=StrToFloat(Edit2.Text); {Ввод третьего числа} c:=StrToFloat(Edit3.Text);
{Вычисление дробной части среднего арифметического}
98
k := frac ((a + b + c) / 3);
{Вывод дробной части среднего арифметического} Edit4.Text:='Дробная часть среднего арифметического = ' + FloatToStr(k);
{Вычисление дробной части среднего геометрического} k := frac(exp (1/3 * ln (a * b * c)));
{Вывод дробной части среднего геометрического} Edit5.Text:='Дробная часть среднего геометрического = '+ FloatToStr(k);
end;
7. Даны два числа. Найти среднее арифметическое кубов этих чисел и среднее геометрическое модулей этих чисел. uses
Classes, …, Math;
…
procedure TForm1.Button1Click(Sender: TObject); var a, b, c : real;
begin
a := StrToFloat(Edit1.Text); b := StrToFloat(Edit2.Text); {вычисление среднего арифметического кубов}
c := (Power(a,3) + Power(b,3)) / 2; Edit3.Text := FloatToStr (c);
{вычисление среднего геометрического модулей} c := sqrt ( abs(a) * abs(b));
Edit4.Text := FloatToStr (c); end;
7. Определите число, полученное выписыванием в обратном порядке цифр заданного целого трехзначного числа. procedure TForm1.Button1Click(Sender: TObject);
var N : Integer; begin
N := StrToInt (Edit1.Text);
99
N:=100*(N mod 10) + 10*((N div 10) mod 10) + N div 100; Edit2.Text := IntToStr(N);
end;
8. Идет k-я секунда суток. Определить, сколько полных часов (h) и полных минут (m) прошло к этому моменту.
procedure TForm1.Button1Click(Sender: TObject); var x, h, m : real;
begin
x := StrToFloat (Edit1.Text);
h := int (x / 3600); x := x – h * 3600; m := int (x / 60); Label2.Caption:='Прошло '+FloatToStr(h)+' часов '+ Float-
ToStr(m)+' минут'; end;
9. Определить f - угол в градусах между положением часовой стрелки в начале суток и ее положением в h часов, m минут и s секунд ( 0 ≤ h ≤11, 0 ≤ m , s ≤ 59 ).
procedure TForm1.Button1Click(Sender: TObject); var
h, m, s: integer; f, degree_s: real;
begin
//ввод значений переменных h := StrToInt (Edit1.Text);
m := StrToInt (Edit2.Text); s := StrToInt (Edit3.Text);
//вычисление числа градусов при смещении на секунду degree_s := 360 / (12 * 60 * 60);
//вычисление угла
f := (h * 60 * 60 + m * 60 + s) * degree_s; Edit4.Text := FloatToStrF (f, ffFixed, 5, 0) ;
end;
100
§ 2.2. Ветвления в программах
Данный параграф посвящен реализации в Паскале основной алгоритмической конструкции - развилка. Рассматривается логический тип, конструирование условий с использованием операций отношения и логических операций. Обсуждается использование условного оператора, оператора безусловного перехода и оператора выбора.
Логический тип. Логические операции. Операции отношения. Булевы выражения
Данные логического типа могут иметь два значения: True (Истина) и False (Ложь). Для описания данных логического типа используется зарезервированное слово Boolean.
Var Имя_переменной : Boolean;
Логический тип данных относится к порядковым типам. Порядковые типы представляют собой упорядоченное по числовым кодам множество значений. Логический тип можно считать частным случаем перечислимого типа с двумя значениями.
Значению False соответствует числовой код 0, значению True – 1. Поэтому справедливы следующие условия:
False<True |
Succ (False)=True |
Pred (True)=False |
|
Ord (False)=0 |
Ord (True)=1 |
К величинам логического типа применимы логиче-
ские операции.
•Not (отрицание) – унарная логическая операция, имеющая самый высокий приоритет выполнения, изменяет значение логического типа на противоположное.
•And (И) – бинарная логическая операция, которая возвращает значение True только в том случае, когда оба ее операнда имеют значение True.
•Or (ИЛИ) – бинарная логическая операция, которая возвращает значение False только в том случае, когда оба ее операнда имеют значение False.
101
• Xor (Исключающее ИЛИ) – бинарная логическая операция, которая возвращает значение False, когда оба ее операнда имеют значение False, либо оба ее операнда имеют значение True. Операция возвращает значение True в том случае, когда истинен только один из ее операндов.
Приоритет операции And выше, чем приоритет операций Or и Xor. Поэтому операцию And иногда называют логическим умножением, а операцию Or – логическим сложением.
Самый низкий приоритет выполнения имеют опера-
ции отношения: = (равно), <> (не равно), <= (меньше или равно), < (меньше), > (больше), >= (больше или равно).
Определенный по умолчанию приоритет выполнения операций можно изменить расстановкой круглых скобок.
Булево выражение – это запись, которая может содержать арифметические выражения, круглые скобки, логические операции и операции отношения. Значение булева выражения принадлежит логическому типу.
Например, булево выражение not(12.5 > 25/2) and (-5*6 = 30) имеет значение False.
Переменной логического типа может быть присвоено значение булева выражения. Например,
Var B : Boolean; X, Y : Integer;
Begin … X := 15; Y := 10; B := X > Y; … End;
В результате выполнения фрагмента программы логическая переменная B примет значение True.
Упражнения.
1.Вычислите значение логического выражения:
а) (x or not(x)) and (odd(5896-2)) or (5>12.5-7.5) or (succ(false)),
б) a or (not b) при a=false, b=false,
в) t and (p mod 3=0) при t=true, p=101010.
102
Ответы: |
|
|
а) true; |
б) true; |
в) true. |
2.Запишите на языке Паскаль булевы выражения, истинные при выполнении указанного условия и ложные в противном случае:
а) |
x = min(x, y, z) , |
б) |
x [−3,3], |
в) |
x (−1,2;0,3), |
г) |
x (−1,2;0,3) (2;8), |
д) только одно из чисел x, y,z положительно, е) хотя бы одно из чисел x, y, z положительно.
Ответы:
а) (x <= y) and (x <= z); б) (x >= -3) and (x <= 3); в) (x <= 1.2) or (x >= 3);
г) (x <= -1.2) or (x >= 3) and (x <= 2) or (x >= 8);
д) (x >0) xor (y >0) xor (z >0); е) (x >0) or (y >0) or (z >0).
3.Для произвольных чисел a,b,c напишите условие, при
котором уравнение ax2 +bx + c = 0 имеет хотя бы одно вещественное значение.
Ответ:
sqr (b) – 4 * a * c >= 0.
4.Даны три положительных числа a,b,c. Напишите условие, при котором существует треугольник с такими длинами сторон.
Ответ:
(a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a).
5.Напишите оператор присваивания, в результате выполнения которого логическая переменная t принимает значение true, если выполняется указанное условие, и значение false в противном случае:
а) целые числа m и n имеют одинаковую четность;
б) даны l и r ( l ≥ r ≥ 0 ), точка (x,y) попадает внутрь кольца с центром в начале координат, внешний радиус которого равен l, а внутренний – r.
103

Ответы:
а) t := odd(m) = odd(n);
б) t := (sqr(x)+sqr(y)>sqr(r)) and (sqr(x)+sqr(y)<sqr(l)).
Составной оператор. Условный оператор. Оператор безусловного перехода.
Оператор выбора
В предыдущем параграфе обсуждалось составление линейных программ, в основе которых лежит структура «следование». В этом параграфе рассматриваются разветвляющиеся программы, в которых результат проверки условий определяет группы исполняемых операторов.
Рассмотренный нами ранее оператор присваивания является простым, так как он не включает в себя другие операторы.
К структурированным операторам можно отнести составной оператор – совокупность последовательно выполняемых операторов, заключенная в операторные скобки.
Begin Оператор 1; Оператор 2; …; Оператор N End;
Составной оператор часто используется для оформления блока операторов внутри другого структурированного оператора. Например, внутри условного оператора.
Условный оператор
реализует алгоритмическую конструкцию РАЗВИЛКА. Условный оператор изменяет порядок выполнения операторов в зависимости от того, истинно или ложно записанное в операторе условие.
Существуют сокращенная и полная формы записи условного оператора.
Общий вид сокращенной формы:
If Булево выражение Then Оператор1;
104

Общий вид полной формы:
If Булево выражение Then Оператор1 Else Оператор2;
В условном операторе вначале вычисляется значение булева выражения. Если значение булева выражения истинно - True, то выполняется Оператор1, а Оператор2 пропускается. Если значение булева выражения ложно - False, то выполняется Оператор2, а Оператор1 пропускается.
Если после Then или Else нужно написать несколько операторов, то эту группу операторов оформляют в виде составного оператор. Таким образом, Оператор1 и Оператор2 часто представляют собой составной оператор.
Задача1. Рассмотрим простую программу с ветвлениями.
Рис.2.2.1. Интерфейс игры «Угадай число от 1 до 100».
Настройка свойств формы Form1:
• Caption Игра «Угадай число от 1 до 100»
•Color clLime
Настройка свойств метки Label1:
105
• |
Caption |
Какое число загадано? |
|
• |
Font |
Arial Black, |
24 пт |
|
Настройка свойств поля для ввода числа Edit1: |
||
• |
Text |
очистить |
|
• |
Font |
Arial Black, 30 пт, цвет: синий |
|
|
Настройка свойств поля для кнопки Button1: |
||
• |
Caption |
Проверить? |
|
• |
Font |
Arial Black, 24 пт, синий |
|
|
Настройка свойств метки Label2: |
||
• |
Caption |
очистить |
|
• |
Font |
Monotype Corsiva, 36 пт, цвет: малиновый |
При запуске программы на исполнение происходит генерация случайного числа, которое хранится в переменной c. Опишем переменную c как данное типа Integer. Для того чтобы значение c просуществовало в памяти во все время работы с программой, переменную нужно описать как глобальную, например, там же, где описывается сама форма.
var
Form1: TForm1;
c : integer; // загаданное число
Генерацию случайного числа привяжем к событию OnCreate (создание) формы Form1. Для создания шаблона обработчика события OnCreate формы достаточно дважды кликнуть по макету формы в свободном от других компонент месте. Можно действовать и по другому. Снять выделение со всех компонент формы (при этом будет выделена сама фор-
ма) и в Инспекторе объектов на вкладке События найти
OnCreate и дважды кликнуть справа от названия события.
procedure TForm1.FormCreate(Sender: TObject); begin
106

{генерация случайного числа от 1 до 100}
Randomize;
c := random(100) + 1;
end;
Для создания шаблона обработчика кнопки Button1 с надписью «Проверить?» дважды кликните по кнопке на макете формы. Можно действовать и по другому. Выделить
Button1 и в Инспекторе объектов на вкладке События
найти OnClick и дважды кликнуть справа от названия события.
procedure TForm1.Button1Click (Sender: TObject); var m : integer; // число, введенное пользователем begin
m := StrToInt (Edit1.Text); if c > m
then Label2.Caption := 'Загаданное число больше!' else
if c < m
then Label2.Caption := 'Загаданное число меньше!' else
Label2.Caption := 'ВЫ УГАДАЛИ !!!';
end;
Условные операторы могут быть вложенными. Если используются вложенные условные операторы в сокращенной и полной форме, то каждая ветвь Else относится по умолчанию к ближайшей к ней сверху ветви Then.
Задача2. При введенном с клавиатуры значении аргу-
мента, вычислить значение функции |
|
2x −2, x < −1, |
|||
y = |
|
|
1 |
, x ≥ −1. |
|
|
|
2 |
x |
−2 |
|
|
|
|
|
107

Рис.2.2.2. Интерфейс приложения для решения задачи № 2.
Ниже приведен текст программы - обработчика события
OnClick кнопки Button1 – Вычислить.
procedure TForm1.Button1Click(Sender: TObject); var x, y : real; // x – аргумент, y – результат begin
x := StrToFloat ( Edit1.Text ); y := exp ( x * ln ( 2 ) ) - 2;
If x >= -1 Then
if x <> 1 then
y:=1/y else begin
ShowMessage('Значение функции не определено!'); exit
end;
Edit2.Text := FloatToStr(y);
end;
108
В коде обработчика запрограммирована корректная реакция программы в особом случае. При x =1 значение функ-
ции |
|
2x −2, x < −1, |
|||
y = |
|
|
1 |
не определено. |
|
|
|
|
|
|
, x ≥ −1. |
|
2 |
x |
−2 |
||
|
|
|
|
По команде Exit происходит принудительный выход из процедуры, при этом само приложение продолжает работать.
Среди простых операторов есть оператор безусловного перехода, позволяющий изменить стандартный последовательный порядок выполнения операторов. Оператор безусловного перехода Goto <метка>; организует принудительный переход к отмеченному оператору. Метка отделяется от оператора двоеточием.
Метками могут служить идентификаторы и целые числа. Все используемые в программе метки должны быть описаны. Например,
Label 10, 20, my_label;
Старайтесь использовать оператор перехода только там, где он действительно необходим. Оператор безусловного перехода также как и условный оператор нарушает естественный последовательный порядок исполнения программы, что часто увеличивает время работы программы, поскольку необходимых инструкций и данных для их исполнения может не оказаться в кэше процессора и за ними нужно будет обратиться в оперативную или внешнюю память.
С помощью оператора перехода нельзя перейти из основной программы в подпрограмму, нельзя выйти из подпрограммы. Переход внутрь структурированного оператора может привести к неправильному результату.
Оператор варианта позволяет по вычисляемому значению порядкового типа выполнить один из нескольких вариантов исполнения программы.
Формат оператора варианта:
109

Case <Выражение порядкового типа> of
Const_1 : <Оператор 1>; Const_2 : <Оператор 2>;
…
Const_N : <Оператор N>; Else <Операторы>
End;
При выполнении оператора варианта вычисляется значение выражения порядкового типа, которое иногда называют селектором или переключателем. Затем выполняется тот оператор, константа которого равна значению селектора.
Приведем пример использования оператора выбора:
{Определение числа дней в месяце (n) по номеру месяца - i} case i of
1, 3, 5, 7, 8, 10 : n := 31;
2 : n := 28 else n := 30 end;
Если значение селектора не совпадает ни с одной константой, то выполняется группа операторов, стоящая после else. Ветвь else не является обязательной и может отсутствовать.
Таким образом в Паскале реализованы следующие
варианты базовой алгоритмической конструкции «Развилка»:
1.ЕСЛИ – ТО
если <условие> то <действия>
всё
110

2.ЕСЛИ – ТО – ИНАЧЕ
если <условие> то <действия 1>
иначе <действия
2>
всё
3.ВЫБОР
выбор при <условие 1> :
<действия 1> при <условие 2> : <действия 2>
…
при <условие N> : <действия N>
всё
4.ВЫБОР – ИНАЧЕ
выбор при <условие 1> :
<действия 1> при <условие 2> : <действия 2>
…
при <условие N> : <действия N> иначе <действия N + 1>
всё
111

Задача3. Составьте программу вычисления по заданному радиусу r и значению переменной k площади круга (если k=1), длины окружности (если k=2), объема шара (если k=3).
Рис.2.2.3. Вид окна приложения для решения задачи № 3.
Ниже приведен текст программы - обработчика события
OnClick кнопки Button1 – Вычислить.
Обратите внимание на то, как сделана в программе защита от ошибок при вводе данных и на пример использования оператора выбора.
procedure TForm1.Button1Click(Sender: TObject); var k : byte; r, res : real; s : string;
begin
k := StrToInt(Edit1.Text); if not (k in [1,2,3]) then begin
ShowMessage('Возможные значения k : 1, 2, 3 !'); Edit1.Clear; Exit
end;
r := StrToFloat(Edit2.Text); if r<=0 then
begin
ShowMessage('Введите положительный радиус!');
112