Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы по дисциплине.doc
Скачиваний:
15
Добавлен:
31.05.2015
Размер:
1.02 Mб
Скачать

6. Дополнительные задания

1. Создать вариант программы HELLO, которая отображает своё сообщение Hello world! белым текстом, центрированным на форме с "морским синим" фоновым цветом (clBlue).

2. Создать другой вариант программы HELLO, которая отображает своё сообщение Hello world! в шрифтеArialв 18 пунктов, выведенным ярко-жёлтым текстом, центрированным на форме с тёмным красным фоном.

3. Создать программу, основное окно которой отображает пять строк окошек редактирования, помеченных First Name,Last Name,Street Address,CityиZipсоответственно.

Приложение б Лабораторная работа № 131 Проектирование калькулятора в среде Delphi

Настоящая лабораторная работа ставит целью закрепление у студентов навыков использования арифметических операторов в языке Object Pascal, а также закрепление умений для создания типичных Delphi-приложений.

Рассмотрим пример построения программы с использованием арифметических операторов. Арифметические выражения будут использоваться в контексте рабочего Delphi-приложения, построенного на форме. Вы будете вынуждены в какой-то степени слепо использовать возможности Delphi, т. к. ещё формально не знакомились, например, с объектными классами. Идея состоит в том, чтобы погрузить вас в среду создания типичных Delphi-приложений, а понимание подробностей придёт позже.

1. Создание калькулятора

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

Недостаток в использовании свободной формы ввода для вашего калькулятора состоит в том, что требуется проверка правильности данных на входе. Например, надо быть уверенным, что пользователь ввёл действительно допустимое число. Для упрощения программы сделаем допущение, что пользователь всегда вводит только допустимые целые числа внутри приемлемого диапазона. Предположение, подобное этому, конечно, недопустимо для хорошего программного продукта.

Для начала выполните следующие действия:

1. Создайте новый каталог, где вы сохраните файл проекта. Назовите его, например, CALC.

2. Начните новый проект, выбирая "Файл/ Создать/ Приложение" из главного окна Delphi.

3. Сохраните новый проект в созданном каталоге под именем FCALC.DPR, а модуль, поддерживающий основную форму приложения (Unit1по умолчанию), назовите FCALC1.PAS.

Основная форма приложения, Form1по умолчанию, будет главным окном калькулятора. Теперь поместим в форму некоторые средства управления.

Визуальное проектирование калькулятора

На рис. 1 показано размещение на форме различных элементов управления относительно друг друга. Для получения такой панели надо проделать следующее:

1. Измените свойство BorderStyleнаbsSingle.

2. Измените свойство Captionна заголовокFree-form-Calculator.

3. Из страницы StandardПалитры компонентов выберите компонентEditи расположите его на форме. Компонент будет названEdit1самой Delphi.

4. Переименуйте Edit1наEditOperand1.

Рис. 1. Калькулятор со свободным вводом

5. Повторите предыдущие два шага, помещая на форме под первым компонентом с именем EditOperand1два дополнительных компонентаEdit. Назовите два новых окна редактированияEditOperand2иEditResultсоответственно.

6. Выберите все три компонента Editвместе, удерживая нажатой клавишуShiftи нажимая каждое из трёх окон редактирования последовательно. Выбор нескольких компонентов будет отображён Delphi рядом маленьких серых прямоугольников, расположенных на каждом из выбранных компонентов.

7. После выбора трёх окон редактирования перейдите в правый столбец атрибутов текста внутри Инспектора объекта и очистите его содержимое.

Все три выбранных окна редактирования, таким образом, становятся пустыми.

Щёлкните в пустое место формы, а затем снова выделите три окна редактирования.

8. Выберите "Выровнять..." из основного меню "Правка" среды Delphi. Диалоговое окно "Выравнивание" теперь открыто.

9. Пометьте радиокнопку "По левому краю" внутри группы "По горизонтали", чтобы левые стороны окон редактирования были выровнены горизонтально. Нажмите кнопку ОК, чтобы закрыть диалоговое окно.

10. Выберите окно редактирования EditResultна форме и в Инспекторе объекта измените свойствоReadOnlyокна наTrue.

В итоге пользователь не сможет подправить (случайно или умышленно) данные, полученные в окне результата.

11. Измените цвет текста, который будет отображаться внутри поля EditResult, настроив свойствоFont, как описано в следующих шагах.

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

12. Чтобы изменить цвет текста, дважды нажмите с правой стороны свойства FontокнаEditResultвнутри Инспектора объекта. Вы можете также нажать кнопку, следующую за значением шрифта, которая появляется при его выборе.

Появляется стандартное диалоговое окно Windows Font, что позволяет вам изменить и другие атрибуты шрифта.

13. Теперь выберите, например, Redиз раскрывшегося списка цветов в нижнем левом углу диалогового окна и закройте диалоговое окно нажатием кнопкиОК.

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

14. Нажмите на компонент BitBtnна страницеAdditionalПалитры компонентов и поместите его на форме.

15. Измените свойство KindкомпонентаBitBtn1наbkClose.

16. Переименуйте компонент BitBtn1вBitBtnClose.

Изменив свойство KindкомпонентаBitBtnCloseнаbkClose, вы гарантируете, что действие кнопки после нажатия пользователем приводит к закрытию всей формы. Это действие кнопкиCloseзадано по умолчанию, т. е. не надо писать программу, чтобы это обеспечить.

Теперь поместим в форму ряд кнопок, каждую для одной функции калькулятора.

17. На странице AdditionalПалитры компонентов нажмите изображение компонентаSpeedButton, удерживая клавишуShift.

Изображение компонента SpeedButton будет выбрано в "постоянном режиме", позволяя поместить несколько компонентов того же самого вида без нажатия каждый раз на изображение компонента из палитры. Кнопка изображения компонента будет выглядеть не только нажатой, а вокруг её изображения возникнет прямоугольник, состоящий из точек, указывающий на постоянный режим работы (режим залипания).

18. Теперь можно двигаться дальше и поместить на панели семь копий компонента SpeedButton(быстрая кнопка) одну за другой, нажимая приблизительно там, где вы хотите их расположить.

Быстрые кнопки, которые вы только что разместили на панели, Delphi назовет SpeedButton1, ... ,SpeedButton7.

19. Нажмите крайнюю левую кнопку на Палитре компонентов с изображением стрелки, похожей на стандартный курсор мыши, чтобы вернуться к нормальному режиму работы, в котором курсор мыши выбирает компоненты на форме, а не размещает копииSpeedButton.

Быстрые кнопки, которые вы разместили на панели, могут отображать произвольные рисунки, называемые растровыми матрицами (bitmap – отсюда расширение *.bmp). Начертание(Glyph) – растровое изображение (или картинка), отображенное внутри быстрой кнопки или некоторого другого компонента, определяющее, как оно выглядит визуально.

Вы можете подобрать вид быстрых кнопок по своему вкусу, создавая для их начертания соответствующие файлы Windows в стандарте битовых матриц (*.bmp). Это очень полезно для создания более современных инструментальных панелей. Но в демонстрационной программе калькулятора мы просто зададим для этих кнопок изображения символов.

20. Выберите верхнюю левую кнопку SpeedButton1в группе быстрых кнопок, которые размещены на панели.

21. Измените атрибут заголовка SpeedButton1 на знак "плюс" (+), а свойствоNameнаBtnAdd.

22. Теперь последовательно выберите каждую из оставшихся быстрых кнопок и измените свойства Captionна символ соответствующей операции, а их имена – согласно таблице.

Обратитесь снова к рис. 1, чтобы видеть, какие операции должен поддерживать Ваш калькулятор.

Таблица включает все функции программы калькулятора со свободным вводом. На панели для каждой из этих функций калькулятора имеется соответствующая быстрая кнопка.

Таблица

Функциональные клавиши калькулятора

Символ для быстрой кнопки

Имя кнопки

Функция

+

BtnAdd

Сложение

BtnSubtract

Вычитание

*

BtnMultiply

Умножение

/

BtnDivide

Деление с вещ. рез.

Mod

BtnMod

Остаток

Div

BtnDiv

Целочисленное дел.

Clear

BtnClear

Очистить поля ввода

23. Из страницы StandardПалитры компонентов выберите компонентLabel(метка) и разместите две метки на панели перед окнами редактирования –EditOperand2иEditResultсоответственно.

24. Переименуйте метку перед EditOperand2изLabel1в LabelOperatorи измените свойствоCaptionна одинарный вопросительный знак (?).

25. Переименуйте метку перед окном EditResultизLabel2в LabelResult и измените свойство Caption на вопросительный знак.

Отображённые вопросительные знаки означают отсутствие на калькуляторе в настоящее время каких-либо допустимых вычислений. Метки во время выполнения изменяются динамически в зависимости от того, что делает пользователь.

26. Поместите компонент Bevelиз страницыAdditionalПалитры компонентов на форме для отделения результатов вычисления операндов.

27. Измените свойство StyleкомпонентаBevel1наbsRaised. Вам может также понадобиться скорректировать свойствоHeightтак, чтобы результат был хорошо виден на экране. Значение свойства, равное 5-ти, например, будет приемлемо.

После завершения визуального проекта интерфейса перейдём к разработке нужного поведения приложения.

Ввод кода для калькулятора

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

Чтобы обеспечить действие для таких событий, как нажатие кнопки пользователем, надо написать программу на Object Pascal.

Поддержка сложения

Для обеспечения выполнения операции сложения надо выполнить следующие действия:

