Добавил:
Tushkan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Курсовой проект Автоколебания в химических реакциях / Исходные коды / EditUnit
.cpp/*---------------------------------------------------------------------------
Курсовая работа "Автоколебания в химических реакциях"
Автор: Захаров А. Е.
Московский Энергетический Институт (Технический Университет), 2011 г.
---------------------------------------------------------------------------*/
#include <vcl.h>
#include <string>
#include <boost/regex.hpp>
#pragma hdrstop
#include "EditUnit.h"
#include "MainUnit.h"
#include "Common.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "sBitBtn"
#pragma link "sEdit"
#pragma link "sLabel"
#pragma link "sSkinProvider"
#pragma link "sComboBoxes"
#pragma link "sColorSelect"
#pragma link "sSpeedButton"
#pragma link "sCheckBox"
#pragma link "sTrackBar"
#pragma resource "*.dfm"
TEditForm1 *EditForm1;
settings Options_old, Options_new;
//---------------------------------------------------------------------------
__fastcall TEditForm1::TEditForm1(TComponent* Owner)
: TForm(Owner)
{
Options_old = Options;
// Концентрации исходных веществ
sTrackBar1->Position = int(Options.a * 10.);
sTrackBar2->Position = int(Options.b * 10.);
sLabel22->Caption = FloatToStr(Options.a);
sLabel23->Caption = FloatToStr(Options.b);
// Отрезок времени
sEdit3->Text = "[" + FloatToStr(Options.ta) + ";" + FloatToStr(Options.tb) + "]";
// Шаг
sEdit4->Text = Options.h;
// Параметры метода Рунге-Кутты
sEdit5->Text = Options.a1;
sEdit6->Text = Options.a2;
sEdit7->Text = Options.a3;
// Начальные условия
sTrackBar3->Position = int(Options.y0 * 10.);
sTrackBar4->Position = int(Options.x0 * 10.);
sLabel24->Caption = FloatToStr(Options.y0);
sLabel25->Caption = FloatToStr(Options.x0);
// Сетка
sCheckBox1->Checked = Options.show_grid;
// Семейство решений
sCheckBox2->Checked = Options.show_all;
}
//--- Настройки по умолчанию ------------------------------------------------
void __fastcall TEditForm1::sBitBtn1Click(TObject *Sender)
{
// Концентрации исходных веществ
sTrackBar1->Position = int(Options_default.a * 10.);
sTrackBar2->Position = int(Options_default.b * 10.);
sLabel22->Caption = FloatToStr(Options_default.a);
sLabel23->Caption = FloatToStr(Options_default.b);
// Отрезок времени
sEdit3->Text = "[" + FloatToStr(Options_default.ta) + ";" + FloatToStr(Options_default.tb) + "]";
// Шаг
sEdit4->Text = Options_default.h;
// Параметры метода Рунге-Кутты
sEdit5->Text = Options_default.a1;
sEdit6->Text = Options_default.a2;
sEdit7->Text = Options_default.a3;
// Начальные условия
sTrackBar3->Position = int(Options_default.y0 * 10.);
sTrackBar4->Position = int(Options_default.x0 * 10.);
sLabel24->Caption = FloatToStr(Options_default.y0);
sLabel25->Caption = FloatToStr(Options_default.x0);
// Сетка
sCheckBox1->Checked = Options_default.show_grid;
}
//--- Отмена сделанных изменений --------------------------------------------
void __fastcall TEditForm1::sBitBtn2Click(TObject *Sender)
{
Options = Options_old;
MainForm->recount();
Close();
}
//--- Сохранение настроект --------------------------------------------------
void __fastcall TEditForm1::sBitBtn3Click(TObject *Sender)
{
AnsiString ta, tb, segment, h, a1, a2, a3;
segment = sEdit3->Text.Trim();
h = sEdit4->Text.Trim();
a1 = sEdit5->Text.Trim();
a2 = sEdit6->Text.Trim();
a3 = sEdit7->Text.Trim();
if (segment == "" || h == "" || a1 == "" || a2 == "" || a3 == "")
{
MessageDlg ("Заполнены не все поля настроект!\nПожалуйста, введите недостающие параметры.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
std::string str(segment.c_str());
boost::smatch results;
boost::regex regexp("\\s*\\[\\s*([\-\\d\.\,]+)\\s*;\\s*([\-\\d\.\,]+)\\s*\\]\\s*");
if(!regex_match(str, results, regexp))
{
MessageDlg ("Неверный формат записи интервала!\nПожалуйста, проверьте введённый интервал.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
try
{
Options_new.ta = StrToFloat(results[1].str().c_str());
Options_new.tb = StrToFloat(results[2].str().c_str());
}
catch (...)
{
MessageDlg ("Неверный формат записи интервала!\nПожалуйста, проверьте введённый интервал.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
if(Options_new.ta >= Options_new.tb)
{
MessageDlg ("Неверный формат записи интервала!\nПожалуйста, проверьте введённый интервал.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
try
{
Options_new.h = StrToFloat(h);
}
catch (...)
{
MessageDlg ("Шаг должны быть вещественными числом!\nПожалуйста, проверьте введённое значение шага.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
if(Options_new.h <= 0)
{
MessageDlg ("Некорректное значение шага!\nПожалуйста, проверьте введённое значение шага.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
try
{
Options_new.a1 = StrToFloat(a1);
Options_new.a2 = StrToFloat(a2);
Options_new.a3 = StrToFloat(a3);
}
catch (...)
{
MessageDlg ("Параметры метода должны быть вещественными числами!\nПожалуйста, проверьте введённые значения параметров.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
if(Options_new.a1 != 0 || Options_new.a2 <= Options_new.a1 || Options_new.a3 <= Options_new.a2 || Options_new.a3 > 1)
{
MessageDlg ("Параметры метода должны удовлетворять условию 0 = a1 < a2 < a3 <= 1!\nПожалуйста, проверьте введённые значения параметров.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
Options_new.c1 = 1. / 3.;
Options_new.c2 = 1. / 3.;
Options_new.c3 = 1. / 3.;
Options_new.b2 = 1. / 3.;
Options_new.b31 = 1. / 3.;
Options_new.b32 = 1. / 3.;
Options_new.show_grid = sCheckBox1->Checked;
Options_new.show_all = sCheckBox2->Checked;
Options = Options_new;
MainForm->recount();
Close();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sTrackBar1Change(TObject *Sender)
{
Options_new.a = Options.a = double(sTrackBar1->Position) / 10.;
sTrackBar2->Max = int((pow(Options.a,2) + 1) * 10.);
sLabel22->Caption = Options.a;
MainForm->recount();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sTrackBar2Change(TObject *Sender)
{
Options_new.b = Options.b = double(sTrackBar2->Position) / 10.;
sLabel23->Caption = Options.b;
MainForm->recount();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sCheckBox1Click(TObject *Sender)
{
Options.show_grid = sCheckBox1->Checked;
MainForm->paint();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sTrackBar3Change(TObject *Sender)
{
Options_new.y0 = Options.y0 = double(sTrackBar3->Position) / 10.;
sLabel24->Caption = Options.y0;
MainForm->recount();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sTrackBar4Change(TObject *Sender)
{
Options_new.x0 = Options.x0 = double(sTrackBar4->Position) / 10.;
sLabel25->Caption = Options.x0;
MainForm->recount();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sCheckBox2Click(TObject *Sender)
{
Options.show_all = sCheckBox2->Checked;
MainForm->paint();
}
//---------------------------------------------------------------------------
Соседние файлы в папке Исходные коды