Скачиваний:
20
Добавлен:
28.06.2014
Размер:
7.57 Кб
Скачать
/*---------------------------------------------------------------------------
	Курсовая работа "Автоколебания в химических реакциях"
	Автор: Захаров А. Е.
	Московский Энергетический Институт (Технический Университет), 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();
}
//---------------------------------------------------------------------------

Соседние файлы в папке Исходные коды