Нажмите дважды кнопку BtnAddв окне Дизайнера форм.

В ответ на это Delphi создаст заданный по умолчанию обработчик события для этой кнопки. Курсор будет помещён в строку между ключевыми словами Паскаля beginиendв сгенерированном блоке программы:

procedure Tform1.BtnAddClick (Sender: TObject);

begin

end;

Пространство между beginиend –это поле вашего собственного кода, который вы вводите для отклика на событие, в данном случае – нажатие кнопки.

По идее, теперь калькулятор должен был бы взять содержимое окна редактирования для первого операнда, сложить его с содержимым окна редактирования второго операнда и поместить результат в поле результата. Но в окнах вводятся значения для переменных строкового типа, а складывать мы должны переменные типа Integer. Требуемое преобразование можно выполнить, вызвав одну из стандартных функций модуляSysutils:

– StrToIntпреобразует параметр типаStringв числовой эквивалент; например,StrToInt ('123')берёт строку '123' и возвращает число 123, назначая ему типLongInt,совместимый сInteger.

– IntToStrберёт числовое целое значение в качестве параметра и возвращает символьное представление числа; например,IntToStr (789),принимающее целочисленную константу 789 в качестве аргумента, возвращает строку со значением '789'.

– FloatToStrпреобразует число с плавающей запятой в символьное представление; например,FloatToStr (2.10)возвращает строку '2.10000000000'.

Функция StrToIntпозволяет содержимое окна редактирования операнда, доступное как свойствоTextсоответствующего компонентаEdit,преобразовать в целое число, необходимое для вычислений. Например, чтобы получить числовое значение первого операнда, вызываютStrToIntследующим образом:

StrToInt(EditOperand1.Text)

Теперь заполним обработчик события BtnAddClickтекстом программы.

Вставьте следующий код между beginиendобработчика событияBtnAddClick:

Op1:=StrToInt(EditOperand1.Text);

Op2:=StrToInt(EditOperand2.Text);

Result:=Op1+Op2;

ResultStr:=IntToStr(Result);

EditResult.Text:=ResultStr;

В этом коде введено несколько вспомогательных переменных. Подходящее место для объявления временных переменных – непосредственно подпрограмма, чтобы они были доступны только внутри неё.

Дополните программу, чтобы она выглядела так:

1: procedure TForm1.BtnAddClick(Sender: TObject);

2: var

3: Op1,

4: Op2,

5: Result:Integer;

6: ResultStr:String;

7: begin

8: Op1:=StrToInt(EditOperand1.Text);

9: Op2:=StrToInt(EditOperand2.Text);

10: Result:=Op1+Op2;

11: ResultStr:=IntToStr(Result);

12: EditResult.Text:=ResultStr;

13: end;

Строки со 2-й по 6-ю подпрограммы BtnAddClickформыTForm1объявляют временные переменные для преобразований между числовыми и строковыми представлениями.

8-я строка преобразует строковое значение первого операнда в числовое и сохраняет результат в целой переменной Op1.

Аналогично 9-я строка преобразует строковое значение второго операнда и сохраняет результат в целой переменной Op2.

В 10-й строке выполняется фактическое вычисление суммы.

11-я строка преобразует полученные в 10-й строке результаты сложения обратно в строковое представление, присваивая его переменной ResultStr.

Наконец, 12-я строка заставляет окно редактирования Resultотображать строковое представление суммы двух операндов, присваивая значениеResultStrсвойствуTextкомпонентаEditResult.

Поддержка вычитания и умножения

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

Дважды нажмите на BtnSubtractв окне Дизайнера формы.

Delphi снова создаст заданный по умолчанию обработчик события для этой кнопки. Сгенерированный блок программы выглядит следующим образом:

procedure TForm1.BtnSubtractClick(Sender: TObject);

begin

end;

Как и прежде, введите текст подпрограммы BtnSubtractClickследующим образом (но без промежуточных переменных):

procedure TForm1.BtnSubtractClick(Sender: TObject);

begin

EditResult.Text:=

IntToStr(StrToInt(EditOperand1.Text)-

StrToInt(EditOperand2.Text));

end;

Аналогично введите текст для обработчика события BtnMultiplyClick.

Поддержка деления

Предполагается, что ваш калькулятор поддерживает два вида деления: целочисленное деление, оперирующее только с целыми числами, и деление с вещественным результатом.

Программа для целочисленного деления повторяет шаги, которые вы делали при поддержке сложения, вычитания и умножения. Только здесь используется операция целочисленного деления div.

Заодно попробуйте создать программы поддержки деления по модулю (mod), т. е. получения остатка от деления первого операнда на второй:

procedure TForm1.BtnModClick(Sender: TObject);

begin

EditResult.Text:=

IntToStr(StrToInt(EditOperand1.Text) mod

StrToInt(EditOperand2.Text));

end;

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

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