Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2942.pdf
Скачиваний:
3
Добавлен:
15.11.2022
Размер:
2.65 Mб
Скачать

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

Страница Additional
Страница Additional

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

Например, выражение 1x2 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]