5) Программный код проекта
Теперь напишем программный код проекта Проект-ЛР1. Встроенная функциональность объектов является одной из самых сильных сторон VS и C++ - после того, как объекты будут размещены на форме и их свойства будут размещены на форме и их свойства будут установлены, они готовы к запуску без дополнительного программирования.
Так как программой управляют кнопки Вычислить и Завершить, программный код нашего проекта должен быть связан именно с этими кнопками. Для ввода и редактирования операторов программы на С++ предназначено окно Редактор программного кода.
В технологии визуального программирования используются событийные процедуры, т.е функции, тело которых выполняется при наступлении какого-либо события. Такая функция всегда ассоциирована с конкретным объектом и конкретным событием. Заголовок такой функции жестко определяется самой системой VS, и изменять его программист ни в коем случае не может. Каждый объект может иметь несколько связанных с ним процедур – по одной для каждого распознаваемого события.
Чтобы получить «заготовку» событийной процедуры (заголовок и пустое тело) требуется в окне Конструктора форм Form1.h [Конструктор] дважды щелкнуть мышью на том объекте (элементе управления) формы, для которого и требуется эта событийная процедура. После двойного щелчка по объекту на форме открывается окно Редактор программного кода (Form1.h), внизу которого записана пока пустая событийная функция для этого объекта.
Создадим событийную процедуру для кнопки cmdExit (Завершить). Для этого надо дважды щелкнуть по кнопке, при этом в окне Редактор программного кода автоматически добавляется заголовок и пустое тело функции обработки события Click – щелчок мышью по кнопке cmdExit.
Так как эта кнопка предназначена для завершения программы, то в тело процедуры необходимо вставить оператор обращения к методу формы Close, который позволяет закрыть форму, завершив выполнение программы (рис.9).
private: System::Void cmdExit_Click(System::Object^ sender, System::EventArgs^ e) { this->Close(); } };
|
Рисунок 9 – Событийная процедура завершения с программным кодом
Тело этой процедуры будет исполняться каждый раз, когда пользователь активизирует элемент интерфейса, ассоциированный с этой процедурой. В данном случае такое событие – щелчок мышью на кнопке Завершить. Теперь, когда написан код, связанный с кнопкой Завершить, надо написать код для кнопки Вычислить. Однако сначала необходимо написать и сохранить в отдельном файле функции, которые реализуют вычисление периметра и площади треугольника.
Так как при нажатии на кнопку Вычислить должны вычисляться периметр и площадь треугольника, то код событийной процедуры для кнопки должен содержать операторы ввода исходных данных, операторы вычисления периметра и площади треугольника и операторы вывода результатов. В консольном режиме для этих целей мы создавали отдельные пользовательские функции. Сейчас для ввода и вывода пока отдельных функций делать не будем, но вычисление периметра и площади треугольника реализуем функцией пользователя PS.
Так же, как и раньше, код этой и вспомогательных функций будем записывать в отдельном файле и раздельно компилировать для локализации возможных ошибок. Поэтому, прежде чем записывать код событийной процедуры для кнопки Вычислить, создадим файл с функцией PS и необходимыми вспомогательными функциями.
Для создания такого файла и записи в него необходимых функций, вычисляющих периметр и площадь треугольника, необходимо щелкнуть в панели Обозреватель решений на строку Файлы исходного кода правой кнопкой мыши и в появившемся контекстном меню выполнить команду Добавить, а затем команду Создать элемент.
В открывшемся окне Добавление нового элемента Проект ЛР-1 в поле Имя надо ввести имя файла, например, Resh, где будут находиться программные коды пользовательских функций, вычисляющие периметр и площадь треугольника. Затем активизировать элемент Файл С++ (.срр) и нажать на кнопку Добавить. После этого на вкладке Resh.cрp откроется редактор программного кода. В окно редактора надо добавить тексты функций, представленные на рисунке 10.
#include "stdafx.h" double LenS(double Xa, double Ya, double Xb, double Yb) { return sqrt(pow((Xa-Xb),2)+pow((Ya-Yb),2)); }
double CalcP(double a, double b, double c) { return a+b+c; }
double CalcS(double a, double b, double c) { double pp=CalcP(a,b,c)/2; return sqrt(pp*(pp-a)*(pp-b)*(pp-c)); }
double PS(double x1, double y1, double x2, double y2, double x3, double y3, double& p) { double a,b,c,s; a=LenS(x1,y1,x2,y2); b=LenS(x2,y2,x3,y3); c=LenS(x1,y1,x3,y3); p=CalcP(a,b,c); s=CalcS(a,b,c); return s; } |
Рисунок 10 – Окно редактора кода с файлом Resh.cрp
В тех случаях, когда проект содержит функции пользователя в отдельных файлах, целесообразно создавать пользовательский заголовочный файл, содержащий необходимые директивы using namespace, директивы include для подключения необходимых заголовочных файлов, а также прототипы используемых функций пользователя. На рис. 11 приведен программный код заголовочного файла Resh.h, созданного для этих целей и включенного в состав проекта в раздел Заголовочные файлы. Создание и добавление заголовочного файла в проект выполняется аналогично добавлению файла с кодами функций.
using namespace System; using namespace System::Windows::Forms; #include <cmath>
double PS(double,double,double,double,double,double,double&); double LenS(double,double,double,double); double CalcP(double,double,double); double CalcS(double,double,double); |
Рисунок 11 – Программный код заголовочного файла Resh.h
Созданный заголовочный файл директивой include подключается к системному заголовочному файлу stdafx.h (рис. 12). Заголовочный файл stdafx.h подключается директивой include ко всем cpp-файлам с функциями пользователя.
#pragma once
#include "Resh.h" |
Рисунок 12 – Программный код системного заголовочного файла stdafx.h
Откомпилируем созданный файл, выполнив команду
Компилировать элемента меню Построение, и после устранения возможных ошибок добьемся успешной компиляции.
Теперь можно написать программный код, который будет выполняться при нажатии кнопки Вычислить, то есть событийную процедуру cmdCalc_Click. Чтобы отобразить форму, надо щелкнуть в окне Обозреватель решений на пиктограмме Form1.h или на вкладке Form1.h [Конструктор].
Дважды щелкнем мышью на кнопке Вычислить. Появляется окно Редактор кода, и рядом с событийной процедурой, связанной с кнопкой cmdExit, появится заготовка событийной процедуры, ассоциированной с кнопкой cmdCalc.
Дополним событийную процедуру программным кодом: операторами ввода значений координат вершин треугольника из текстовых полей формы, оператором вызова функции PS(x1,y1,x2,y2,x3,y3,p) и операторами вывода в текстовые поля формы полученных результатов вычисления периметра и площади треугольника (рис. 13).
private: System::Void cmdCalc_Click(System::Object^ sender, System::EventArgs^ e) { double x1=Convert::ToDouble(txtX1 -> Text); double y1=Convert::ToDouble(txtY1 -> Text); double x2=Convert::ToDouble(txtX2 -> Text); double y2=Convert::ToDouble(txtY2 -> Text); double x3=Convert::ToDouble(txtX3 -> Text); double y3=Convert::ToDouble(txtY3 -> Text); double s,p; s=PS(x1,y1,x2,y2,x3,y3,p); txtPttr -> Text = p.ToString(); txtPltr -> Text = s.ToString(); }
|
Рисунок 13-Событийная процедура нажатия кнопки Вычислить
Для ввода и вывода данных в текстовые поля используется свойство Text объектов типа TextBox с именами txtX1, txtY1, txtX2, txtY2, txtX3, txtY3, txtPttr, txtPltr. Доступ к этому свойству осуществляется через операцию косвенного выбора (->). Так как значения этого свойства имеют строковый тип данных (String), то при чтении данных из текстовых полей в переменные числовых типов необходимо их явное преобразование методами класса Convert. Например, метод Convert::ToDouble() преобразует тип записанного в скобках объекта в числовой тип double. И наоборот, для вывода числовых данных в текстовые поля нужно их явное преобразование в строковый тип с помощью метода ToString(). Например: txtPttr -> Text = p.ToString();
Структуру созданного проекта можно посмотреть в окне Обозреватель решений, представленном на рисунке 14.
Рисунок 14 – Структура проекта в окне Обозреватель решений
Выполним построение проекта, выбрав элемент главного меню Построение и пункт Построить решение или нажав клавишу F7. Убедимся в отсутствии ошибок построения.
Сохраним введенный программный код, выполнив команду Сохранить все элемента главного меню Файл.
Для выполнения созданного приложения выберем элемент главного меню Отладка и пункт Начать отладку, или нажмем клавишу F5, или нажмем на треугольную пиктограмму на панели быстрого доступа. Приложение запустится и на экране появится форма, ожидающая ввода исходных данных и нажатия кнопки Вычислить. Необходимо ввести заранее подготовленный тестовый набор исходных данных и нажать кнопку Вычислить. В текстовых полях результатов появятся вычисленные значения периметра и площади треугольника (рис. 15).
Рисунок 15 – Форма с результатами выполнения приложения
