![]() |
|
|
#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. |
|
#2
|
||||
|
||||
|
если честно, редко пользуюсь ручным уничтожением. я бы убрал вообще из Close эти две строчки.
MatrEnd.free; MatrEnd:=nil; Я думаю система сама от них ресурсы освободит как надо.... |
|
#3
|
|||
|
|||
|
У меня вообще очень странная штука происходит.
Если я их убираю то программа дальше работает. Но при изменении некоторых параметров MainForm Опять начинается... Я уже всю голову сломал Читал, что для удаления Free надо в FormCreate дописать создание MatrEnd. Но по примеру у меня не получается. Хотя.. сейчас прошелся по всему коду и нашел в кнопке MatrEnd.free; Удалил.. Пока вроде все пашет ) Но все же хотелось бы понять почему ))))))))) Ведь отстранение от проблемы это не ее решение. Последний раз редактировалось defff1, 23.03.2011 в 22:19. |
|
#4
|
||||
|
||||
|
а каким образом ты форму закрываешь???
|
|
#5
|
|||
|
|||
|
так как нет никаких кнопок закрытия и менюшек то
просто тыкаю на крестик. |
|
#6
|
||||
|
||||
|
хрен знает, у тебя эта форма главная или дочерняя, что за форма form1??
|
|
#7
|
|||
|
|||
|
Form1 это MainForm
Нашел еще MatrEnd.Destroy; тоже не помогло. |
|
#8
|
||||
|
||||
|
надо сам исходник смотреть....
|
|
#9
|
|||
|
|||
|
Попробуй их местами поменять...
Код:
procedure TMatrEnd.FormClose(Sender: TObject; var Action: TCloseAction); begin MatrEnd:=nil; MatrEnd.free; Form1.N10.Enabled:=False; Form1.N15.Enabled:=False; end; |
|
#10
|
||||
|
||||
|
Если форма не была создана "вручную", то TApplication сам освободит ресурсы. Если ты создавал форму самостоятельно - то и удаляй ее самостоятельно. Но уж НИ В КОЕМ СЛУЧАЕ нельзя освобождать объект внутри обработчика события этого объекта.
|
|
#11
|
|||
|
|||
|
Спасибо всем. Учту свою ошибку.
|