急运行中自动创建控件,关闭窗体之前,无论free与否,都产生异常:直接关闭窗体时,产生“Invalid Pointer operation”;先free掉

急!!!运行中自动创建控件,关闭窗体之前,无论free与否,都产生错误:直接关闭窗体时,产生“Invalid Pointer operation”;先free掉,
运行中自动创建控件,关闭窗体之前,无论free与否,都产生错误:直接关闭窗体时,产生“Invalid   Pointer   operation”;先free掉,然后在关闭窗体,这时产生0地址错误。

------解决方案--------------------
public
destructor destrory;override;


destructor aaa.Destroy;
begin
xxxx.Free;//释放到你的东东
inherited Destroy;
end;
------解决方案--------------------
===============================================================================
ycjf(求知者) ( ) 信誉:100 Blog 加为好友 2007-4-24 17:10:28 得分: 0



TO gobiz:
用FreeAndNil,提示“Constant object cannot be passed as var parameter”,但我的控件是在程序运行中自动创建的,须使用变量或参数。


==================================================================================

procedure TForm1.FormCreate(Sender: TObject);
var
AEdit: TEdit;
begin
AEdit := TEdit.Create(Self);
AEdit.Parent := Self;
AEdit.Name := 'EditTest ';
AEdit.Top := 100;
AEdit.Left := 100;
……
end;

procedure TForm1.FormDestory(Sender: TObject);
var
i: Integer;
AEdit: TEdit;
begin
//方法1
AEdit := TEdit(FindComponent( 'EditTest '));
FreeAndNil(AEdit);
//方法2
for i:=0 to ComponentCount-1 do
begin
if (Components[i] is TEdit) and ((Components[i] as TEdit).Name = 'EditTest ') then
begin
AEdit := TEdit(Components[i]);
Break;
end;
end;
FreeAndNil(AEdit);
//方法3
由于本例中动态创建的Edit的Owner是Self(这里就是Form1),所以根本就不用自己来释放,只要窗体释放了,那么这个动态创建的控件就可以自动释放的。
end;

//如果本例中创建的Edit的Owner是nil,即是使用AEdit := TEdit.Create(nil)来创建的,那么就可以在需要释放的地方使用方法1、方法2来释放。