比如
var ado:adoquery;
我怎么判断ado是否调用了
ado.create(nil);
然后我把它ado.free掉?

解决方案 »

  1.   

    FreeAndNil(ado); //就可以了...
      

  2.   

    不行啊,假设ado没有调用create的话,会出现非法访问内存的错误.在帮助中FreeAndNil明确地警告:
    Warning: Obj must be an instance of a TObject descendant.
    没有create的话,不能算是instance.
      

  3.   

    if ado <> nil then
      ado.free;
      

  4.   

    我的分析代码:
    var ado,ado1:tadoquery;
    begin
         ado1:=tadoquery.create(self);     
         ShowMessage(IntToStr(int64(@ado1)));
         //结果返回1242660
         ShowMessage(IntToStr(int64(@ado)));
         //结果返回1242664,由此可知ado不是nil=0
         //例外这两个数字不会因为重新启动delphi而变化,脱离ide不变,self改变为nil,form1仍不变
         if ado is tadoquery then
            ShowMessage('isTadoquery!');
         //结果返回is
         if assigned(ado) then
            ShowMessage('assigned!');
         //结果返回已经assign
         if ado.IsEmpty then
            ShowMessage('Empty!');
         //结果返回不是empty
    由此可知,对象在未初始化前,已经assigned,并且类型就是tadoquery.现在的问题是我能否使用1242664和1242660作为是否调用create初始化的标志呢?
      

  5.   

    有趣的还有如下代码:
    var ed,ed1:tedit;
    begin
         ed1:=tedit.Create(form1);
         ShowMessage(IntToStr(int64(@ed)));
         ShowMessage(IntToStr(int64(@ed1)));
    结果和tadoquery一样,将int64改为integer结果一样.
    都是初始化后返回1242660,未初始化返回1242664;急待大家帮忙测试一下!!
      

  6.   

    if adq=nil then  adq:=TADOQUERY.CREATE(NIL);    ...
      
    end;
      

  7.   

    上面已经说的很明白了,ado虽然没有create
    但ado不是nil,所以不能被free.
    是有地址的,初始化后返回1242660,未初始化返回1242664;例外,这个值是随即的,不能用来判断是否初始化.
      

  8.   

    问题解决!
    我读对象的第一个Dword看它是否为'0',这样就能确定对象是否创建var ado,ado1:TADOQUERY;
        FirstWord:^Dword;
    begin
         ado1:=TADOQUERY.Create(self);
         FirstWord:=@ado1;//测试代码请改成@ado
         if Trim(IntToStr(FirstWord^))='0' then
            showmessage('Not Creat Yet!')
         else
            showmessage('Created Yeah!');还望高手指点迷津
      

  9.   

    期待高手,上面的解决办法明显是错误的.
    当ado被声明后他的前4字节不一定是0,我该如何判断呢?难道只能try/except?
      

  10.   

    Delphi外行最容易犯的错误:ado.create(nil);
    应该写成: ado := TADOxxxx.Create( nil ); 比如 TADOQuery, TADOCommand没有太聪明的办法,你只有在begin后先将它赋一个nil的值,然后在一个大的try的finally部分释放:
    var
      ado: TADOQuery;
    begin
      ado := nil;
      try
        你的程序代码
      finally
        FreeAndNil( ado ); // 会自动判断是否为nil
      end;
      

  11.   

    ado.create(nil);笔误,当时主要关心create问题了