var ADOQuery: TADOQuery;
    S: ShortString;
begin
  try
    ADOQuery := TADOQuery.Create(nil);
    ADOQuery.Connection := ADOConnect;
    whih ADOQuery do
      begin
        ADOQuery.SQL.Clear;
        ........  
      end;
  except    
  end;
  if ADOQuery <> nil then
    ADOQuery.Free;
这时编译器有警告:Variable "ADOQuery" might not have been initialized
如何正确释放ADOQuery ?

解决方案 »

  1.   

    ADOQuery := TADOQuery.Create(nil); //ADOQuery可能在创建不成功
      try
        ADOQuery.Connection := ADOConnection1;
        with ADOQuery do
          begin
            ADOQuery.SQL.Clear;
          end;
      except
      end;
      

  2.   

    var adoquery:tadouery;try
      adoquery:=tadoquery.create(nil);
     ...
    except
      raise exception.create('adoquery component create failed!');end;
      

  3.   

    不要TRY..EXCEPT时不会有警告。
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var ADOQuery: TADOQuery;
    begin
    ADOQuery := TADOQuery.Create(nil);
    ADOQuery.Connection := ADOConnect;
    with ADOQuery do
      begin
       SQL.Clear;
       sql.add('select * from userinfo' );
       open;
      end;
    datasource1.DataSet:=adoquery;
    if Assigned(ADOQuery) then
        ADOQuery.Free;
    end;
      

  5.   

    我认为建立ADOQuery时可以不用TRY..EXCEPT,只是在OPEN时可以用TRY..EXCEPT。
    不知然否?
      

  6.   

    ADOQuery := TADOQuery.Create(nil); //ADOQuery可能在创建不成功
      try
        ADOQuery.Connection := ADOConnection1;
        with ADOQuery do
          begin
            ADOQuery.SQL.Clear;
          end;
      finally
        ADOQuery.free;
      end;
      

  7.   

    ADOQuery := nil //这里就不会有WARNING 了ADOQuery := TADOQuery.Create(nil); //ADOQuery可能在创建不成功
      try
        ADOQuery.Connection := ADOConnection1;
        with ADOQuery do
          begin
            ADOQuery.SQL.Clear;
          end;
      finally
        ADOQuery.free;
      end;
      

  8.   

    用ADOQuery 本身就可能会出错~~~
      

  9.   

    他是说ADOQuery没有被初始化,你把ADOQuery:=nil;就行了。
      

  10.   

    Delphi的try...finally...end这么好的结构为什么不用呢?这样ADOQuery肯定可以释放的
    var ADOQuery: TADOQuery;
        S: ShortString;
    begin
      try
        ADOQuery := TADOQuery.Create(nil);
        try
          ADOQuery.Connection := ADOConnect;
          whih ADOQuery do
            begin
              ADOQuery.SQL.Clear;
              ........  
            end;
        finally
          FreeAndNil(ADOQuery);
        end;
        except    
        end;
    你的代码问题在于一旦发生异常程序终止了,你的ADOQuery根本没机会释放
      

  11.   

    我认为有一点多余吧?既然使用了try except 就不再需要判断nil了啊?
      

  12.   

    var 
      aquery : TADOQuery;
    begin
      aquery := TADOQuery.create(nil);  //这一句写在Try的上面不会出现WARNING nil就必须自己来释放自己创建的对象.所以要用Finally。
      Try
        with aquery do 
        begin
          Connection := ADOConnect;
          close;
          sql.clear;
          sql.add(s);
          open;
          用完后close;
        end;
      Finally
        aquery.free;
        aquery := nil;
      End;
    end;
      

  13.   

    把创建的语句放到Try之前去,编译器只是说might not,不是完全肯定的说没有创建,我举个例子估计你就明白了:
    try
      if 1=1 then exit;//注意此处已经退出
      ADOQuery := TADOQuery.Create(nil);  
      {你的处理语句}
    except
    end;
      ADOQuery.Free;
    编译器只是告诉你容易发生这样的错误而已。