我是在窗体的onshow 里创建的
if adoLevyItem = nil then adoLevyItem:=TADOQuery.Create(nil);
在窗体的close按扭里释放:
if adoLevyItem <> nil then adoLevyItem.free;窗体里的代码使用过地方有作为参数船给一个其他单元的过程使用过,
gFunCountMoney(adoLevyItem);
使用其他单元的公用函数获取数据
adoLevyItem:=gFunSearchData('select a.*,b.levyItemNote from aa ');这样使用有什么隐患或不妥吗?在关闭窗口的时候并不都出现错误,为什么?
if adoLevyItem = nil then adoLevyItem:=TADOQuery.Create(nil);
在窗体的close按扭里释放:
if adoLevyItem <> nil then adoLevyItem.free;窗体里的代码使用过地方有作为参数船给一个其他单元的过程使用过,
gFunCountMoney(adoLevyItem);
使用其他单元的公用函数获取数据
adoLevyItem:=gFunSearchData('select a.*,b.levyItemNote from aa ');这样使用有什么隐患或不妥吗?在关闭窗口的时候并不都出现错误,为什么?
出了问题;
如果没有猜错的话你的函数gFunSearchData返回的应该是一个TAdoquery类型的变量。
这里你用‘:=’将该返回值赋值给adolevyitem后,onshow过程中为adolevyitem分配的内存将不再有人管理,导致内存泄漏。
你可以考虑改变函数gFunserchData的定义和实现如下:
gFunsearchData(sqlstr:string; AAdoq: TAdoquery);
begin
with aadoq do
begin
close;
sql.clear;
sql.text := sqlstr;
open;
end;
end;
调用方式采用。
gFunSearchData('select a.*,b.levyItemNote from aa ', AdolevyItem);
在窗体的close按扭里释放:
if adoLevyItem <> nil then adoLevyItem.free;//////////////////////
有问题,if adoLevyItem <> nil then adoLevyItem.free;这里仅仅是将adolevyitem对象释放,并没有置为nil,所以当再次执行if adoLevyItem = nil then adoLevyItem:=TADOQuery.Create(nil); 时会出错,解决方法:if adoLevyItem <> nil then adoLevyItem.free;改为:
FreeAndNil(adoLevyItem);
对于 47522341(睡到8:30) 的提示已经改过,但还有错误,在那个if adoQur <> nil的地方,应该是zhangl_cn(不做和尚了!) 说的原因,再调试......
咳,,,,快3点了哦
有什么区别? 是不是内存都释放了?
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
可以看到,对象的是在free过程中调用destroy过程代码;
然后我们在adodb单元中找到tadoquery.destroy过程代码如下:
destructor TADOQuery.Destroy;
begin
inherited Destroy;
FreeAndNil(FSQL);
end;
所以;个人认为,至少在这里,free和freeandnil过程执行的操作效果应该是一样的。
if adoLevyItem <> nil then adoLevyItem.free,看效果procedure TForm1.Button1Click(Sender: TObject);
begin
if adoq = nil then adoQ:=tadoquery.Create(nil);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
if adoq <> nil then adoQ.Free;
if adoq <> nil then adoQ.Free;
end;结果就是我程序里的那个错误.再次谢过楼上老大