Файл: пк для решения задач линейного программирования симплексным методом.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.11.2023

Просмотров: 59

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


for j:=0 to MoreCount+EquallyCount-1 do

begin

Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);

for i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do

SimplexTable[i,j]:=0;

SimplexTable[length(SimplexTable)-1,j]:=1;

end;
//Целевая функция GoalFun

GoalFun:=nil;

with MainForm.ActiveMDIChild as TChildForm do

begin

SetLength(GoalFun,GoalChild.ColCount+1);

for i:=1 to GoalChild.ColCount do

begin

if parametersForm.Min.Checked then GoalFun[i]:=StrToFloat(goalChild.Cells[i-1,1])

else GoalFun[i]:=-1*StrToFloat(goalChild.Cells[i-1,1]);

end;

end;

//Искусственная функция ArtFun

ArtFun:=nil;

SetLength(ArtFun,length(SimplexTable)-1-MoreCount);

//i=1 - Значение иск. функции

for i:=1 to length(SimplexTable)-3 do

for j:=0 to MoreCount-1 do ArtFun[i-1]:=ArtFun[i-1]-SimplexTable[i,j];
//------------------------------------------------------------------------------

//Минимизация искусственной функции

//Базис

if MoreCount>0 then

begin

for j:=0 to MoreCount-1 do

SimplexTable[0,j]:=length(simplexTable)-MoreCount+j-1;

for i:=MoreCount to length(simplexTable[0])-1 do

SimplexTable[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+(i-MoreCount)-1;

end

else

for i:=0 to LessCount+EquallyCount-1 do

SimplexTable[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+i-1;
//2 нижние строки для оценок

SetLength(SimplexTable,length(SimplexTable),length(SimplexTable[0])+2);

for i:=0 to length(GoalFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-2]:=goalFun[i];

for i:=0 to length(ArtFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-1]:=ArtFun[i];
SimplexTableNew:=nil;

SetLength(SimplexTableNew,length(SimplexTable),length(SimplexTable[0]));

//итерации...

up:

repeat

if not art then inc(IterCount);

if IterCount=Parametersform.CountIteration.Value then

begin

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Достигнуто предельное число итераций. Решение не найдено');

exit;

end;

end;

{

//Может функция не ограничена? => поиск столбца с отрицательными коэф.

k:=0;

if art then

for i:=2 to length(simplexTable)-1 do

begin

if simplexTable[i,length(SimplexTable[0])-1]<0 then

begin

// k:=0;

for j:=0 to length(SimplexTable[0])-3 do

if simplexTable[i,j]<=0 then inc(k);

if k=length(SimplexTable[0])-2 then

begin

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Невозможно найти начальный базис');

exit;

end;

k:=0;

end;

end;

end;

k:=0;

if not art then

for i:=2 to length(simplexTable)-1 do

begin

if simplexTable[i,length(SimplexTable[0])-1]<0 then

begin

k:=0;

for j:=0 to length(SimplexTable[0])-2 do

if simplexTable[i,j]<=0 then inc(k);

if k=length(SimplexTable[0])-1 then

begin

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Целевая функция не ограничена');

exit;

end;

end;

end;

end;

}
//поиск первой минимальной из отрицательных оценки искуственной функции

ExtrEstimation:=100000;

extrItem:=0;

for i:=2 to length(simplexTable)-1 do

if (SimplexTable[i,length(SimplexTable[0])-1]
begin

extrItem:=i-1;{новый базис}

ExtrEstimation:=SimplexTable[i,length(SimplexTable[0])-1];

end;

if ExtrEstimation=100000 then goto fin;
{ВНИМАНИЕ!!! Delphi пропускает не используемые (по мнению Delphi) операторы.}

0>0>

//выбор рабочей строки (поиск минимального из положительных)

ExtrEstimation:=100000;

WLine:=0;

for j:=0 to length(simplexTable[0])-2 do

begin

if SimplexTable[extrItem+1,j]<>0 then

if (SimplexTable[1,j]/SimplexTable[extrItem+1,j]0) then

begin

WLine:=j;

ExtrEstimation:=SimplexTable[1,j]/SimplexTable[extrItem+1,j];

end;

end;

//новый базис

for i:=0 to length(SimplexTable[0])-1 do SimplexTableNew[0,i]:=SimplexTable[0,i];

SimplexTableNew[0,WLine]:=extrItem;

//перерасчет рабочей строки

for i:=1 to length(SimplexTable)-1 do SimplexTableNew[i,WLine]:=SimplexTable[I,wlINE]/SimplexTable[extrItem+1,wlINE];

//перерасчет коэффициентов

for i:=1 to length(SimplexTable)-1 do

for j:=0 to length(SimplexTable[0])-1 do

if j<>WLine then

SimplexTableNew[i,j]:=SimplexTable[i,j]-SimplexTable[i,Wline]*SimplexTable[extrItem+1,j]/SimplexTable[extrItem+1,WLine];

//копирование таблиц

for i:=0 to length(SimplexTable)-1 do for j:=0 to length(SimplexTable[0])-1 do SimplexTable[i,j]:=SimplexTableNew[i,j];

//Вывод текущего решения

if ParametersForm.CheckBox1.Checked then begin

bil:=false;

if not art then

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Итерация '+InttoStr(IterCount));

for i:=0 to GoalChild.ColCount-1 do

begin

for j:=0 to length(SimplexTable[0])-1 do

if i+1=SimplexTable[0,j] then

begin

task.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));

bil:=true;

end;

if not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');

bil:=false;

end;

end;

end;
until false;

fin:

if art then

begin

art:=false;

SetLength(SimplexTable,Length(SimplexTable)-MoreCount,Length(SimplexTable[0])-1);

goto up;

end;

//Результат

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Результат');

for i:=0 to GoalChild.ColCount-1 do

begin

for j:=0 to length(SimplexTable[0])-1 do

if i+1=SimplexTable[0,j] then

begin

task.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));

