Скачиваний:
43
Добавлен:
02.05.2014
Размер:
191.49 Кб
Скачать

Описание программного обеспечения

Перейдём к непосредственной реализации. Используемое в курсовой работе програмное обеспечение будет ОС Микрософт Виндовс, Inno Setup и Borland C++ Builder 6.0, который мы рассмотрим более подробно.

В среде Borland C++ Builder есть ряд возможностей, которые повышают удобство использования редактора и отладчика, некоторые из них доступны как через пункты меню, так и с помощью горячих клавиш, однако многие доступны только с клавиатуры.

Также в Borland C++ Builder присутствует совместимость с другими языками программирования (ассемблер, паскаль), что обеспечивает удобство в использовании библиотек сторонних разработчиков.

Должным образом использованный С++ дает вам значительные выгоды в сопровождении. Вы можете делать значительные изменения в поведении программы (типа перевода всей программы с английского языка на японский или переноса в другую операционную среду) при помощи незначительных изменений в исходном коде, ограниченных малым уголком этого кода. Подобные изменения в структурной системе обычно потребуют модификации поистине каждой функции в программе.

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

Пара слов о Inno Setup – программа предназначена для создания инсталляции. Почему именно Инно Сетап? –много функций и является freeware.

Контрольный пример

Листинг исходных кодов программы с комментариями.

MainForm.cpp

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "MainForm.h"

#include "funcmast.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//Функция SM будетзаменять функцию ShowMessage

void SM(String message)

{

ShowMessage(message);

}

//Функция redraw перерисовывает координатную сетку (чтобы очистить от графика)

void redraw()

{

Form1->Image1->Picture->Bitmap->LoadFromResourceName((int)HInstance,"bck");

Form1->Image1->Canvas->TextOutA(270,141,"X");

Form1->Image1->Canvas->TextOutA(141,3,"Y");

for(int x=21;x<281;x+=20)

{

Form1->Image1->Canvas->TextOutA(x,141,IntToStr((x-1)/20-7));

Form1->Image1->Canvas->TextOutA(141,x,IntToStr((x-1)/20-7)*(-1));

}

}

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

//Функция на создание формы

void __fastcall TForm1::FormCreate(TObject *Sender)

{

//Перерисовываем координатную сетку

redraw();

//Установка значиния масштаба по умолчанию (1:20)

mastab=20;

//Проверка реестра на наличие соответствующего ключа

TRegistry * pReg=new TRegistry;

pReg->RootKey=HKEY_LOCAL_MACHINE;

if(pReg->KeyExists("software\\AD Team\\kursa4_3_1"))

{

pReg->OpenKey("software\\AD Team\\kursa4_3_1",false);

if(pReg->ReadString("")!=ExtractFileDir(Application->ExeName))

{

//Если ключ не найден программа выдаст сообщение об ошибке и закроется

SM("Программа установленна некорректно!!\n\rОбратитесь к владельцу копии!!!!!!!!");

Application->Terminate();

}

}

pReg->Free();

}

//---------------------------------------------------------------------------

//Функция на перемещение курсора над координатной сеткой

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,

int X, int Y)

{

//Возвращает в LabeledEdit1 координаты мышки относительно координатной сетки

LabeledEdit1->Text="X="+FormatFloat("0.#",(X-139.5)/20)+",Y="+FormatFloat("0.#",((Y-140.0)/20*(-1)));

}

//---------------------------------------------------------------------------

//Переход к мастеру функций

void __fastcall TForm1::SpeedButton3Click(TObject *Sender)

{

Form2->Show();

Form1->Hide();

}

//---------------------------------------------------------------------------

//Непосредственно построение графика

void __fastcall TForm1::SpeedButton4Click(TObject *Sender)

{

long double xr;

//Очистка координатной плоскости

redraw();

//Задание цикла по X

for(float x=0;x<281;x+=0.01)

{

float X=(x-139.5)/mastab;//перевод из фактической координаты x в относительную X

//Создание объекта TMyParser, который считывает текстовое выражение функции и возвращает её //значение в точке X

TMyParser *parser=new TMyParser(Form2->RichEdit1->Text,"X="+FormatFloat("#.#####",X));

if(parser->Parse())

{

if(parser->Calc(xr,Form2->RadioButton1->Checked))

{

float y=140-xr*mastab;

if(y<281 && y>0)

Image1->Picture->Bitmap->Canvas->Pixels[x][y]=clBlack;

}

else

SM(parser->Errors);

}

else

SM(parser->Errors);

parser->Free();

}

}

//---------------------------------------------------------------------------

//Закрытие приложения

