你看到没有比如TFORM里面有一个COMPONENTS的数组, 在他DESTORY的时候 就 FOR I:=0 TO COMPONENTS.COUNT-1 do COMPONENTS.FEEE 是自动的, 但是如果一个COMPONENT是自己生成的,并且create()里面没有参数FORM1,这时候FORM1.components里面没有它的引用,所以没有自动FREE,那么就要自己FREE掉不然就会有内存泄露,很简单如果CREATE函数里有AOWNER的就由AOWNER在他DESTORY的时候FREE,如果没有的你就要手动FREE 比如: var kk:tbutton; begin KK:=TBUTTON.CREATE; KK.PARENT:=FORM1; KK.LEFT:=1 ; //DOSOMETHING KK.FREE; END;
FOR I:=0 TO COMPONENTS.COUNT-1 do COMPONENTS[i].FEEE //笔误
也就是说,如果你动态创建的窗体上的控件的owner不是这个窗体,那么在窗体被free的时候,他不一定会被自动释放。例如,myLabel:=TLabel.Create(Application);myLabel.parent:=Form2;
创建一个owner是Application的Label,那么他在程序结束的时候才会被释放。
说的非常精彩!
有问题请发信息到我的E-mail:[email protected]
窗体上的构件的parent是窗体。
在他DESTORY的时候
就 FOR I:=0 TO COMPONENTS.COUNT-1 do
COMPONENTS.FEEE
是自动的,
但是如果一个COMPONENT是自己生成的,并且create()里面没有参数FORM1,这时候FORM1.components里面没有它的引用,所以没有自动FREE,那么就要自己FREE掉不然就会有内存泄露,很简单如果CREATE函数里有AOWNER的就由AOWNER在他DESTORY的时候FREE,如果没有的你就要手动FREE
比如:
var
kk:tbutton;
begin
KK:=TBUTTON.CREATE;
KK.PARENT:=FORM1;
KK.LEFT:=1 ;
//DOSOMETHING
KK.FREE;
END;
COMPONENTS[i].FEEE //笔误