Скачиваний:
29
Добавлен:
01.05.2014
Размер:
33.19 Кб
Скачать
unit Modul;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, ExtCtrls, Buttons, ComCtrls,Instances,RuleItem,DmmTypes,
Grids, OleServer, Excel2000,ItemSet;

type

TElemSteck = Class {Описание класса элемента стека}
public
index: integer; //индекс
val:double; //значение
constructor Create(index1: integer;val1:double);

end;

TExpertMod = class(TForm)
Memo1: TMemo;
MainMenu1: TMainMenu;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Image1: TImage;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ProgressBar1: TProgressBar;
Image3: TImage;
Label7: TLabel;
Panel2: TPanel;
Label8: TLabel;
Edit3: TEdit;
Label9: TLabel;
ListBox1: TListBox;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
BitBtn7: TBitBtn;
GreedAtr: TStringGrid;
OpenDialog1: TOpenDialog;
ExcelApplication1: TExcelApplication;
N1: TMenuItem;
N5: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
SaveDialog1: TSaveDialog;
BitBtn8: TBitBtn;
procedure N5Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure prbar(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure BitBtn7Click(Sender: TObject);
procedure ClickGreed(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N12Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure closeform(Sender: TObject; var Action: TCloseAction);
procedure BitBtn8Click(Sender: TObject);




private
{ Private declarations }
procedure PrintAttr(i:integer;inst1:TDMInstances);
procedure GreedAtrFull(inst1:TDMInstances);
public
{ Public declarations }
procedure Show(rul:TList;inst1:TDMInstances);
procedure otvet(index:integer);
procedure EnterAtr;
procedure TakeVal(n:integer;list:Tlist);
procedure takeSys(sys1:integer);
end;

var
ExpertMod: TExpertMod;

implementation

uses DmmConstants,logic,logic_str,MainForm;
{$R *.dfm}
var nom:integer; {номер последнего правила -для объяснений}
list_true_rules:TList; {список номеров доказанных правил -для объяснений}
Rules:TList;
inst:TDMInstances; {а это нужно позарез, так как инсты придется менять}
N: integer; {Количесиво уже введенных атрибутов}
OC:integer; {индекс основной цели, если она задана}
OC_name: AnsiString;
sys:integer; {Хранит состояние системы, для реализации подсказок}
{1-ввод первоначальных данных}
{2-выполнение логического вывода}
{3-результат получен}

constructor TElemSteck.Create(index1: integer;val1:double);
begin
index:=index1;
val:=val1;
end;


procedure TExpertMod.TakeSys(sys1:integer);
begin
sys:=sys1;
end;

{Процедура выводит значения i того атрибута на экран}
procedure TExpertMod.PrintAttr(i:integer;inst1:TDMInstances);
var j:integer;
begin
ExpertMod.Memo1.Lines.Add('');
{Имя атр в Edit}
ExpertMod.Edit1.Enabled:=true;
ExpertMod.Edit1.Text:=inst1.attribute(i).name;
ExpertMod.Edit1.Enabled:=false;

{Если значение введено,то его тоже в Edit}
ExpertMod.Edit2.Clear;
if inst1.instance(i).value(2)=1 then
begin
if inst1.attribute(i).attributeType=1 then ExpertMod.Edit2.Text:=FloatToStr(inst1.instance(i).value(1));
if inst1.attribute(i).attributeType=2 then ExpertMod.Edit2.Text:=inst1.attribute(i).value(round(inst1.instance(i).value(1)));
end;

{Если атрибут - основная цель}
if (ExpertMod.Edit1.Text=OC_name)and(OC_name<>'') then ExpertMod.Edit2.Text:='Основная цель';

{Метки типа атрибута}
ExpertMod.Label4.Visible:=false;
ExpertMod.Label5.Visible:=false;
if inst1.attribute(i).attributeType=1 then ExpertMod.Label4.Visible:=true;
if inst1.attribute(i).attributeType=2 then ExpertMod.Label5.Visible:=true;

{Возможные значения атрибутов}
if inst1.attribute(i).attributeType=1 then {Если атрибут числовой,}
begin
{Выводим значения верхней и нижней границ}

ExpertMod.Memo1.Lines.Add('Верхняя граница: '+inttostr(round(inst1.attribute(i).getLowerNumericBound)));
ExpertMod.Memo1.Lines.Add('Нижняя граница: '+inttostr(round(inst1.attribute(i).getUpperBumericBound)));
end;

if inst1.attribute(i).attributeType=2 then
begin

ExpertMod.Memo1.Lines.Add('Возможные значения: ');

for j:=0 to inst1.attribute(i).numValues-1 do {По всем запися в m_Values}
begin
// value:=inst1.attribute(i).value(j);

ExpertMod.Memo1.Lines.Add(inst1.attribute(i).value(j));
end;
end;

ExpertMod.Memo1.Lines.Add('');
{данные об общем количестве атрибутов}
if sys=1 then begin
ExpertMod.Memo1.Lines.Add('Общее количество атрибутов: '+inttostr(inst1.numAttributes));
ExpertMod.Memo1.Lines.Add('Номер текущего атрибута: '+inttostr(i+1));
ExpertMod.Memo1.Lines.Add('Введено значений атрибутов: '+inttostr(N));
end;

end;

{Открытие формы по процедуре с параметрами}
procedure TExpertMod.Show(rul:TList;inst1:TDMInstances);
var Dir: array [0..256] of Char;
begin

nom:=-1;
list_true_rules:=nil;
OC:=-1;
OC_name:='';

ExpertMod.Edit2.Text:='';
ExpertMod.Panel1.Visible:=true;
ExpertMod.Panel2.Visible:=false;
ExpertMod.Memo1.Clear;

sys:=1;

try
inst:= TDMInstances.Create(inst1);

try
inst.CleanupInstance;
Rules:=rul;
except
Application.MessageBox('Произошла ошибка при очистке массива атрибутов','Ошибка');
end;

except
Application.MessageBox('Произошла ошибка при создании копии массива атрибутов'+
#13+#10+'Попробуйте сначала загрузить данные из файла. Ж-)','Ошибка');
ExpertMod.Close;
end;
{Открытие панели ввода атрибутов}
N:=0;
ExpertMod.BitBtn1.Tag:=0; {Играет роль счетчика введенных атрибутов}

ExpertMod.Memo1.Lines.Add('Чтобы задать основную цель, Введите в качестве значения знак "!"');
ExpertMod.Memo1.Lines.Add('Общее количество атрибутов: '+inttostr(inst.numAttributes));
ExpertMod.Memo1.Lines.Add('Номер текущего атрибута: '+inttostr(ExpertMod.BitBtn1.Tag+1));

ExpertMod.Label4.Visible:=false;
ExpertMod.Label5.Visible:=false;
ExpertMod.Label6.Visible:=false;
ExpertMod.Image3.visible:=false;
ExpertMod.Label7.Visible:=false;
ExpertMod.BitBtn1.Default:=true;
ExpertMod.BitBtn7.Visible:=true;

{Выводит параметры первого атрибута}
PrintAttr(ExpertMod.BitBtn1.Tag,inst);

{инициализация таблицы}
GreedAtrFull(inst);
end;

{Процедурка на загрузку файла из Exel}
procedure TExpertMod.N5Click(Sender: TObject);
var file_name,s :String;
RangeMatrix:Variant;
X,Y,i,j:integer;
begin

if OpenDialog1.Execute then begin
file_name:=AnsiLowerCase(OpenDialog1.FileName);
try
ExpertMod.ExcelApplication1.Connect;
ExpertMod.ExcelApplication1.WorkBooks.Open(file_name,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
X:=ExpertMod.GreedAtr.RowCount;
Y:=ExpertMod.GreedAtr.ColCount;

RangeMatrix := ExpertMod.ExcelApplication1.Range['A1',ExpertMod.ExcelApplication1.Cells.Item[X,Y]].Value;

for i:=1 to X do begin
for j:=0 to X-1 do begin

if Trim(AnsiLowerCase(RangeMatrix[i,1]))=Trim(AnsiLowerCase(ExpertMod.GreedAtr.Cells[0,j]))
then begin
ExpertMod.otvet(j-1);
if AnsiLowerCase(Trim(RangeMatrix[i,2]))='основная цель' then ExpertMod.Edit2.Text:='!'
else ExpertMod.Edit2.Text:=Trim(RangeMatrix[i,2]);
ExpertMod.BitBtn1.Click;
end;
end;
end;
except
Application.MessageBox('Не удается открыть файл','Сообщение',MB_OK+MB_ICONWARNING)
end;
end;
end;

{Процедура срабатывает при выборе пункта меню "Задачи / Ввести значения"
устанавливает значения компонентам}
procedure TExpertMod.N3Click(Sender: TObject);
begin
ExpertMod.BitBtn5.Click;
ExpertMod.Edit2.Text:='';
ExpertMod.Panel1.Visible:=true;
ExpertMod.Panel2.Visible:=false;
ExpertMod.Memo1.Clear;
{Открытие панели ввода атрибутов}
N:=0;
ExpertMod.BitBtn1.Tag:=0; {Играет роль счетчика введенных атрибутов}

ExpertMod.Memo1.Lines.Add('Чтобы задать основную цель, Введите в качестве значения знак "!"');
ExpertMod.Memo1.Lines.Add('Общее количество атрибутов: '+inttostr(inst.numAttributes));
ExpertMod.Memo1.Lines.Add('Номер текущего атрибута: '+inttostr(ExpertMod.BitBtn1.Tag+1));

ExpertMod.Label4.Visible:=false;
ExpertMod.Label5.Visible:=false;
ExpertMod.Label6.Visible:=false;
ExpertMod.Image3.visible:=false;
ExpertMod.Label7.Visible:=false;
ExpertMod.BitBtn1.Default:=true;
ExpertMod.BitBtn7.Visible:=true;

{Выводит параметры первого атрибута}
PrintAttr(ExpertMod.BitBtn1.Tag,inst);
end;

{Процедура срабатывает при выборе пункта меню "Задачи / Расчет"
должна запускать процедуру расчета}
procedure TExpertMod.N4Click(Sender: TObject);
var LR:TList;
R11,R22,R33,R44,R55:^TDMRuleItem;
R1,R2,R3,R4,R5:TDMRuleItem;
I1,J1,I2,J2,I3,J3,I4,J4,I5,J5:TDMItemSet;
a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3,a4,b4,c4,d4,a5,b5,c5,d5:IArray;
begin
ExpertMod.BitBtn1.Default:=false;
ExpertMod.ProgressBar1.Position:=ExpertMod.ProgressBar1.Min;
ExpertMod.Memo1.Clear;
ExpertMod.Memo1.Lines.Add('Производятся архигромоздкие вычисления...');
ExpertMod.Memo1.Lines.Add('Пожалуста пождите...');
ExpertMod.ProgressBar1.Visible:=true;
ExpertMod.BitBtn7.Visible:=true;
sys:=2;
{
//-----------------------------------------------
//-1
SetLength(a1,5);
SetLength(b1,5);
SetLength(c1,5);
SetLength(d1,5);
a1[0]:=0;c1[0]:=0;
b1[3]:=1;d1[3]:=0;
a1[1]:=IMIN_VALUE;c1[1]:=IMIN_VALUE;
a1[2]:=IMIN_VALUE;c1[2]:=IMIN_VALUE;
a1[3]:=IMIN_VALUE;c1[3]:=IMIN_VALUE;
a1[4]:=IMIN_VALUE;c1[4]:=IMIN_VALUE;
b1[0]:=IMIN_VALUE;d1[0]:=IMIN_VALUE;
b1[1]:=IMIN_VALUE;d1[1]:=IMIN_VALUE;
b1[2]:=IMIN_VALUE;d1[2]:=IMIN_VALUE;
b1[4]:=IMIN_VALUE;d1[4]:=IMIN_VALUE;

I1:=TDMItemSet.Create(a1,c1);
J1:=TDMItemSet.Create(b1,d1);

R1:=TDMRuleItem.Create(I1,J1);
new(R11);
R11^:=R1;

//-2
SetLength(a2,5);
SetLength(b2,5);
SetLength(c2,5);
SetLength(d2,5);
a2[1]:=10;c2[1]:=-1;
b2[0]:=0;d2[0]:=0;
a2[0]:=IMIN_VALUE;c2[0]:=IMIN_VALUE;
a2[2]:=IMIN_VALUE;c2[2]:=IMIN_VALUE;
a2[3]:=IMIN_VALUE;c2[3]:=IMIN_VALUE;
a2[4]:=IMIN_VALUE;c2[4]:=IMIN_VALUE;
b2[1]:=IMIN_VALUE;d2[1]:=IMIN_VALUE;
b2[2]:=IMIN_VALUE;d2[2]:=IMIN_VALUE;
b2[3]:=IMIN_VALUE;d2[3]:=IMIN_VALUE;
b2[4]:=IMIN_VALUE;d2[4]:=IMIN_VALUE;

I2:=TDMItemSet.Create(a2,c2);
J2:=TDMItemSet.Create(b2,d2);

R2:=TDMRuleItem.Create(I2,J2);
new(R22);
R22^:=R2;

//-3
SetLength(a3,5);
SetLength(b3,5);
SetLength(c3,5);
SetLength(d3,5);
a3[3]:=1;c3[3]:=0;
a3[2]:=5;c3[2]:=1;
b3[4]:=0;d3[4]:=0;
a3[0]:=IMIN_VALUE;c3[0]:=IMIN_VALUE;
a3[1]:=IMIN_VALUE;c3[1]:=IMIN_VALUE;
a3[4]:=IMIN_VALUE;c3[4]:=IMIN_VALUE;
b3[0]:=IMIN_VALUE;d3[0]:=IMIN_VALUE;
b3[1]:=IMIN_VALUE;d3[1]:=IMIN_VALUE;
b3[2]:=IMIN_VALUE;d3[2]:=IMIN_VALUE;
b3[3]:=IMIN_VALUE;d3[3]:=IMIN_VALUE;

I3:=TDMItemSet.Create(a3,c3);
J3:=TDMItemSet.Create(b3,d3);

R3:=TDMRuleItem.Create(I3,J3);
new(R33);
R33^:=R3;

//-4
SetLength(a4,5);
SetLength(b4,5);
SetLength(c4,5);
SetLength(d4,5);
a4[2]:=4;c4[2]:=-1;
b4[3]:=0;d4[3]:=0;
a4[0]:=IMIN_VALUE;c4[0]:=IMIN_VALUE;
a4[1]:=IMIN_VALUE;c4[1]:=IMIN_VALUE;
a4[3]:=IMIN_VALUE;c4[3]:=IMIN_VALUE;
a4[4]:=IMIN_VALUE;c4[4]:=IMIN_VALUE;
b4[0]:=IMIN_VALUE;d4[0]:=IMIN_VALUE;
b4[1]:=IMIN_VALUE;d4[1]:=IMIN_VALUE;
b4[2]:=IMIN_VALUE;d4[2]:=IMIN_VALUE;
b4[4]:=IMIN_VALUE;d4[4]:=IMIN_VALUE;

I4:=TDMItemSet.Create(a4,c4);
J4:=TDMItemSet.Create(b4,d4);

R4:=TDMRuleItem.Create(I4,J4);
new(R44);
R44^:=R4;

//-5
SetLength(a5,5);
SetLength(b5,5);
SetLength(c5,5);
SetLength(d5,5);
a5[3]:=0;c5[3]:=0;
a5[2]:=5;c5[2]:=-1;
b5[4]:=1;d5[4]:=0;
a5[0]:=IMIN_VALUE;c5[0]:=IMIN_VALUE;
a5[1]:=IMIN_VALUE;c5[1]:=IMIN_VALUE;
a5[4]:=IMIN_VALUE;c5[4]:=IMIN_VALUE;
b5[0]:=IMIN_VALUE;d5[0]:=IMIN_VALUE;
b5[1]:=IMIN_VALUE;d5[1]:=IMIN_VALUE;
b5[2]:=IMIN_VALUE;d5[2]:=IMIN_VALUE;
b5[3]:=IMIN_VALUE;d5[3]:=IMIN_VALUE;

I5:=TDMItemSet.Create(a5,c5);
J5:=TDMItemSet.Create(b5,d5);

R5:=TDMRuleItem.Create(I5,J5);
new(R55);
R55^:=R5;

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

LR:=TList.Create;
LR.Clear;
LR.Add(R11);
LR.Add(R22);
LR.Add(R33);
LR.Add(R44);
LR.Add(R55);
Rules:=LR;
//-----------------------------------------------
}
try
//-----------------------------------------------
//Это запуск с передачей правил, пол. в рез. работы алгаритмов - рабочий
if OC<>-1 then logic.Execute_all(Rules,inst,OC)
else logic_str.Execute(Rules,inst);

except
ExpertMod.Memo1.Clear;
ExpertMod.Memo1.Lines.Add('Операция логического вывода выполнилась некорректно.');
ExpertMod.Memo1.Lines.Add('Возможно неправильно сформирован список правил.');
sys:=1;
end;
end;

{Процедура срабатывает в режиме ввода значений атрибутов
очищает поле значений}
procedure TExpertMod.BitBtn2Click(Sender: TObject);
begin
ExpertMod.Edit2.Text:='';
ExpertMod.Panel2.Visible:=true;
ExpertMod.Panel1.Visible:=false;
ExpertMod.ListBox1.Visible:=false;
ExpertMod.Panel2.Height:=150;
ExpertMod.BitBtn5.Visible:=true;
ExpertMod.BitBtn6.Click;
ExpertMod.BitBtn6.Visible:=false;
ExpertMod.BitBtn4.Top:=115;
ExpertMod.BitBtn3.Tag:=1;

end;

{Процедура срабатывает в режиме ввода значений атрибутов
вводит значение очередного атрибута}
procedure TExpertMod.EnterAtr;
var s,val_nom_str:string;
val_nom,correct,j,nom:integer;
val_num:Double;
begin
val_nom:=-1;
ExpertMod.Label7.Visible:=false;
ExpertMod.Memo1.Clear;
ExpertMod.Memo1.Lines.Add('****************************************');
//correct:=1;

if (ExpertMod.Edit2.Text='Основная цель') then ExpertMod.Edit2.Clear;

if (ExpertMod.edit2.Text='!')and(sys=1) then
begin
ExpertMod.Memo1.Lines.Add('Задана основная цель: ');
ExpertMod.Memo1.Lines.Add(ExpertMod.edit1.Text);
OC:=ExpertMod.BitBtn1.Tag; {Запомнили основную цель}

OC_name:=ExpertMod.Edit1.Text;

inst.instance(BitBtn1.Tag).setValue(2,0); {значит основная цель}

ExpertMod.BitBtn1.Tag:=ExpertMod.BitBtn1.Tag+1;

N:=N+1;

ExpertMod.Edit2.Clear;
{ Выводит параметры следующего атрибута}
if BitBtn1.Tag<inst.numAttributes then else BitBtn1.Tag:=0;

PrintAttr(ExpertMod.BitBtn1.Tag,inst);
end
else
begin {***}
if (ExpertMod.edit2.Text='')and(sys=1) then
begin
inst.instance(BitBtn1.Tag).setValue(2,2); {значит не задано значение}
ExpertMod.BitBtn1.Tag:=ExpertMod.BitBtn1.Tag+1;

ExpertMod.Edit2.Clear;
{ Выводит параметры следующего атрибута}
if BitBtn1.Tag<inst.numAttributes then else BitBtn1.Tag:=0;

PrintAttr(ExpertMod.BitBtn1.Tag,inst);
end
else
begin {**}

{Проверка введенного значения атрибута}
{числового}
if inst.attribute(ExpertMod.BitBtn1.Tag).attributeType=1 then
begin
correct:=1;
try
val_num:=StrToFloat(ExpertMod.edit2.Text);

if (inst.instance(ExpertMod.BitBtn1.Tag).value(2)=1) and
(inst.instance(ExpertMod.BitBtn1.Tag).value(1)=val_num) then correct:=2
else
begin
{!}
if (inst.attribute(ExpertMod.BitBtn1.Tag).getLowerNumericBound<>inst.attribute(ExpertMod.BitBtn1.Tag).getUpperBumericBound) then
if (val_num<inst.attribute(ExpertMod.BitBtn1.Tag).getLowerNumericBound) or
(val_num>inst.attribute(ExpertMod.BitBtn1.Tag).getUpperBumericBound) then
begin
ExpertMod.Label7.Visible:=true;
ExpertMod.Memo1.Lines.Add('Значение не попадает в заданный диапазон.');
correct:=0;
end;
end;
except
on e: Exception do
begin
ExpertMod.Memo1.Lines.Add('Неверно введено значение атрибута.');
ExpertMod.Memo1.Lines.Add('Обратите внимание на тип атрибута.');
PrintAttr(ExpertMod.BitBtn1.Tag,inst);
correct:=0;
end;
end;
end;

{номинального}
if inst.attribute(ExpertMod.BitBtn1.Tag).attributeType=2 then
begin
correct:=0;

try
//Если введен один символ и он цифра
if TryStrToInt(ExpertMod.edit2.Text,nom) then
begin
if inst.attribute(ExpertMod.BitBtn1.Tag).numValues-1>=nom then
begin
val_nom:=nom;
correct:=1;
end;
end
else
begin

//Если введена одна буква
if length(ExpertMod.edit2.Text)=1 then
begin
for j:=0 to inst.attribute(ExpertMod.BitBtn1.Tag).numValues-1 do {По всем запися в m_Values}
if pos(AnsiLowerCase(ExpertMod.edit2.Text),AnsiLowerCase(inst.attribute(ExpertMod.BitBtn1.Tag).value(j)))=1 then
begin
val_nom:=j;
correct:=1;
end;
end
else
for j:=0 to inst.attribute(ExpertMod.BitBtn1.Tag).numValues-1 do {По всем запися в m_Values}
if AnsiLowerCase(ExpertMod.edit2.Text)=AnsiLowerCase(inst.attribute(ExpertMod.BitBtn1.Tag).value(j)) then
begin
val_nom:=j;
correct:=1;
end;
end;

{Проверяем не повторяется ли значение}
if (inst.instance(ExpertMod.BitBtn1.Tag).value(2)=1) and
(inst.instance(ExpertMod.BitBtn1.Tag).value(1)=val_nom) then correct:=2;

if correct=0 then
begin
ExpertMod.Memo1.Lines.Add('Неверно введено значение атрибута.');
ExpertMod.Memo1.Lines.Add('Обратите внимание на тип атрибута.');
PrintAttr(ExpertMod.BitBtn1.Tag,inst);
end;


except
on e: Exception do
begin
ExpertMod.Memo1.Lines.Add('Неверно введено значение атрибута.');
ExpertMod.Memo1.Lines.Add('Обратите внимание на тип атрибута.');
PrintAttr(ExpertMod.BitBtn1.Tag,inst);
correct:=0;
end;
end;
end;

if correct=2 then begin
BitBtn1.Tag:=BitBtn1.Tag+1;
ExpertMod.Edit2.Clear;
if BitBtn1.Tag<inst.numAttributes then else BitBtn1.Tag:=0;
PrintAttr(ExpertMod.BitBtn1.Tag,inst);
end;

if correct=1 then begin {*}
{Вставка атрибутов}

if inst.attribute(ExpertMod.BitBtn1.Tag).attributeType=1 then
begin
if (inst.instance(ExpertMod.BitBtn1.Tag).value(2)=1) then
else begin inst.instance(BitBtn1.Tag).setValue(2,1); N:=N+1 end;

inst.instance(BitBtn1.Tag).setValue(1,val_num);

end;

if inst.attribute(ExpertMod.BitBtn1.Tag).attributeType=2 then
begin
if (inst.instance(ExpertMod.BitBtn1.Tag).value(2)=1) then
else begin inst.instance(BitBtn1.Tag).setValue(2,1); N:=N+1 end;

inst.instance(BitBtn1.Tag).setValue(1,val_nom);
end;

{Если система в режиме вывода}
if sys=2 then begin Logic.TakeVal(ExpertMod.BitBtn1.Tag,inst.instance(ExpertMod.BitBtn1.Tag).value(1)); logic.Execute(Rules,inst,OC); exit end;

BitBtn1.Tag:=BitBtn1.Tag+1;

ExpertMod.Edit2.Clear;

if BitBtn1.Tag<inst.numAttributes then else BitBtn1.Tag:=0;

if sys=1 then PrintAttr(ExpertMod.BitBtn1.Tag,inst);


end; {*}
end; {**}
end; {***}
end;


procedure TExpertMod.BitBtn1Click(Sender: TObject);
var val:double;
begin
if sys=3 then sys:=1;
ExpertMod.EnterAtr;
ExpertMod.GreedAtrFull(inst);
end;

{Процедура срабатывает при выборе пункта меню Вид / Список атрибутов
вводит имена всех атрибутов}
procedure TExpertMod.N8Click(Sender: TObject);
var i,j:integer;
name,typ,value:string;
LowerBound,UpperBound :Double;
begin
ExpertMod.BitBtn7.Visible:=true;
ExpertMod.BitBtn1.Default:=false;
ExpertMod.Memo1.Clear;
ExpertMod.Memo1.Lines.Add('Используемые атрибуты: ');
ExpertMod.Memo1.Lines.Add('');

for i:=0 to inst.numAttributes-1 do begin
name:=inst.attribute(i).name; {Выводим имя и тип атрибута}
typ:=inst.attribute(i).getAttrType;

ExpertMod.Memo1.Lines.Add(name+' '+typ);

if inst.attribute(i).attributeType=1 then {Если атрибут числовой,}
begin
LowerBound:=inst.attribute(i).getLowerNumericBound; {Выводим значения верхней и нижней границ}
UpperBound:=inst.attribute(i).getUpperBumericBound;

ExpertMod.Memo1.Lines.Add('Верхняя граница: '+inttostr(round(UpperBound)));
ExpertMod.Memo1.Lines.Add('Нижняя граница: '+inttostr(round(LowerBound)));
end;

if inst.attribute(i).attributeType=2 then
begin

ExpertMod.Memo1.Lines.Add('Возможные значения: ');

for j:=0 to inst.attribute(i).numValues-1 do {По всем запися в m_Values}
begin
value:=inst.attribute(i).value(j);

ExpertMod.Memo1.Lines.Add(value);
end;
end;

ExpertMod.Memo1.Lines.Add('');
end;

end;

{Процедура срабатывает при выборе пункта меню Вид / Введенные значения
вводит значение всех введенных атрибутов}
procedure TExpertMod.N9Click(Sender: TObject);
var i: integer;
name,val: AnsiString;
begin
ExpertMod.BitBtn1.Default:=false;
ExpertMod.Memo1.Clear;
if N=0 then begin
ExpertMod.Memo1.Lines.Add('Значений не введено.');
ExpertMod.Memo1.Lines.Add('Список атрибутов Вы можете посмотреть в пункте Вид / Список атрибутов');
end
else begin

ExpertMod.Memo1.Lines.Add('Введенные значения: ');
ExpertMod.Memo1.Lines.Add('');


for i:=0 to inst.numAttributes-1 do
begin
name:=inst.attribute(i).name;

if inst.instance(i).value(2)=1 then
begin
if inst.attribute(i).attributeType=1 then val:=floattostr(inst.instance(i).value(1));
if inst.attribute(i).attributeType=2 then val:=inst.attribute(i).value(round(inst.instance(i).value(1)));
end
else
if (name=OC_name)and(OC_name<>'') then val:='Основная цель'
else val:='Значение не задано';

name:=name+' : '+val;
ExpertMod.Memo1.Lines.Add(name);
end;

end;
end;

{Процедура срабатывает по таймеру, отвечает за ProgressBar}
procedure TExpertMod.prbar(Sender: TObject);
begin
ExpertMod.ProgressBar1.StepBy(5);

if (ExpertMod.ProgressBar1.Position=ExpertMod.ProgressBar1.Max) then
begin
ExpertMod.ProgressBar1.Visible:=false;
end;
end;

{Процедура срабатывает в режиме Задать вопросы,
читает один из типовых вопросов}
procedure TExpertMod.ListBox1Click(Sender: TObject);
begin

ExpertMod.Edit3.text:=ExpertMod.ListBox1.Items.ValueFromIndex[ExpertMod.ListBox1.itemindex];

end;

{Процедура срабатывает при выборе пункта меню Задачи / Вопросы
задает начальные значения}
procedure TExpertMod.N6Click(Sender: TObject);
begin
ExpertMod.BitBtn1.Default:=false;
ExpertMod.Panel1.Visible:=false;
ExpertMod.Panel2.Visible:=true;
ExpertMod.BitBtn6.Click;
end;

{Процедура срабатывает при выборе пункта меню Задачи / Вопросы
по клику на вопросик. Запускает механизм ответа на вопрос}
procedure TExpertMod.BitBtn3Click(Sender: TObject);
var q_type:integer; {0-как, 1-Почему, 2-Стандартный из списка}
ind:integer;
begin
ExpertMod.Memo1.Clear;
ExpertMod.Memo1.Lines.Add(ExpertMod.Edit3.text);
q_type:=-1;

if pos('как',AnsiLowerCase(ExpertMod.Edit3.text))>0 then q_type:=0
else
if pos('почему',AnsiLowerCase(ExpertMod.Edit3.text))>0 then q_type:=1;

if q_type=0 then begin
ExpertMod.Memo1.Lines.Add('Ответ на вопрос "Как?": ');

if (sys=1) then OtvetPoch_1v(1)
else
if OC=-1 then
begin
logic_str.Otv_Kak(ExpertMod.BitBtn3.Tag-1,list_true_rules,Rules,inst);
ExpertMod.BitBtn3.Tag:=ExpertMod.BitBtn3.Tag+1;
if ExpertMod.BitBtn3.Tag> list_true_rules.Count then ExpertMod.BitBtn3.Tag:=1;
end
else begin
logic.Otv_Kak(ExpertMod.BitBtn3.Tag-1,list_true_rules,Rules,inst);
ExpertMod.BitBtn3.Tag:=ExpertMod.BitBtn3.Tag+1;
if ExpertMod.BitBtn3.Tag> list_true_rules.Count+1 then ExpertMod.BitBtn3.Tag:=1;
end;
end;
if q_type=1 then begin
ExpertMod.Memo1.Lines.Add('Ответ на вопрос "Почему?": ');

if (sys=1) then OtvetPoch_1v(2)
else
if OC=-1 then
logic_str.Otv_Poch
else
logic.Otv_Poch(nom,Rules,inst,sys);

end;
if q_type=-1 then ExpertMod.Memo1.Lines.Add('Ваш вопрос не понятен...')

end;

procedure TExpertMod.TakeVal(n:integer;list:Tlist);
begin
nom:=n;
list_true_rules:=list;
end;

{получить_ответ п конкретному значению}
{Выводит сведения по номеру атрибута и выставляет все параметры для ввода}
procedure TExpertMod.otvet(index:integer);
begin
ExpertMod.N3.Click;
ExpertMod.Memo1.Clear;
if sys=2 then begin
ExpertMod.Memo1.Lines.Add('*****************************************');
ExpertMod.Memo1.Lines.Add('Введите пожалуста значение атрибута.');
ExpertMod.Memo1.Lines.Add('Это необходимо для продолжения вывода.');
ExpertMod.Memo1.Lines.Add('*****************************************');
end;

ExpertMod.PrintAttr(index,inst);
ExpertMod.BitBtn1.Tag:=index;
end;


{Переключение между панельками}
procedure TExpertMod.BitBtn4Click(Sender: TObject);
begin
ExpertMod.BitBtn5.Click;
ExpertMod.Panel2.Visible:=false;
ExpertMod.Panel1.Visible:=true;

end;

{Переключение между панельками в обратную сторону}
procedure TExpertMod.BitBtn5Click(Sender: TObject);
begin
ExpertMod.Panel2.Height:=273;
ExpertMod.ListBox1.Visible:=true;
ExpertMod.BitBtn4.Top:=234;
ExpertMod.BitBtn5.Visible:=false;
ExpertMod.BitBtn6.Visible:=true;

ExpertMod.GreedAtr.Top:=288;
ExpertMod.GreedAtr.height:=265;
end;

{установка размера панельки}
procedure TExpertMod.BitBtn6Click(Sender: TObject);
begin
ExpertMod.Panel2.Height:=150;
ExpertMod.ListBox1.Visible:=false;
ExpertMod.BitBtn4.Top:=115;
ExpertMod.BitBtn5.Visible:=true;
ExpertMod.BitBtn6.Visible:=false;

ExpertMod.GreedAtr.Top:=165;
ExpertMod.GreedAtr.height:=388;

end;

{тут срабатывает блок логического аывода}
procedure TExpertMod.BitBtn7Click(Sender: TObject);
begin
ExpertMod.Close;
end;

{Заполняет значениями таблицу}
procedure TExpertMod.GreedAtrFull(inst1:TDMInstances);
var i,j:integer;
begin
ExpertMod.GreedAtr.RowCount:=inst1.numAttributes+1;
ExpertMod.GreedAtr.Cells[0,0]:='Атрибут';
ExpertMod.GreedAtr.Cells[1,0]:='Значение';

for i:=1 to ExpertMod.GreedAtr.RowCount do
ExpertMod.GreedAtr.Cells[1,i]:='';

if OC<>-1 then ExpertMod.GreedAtr.Cells[1,OC+1]:='основная цель';

for i:=1 to inst1.numAttributes do
begin

ExpertMod.GreedAtr.Cells[0,i]:=inst1.attribute(i-1).name;
if inst1.instance(i-1).value(2)=1 then
begin
if inst1.attribute(i-1).attributeType=1 then ExpertMod.GreedAtr.Cells[1,i]:=FloatToStr(inst1.instance(i-1).value(1));
if inst1.attribute(i-1).attributeType=2 then ExpertMod.GreedAtr.Cells[1,i]:=inst1.attribute(i-1).value(round(inst1.instance(i-1).value(1)));
end;

end;

end;


procedure TExpertMod.ClickGreed(Sender: TObject);
var X,Y,Col,Row:Integer;
s:string;
begin
if sys=3 then sys:=1;
X:=mouse.CursorPos.X-ExpertMod.Left-5-ExpertMod.GreedAtr.Left;
Y:=mouse.CursorPos.Y-ExpertMod.Top-42-ExpertMod.GreedAtr.Top;
ExpertMod.GreedAtr.MouseToCell(X,Y,Col,Row);

ExpertMod.otvet(Row-1);

ExpertMod.Edit2.SetFocus;
end;


procedure TExpertMod.N10Click(Sender: TObject);
var file_res,str:string;
res:textfile;
vih:boolean;
begin
try

if sys=1 then file_res:='\Help1.txt'
else file_res:='\Help2.txt';
AssignFile(res,file_res);
Reset(res);
try

ExpertMod.Memo1.Clear;
vih:=true;
while vih do
begin
readln(res,str);

if str='*****' then vih:=false
else ExpertMod.Memo1.Lines.Add(str);

end;

finally
closefile(res);
end;

except
Application.MessageBox('Не определен доступ к файлу','Сообщение',MB_OK+MB_ICONWARNING)
end;
end;


procedure TExpertMod.N12Click(Sender: TObject);
begin
ExpertMod.Close;
end;

{процедурка на сохранение таблицы в файле}
procedure TExpertMod.N11Click(Sender: TObject);
var filename,s:string;
TabGrid : Variant;
i,k,R,C:integer;
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
begin


if not ExpertMod.SaveDialog1.Execute then Exit;
filename:=ExpertMod.SaveDialog1.FileName;

try
try
R:=ExpertMod.GreedAtr.RowCount;
C:=ExpertMod.GreedAtr.ColCount;

TabGrid := VarArrayCreate([0,(R - 1),0,(C - 1)],VarOleStr);

k:=0;
for i := 1 to R-1 do
begin
if ExpertMod.GreedAtr.Cells[1,i]<>'' then begin
TabGrid[k,0] := ExpertMod.GreedAtr.Cells[0,i];
TabGrid[k,1] := ExpertMod.GreedAtr.Cells[1,i];
k:=k+1;
end;
end;

ExpertMod.ExcelApplication1.Connect;
ExpertMod.ExcelApplication1.WorkBooks.Add(xlWBatWorkSheet,0);
WorkBk := ExpertMod.ExcelApplication1.WorkBooks.Item[1];
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
Worksheet.Range['A1',Worksheet.Cells.Item[R,C]].Value := TabGrid;
WorkSheet.Name := 'Expert System';
Worksheet.Columns.HorizontalAlignment := xlLeft;
WorkSheet.Columns.ColumnWidth := 14;
WorkSheet.Range['A' + IntToStr(1),'A' + IntToStr(R)].ColumnWidth := 31;
ExpertMod.ExcelApplication1.Visible[0] := False;

if FileExists(filename) then
DeleteFile(filename);
WorkBk.Close(True, filename, 0, 0);
except

Application.MessageBox('Не удалось сохранить файл','Сообщение',MB_OK+MB_ICONWARNING)
end;
finally
ExpertMod.ExcelApplication1.Disconnect;
TabGrid := Unassigned;
end;
end;

procedure TExpertMod.closeform(Sender: TObject; var Action: TCloseAction);
begin
Form1.Enabled:=true;
end;


//Сброс результатов
procedure TExpertMod.BitBtn8Click(Sender: TObject);
var i:integer;
begin
try
// inst.CleanupInstance;
nom:=-1;
list_true_rules.Free;
N:=0;
OC:=-1;
OC_name:='';
sys:=1;

for i:=1 to inst.numAttributes do begin
ExpertMod.GreedAtr.Cells[1,i]:='';
inst.instance(i-1).setValue(2,0);
inst.instance(i-1).setValue(1,0);
end;

except
ExpertMod.Memo1.Lines.Clear;
ExpertMod.Memo1.Lines.Add('*************************************');
ExpertMod.Memo1.Lines.Add('Операция очистки не может быть');
ExpertMod.Memo1.Lines.Add('выполнена.');
ExpertMod.Memo1.Lines.Add('*************************************');
end;
end;

end.
Соседние файлы в папке ExpertModule