void __fastcall TForm1::N3Click(TObject *Sender)

{

Application->Terminate();

}

//---------------------------------------------------------------------------

//Сохранение файла

void __fastcall TForm1::N2Click(TObject *Sender)

{

if(SaveDialog1->Execute())

{

switch (SaveDialog1->FilterIndex){

//Проверка выбраного формата

case 1://Выбран формат png

{

TPNGObject *png=new TPNGObject;

png->Assign(Image1->Picture->Bitmap);

png->SaveToFile(SaveDialog1->FileName);

png->Free();

}

break;

case 2://Выбран формат jpeg

{

TJPEGImage *jp = new TJPEGImage();

jp->Assign(Image1->Picture->Bitmap);

jp->SaveToFile(SaveDialog1->FileName);

jp->Free();

}

break;

default://Другое (сохраняет в формате bmp)

Image1->Picture->Bitmap->SaveToFile(SaveDialog1->FileName);

}

//Сохранение функции в текстовый файл

Form2->RichEdit1->Lines->SaveToFile(SaveDialog1->FileName+".rtf");

}

}

//---------------------------------------------------------------------------

//Очистка координатной сетки

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)

{

redraw();

}

//---------------------------------------------------------------------------

//Увеличение масштаба

void __fastcall TForm1::SpeedButton5Click(TObject *Sender)

{

if(mastab<60)

mastab+=5;

LabeledEdit2->Text="1:"+IntToStr(mastab);

}

//---------------------------------------------------------------------------

//Уменьшение масштаба

void __fastcall TForm1::SpeedButton6Click(TObject *Sender)

{

if(mastab>5)

mastab-=5;

LabeledEdit2->Text="1:"+IntToStr(mastab);

}

//---------------------------------------------------------------------------

//Вывод сообщения о программе

void __fastcall TForm1::N6Click(TObject *Sender)

{

SM("Powered by Se AD WMD\n\r\t FIST\n\r\t2007(C)");

}

//---------------------------------------------------------------------------

//Загрузка функции из файла

void __fastcall TForm1::N7Click(TObject *Sender)

{

if(OpenDialog1->Execute())

{

Form2->RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);

}

}

//---------------------------------------------------------------------------

//Вызов помощи

void __fastcall TForm1::N5Click(TObject *Sender)

{

ShellExecuteA(0,NULL,".\\readme.txt",NULL,NULL,SW_SHOW);

}

//---------------------------------------------------------------------------

MainForm.H

//---------------------------------------------------------------------------

#ifndef MainFormH

#define MainFormH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ExtCtrls.hpp>

#include <math.h>

#include <Dialogs.hpp>

#include <pngextra.hpp>

#include <pngimage.hpp>

#include <pnglang.hpp>

#include <zlibpas.hpp>

#include <jpeg.hpp>

#include <Buttons.hpp>

#include <Menus.hpp>

#include <registry.hpp>

//Объявление функции SM

void SM(String message);

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

TImage *Image1;

TSaveDialog *SaveDialog1;

TSpeedButton *SpeedButton3;

TLabeledEdit *LabeledEdit1;

TSpeedButton *SpeedButton4;

TLabeledEdit *LabeledEdit2;

TSpeedButton *SpeedButton5;

TSpeedButton *SpeedButton6;

TMainMenu *MainMenu1;

TMenuItem *N1;

TMenuItem *N2;

TMenuItem *N3;

TMenuItem *N4;

TMenuItem *N5;

TMenuItem *N6;

TSpeedButton *SpeedButton1;

TMenuItem *N7;

TOpenDialog *OpenDialog1;

void __fastcall FormCreate(TObject *Sender);

void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift,

int X, int Y);

void __fastcall SpeedButton3Click(TObject *Sender);

void __fastcall SpeedButton4Click(TObject *Sender);

void __fastcall N3Click(TObject *Sender);

void __fastcall N2Click(TObject *Sender);

void __fastcall SpeedButton1Click(TObject *Sender);

void __fastcall SpeedButton5Click(TObject *Sender);

void __fastcall SpeedButton6Click(TObject *Sender);

void __fastcall N6Click(TObject *Sender);

void __fastcall N7Click(TObject *Sender);

void __fastcall N5Click(TObject *Sender);

private: // User declarations

public: int mastab; // Объявление глобальной переменной для масштаба

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

funcmast.cpp

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "funcmast.h"

#include "MainForm.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm2 *Form2;

//Функция для цветного преобразования введёной функции для наглядности

void COLOR()

