Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабник по СПО

.pdf
Скачиваний:
11
Добавлен:
05.06.2015
Размер:
1.59 Mб
Скачать

В отличие от других объектов, строка Hint для пунктов меню задаёт только длинное сообщение, которое может отображаться на любом объекте, предназначенном для вывода текста. Для того чтобы длинное сообщение строки Hint выводилось, необходимо указать программе метод обработки события OnHint.

Для элемента меню определено событие OnClick, которое возникает при щелчке на пункте или при нажатии клавиши Enter.

Компонент PopupMenu (контекстное меню) находится на вкладке Standard и предназначен для создания контекстных меню. Контекстное меню может быть создано для любого оконного объекта, т.е. контекстных меню на форме может быть несколько.

Для того чтобы связать щелчок правой кнопки мыши с раскрытием контекстного меню объекта, в свойство PopupMenu объекта необходимо поместить имя соответствующего меню. Процесс создания контекстного меню не отличается от процесса создания главного меню.

Строка Hint контекстного меню выводится целиком, без разделения на короткое и длинное сообщения.

Компонент SpeedButton (кнопка с фиксацией) находится на вкладке Additional. Кнопки SpeedButton отличаются от кнопок BitBtn следующим: в них не предусмотрены свойство Kind и вывод стандартной надписи; они могут фиксироваться в утопленном состоянии; они не могут закрыть модальное окно. Во всём остальном они повторяют свойства и методы кнопок BitBtn.

Для фиксации в нажатом состоянии кнопка должна быть отнесена к какой-либо группе кнопок. Принадлежность кнопки к группе определяется значением свойства GroupIndex. Номер группы не может быть равен нулю. Группа может состоять и из одной кнопки. Свойство Down является индикатором нажатия кнопки, его значение можно изменять программно. Реакция кнопки на нажатие определяется свойством AllowAllUp: если AllowAllUp = False, утопленная кнопка отпускается только при нажатии другой кнопки, входящей в ту же группу, если AllowAllUp = True, кнопку можно освободить повторным щелчком по этой же кнопке.

Компонент ToolBar находится на вкладке Win32 и представляет контейнер для создания инструментальных панелей, выполняющих функции пиктографических меню. Главное свойство компонента ToolBar - способность гибкого управления дочерними элементами. Компонент может манипулировать любыми дочерними элементами, вставленными в него, но наиболее полно его возможности реализуются при использовании специальной кнопки ToolButton (инструментальная кнопка). Кнопки

71

PDF created with pdfFactory Pro trial version www.pdffactory.com

ToolButton нет в палитре компонентов. Для того чтобы вставить инструментальную кнопку на инструментальную панель, нужно щёлкнуть правой кнопкой по объекту ToolBar и выбрать пункт NewButton. Элемент NewSeparator предназначен для функционального разделения групп элементов на инструментальной панели. Объект ToolButton не имеет свойства для хранения картинки, но объект ToolBar умеет использовать контейнер ImageList для размещения пиктограмм на инструментальных кнопках.

Свойство ImageIndex объекта ToolButton определяет индекс связанного с кнопкой изображения.

Свойство Images объекта ToolBar определяет контейнер для хранения изображений. Свойство WrapAble запрещает или разрешает располагать кнопки в нескольких рядах. RowCount - число рядов.

Компонент ImageList находится на вкладке Win32 и представляет контейнер для хранения множества рисунков одинакового размера. Компонент не имеет собственной канвы и поэтому не может самостоятельно отображать хранимые в нём картинки, которые могут быть растрами или пиктограммами. Его метод Draw получает канву от другого компонента и рисует изображение в клиентской области этого компонента.

Схема программы

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

Схема программы, обеспечивающая заданные действия, приведена на рис.3.4.

72

PDF created with pdfFactory Pro trial version www.pdffactory.com

 

 

 

 

 

 

 

 

 

 

 

 

1

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

Вывод

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

нач. значений

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

3

 

?

 

 

Да

 

 

 

Да

 

 

 

 