bil:=true;

end;

if not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');

bil:=false;

end;

task.Items.Add('');

if parametersForm.Min.Checked then

task.Items.Add('Минимальное значение функции '+FloatToStr(-1*(SimplexTable[1,length(SimplexTable[0])-1])))

else

task.Items.Add('Максимальное значение функции '+FloatToStr(SimplexTable[1,length(SimplexTable[0])-1]));

end;

end;
procedure TMainForm.SaveAsClick(Sender: TObject);

var

FExt: String;

begin

with SaveDialog1 do

begin

if ActiveMDIChild.Caption[1]='З' then

FileName:=ActiveMDIChild.Caption+'.tsk'

else

FileName:=ActiveMDIChild.Caption;

FExt:=ExtractFileExt(FileName);

if length(Fext)=0 then

FExt:='.tsk';

filter:='Files (*'+FExt+')|*'+FExt;

if Execute then

with ActiveMDIchild as TChildForm do

SaveData(FileName);

end;

end;
procedure TMainForm.PrintClick(Sender: TObject);

begin

PrintDialog1.Execute;

end;
procedure TMainForm.OpenClick(Sender: TObject);

var

s:string;

i,k:integer;

begin

if OpenDialog1.Execute then

begin

with fileMenu do

begin

if not N11.Visible then N11.Visible:=true;

k:=IndexOf(N1Name1);

for i:=count-3 downto k+1 do

begin

s:=items[i-1].caption;

s[2]:=chr(ord('0')+(i-k+1));

Items[i].Caption:=S;

Items[i].Visible:=Items[i-1].Visible;

end;

n1name1.Caption:='&1 '+OpenDialog1.FileName;

n1name1.Visible:=true;

end;

CreateChild(OpenDialog1.FileName);

with ActiveMDIChild as TChildForm do

LoadData(OpenDialog1.FileName);

ParametersForm.FormShow(Sender);

ParametersForm.Button3Click(Sender);

end;

end;
procedure TMainForm.N27Click(Sender: TObject);

begin

N27.checked:=not N27.checked;

if N27.checked then toolbar1.Visible:=true else toolbar1.Visible:=false;

end;
procedure TMainForm.N28Click(Sender: TObject);

begin

N28.checked:=not N28.checked;

if N28.checked then statusbar1.Visible:=true else statusbar1.Visible:=false;

end;

procedure TMainForm.N7Click(Sender: TObject);

var

SimplexTable,SimplexTableNew:array of array of extended;

GoalFun:array of extended;

ArtFun:array of extended;

ExtrEstimation:extended;

k,i,j,MoreCount,LessCount,EquallyCount,extrItem,WLine,IterCount: integer;

Art,bil:boolean;

label fin,up,up2;

begin

Art:=true;bil:=false;IterCount:=0;

SimplexTable:=nil;

MoreCount:=0;LessCount:=0;EquallyCount:=0;

{1}//Сортировка ограничений: 1) >=; 2) =; 3) <=.

{2}//Порождение начального базиса

{3}//Итерационное построение симплекс-таблиц
{1}//---------------------------------------------------------------------------

//Сортировка "Больше"

with MainForm.ActiveMDIChild as TChildForm do

begin