{

int i,pos = Form2->RichEdit1->SelStart;

Form2->RichEdit1->SelStart=0;

Form2->RichEdit1->SelLength=Form2->RichEdit1->Text.Length();

Form2->RichEdit1->SelAttributes=Form2->RichEdit1->DefAttributes;

String s = Form2->RichEdit1->Text;

for(i=1;i<=s.Length();i+=1)

{

Form2->RichEdit1->SelStart = i-1;

Form2->RichEdit1->SelLength = 1;

if ((s[i] == '(') || (s[i] == ')') || (s[i] == '[') || (s[i] == ']'))

Form2->RichEdit1->SelAttributes->Color = clTeal;

else

if ((s[i] >= '0') && (s[i] <= '9') )

Form2->RichEdit1->SelAttributes->Color = clMaroon;

else

if (((s[i] >= 'a') && (s[i] <= 'z')) || ((s[i] >= 'A') && (s[i] <= 'Z')) || (s[i] == '_') )

{

Form2->RichEdit1->SelAttributes->Color = clBlack;

Form2->RichEdit1->SelAttributes->Style = Form2->RichEdit1->SelAttributes->Style<<fsBold;

}

else

if ((s[i] == '+') || (s[i] == '-') || (s[i] == '*') || (s[i] == '/') || (s[i] == '^') || (s[i] == '=') )

Form2->RichEdit1->SelAttributes->Color = clBlue;

else Form2->RichEdit1->SelAttributes->Color = clRed;

}

Form2->RichEdit1->SelStart=pos;

}

//Добавление единственного знака

void ADD(String funk)

{

int i,pos;

String Text;

Text="";

pos=Form2->RichEdit1->SelStart;

for(i=1;i<Form2->RichEdit1->SelStart+1;i+=1)

Text = Text + Form2->RichEdit1->Text[i];

Text = Text + funk;

if(Form2->RichEdit1->SelLength>0)

for(i=Form2->RichEdit1->SelStart+1;i<Form2->RichEdit1->SelStart + Form2->RichEdit1->SelLength;i+=1)

Text = Text + Form2->RichEdit1->Text[i];

if(Form2->RichEdit1->SelLength < Form2->RichEdit1->Text.Length())

for(i=Form2->RichEdit1->SelStart + Form2->RichEdit1->SelLength + 1;i<Form2->RichEdit1->Text.Length()+1;i+=1)

Text= Text + Form2->RichEdit1->Text[i];

Form2->RichEdit1->Text=Text;

Form2->RichEdit1->SelStart = pos + funk.Length();

COLOR();

}

//Добавление функции. От функции ADD(String funk) отличается тем, что после добавленого текста ставит //скобочки и перемещает указатель в позицию между скобками

void ADDFUNK(String funk)

{

int i,pos;

String Text;

Text="";

pos=Form2->RichEdit1->SelStart;

for(i=1;i<Form2->RichEdit1->SelStart+1;i+=1)

Text = Text + Form2->RichEdit1->Text[i];

Text = Text + " "+funk + "(";

if(Form2->RichEdit1->SelLength>0)

for(i=Form2->RichEdit1->SelStart+1;i<Form2->RichEdit1->SelStart + Form2->RichEdit1->SelLength;i+=1)

Text = Text + Form2->RichEdit1->Text[i];

Text = Text + ")";

if(Form2->RichEdit1->SelLength < Form2->RichEdit1->Text.Length())

for(i=Form2->RichEdit1->SelStart + Form2->RichEdit1->SelLength + 1;i<Form2->RichEdit1->Text.Length()+1;i+=1)

Text= Text + Form2->RichEdit1->Text[i];

Form2->RichEdit1->Text=Text;

Form2->RichEdit1->SelStart = pos + funk.Length() +2;

COLOR();

}

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

//На нажатие кнопки «Готово» возвращается на главную форму и закрывает мастер функций

void __fastcall TForm2::btnOKClick(TObject *Sender)

{

Form2->Hide();

Form1->Show();

}

//---------------------------------------------------------------------------

//Ниже приведены два кода на нажатие кнопок в пример использования функций ADD(String funk ) и

//ADDFUNK(String funk), остальной код не приведён в целях экономии места и за ненадобностью, т.к. он

//практически соответсвует приведёным ниже примерам.

void __fastcall TForm2::btnCtgHClick(TObject *Sender)

{

ADDFUNK("ctgh");

}

//---------------------------------------------------------------------------

void __fastcall TForm2::btn3Click(TObject *Sender)

{

ADD("3");

}

//---------------------------------------------------------------------------

//Нажатие кнопки «Влево» переводит курсор влево на 1 позицию