?

 

 

 

 

 

 

Выход

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рез. сохр.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

в файл

 

 

 

 

 

Нет

 

Конец

Запись

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Да

 

 

6

 

 

?

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Записать

 

 

 

 

 

 

 

 

 

 

7

 

списка

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вывод

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Nm1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Nm2

 

 

Нет

 

 

 

 

 

 

 

 

 

Да

 

 

 

 

 

 

 

 

?

 

 

 

 

 

 

 

 

 

 

 

10

 

 

 

 

 

 

 

 

 

?

 

 

 

 

 

 

 

 

 

 

 

Расчёт

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Действие

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

×

/

12

Сложение

13

Вычитание

14

Умножение

15

Деление

Рис.3.4. Схема программы калькулятора на четыре действия

Основными событиями, которые должна обрабатывать программа, являются:

Ÿкоманда на закрытие программы;

Ÿкоманда на выполнение расчёта;

Ÿввод значений исходных данных;

Ÿвыбор действия;

Ÿвыбор режима расчёта;

Ÿкоманда на запись результатов расчёта;

Ÿкоманда на сохранение результатов расчёта.

73

PDF created with pdfFactory Pro trial version www.pdffactory.com

Процедуры ввода чисел, блоки 8 и 9, на схеме программы изображены в виде предопределённых процессов. Блок 8 реализует ввод первого числа с именем Nm1, блок 9 - ввод второго числа с именем Nm2.

Подпрограмма ввода числа должна производить преобразование введённой строки в число с сообщением об ошибках ввода, если они появляются. Схема подпрограммы приведена на рис.3.5.

 

 

 

 

 

 

 

 

 

 

1

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

строки

 

 

 

 

 

 

Чтение

 

7

 

 

 

 

 

 

Число = 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

Преобразование в число

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сообщение об ошибке

 

 

 

 

 

 

?

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

Преобразование

 

 

 

 

 

 

 

 

 

 

 

успешно

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Да

5

 

 

?

 

 

 

 

 

 

 

 

 

 

 

 

Ещё символ

8

Нет

Конец

 

Рис.3.5. Схема функции преобразования строки в число

Подпрограммы, выполняющие арифметические действия, - блоки 12 - 15 на рис.3.4,

также показаны как предопределённые процессы и поэтому для них требуется разработка схем.

Подпрограмма сложения двух чисел (рис.3.6) должна сначала проверить, требуется ли накопительная операция, т.е. сложение одного из заданных чисел с результатом или сложение двух заданных чисел.

74

PDF created with pdfFactory Pro trial version www.pdffactory.com

1

 

 

 

 

 

 

 

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

Да

 

2

?

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Накопл.

 

 

 

 

 

 

 

 

?

 

 

Да

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Res+Nm1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

5

 

 

 

 

6

 

 

 

4

 

 

 

 

 

Сложение

 

 

 

Сложение

 

 

Сложение

 

 

 

 

 

 

Res+Nm1

 

 

 

Nm1+Nm2

 

 

Res+Nm2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вывод

 

 

 

 

 

 

 

 

 

 

 

результата

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

Конец

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис.3.6. Схема подпрограммы сложения

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

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

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

75

PDF created with pdfFactory Pro trial version www.pdffactory.com

1

 

 

 

 

 

 

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Да

 

2

 

 

?

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

12

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

 

Да

Повтор

 

 

 

 

 

 

 

Сообщение

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Res/Nm1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

Да

 

 

?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

Да

 

 

 

Nm1=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Nm2=0

 

 

 

 

7

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

Деление

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Деление

 

 

 

 

 

Res/Nm1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Res/Nm2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

 

 

?

Да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1/Nm2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Nm

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

R

 

 

 

 

 

Нет

 

 

 

 

?

Да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

 

 

 

 

Nm2=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Nm1=0

 

 

13

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Деление

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

 

 

 

 

 

Nm1/Nm2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Деление

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Nm2/Nm1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

R

 

 

 

 

 

 

 

