![]() |
|
#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
|
|||
|
|||
![]() Спасибо всем. Учту свою ошибку.
|