void __fastcall TForm2::btnLeftClick(TObject *Sender)

{

RichEdit1->SelStart-=1;

}

//---------------------------------------------------------------------------

//Нажатие кнопки «Вправо» переводит курсор вправо на 1 позицию

void __fastcall TForm2::btnRightClick(TObject *Sender)

{

RichEdit1->SelStart+=1;

}

//---------------------------------------------------------------------------

//Очистка функции

void __fastcall TForm2::btnClearClick(TObject *Sender)

{

RichEdit1->Text="";

}

//---------------------------------------------------------------------------

//На закрытие мастера функций появляется главное окно программы

void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)

{

Form1->Show();

}

//---------------------------------------------------------------------------

//Начальная инициализация мастера функций

void __fastcall TForm2::FormCreate(TObject *Sender)

{

RichEdit1->Text="cos(X^(2))";

RichEdit1->SelStart=12;

COLOR();

}

funkmast.h

//---------------------------------------------------------------------------

#ifndef funcmastH

#define funcmastH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Buttons.hpp>

#include <ComCtrls.hpp>

#include <ExtCtrls.hpp>

//Объявление констант pi и e

#define pi 3.141592653589793

#define e 2.718281828459045

#include "MyDeque.hpp"

#include "MyArr.hpp"

#include "MyParser.hpp"

//Объявление функций

void ADD(String funk);

void ADDFUNK(String funk);

void COLOR();

//---------------------------------------------------------------------------

class TForm2 : public TForm