R

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14

 

 

 

 

Вывод

результата

15

Конец

Рис.3.7. Схема подпрограммы деления

Схема подпрограммы вычитания (рис.3.8) отличается от подпрограммы сложения введением проверки последовательности чисел, так как результат зависит от перестановки операндов. Подпрограмма вычитания должна обеспечить возможность перестановки чисел по команде пользователя, т.е. возможность выбора вычитания первого числа из второго или второго из первого.

76

PDF created with pdfFactory Pro trial version www.pdffactory.com

 

 

 

1

 

 

 

 

 

 

Начало

 

 

 

 

 

Да

2 ?

Нет

 

 

 

 

 

Повтор

 

 

 

3

?

Да

6

?

Да

ResNm1

 

 

 

 

 

 

Nm1Nm2

 

 

Нет

 

 

 

Нет

 

 

 

 

5

 

 

4

 

 

7

 

8

Вычитание

Вычитание

Вычитание

Вычитание

ResNm2

 

ResNm1

Nm2Nm1

Nm1Nm2

 

 

 

 

 

 

9

 

 

 

 

 

 

Вывод

 

 

 

 

 

 

результата

 

 

 

 

 

 

10

 

 

 

 

 

 

Конец

 

Рис.3.8. Схема подпрограммы вычитания

Создание проекта

Создаём проект типа VCL Forms Application. Сохраняем проект в подготовленной заранее папке с именем Work3, присваиваем главному модулю имя UnCalc, а проекту - имя Calc. Присваиваем главной форме имя fmCalc. Вводим в проект вторую форму с заголовком Результаты расчёта и именем fmOut. На второй форме помещаем многострочный редактор с именем OutMem типа TMemo.

На второй форме создаём контекстное меню с пунктами, показанными на рис.3.9. Присваиваем пунктам контекстного меню второй формы имена: CalcResPop, ResOutClr, WrResPop, SavPop, ClsOut. На главной форме создаём аналогичное контекстное меню, но вместо пункта меню Удалить результаты создаём пункт Открыть результаты.

Присваиваем пунктам контекстного меню главной формы имена: CalcResPop, OpOut, WrResPop, SavPop, ClsOut.

Рис.3.9. Контекстное меню второй формы

77

PDF created with pdfFactory Pro trial version www.pdffactory.com

Размещаем на главной форме объект главного меню. Создаём три главных пункта главного меню: Результаты, Действие и Режим расчёта (см. рис.3.2). Присваиваем пунктам меню имена: FlRes, Action, RegClc. В пункте Результаты создаём подпункты:

Расчёт, Записать, Открыть, Сохранить. Присваиваем подпунктам имена: CalcRes, WrRes, OpRes, SavRes. В этом же пункте создаём подпункт Выход. Для того чтобы отделить подпункт Выход чертой от остальных подпунктов, в заголовок предыдущего подпункта вводим символ "-". В событие OnClick подпункта Выход вводим оператор Close. В свойстве ShotCut подпунктов выбираем имена горячих клавиш.

В пункте Действие создаём подпункты: Сложение, Вычитание, Умножение,

Деление. Присваиваем подпунктам имена: ActAdd, ActSub, ActMult, ActDiv. В подпункте

Вычитание вводим два подпункта: Вычитание Nm1–Nm2 и Вычитание Nm2–Nm1 с

именами ActSub1 и ActSub2 (рис.3.10).

а б в

Рис.3.10. Структура пунктов главного меню: а - раздел Результаты;

б- раздел Действие; в - раздел Режим расчёта

Вподпункте Деление вводим два подпункта: Деление Nm1/Nm2 и Деление Nm2/Nm1

сименами DivNm1 и DivNm2. В пункте Режим расчёта создаём подпункты: Одинарное действие и Дополняющие действия с именами: Reg1 и RegAdd. Проверяем работу проекта.

Текст программы на языке Delphi

Помещаем на форму инструментальную панель ToolBar1 и контейнер ImageList1 для хранения рисунков (рис.3.11).

