
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
УКРАИНСКИЙ ГОСУДАРСТВЕННЫЙ ХИМИКО-ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ИС
Лабораторная работа №6
по дисциплине «Объектно-ориентированное программирование»
на тему «Использование библиотеки VCL»
Подготовил:
Студент группы 2-ИС-10
Таран С.Е.
Проверил:
доц. Гаркуша И.Н.
Днепропетровск 2014
Библиотека VCL
Цель работы:
Освоить основные классы библиотеки Visual Component Library (VCL),позволяющие строить приложения с графическим интерфейсом пользователя (GUI).
Задание 1:
Используя класс, разработанный в ЛР №4,построить программу с графическим интерфейсом пользователя, предоставляющую возможность расчета математического выражения и сохранение результатов.
Задание 2:
Реализовать GUI к заданию 2 лабораторной работы № 5.
Задание 3:
Предложить и разработать иерархию классов и программу с GUI,
позволяющую отображать точечные, линейные и полигональные графические объекты с возможностью загрузки координат их вершин из файла(ов).
Задание 1:
файл CDoubleVector.срр:
#include "CDoubleVector.h"
#include <iostream>
CDoubleVector::CDoubleVector(const CDoubleVector&original)
{
vector = new double[size = original.getSize()];
for(int i=0; i<size; ++i)
vector[i] = original.getValue(i);
}
CDoubleVector::CDoubleVector() { size = 0; }
CDoubleVector::~CDoubleVector() { clear(); }
void CDoubleVector::Init(int vectorSize)
{
vector = new double[size = vectorSize];
for(int i=0; i<size; ++i)
vector[i] = 0;
}
void CDoubleVector::clear()
{
delete[] vector;
vector = NULL;
size = 0;
}
void CDoubleVector::setValue(unsigned int index, double value)
{
if(index < size)
vector[index] = value;
}
double CDoubleVector::getValue(unsigned int index) const
{
if(index < size)
return vector[index];
else
return 0;
}
int CDoubleVector::getSize() const { return size; }
double CDoubleVector::getMin() const
{
double min = vector[0];
for(int i=1; i<size; ++i)
if(vector[i] < min)
min = vector[i];
return min;
}
double CDoubleVector::getMax() const
{
double max = vector[0];
for(int i=1; i<size; ++i)
if(vector[i] > max)
max = vector[i];
return max;
}
double CDoubleVector::getArithmeticMeanValue() const
{
double sum = 0;
for(int i=0; i<size; ++i)
sum += vector[i];
return sum/(double)size;
}
double CDoubleVector::calculate() const
{
double sumUp = 0, sumDown = 0;
for(int i=0; i<size; ++i)
{
sumUp += sin(abs(1-log(vector[i])));
sumDown += pow(sin(18*pow(vector[i], 3)), 2);
}
return (sumUp)/(sumDown);
}
void CDoubleVector::saveData(string path) const
{
if(size > 0)
{
ofstream out(path.c_str(), ios::binary);
if(out.is_open())
for(int i=0; i<size; ++i)
out.write((const char *)&vector[i], sizeof(double));
out.close();
}
}
void CDoubleVector::loadData(string path)
{
ifstream in(path.c_str(), ios::binary);
if(in.is_open())
{
in.seekg(0, ios::end);
vector = new double[size = (int)(in.tellg()/sizeof(double))];
in.seekg(0, ios::beg);
for(int i=0; i<size; ++i)
in.read((char *)&vector[i], sizeof(double));
}
else
cout<<"error";
in.close();
}
void CDoubleVector::saveResult(string path) const
{
if(size > 0)
{
ofstream out(path.c_str(), ios::trunc);
if(out.is_open())
out<<calculate();
out.close();
}
}
void CDoubleVector::saveResult(char *path) const
{
if(size > 0)
{
ofstream out(path, ios::trunc);
if(out.is_open())
out<<calculate();
out.close();
}
}
файл CDoubleVector.h:
#include <string>
#include <cmath>
#include <fstream>
using namespace std;
class CDoubleVector
{
private:
double *vector; // массив значений типа double (наш вектор)
int size; // размер массива
public:
CDoubleVector(); // конструктор по умолчанию
CDoubleVector(const CDoubleVector&); // конструктор копии
~CDoubleVector(); // деструктор
void Init(int vectorSize); // инициализация вектора
int getSize() const; // возврат значения размера вектора
void setValue(unsigned int index, double value); // установка значения определенного элемента вектора
double getValue(unsigned int index) const; // возврат значение некоторого элемента вектора
void clear(); // очистка (удаление вектора)
double getArithmeticMeanValue() const; // среднее арифметическое значений вектора
double getMin() const;
double getMax() const;
double calculate() const;
void saveData(string path) const; // сохранение вектора в бинарный файл
void loadData(string path); // получение значений вектора из бинаронго файла
void saveResult(string path) const; // сохранение результата вычислений метода calculate() в txt-файл
void saveResult(char *path) const;
};
файл Progect1:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", MainForm);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
файл Unit1.cpp:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
vector = new CDoubleVector();
CreateButton->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Exit1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::New1Click(TObject *Sender)
{
vector = new CDoubleVector();
ResultLabel->Caption = "";
VectorList->Clear();
VectorSize->Text = "";
EditElement->Text = "";
CreateButton->Visible = false;
CalculateButton->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::CreateButtonClick(TObject *Sender)
{
vector->Init(StrToFloat(VectorSize->Text));
VectorList->Clear();
CalculateButton->Visible = true;
for(int i=0; i<vector->getSize(); ++i)
VectorList->Items->Add( vector->getValue(i) );
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::VectorListClick(TObject *Sender)
{
EditElement->Text = VectorList->Items->Strings[VectorList->ItemIndex];
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::EditElementChange(TObject *Sender)
{
VectorList->Items->Strings[VectorList->ItemIndex] = EditElement->Text;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::CalculateButtonClick(TObject *Sender)
{
for(int i=0; i<vector->getSize(); ++i)
vector->setValue(i, StrToFloat(VectorList->Items->Strings[i]));
ResultLabel->Caption = vector->calculate();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::SavaAs1Click(TObject *Sender)
{
if(Save->Execute())
vector->saveResult(Save->FileName.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::VectorSizeKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key!=8 && (Key < '0' || Key > '9'))
VectorSize->ReadOnly = true;
else if(CreateButton->Visible)
{
if(VectorSize->Text.Length() == 1 && Key==8)
CreateButton->Visible = false;
}
else if( !(CreateButton->Visible) )
{
if(Key=='0')
VectorSize->ReadOnly = true;
else
CreateButton->Visible = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::VectorSizeKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key!=8 && (Key < '0' || Key > '9'))
VectorSize->ReadOnly = false;
else if(CreateButton->Visible == false && Key=='0')
VectorSize->ReadOnly = false;
}
файл Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
#include <jpeg.hpp>
#include <Menus.hpp>
#include <C:\Users\Freddy\Desktop\OOP_2014\lab6_1\lab6_1\CDoubleVector.h>
#include <ExtCtrls.hpp>
#include <jpeg.hpp>
#include <Menus.hpp>
#include <Dialogs.hpp>
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published: // IDE-managed Components
TPanel *MainPanel;
TEdit *VectorSize;
TButton *CreateButton;
TListBox *VectorList;
TEdit *EditElement;
TImage *Formula;
TButton *CalculateButton;
TLabel *ResultLabel;
TMainMenu *MainMenu;
TMenuItem *File;
TMenuItem *New1;
TMenuItem *SavaAs1;
TMenuItem *Exit1;
TSaveDialog *Save;
TMenuItem *N1;
TMenuItem *N2;
void __fastcall Exit1Click(TObject *Sender);
void __fastcall New1Click(TObject *Sender);
void __fastcall CreateButtonClick(TObject *Sender);
void __fastcall VectorListClick(TObject *Sender);
void __fastcall EditElementChange(TObject *Sender);
void __fastcall CalculateButtonClick(TObject *Sender);
void __fastcall SavaAs1Click(TObject *Sender);
void __fastcall VectorSizeKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall VectorSizeKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift);
private: // User declarations
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
CDoubleVector *vector;
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif
Тестирование задания 1:
Задание 2
Файл Project1.Cpp:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
Файл AssistProfessor.Cpp:
#include "AssistProfessor.h"
AssistProfessor::AssistProfessor()
{
surProf = (salary*15)/100.0;
surAss = (salary*25)/100.0;
salary += (surProf + surAss);
}
AssistProfessor::AssistProfessor(string n, string s, string m, unsigned int N)
{
name = n;
surname = s;
middle = m;
number = N;
Init(0, 0, 0, 0, 0);
}
void AssistProfessor::ReadInfo(string path)
{
Teacher::ReadInfo(path);
ifstream in(path.c_str(), ios::ate);
if(in.is_open())
{
string tmps;
float tmpf;
for(int i=0; i<3; ++i)
in>>tmps;
for(int i=0; i<8; ++i)
in>>tmpf;
in>>surProf;
in>>surAss;
in.close();
if(surProf==0 && surAss==0)
{
surProf = (salary*15)/100.0;
surAss = (salary*25)/100.0;
salary += (surProf + surAss);
}
}
}
void AssistProfessor::SaveInfo(string path) const
{
Teacher::SaveInfo(path);
ofstream out(path.c_str(), ios::app);
if(out.is_open())
{
out<<surProf<<endl;
out<<surAss;
}
out.close();
}
файл AssistProfessor.h:
#include "C:\Users\Freddy\Desktop\OOP_2014\lab6_2\lab6_2\Teacher.h"
class AssistProfessor : public Teacher
{
private:
float surProf, surAss;
public:
AssistProfessor();
AssistProfessor(string n, string s, string m, unsigned int N);
void ReadInfo(string path);
void SaveInfo(string path) const;
};
файл Unit1.cpp:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
path = "";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplyButtonClick(TObject *Sender)
{
if(ComboBox->ItemIndex == 0)
t = new Teacher((const char*)(EditName->Text.c_str()), (const char*)(EditSurname->Text.c_str()), (const char*)(EditMiddle->Text.c_str()), StrToFloat(EditNumber->Text));
else if(ComboBox->ItemIndex == 1)
t = new AssistProfessor((const char*)(EditName->Text.c_str()), (const char*)(EditSurname->Text.c_str()), (const char*)(EditMiddle->Text.c_str()), StrToFloat(EditNumber->Text));
t->Init(StrToInt(EditYear->Text), StrToFloat(EditSalary->Text), StrToFloat(EditAllowance->Text), StrToFloat(EditAid->Text), StrToFloat(EditVacationPay->Text));
TaxOut->Caption = t->GetTax();
Total->Caption = t->GetSalary();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveAsClick(TObject *Sender)
{
if(SaveDialog->Execute())
t->SaveInfo((const char*)(path = SaveDialog->FileName).c_str()) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Load1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Save1Click(TObject *Sender)
{
if(path != "")
t->SaveInfo((const char*)path.c_str()) ;
else if(SaveDialog->Execute())
t->SaveInfo((const char*)(path = SaveDialog->FileName).c_str()) ;
}
void __fastcall TForm1::New1Click(TObject *Sender)
{
path = "";
EditName->Text = "";
EditSurname->Text = "";
EditMiddle->Text = "";
EditSalary->Text = "";
EditSurcharge->Text = "";
EditAllowance->Text = "";
EditAid->Text = "";
EditVacationPay->Text = "";
EditNumber->Text = "";
EditYear->Text = "";
TaxOut->Caption = "";
Total->Caption = "";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Open1Click(TObject *Sender)
{
if(OpenDialog->Execute())
{
if(ComboBox->ItemIndex == 0)
t = new Teacher();
else if(ComboBox->ItemIndex == 1)
t = new AssistProfessor();
t->ReadInfo((const char*)(path = OpenDialog->FileName).c_str()) ;
EditName->Text = AnsiString(t->GetName().c_str());
EditSurname->Text = AnsiString(t->GetSurname().c_str());
EditMiddle->Text = AnsiString(t->GetMiddle().c_str());
EditSalary->Text = t->GetOldSalary();
EditSurcharge->Text = t->GetSurcharge();
EditAllowance->Text = t->GetAllowance();
EditAid->Text = t->GetAid();
EditVacationPay->Text = t->GetVacationPay();
EditNumber->Text = t->GetNumber();
EditYear->Text = t->GetYear();
TaxOut->Caption = t->GetTax();
Total->Caption = t->GetSalary();
}
}
//---------------------------------------------------------------------------