{

__published: // IDE-managed Components

TRichEdit *RichEdit1;

TLabel *Label1;

TSpeedButton *btnE;

TSpeedButton *btnPi;

TSpeedButton *btnExp;

TSpeedButton *btnLn;

TSpeedButton *btnLg;

TSpeedButton *btnAbs;

TSpeedButton *btnSin;

TSpeedButton *btnCos;

TSpeedButton *btnTg;

TSpeedButton *btnCtg;

TSpeedButton *btnarcSin;

TSpeedButton *btnarcCos;

TSpeedButton *btnarcTg;

TSpeedButton *btnarcCtg;

TSpeedButton *btnSec;

TSpeedButton *btnCosec;

TSpeedButton *btnarcSec;

TSpeedButton *btnarcCsec;

TBevel *Bevel1;

TSpeedButton *btn7;

TSpeedButton *btn8;

TSpeedButton *btn9;

TSpeedButton *btn4;

TSpeedButton *btn5;

TSpeedButton *btn6;

TSpeedButton *btn1;

TSpeedButton *btn2;

TSpeedButton *btn3;

TSpeedButton *btnRackR;

TSpeedButton *btn0;

TSpeedButton *btnDot;

TSpeedButton *btnminus;

TSpeedButton *btnplus;

TSpeedButton *btnMnoz;

TSpeedButton *btndelit;

TSpeedButton *btnPower2;

TSpeedButton *btnSqrt;

TSpeedButton *btnPowerN;

TBevel *Bevel3;

TSpeedButton *btnSinH;

TSpeedButton *btnCosH;

TSpeedButton *btnTgH;

TSpeedButton *btnCtgH;

TSpeedButton *btnSecH;

TSpeedButton *btnCosecH;

TSpeedButton *btnOK;

TSpeedButton *btnClear;

TSpeedButton *btnLeft;

TSpeedButton *btnRight;

TSpeedButton *btnX;

TSpeedButton *btnRackL;

TRadioButton *RadioButton1;

TRadioButton *RadioButton2;

void __fastcall btnOKClick(TObject *Sender);

void __fastcall btnSinClick(TObject *Sender);

void __fastcall btnCosClick(TObject *Sender);

void __fastcall btnTgClick(TObject *Sender);

void __fastcall btnCtgClick(TObject *Sender);

void __fastcall btnSecClick(TObject *Sender);

void __fastcall btnCosecClick(TObject *Sender);

void __fastcall btnarcSinClick(TObject *Sender);

void __fastcall btnarcCosClick(TObject *Sender);

void __fastcall btnarcTgClick(TObject *Sender);

void __fastcall btnarcCtgClick(TObject *Sender);

void __fastcall btnarcSecClick(TObject *Sender);

void __fastcall btnarcCsecClick(TObject *Sender);

void __fastcall btnSinHClick(TObject *Sender);

void __fastcall btnCosHClick(TObject *Sender);

void __fastcall btnTgHClick(TObject *Sender);

void __fastcall btnCtgHClick(TObject *Sender);

void __fastcall btnSecHClick(TObject *Sender);

void __fastcall btnCosecHClick(TObject *Sender);

void __fastcall btn7Click(TObject *Sender);

void __fastcall btn4Click(TObject *Sender);

void __fastcall btn1Click(TObject *Sender);

void __fastcall btn8Click(TObject *Sender);

void __fastcall btn5Click(TObject *Sender);

void __fastcall btn2Click(TObject *Sender);

void __fastcall btn3Click(TObject *Sender);

void __fastcall btn0Click(TObject *Sender);

void __fastcall btnDotClick(TObject *Sender);

void __fastcall btn6Click(TObject *Sender);

void __fastcall btn9Click(TObject *Sender);

void __fastcall btnPower2Click(TObject *Sender);

void __fastcall btnSqrtClick(TObject *Sender);

void __fastcall btnPowerNClick(TObject *Sender);

void __fastcall btnSqrtNClick(TObject *Sender);

void __fastcall btnminusClick(TObject *Sender);

void __fastcall btnplusClick(TObject *Sender);

void __fastcall btnMnozClick(TObject *Sender);

void __fastcall btndelitClick(TObject *Sender);

void __fastcall btnXClick(TObject *Sender);

void __fastcall btnEClick(TObject *Sender);

void __fastcall btnPiClick(TObject *Sender);

void __fastcall btnLnClick(TObject *Sender);

void __fastcall btnLgClick(TObject *Sender);

void __fastcall btnExpClick(TObject *Sender);

void __fastcall btnAbsClick(TObject *Sender);

void __fastcall btnLeftClick(TObject *Sender);

void __fastcall btnRightClick(TObject *Sender);

void __fastcall btnClearClick(TObject *Sender);

void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

void __fastcall FormCreate(TObject *Sender);

void __fastcall btnRackLClick(TObject *Sender);

void __fastcall btnRackRClick(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm2(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm2 *Form2;

//---------------------------------------------------------------------------

#endif

Скрипт к Inno Setup для установки программы

[Setup]

AppName=Курсач 3-й курс

AppVerName=Рисовалка математических функций

DefaultDirName={pf}\MatPaint

DefaultGroupName=MatPaint

UninstallDisplayIcon={app}\kursa43.exe

OutputDir=userdocs:Inno Setup Examples Output

[Files]

Source: "kursa42.exe"; DestDir: "{app}"

Source: "MyProg.chm"; DestDir: "{app}"

Source: "cosx^2-sinx.png"; DestDir: "{app}\saved";

Source: "cosx^2-sinx.png.rtf"; DestDir: "{app}\saved";

Source: "e^X.jpg"; DestDir: "{app}\saved";

Source: "e^X.jpg.rtf"; DestDir: "{app}\saved";

Source: "sin(X^5).png"; DestDir: "{app}\saved";

Source: "sin(X^5).png.rtf"; DestDir: "{app}\saved";

Source: "funcmast.cpp"; DestDir: "{app}\source";

Source: "funcmast.dfm"; DestDir: "{app}\source";

Source: "funcmast.h"; DestDir: "{app}\source";

Source: "Kursa43.bpr"; DestDir: "{app}\source";

Source: "Kursa43.cpp"; DestDir: "{app}\source";

Source: "Kursa43.res"; DestDir: "{app}\source";

Source: "main.res"; DestDir: "{app}\source";

Source: "MainForm.cpp"; DestDir: "{app}\source";

Source: "MainForm.dfm"; DestDir: "{app}\source";

Source: "MainForm.h"; DestDir: "{app}\source";

Source: "readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]

Name: "{group}\Рисовалка"; Filename: "{app}\kursa43.exe"; WorkingDir: "{app}"

Name: "{group}\Удалить"; Filename: "{uninstallexe}"; WorkingDir: "{app}"

Name: "{commondesktop}\Рисовалка"; Filename: "{app}\kursa43.exe"; WorkingDir: "{app}"

[Registry]

; Start "Software\My Company\My Program" keys under HKEY_CURRENT_USER

; and HKEY_LOCAL_MACHINE. The flags tell it to always delete the

; "My Program" keys upon uninstall, and delete the "My Company" keys

; if there is nothing left in them.

Root: HKLM; Subkey: "Software\AD Team"; Flags: uninsdeletekeyifempty

Root: HKLM; Subkey: "Software\AD Team\kursa4_3_1"; Flags: uninsdeletekey

Root: HKLM; Subkey: "Software\AD Team\kursa4_3_1"; ValueType: string; ValueName: ""; ValueData: "{app}"

Скриншоты программы:

Выводы

В ходе работы закрепил и упорядочил знания по созданию, разработке и оформлению програмного обеспечения.