有以下程序:function ExecuteSQL(oDatabase:TDatabase;SQLString:string):Boolean;
begin
  Result := false;
  DBErrorMessage := '';
  with TQuery.Create(nil) do begin
    try
      SessionName := oDatabase.SessionName;
      DatabaseName := oDatabase.DatabaseName;
      SQL.Text := SQLString;
      ExecSQL;
      DBRowsAffected := RowsAffected;
      Result := true;
    except
      on E : Exception do DBErrorMessage := E.Message;
    end;
    Free;
  end;
end;TQuery是自己定义的类,为什么可以不定义变量就直接调用Create,那创建之后的对象由什么指针管理,为什么调用Free时会自动把这个对象释放调

解决方案 »

  1.   

    TQuery不是自定义的类,按照你上面的代码TQuery.Create(nil)
    内部会产生一个默认的实例名,这个实例的指针会指向TQuery这个类,
    free是delphi的一个内部函数,你调用它当然可自动释放,这只断开与TQuery这个类的链接,还可以用freeandnil()这个函数,
      

  2.   

    构造函数直接可以使用类名创建。
    指针由内部对象管理。
    调用free时使用的是前面创建的TQuery对象的free,自然就释放了。
      

  3.   

    to:skyclin()
    你说的由“内部产生一个默认的实例名,这个实例的指针会指向TQuery这个类。”
    请问什么资料上有说delphi有这种机制。
    因为我以前用一直都是先定义一个实例
    例如
    var
    MyQuery : TQuery
    to: fangchangjiang
    指针由内部对象管理,请问这个对象是什么?什么资料上有说。
      

  4.   

    你用的是构析函数,当然可以由类名来执行,就象类的方法一样,
    下面是类的方法的介绍
    类的方法可以直接由类名来执行,可不通过实例
    类的方法建立的方法是加class指示字
    tmy_obj:tobject
      class procedure show;
    end;
    var my_obj:tmy_obj;procedure tmy_obj.show
    begin
      showmessage('我是类的方法');
    end;
    你可以直接用tmy_obj.show来执行,不用先建立my_obj
    create和destroy叫构析函数,和类的方法也是一样的,可以由类名执行。
    但是类的方法是不能调用类其中的字段的,因为这时类的实例还没有建立。