Описание программного обеспечения
Перейдём к непосредственной реализации. Используемое в курсовой работе програмное обеспечение будет ОС Микрософт Виндовс, 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}"
Скриншоты программы:


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