Смекни!
smekni.com

Клиентская часть технологической среды для разработки больших экономических моделей: компоненты поддержки работы эксперта-экономиста при формировании и отладке (в расчетном режиме) структурного текста (стр. 6 из 13)

Процедура TfmVar.BitBtn1Click.

Дерево модели может включать в себя переменные, подмодели, а также группы из переменных и подмоделей, но на данном этапе развития проекта понятие группы пока не рассматривается.. Также пока не существует модели макроэкономики, которая была бы структурирована достаточным образом, т.е. в нее кроме переменных входила бы хоть одна подмодель. Таким образом, на данном этапе развития проекта имеет смысл говорить о модели, состоящей только из переменных. Программно это выполнено следующим образом: после ввода имени переменных, комментария и индексов, от которых зависит переменная, из таблицы indexes.db с помощью SQL - запроса выбирается информация по индексам, от которых зависит переменная, и, на основании этой информации, формируется таблица для первоначальных значений. Далее, после того, как пользователь ввел начальные значения переменной, заполняются таблицы inter.db, param.db, params.db и var_value.db. Все это делает процедура класса fmVar.



Рис.11. алгоритм работы процедуры TfmVar.BitBtn1Clickформы fmVar.

var

i,j,num : longint;

Two : Boolean; - имеет значение True, когда переменная зависит от 2-х индексов

begin

if (eVar.Text='') or (lbVar.Items.Count=0) then exit;

if lbVar.Items.Count>2 then begin

MessageDlg('В переменной должно быть не больше двух индексов',mtError,[mbOk],0);

exit;

end;

IndexChance:=not IndexChance;

lbAll.Enabled:=not lbAll.Enabled;

lbVar.Enabled:=not lbVar.Enabled;

sgVar.Enabled:=not sgVar.Enabled;

eVar.Enabled:=not eVar.Enabled;

eRem.Enabled:=not eRem.Enabled;

sgVar.ShowHint:=not sgVar.ShowHint;

if lbVar.Items.Count=2 then Two:=True

elseTwo:=False;

Кнопка Ok нажата один раз

if not IndexChance then begin

fmMain.qMain.SQL.Clear;

Выборкапараметровиндексов

