![]() |
|
|
#1
|
|||
|
|||
|
Доброго времени суток.
Есть форма в которой динамически создается массив edit-ов. Производится расчет. Далее форма закрывается. При закрытии формы выдается ошибка памяти типа "Access violation at address XXXXXXX in module XXXX. Read of address 00000000" После долгих переборов вывел что все дело в MatrEnd.free; Что я упустил? Код: Код:
unit MEnd;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,mat,
StdCtrls;
type
TMatrEnd = class(TForm)
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
EditMas:array[1..30,1..30] of TMyEdit;
end;
var
MatrEnd: TMatrEnd;
implementation
uses MAI;
{$R *.DFM}
procedure TMatrEnd.FormShow(Sender: TObject);
var
x,y,c:integer;
kon,a,b:extended;
s:string;
begin
For y:=1 to Form1.level[4]+1 do begin
kon:=0;
For x:=1 to Form1.Level[3]+2 do begin
EditMas[y,x]:=TMyEdit.Create(self);
EditMas[y,x].x:=x;
EditMas[y,x].y:=y;
EditMas[y,x].Parent:=self;
EditMas[y,x].Top:=(y-1)*20+1;
EditMas[y,x].left:=x*90-28;
EditMas[y,x].Width:=90;
EditMas[y,x].Height:=20;
EditMas[y,x].ReadOnly:=True;
If (y=1) and (x>1) then
EditMas[y,x].text:=Form1.MasHide[0,x-1,Form1.level[2]+2];
if x=1 then begin
EditMas[y,x].Width:=150;
EditMas[y,x].Left:=1;
if y>1 then EditMas[y,x].Text:=Form1.Memos[4,y-1].Text;
end;
if (x>1) and (y>1) and (x<Form1.Level[3]+2) then begin
EditMas[y,x].text:=Form1.MasHide[x+Form1.level[2]-1,y-1,Form1.level[4]+2];
//Теперь умножаем их на соответствующие коэффициенты
val(EditMas[y,x].text,a,c);
val(EditMas[2,x].Text,b,c);
kon:=kon+(a*b);
end;
end;
Case Form1.Opt.col of
one: EditMas[y,Form1.level[3]+2].color:=cl3DLight;
all: begin
EditMas[y,Form1.level[3]+2].color:=cl3DLight;
For x:=2 to form1.level[3]+1 do
if (y mod 2)=0 then EditMas[y,x].color:=clSilver;
end;
end;
Str(kon:8:8,s);
EditMas[y,Form1.level[3]+2].Text:=s;
end;
EditMas[1,form1.level[3]+2].text:='Общие веса';
If (Width>=screen.Width) or (Height>=screen.Height) then AutoScroll:=true
else AutoScroll:=false;
Autosize:=True;
If (Width>=screen.Width) or (Height>=screen.Height) then AutoScroll:=true
else AutoScroll:=false;
Autosize:=False;
if AutoScroll then height:=height+16;
end;
procedure TMatrEnd.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MatrEnd.free;
MatrEnd:=nil;
Form1.N10.Enabled:=False;
Form1.N15.Enabled:=False;
end;
end. |