//строки в таблицах дочернего окна нумеруются с 1

//нулевая строка резервная

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

begin

if (SignsChild.Cells[0,i]='>') or (SignsChild.Cells[0,i]='>=') then

begin

inc(MoreCount);

SetLength(SimplexTable,LimChild.ColCount+2,MoreCount);

//коэффициенты

for j:=0 to LimChild.ColCount-1 do

SimplexTable[j+2,MoreCount-1]:=StrToFloat(LimChild.cells[j,i]);

//Пока нули (потом базис...)

SimplexTable[0,MoreCount-1]:=0;

//Значение (B i-ый)

SimplexTable[1,MoreCount-1]:=StrToFloat(BChild.cells[0,i]);

end;

end;
//Сортировка "Равно"

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

begin

if SignsChild.Cells[0,i]='=' then

begin

inc(EquallyCount);

SetLength(SimplexTable,LimChild.ColCount+2,MoreCount+EquallyCount);

//коэффициенты

for j:=0 to LimChild.ColCount-1 do

SimplexTable[j+2,MoreCount+EquallyCount-1]:=StrToFloat(LimChild.cells[j,i]);

//Пока нули (потом базис...)

SimplexTable[0,MoreCount+EquallyCount-1]:=0;

//Значение (B i-ый)

SimplexTable[1,MoreCount+EquallyCount-1]:=StrToFloat(BChild.cells[0,i]);

end;

end;
//Сортировка "Меньше"

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

begin

if (SignsChild.Cells[0,i]='<') or (SignsChild.Cells[0,i]='<=') then

begin

inc(LessCount);

SetLength(SimplexTable,LimChild.ColCount+2,MoreCount+EquallyCount+LessCount);

//коэффициенты

for j:=0 to LimChild.ColCount-1 do

SimplexTable[j+2,MoreCount+EquallyCount+LessCount-1]:=StrToFloat(LimChild.cells[j,i]);

//Пока нули (потом базис...)

SimplexTable[0,MoreCount+EquallyCount+LessCount-1]:=0;

//Значение (B i-ый)

SimplexTable[1,MoreCount+EquallyCount+LessCount-1]:=StrToFloat(BChild.cells[0,i]);

end;

end;

end;

{2}//---------------------------------------------------------------------------
//Порождение начального базиса

//2.1 Добавить коэф. -1 (>=)

for j:=0 to MoreCount-1 do

begin

Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);

for i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do

SimplexTable[i,j]:=0;

SimplexTable[length(SimplexTable)-1,j]:=-1;

end;
//2.2 Добавить коэф. 1 (<=)

for j:=MoreCount+EquallyCount to MoreCount+EquallyCount+LessCount-1 do

begin

Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);

for i:=length(SimplexTable)-LessCount+2 to length(SimplexTable)-1 do

SimplexTable[i,j]:=0;

SimplexTable[length(SimplexTable)-1,j]:=1;

end;
//2.3 Добавить искусственные коэф. (>= и =)

for j:=0 to MoreCount+EquallyCount-1 do

begin

Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);

for i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do

SimplexTable[i,j]:=0;

SimplexTable[length(SimplexTable)-1,j]:=1;

end;
//Целевая функция GoalFun

GoalFun:=nil;

with MainForm.ActiveMDIChild as TChildForm do

begin

SetLength(GoalFun,GoalChild.ColCount+1);

for i:=1 to GoalChild.ColCount do

begin

if parametersForm.Min.Checked then GoalFun[i]:=StrToFloat(goalChild.Cells[i-1,1])

else GoalFun[i]:=-1*StrToFloat(goalChild.Cells[i-1,1]);

end;

end;

//Искусственная функция ArtFun

ArtFun:=nil;

SetLength(ArtFun,length(SimplexTable)-1-MoreCount);

//i=1 - Значение иск. функции

for i:=1 to length(SimplexTable)-3 do

for j:=0 to MoreCount-1 do ArtFun[i-1]:=ArtFun[i-1]-SimplexTable[i,j];
//------------------------------------------------------------------------------

//Минимизация искусственной функции

//Базис

if MoreCount>0 then

begin

for j:=0 to MoreCount-1 do

SimplexTable[0,j]:=length(simplexTable)-MoreCount+j-1;

for i:=MoreCount to length(simplexTable[0])-1 do

SimplexTable[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+(i-MoreCount)-1;

end

else

for i:=0 to LessCount+EquallyCount-1 do

SimplexTable[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+i-1;
//2 нижние строки для оценок

SetLength(SimplexTable,length(SimplexTable),length(SimplexTable[0])+2);

for i:=0 to length(GoalFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-2]:=goalFun[i];

for i:=0 to length(ArtFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-1]:=ArtFun[i];
//итерации...

up:

repeat

if not art then inc(IterCount);

if IterCount=Parametersform.CountIteration.Value then

begin

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Достигнуто предельное число итераций. Решение не найдено');

exit;

end;

end;
//Может функция не ограничена? => поиск столбца с отрицательными коэф.

k:=0;

if art then

for i:=2 to length(simplexTable)-1 do

begin

if simplexTable[i,length(SimplexTable[0])-1]<0 then

begin

// k:=0;

for j:=0 to length(SimplexTable[0])-3 do

if simplexTable[i,j]<=0 then inc(k);

if k=length(SimplexTable[0])-2 then

begin

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Невозможно найти начальный базис');

exit;

end;

k:=0;

end;

end;

end;

k:=0;

if not art then

for i:=2 to length(simplexTable)-1 do

begin

if simplexTable[i,length(SimplexTable[0])-1]<0 then

begin

k:=0;

for j:=0 to length(SimplexTable[0])-2 do

if simplexTable[i,j]<=0 then inc(k);

if k=length(SimplexTable[0])-1 then

begin

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Целевая функция не ограничена');

exit;

end;

end;

end;

end;
//поиск первой минимальной из отрицательных оценки искуственной функции

ExtrEstimation:=100000;

extrItem:=0;

for i:=2 to length(simplexTable)-1 do

if (SimplexTable[i,length(SimplexTable[0])-1]
begin

extrItem:=i-1;{новый базис}

ExtrEstimation:=SimplexTable[i,length(SimplexTable[0])-1];

end;

if ExtrEstimation=100000 then goto fin;
{ВНИМАНИЕ!!! Delphi пропускает не используемые (по мнению Delphi) операторы.}
//выбор рабочей строки (поиск минимального из положительных)

ExtrEstimation:=100000;

WLine:=0;

for j:=0 to length(simplexTable[0])-2 do

begin

if SimplexTable[extrItem+1,j]<>0 then

if (SimplexTable[1,j]/SimplexTable[extrItem+1,j]0) then

begin

WLine:=j;

ExtrEstimation:=SimplexTable[1,j]/SimplexTable[extrItem+1,j];

end;

end;
up2:

SimplexTableNew:=nil;

SetLength(SimplexTableNew,length(SimplexTable),length(SimplexTable[0]));

//новый базис

for i:=0 to length(SimplexTable[0])-1 do SimplexTableNew[0,i]:=SimplexTable[0,i];

SimplexTableNew[0,WLine]:=extrItem;

//перерасчет рабочей строки

for i:=1 to length(SimplexTable)-1 do SimplexTableNew[i,WLine]:=SimplexTable[I,wlINE]/SimplexTable[extrItem+1,wlINE];

//перерасчет коэффициентов

for i:=1 to length(SimplexTable)-1 do

for j:=0 to length(SimplexTable[0])-1 do

if j<>WLine then

SimplexTableNew[i,j]:=SimplexTable[i,j]-SimplexTable[i,Wline]*SimplexTable[extrItem+1,j]/SimplexTable[extrItem+1,WLine];

//копирование таблиц

for i:=0 to length(SimplexTable)-1 do for j:=0 to length(SimplexTable[0])-1 do SimplexTable[i,j]:=SimplexTableNew[i,j];

//Вывод текущего решения

if ParametersForm.CheckBox1.Checked then begin

bil:=false;

if not art then

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Итерация '+InttoStr(IterCount));

for i:=0 to GoalChild.ColCount-1 do

begin

for j:=0 to length(SimplexTable[0])-1 do

if i+1=SimplexTable[0,j] then

begin

task.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));

bil:=true;

end;

if not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');

bil:=false;

end;

end;

end;

until false;

fin:

if art then

begin

art:=false;

SetLength(SimplexTable,Length(SimplexTable)-MoreCount,Length(SimplexTable[0])-1);

goto up;

end;

//Если среди базисных переменных нет дробных то конец...

bil:=false;

for i:=0 to ParametersForm.dim1.Value-1 do

if (SimplexTable[0,i]<=ParametersForm.dim1.Value) and (SimplexTable[1,i]<>trunc(SimplexTable[1,i])) then bil:=true;

if not bil then

begin

//Результат

with MainForm.ActiveMDIChild as TChildForm do

begin

task.Items.Add('');

task.Items.Add('Результат');

for i:=0 to GoalChild.ColCount-1 do

begin

for j:=0 to length(SimplexTable[0])-1 do

if i+1=SimplexTable[0,j] then

begin

task.Items.Add(' '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));

bil:=true;

end;

if not bil then task.Items.Add(' '+GoalChild.Cells[i,0]+'=0');

bil:=false;

end;

task.Items.Add('');

if parametersForm.Min.Checked then

task.Items.Add('Минимальное значение функции '+FloatToStr(-1*(SimplexTable[1,length(SimplexTable[0])-1])))

else

task.Items.Add('Максимальное значение функции '+FloatToStr(SimplexTable[1,length(SimplexTable[0])-1]));

end;

exit;

end;

//Дополнительная строка и столбец

SetLength(SimplexTable,Length(SimplexTable)+1,Length(SimplexTable[0])+1);

For i:=0 to Length(SimplexTable)-1 do

SimplexTable[i,Length(SimplexTable[0])-1]:=SimplexTable[i,Length(SimplexTable[0])-2];

for i:=0 to Length(SimplexTable[0])-1 do SimplexTable[Length(SimplexTable)-1,i]:=0;

SimplexTable[Length(SimplexTable)-1,Length(SimplexTable[0])-2]:=1;

//поиск максимальной дробной части

ExtrEstimation:=0;

WLine:=0;

for i:=0 to Length(SimplexTable[0])-3 do

begin

if (abs(SimplexTable[1,i]-trunc(SimplexTable[1,i]))>ExtrEstimation) and (abs(SimplexTable[1,i]-round(SimplexTable[1,i]))>0.001) then

begin

ExtrEstimation:=abs(SimplexTable[1,i]-trunc(SimplexTable[1,i]));

WLine:=i;

end;

end;

SetLength(goalfun,Length(goalfun)+1);

GoalFun[Length(goalfun)-1]:=0;

SimplexTable[0,Length(SimplexTable[0])-2]:=Length(SimplexTable)-2;

SimplexTable[1,Length(SimplexTable[0])-2]:=-ExtrEstimation/ExtrEstimation;

for i:=2 to Length(SimplexTable)-2 do

begin

SimplexTable[i,Length(SimplexTable[0])-2]:=-(abs(SimplexTable[i,WLine]-trunc(SimplexTable[i,WLine])))/ExtrEstimation;

end;

SimplexTable[round(SimplexTable[0,WLine])+1,Length(SimplexTable[0])-2]:=0;
//поиск первой минимальной из положительных оценки искуственной функции

ExtrEstimation:=100000;

extrItem:=0;

for i:=2 to length(simplexTable)-1 do

if (SimplexTable[i,length(SimplexTable[0])-1]0) then

begin

extrItem:=i-1;{новый базис}

ExtrEstimation:=SimplexTable[i,length(SimplexTable[0])-1];
end;

//??? if ExtrEstimation=-100000 then goto fin;

WLine:=length(SimplexTable[0])-2;

goto up2;
end;
procedure TMainForm.SaveClick(Sender: TObject);

begin

if pos('Задача',activemdichild.caption)=1 then

SaveAsClick(Sender) else with activemdichild as TChildForm do

SaveData(Caption);

end;
procedure TMainForm.DelLimClick(Sender: TObject);

var i:byte;

begin

with ActiveMDIChild as TChildForm do

begin

if ItemDel<4 then MessageDlg('Ограничение не выбрано',mtWarning,[mbOK],0) else

begin

ParametersForm.FormShow(Sender);

for i:=0 to ItemDel-5 do ParametersForm.BitBtn3Click(Sender);

ParametersForm.BitBtn1Click(Sender);

ParametersForm.Button3Click(Sender);

end;

end;

end;
procedure TMainForm.N8Click(Sender: TObject);

var i:byte;

begin

with Mainform.ActiveMDIChild as TChildForm do

begin

GoalChild.ColCount:=2;

LimChild.ColCount:=2;

LimChild.RowCount:=1;

BChild.RowCount:=1;

SignsChild.RowCount:=1;

for i:=0 to 1 do

GoalChild.Cells[i,1]:='0';

GoalChild.Cells[0,0]:='X1';

GoalChild.Cells[1,0]:='X2';

Task.Clear;

end;

end;
procedure TMainForm.N1Name1Click(Sender: TObject);

var FileName:string;

begin

with sender as TMenuItem do

begin

FileName:=caption;

System.Delete(FileName,1,2);

end;

CreateChild(OpenDialog1.FileName);

with ActiveMDIChild as TChildForm do

LoadData(OpenDialog1.FileName);

ParametersForm.FormShow(Sender);

ParametersForm.Button3Click(Sender);

end;
end.4>0>0>
1   2   3   4