Рис.3.11. Схема размещения кнопок инструментальной панели

78

PDF created with pdfFactory Pro trial version www.pdffactory.com

В графическом редакторе создаём рисунки для кнопок размером 16×16 пикселей. Щелчком правой кнопки мыши по объекту ImageList1 открываем диалоговое окно ImageList Editor и добавляем рисунки для кнопок. В свойстве Images объекта ToolBar1 выбираем контейнер ImageList1.

Создаём на панели восемь кнопок и три разделителя. Присваиваем кнопкам имена: ButReplc, ButSum, ButAdd, ButSub, ButMult, ButDiv, ButtWrite и ButtOpen. Первые шесть кнопок должны фиксироваться, поэтому в их свойстве Style выбираем значение tbsCheck. В свойстве Style седьмой и восьмой кнопок, которые не должны фиксироваться, выбираем значение tbsButton. В свойстве Grouped фиксирующихся зависимых кнопок ButAdd, ButSub, ButMult, ButDiv задаём значение True, у остальных кнопок свойству Grouped задаём значение False. Для определенности действия, выполняемого по умолчанию, свойству Down кнопки ButAdd задаём значение True. В свойство кнопок ImageIndex вводим номера рисунков.

Помещаем на форму метки с обозначениями вводимых чисел, редакторы для ввода чисел, метку для вывода результата, метку для вывода заданного действия, редактор для ввода имени файла, в котором будут сохраняться результаты, и кнопки для команд расчёта, записи результатов, открытия результатов и выхода из программы (рис.3.12).

Рис.3.12. Вид главного окна калькулятора на четыре действия

Объявляем глобальные переменные типа Double для хранения операндов и результата, строковую переменную для формирования строки результата.

Var

fmCalc: TfmCalc;

Nm1, Nm2, Res :Double; ResStr: String;

Функцию ввода чисел реализуем через функцию преобразования строки в число в соответствии со схемой, показанной на рис.3.5, с выводом на метку сообщения об ошибке ввода числа. Текст функции приведён в распечатке 3.1.

79

PDF created with pdfFactory Pro trial version www.pdffactory.com

Распечатка 3.1

Function TfmCalc.Vvod(Str: String): Double;

Begin

Try

Vvod:=StrToFloat(Str);

LabErr.Caption:='';

Except

Vvod:=0;

If ((Str <> '')And(Str <> ' ')And(Str <> '-')) Then LabErr.Caption:='Ошибка ввода'

End

End;

Всобытие OnChange редакторов EdNm1 и EdNm2 вводим операторы присваивания переменным введённых значений. Для того чтобы показать, что расчёт сразу после ввода чисел пока ещё не выполнен и результат не соответствует введённому значению, цвет цифр результата изменяем на красный или светло-серый, но не удаляем из метки результат предыдущего расчёта. Красный или светло-серый цвет результата является сообщением о том, что действие ещё не выполнено. Чёрный цвет шрифта восстанавливаем только после выполнения расчёта.

Procedure TfmCalc.EdNm1Change(Sender: TObject);

Begin

Nm1 := Vvod(EdNm1.Text); ResLb.Font.Color := clRed

End;

Всоответствии с техническим заданием расчёт должен происходить по нажатию клавиши Enter, поэтому свойству Default кнопки Расчёт задаём значение True. В событие OnClick кнопки Расчёт записываем операторы, выполняющие заданное действие.

Пишем текст реализации блока 12 на рис.3.4, т.е. текст подпрограммы сложения, в соответствии со схемой подпрограммы, показанной на рис.3.6. Проверяем состояние кнопок Дополнение результата (блок 2 на рис.3.6) и Выбор второго операнда (блок 3 на рис.3.6) и складываем два числа или результат, оставшийся от предыдущего расчёта, с одним из чисел по выбору.

Procedure TfmCalc.BitBtCalcClick(Sender: TObject);

Begin

ResLb.Font.Color := clBlack;

80

PDF created with pdfFactory Pro trial version www.pdffactory.com

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