fmMain.qMain.SQL.Add('SELECT * from Indexes where ID='+#39+lbVar.Items.Strings[0]+#39+';');

fmMain.qMain.Open;

Количествостолбцовтаблицы sgVar

sgVar.ColCount:=round((fmMain.qMain.FieldByName('Mx').AsInteger-fmMain.qMain.FieldByName('Mn').AsInteger) div fmMain.qMain.FieldByName('Step').AsInteger+1)+1;

Если переменная зависит от 2-х индексов

if Two then begin

fmMain.qSec.SQL.Clear;

fmMain.qSec.SQL.Add('SELECT * from Indexes where ID='+#39+lbVar.Items.Strings[1]+#39+';');

fmMain.qSec.Open;

Количество строк таблицы sgVar для второго индекса

sgVar.RowCount:=round((fmMain.qSec.FieldByName('Mx').AsInteger-fmMain.qSec.FieldByName('Mn').AsInteger) divfmMain.qSec.FieldByName('Step').AsInteger+1)+1;

end;

Заполнение верхней строки таблицы sgVar значениями индекса

sgVar.FixedRows:=1;

sgVar.FixedCols:=1;

for i:=1 to sgVar.ColCount-1 do

sgVar.Cells[i,0]:=IntToStr(fmMain.qMain.FieldByName('Mn').AsInteger+(i-1)*fmMain.qMain.FieldByName('Step').AsInteger);

Если переменная зависит от 2-х индексов

ifTwothenbegin

Заполнение первого столбца таблицы sgVar значениями второго индекса

for i:=1 to sgVar.RowCount-1 do

sgVar.Cells[0,i]:=IntToStr(fmMain.qSec.FieldByName('Mn').AsInteger+(i-1)*fmMain.qSec.FieldByName('Step').AsInteger); sgVar.Cells[0,0]:=fmMain.qSec.FieldByName('Id').AsString+'\'+fmMain.qMain.FieldByName('Id').AsString;

end

else sgVar.Cells[0,0]:=fmMain.qMain.FieldByName('Id').AsString;

fmMain.qMain.Close;

fmMain.qSec.Close;

end

Кнопка Ok нажата второй раз

else begin

for i:=0 to lbVar.Items.Count-1 do begin

fmMain.qMain.SQL.Clear;

Заносим имя переменной и ее индекс в таблицу Inter

fmMain.qMain.SQL.Add('INSERT INTO Inter VALUES('+#39+eVar.Text+#39+','+#39+lbVar.Items.Strings[i]+#39+',1,'+#39+'v'+#39+');');

fmMain.qMain.ExecSQL;

end;

num:=0;

Заносим в базу данных значения переменных иэ табл. sgVar

for i:=1 to sgVar.ColCount-1 do

for j:=1 to sgVar.RowCount-1 do begin

fmMain.qMain.SQL.Clear;

inc(num);

fmMain.qMain.SQL.Add('INSERT INTO Param VALUES('+#39+eVar.Text+#39+','+#39+lbVar.Items.Strings[0]+#39+','+#39+sgVar.Cells[i,0]+#39+','+IntToStr(num)+');');

fmMain.qMain.ExecSQL;

Заносимвтабл. Param имена переменных и их комментарии

if Two then begin

fmMain.qMain.SQL.Clear;

fmMain.qMain.SQL.Add('INSERT INTO Param VALUES('+#39+eVar.Text+#39+','+#39+lbVar.Items.Strings[1]+#39+','+#39+sgVar.Cells[0,j]+#39+','+IntToStr(num)+');');

fmMain.qMain.ExecSQL;

end;

fmMain.qMain.SQL.Clear;

fmMain.qMain.SQL.Add('INSERT INTO Var_value VALUES('+#39+eVar.Text+#39+','+IntToStr(num)+','+#39+sgVar.Cells[i,j]+#39+','+'0);');

fmMain.qMain.ExecSQL;

fmMain.qMain.SQL.Clear;

fmMain.qMain.SQL.Add('INSERT INTO Var_value VALUES('+#39+eVar.Text+#39+','+IntToStr(num)+'," ",'+'-1);');

fmMain.qMain.ExecSQL;

end;

fmMain.qMain.SQL.Clear;

fmMain.qMain.SQL.Add('INSERT INTO Params (id,remark) VALUES('+#39+eVar.Text+#39+','+#39+eRem.Text+#39+')');// changed for MDI

fmMain.qMain.ExecSQL;

Добавляем переменную в дерево переменных

if not(TfmForm1(fmMain.ActiveMDIChild).tv.Selected.HasChildren or not(TfmForm1(fmMain.ActiveMDIChild).tv.Selected.Parent<>nil )) then TfmForm1(fmMain.ActiveMDIChild).tv.Items.AddChild(TfmForm1(fmMain.ActiveMDIChild).tv.Selected.Parent,eVar.Text)

else TfmForm1(fmMain.ActiveMDIChild).tv.Items.AddChild(TfmForm1(fmMain.ActiveMDIChild).tv.Selected,eVar.Text);

Close;

end;

end;

Модульформы fmSetInter.


Рис.12. форма fmSetInter.


Рис.13. алгоритмработыпроцедуры TfmSetInter.cb1Change формы fmSetInter.

Процедура TfmSetInter.cb1Change.

var

i:integer;

begin

Еслиминимальноезначениеизменено

if TComboBox(sender).name='cb1' then begin

Списку максимальных значений присвоить список минимальных

cb2.items:=cb1.items;

Если выбрано мин. значение – удаляем из макс. списка лишнее

if cb1.itemindex<>-1 then for i:=0 to cb1.itemindex-1 do cb2.Items.Delete(0);

end;

Если выбраны все значения – кнопка Ok доступна

if (cb1.ItemIndex<>-1) and (cb2.itemindex<>-1) then OKBtn.enabled:=true

else okBtn.enabled:=False;

Сохраняемзначения

min:=cb1.items[cb1.itemindex];

max:=cb2.items[cb2.itemindex];


Модульформы fmIndex.

Рис.14. форма fmIndex.


Рис.15. алгоритм работы процедуры TfmIndex.FormClose.



var

i : longint;

begin

Курсор в начало таблицы

tIndex.First;

цикл по всем строкам таблицы

for i:=1 to tIndex.RecordCount do begin

условиякорректности

if (tIndex.FieldByName('Mn').AsInteger>tIndex.FieldByName('Mx').AsInteger)

or (tIndex.FieldByName('Mn').AsInteger+tIndex.FieldByName('Step').AsInteger>tIndex.FieldByName('Mx').AsInteger)

thenbegin

сообщение об ошибке

MessageDlg('Введите привильное значение индекса', mtError, [mbOk], 0);

Action:=caNone;

exit;

end;

переход на следущую строку

tIndex.Next;

end;

закрытиетаблицы tIndex

tIndex.Active:=False;

end;


Глава 2

ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ

Технология программирования с использованием средств быстрой разработки приложений”

2. Технология программирования с использованием средств быстрой разработки приложений

2.1 Введение

Тема данной главы - технология быстрой разработки приложений - RAD (RapidApplicationDevelopment). Данная технология сравнительно нова, но она быстро становится популярной, многие производители средств разработки приложений взяли эту технологию на вооружение.

Хотя это и новый подход в программировании, но и до появления RAD–средств делались попытки облегчить труд программиста, сделать этот труд более продуктивным, повысив этим быстродействие и удобство создания приложений. Первоначально появились интегрированные среды разработки - IDE (IntegratedDevelopmentEnvironment), объединяющие компилятор, специальный текстовый редактор, ориентированный на работы с текстами на целевом языке программирования и средства отладки - трассировщик—дебаггер и другие. По сравнению с предыдущими средствами программирования это был большой шаг вперед, но затем появились CASE–средства, которые позволяли максимально визуализировать процесс создания программы, но пользоваться ими было чересчур неудобно из-за их негибкости. В большинстве случаев написать достаточно сложную программу было очень трудно. Сейчас эти средства используются там, где подход достаточно однообразен - например при написании средств работы с базами данных.

Средства же быстрой разработки приложений (в дальнейшем - RAD–средства), взяв все лучшее из интегрированных сред разработки и CASE систем, объединили мощь и гибкость работы с исходными текстами с удобством создания графического интерфейса пользователя - GUI (GraphicUserInterface). К сожалению, большинство RAD–средств не позволяют визуализировать логику самой программы, но и те методы, которые заложены в современные RAD–средства, позволяют поднять производительность разработки программ в 2-3 раза.

Первой вариантом RAD–средств можно назвать продукт фирмы Microsoft - VisualBasic, появившийся в начале девяностых годов. Но пик популярности подобных средств наступил совсем недавно - сразу несколько ведущих фирм по производству средств создания приложений анонсировали новые версии своих продуктов, которые уже могут по праву называться RAD–средствами. СрединихможноназватьMicrosoft Visual C++, Microsoft Visual Java, Power Builder (PowerSoft), Optima++ (PowerSoft), Borland Delphi, Borland C++ Builder имногодругих. В данной главе основной акцент будет делаться на систему BorlandDelphi 3, поскольку именно эта среда использовалась при разработке программы в рамках данного дипломного проекта. Соответственно, большее внимание будет уделяться и диалекту языка Pascal - ObjectPascal, который используется в качестве языка программирования в среде Delphi.

2.2 Особенности RAD–средств

Две основных черты RAD–средств - это визуальная компонентность и многократное использование кода. Каждая из этих черт предназначена для повышения производительности программирования. Рассмотрим их подробнее.


2.2.1 Визуальная компонентность

Данный подход является логическим развитием объектно-ориентированного программирования (ООП). Каждый компонент имеет свои события (events), методы (methods) и свойства (properties). Методы и события пришли из объектно-ориентированного программирования, а свойства являются привилегией компонентного подхода. Свойства позволяют изменить состояние компонента, причем как динамически - во время работы программы, так и статически - визуально во время разработки. Естественно, что компоненты имеет все те особенности, что и объекты в объектно-ориентированном программировании - наследование, полиморфизм и инкапсуляция. Таким образом, описание типичного компонента выглядит следующим образом: