Файл: пк для решения задач линейного программирования симплексным методом.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]
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]
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]
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