我是在窗体的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 ');这样使用有什么隐患或不妥吗?在关闭窗口的时候并不都出现错误,为什么?

解决方案 »

  1.   

    应该是你的代码adoLevyItem:=gFunSearchData('select a.*,b.levyItemNote from aa ');
    出了问题;
    如果没有猜错的话你的函数gFunSearchData返回的应该是一个TAdoquery类型的变量。
    这里你用‘:=’将该返回值赋值给adolevyitem后,onshow过程中为adolevyitem分配的内存将不再有人管理,导致内存泄漏。
      

  2.   

    解决方式;
    你可以考虑改变函数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);
      

  3.   

    if adoLevyItem = nil then adoLevyItem:=TADOQuery.Create(nil);
    在窗体的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);
      

  4.   

    晕啊,现在来说应该是昨天晚上怎么也打不开帖子了,只能显示头,难道我浏览器坏了,但是QQ的TT也打不开啊,,,一点管理,哦  这可以饿.谢2位解答..
    对于 47522341(睡到8:30) 的提示已经改过,但还有错误,在那个if adoQur <> nil的地方,应该是zhangl_cn(不做和尚了!) 说的原因,再调试......
    咳,,,,快3点了哦
      

  5.   

    再问一下,对于ado对象使用完了是要adoLevyItem.free呢还是要FreeAndNil(adoLevyItem);  ?
    有什么区别? 是不是内存都释放了?
      

  6.   

    你可以到sysutils单元里找到freeAndNil的代码执行过程
    procedure FreeAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
      Pointer(Obj) := nil;
      Temp.Free;
    end;
      

  7.   

    同样,在system中找到的free过程代码如下:
    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过程执行的操作效果应该是一样的。
      

  8.   

    按 47522341(睡到8:30) 老大对于释放的分析确实是 free 和freeandnil是一样的,但是我测试后是这样的结果:如果我用free释放,那么在再次打开窗口create后不进行操作 就关闭窗口那么在 if adoLevyItem <> nil then adoLevyItem.free 时出现地址为000000的错误,而用freeandnil后此错误没有了.做简单测试 一个按牛create adoQuery,另一按纽用2次
    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;结果就是我程序里的那个错误.再次谢过楼上老大