如果直接在界面上放置控件,以ADO为例,绑定顺序可以表示如下:
DBGrid->Datasource->ADOQuery
很显然,这个时候如果强制释放ADOQuery,或者哪怕close掉ADOQuery,DBGrid的内容都将清空,可是如果用代码实现绑定的过程,却不会清空,代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var tempquery:TADOQuery;
begin
tempquery:=TADOQuery.Create(self);
tempquery.ConnectionString:='...';
tempquery.SQL.Add('select * from ...');
DataSource1.DataSet :=tempquery;
DBGrid1.DataSource :=DataSource1;
end;退出过程以后界面上的DBGrid1仍然有数据,难道局部变量tempquery没有释放?请高手解惑,谢谢!  ^_^

解决方案 »

  1.   

    你的窗体释放掉了,你的TEMPQUERY自然也就释放掉了
      

  2.   

    自己手动创建的对象,除了指定Owner的和接口以外,一般都要自己释放,Application是不会自动帮你释放的
      

  3.   

    如果我反复的点击button1,岂不是要反复的创建tempquery?
    更重要的,也就是我最大的疑惑,如果tempquery真的没有释放,那第二次创建了tempquery后第一个tempquery怎么办?会不会造成内存泄漏?
      

  4.   

    你创建的TADOQUERY属于SELF,所以APPLICATION释放,它也释放,否则就一直有;所以你的程序有问题,因为每点一次BUTTON都创建一个TADOQUERY;
    也许你应该
    procedure TForm1.Button1Click(Sender: TObject);
    var tempquery:TADOQuery;
    begin
    tempquery:=TADOQuery.Create(nil);
    tempquery.ConnectionString:='...';
    tempquery.SQL.Add('select * from ...');
    DataSource1.DataSet :=tempquery;
    DBGrid1.DataSource :=DataSource1;
             tempquery.free;
    end;
      

  5.   

    呵呵,刚才如果FREE掉了,DBGRID也就没有东西了;可以考虑用STRINGRID
      

  6.   

    有这个可能,所以你大可以加上TempQuery.free这句话。这也算个编程习惯吧。我反正凡是需要create的对象后面用完了都要跟上free的。
    ----------------------------------------------
                       riff ur life
      

  7.   

    用nil作为owner也不是退出过程以后自动释放啊!
      

  8.   

    如果直接跟上free或者destroy,那么就只能采用TStringGrid了
    有没有其他更加好的办法?
      

  9.   

    这个问题提得好!肯定是没有释放掉。因为在最后一句加上tempquery.Free后,dbgrid1中就无内容了。
    这是个类的实例,不同于一般的变量。
    但怎样在这个过程外检测这个实例是否还存在呢?请高手指教!
      

  10.   

    测试了一下,TempQuery好象没有被释放掉(占用的内存越来越大),整个程序结束时才被释放掉。如果加上了Tempquery.free,占用的内存基本不变。procedure TForm1.Button1Click(Sender: TObject);
    var tempquery:TADOQuery;
    begin
    tempquery:=TADOQuery.Create(nil);
    tempquery.Connection:=adoconnection1;
    tempquery.SQL.Add('select * from djunit');
    DataSource1.DataSet :=tempquery;
    DBGrid1.DataSource :=DataSource1;
            TempQuery.Open;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var i:integer;
    begin
      for i:=1 to 1000 do
        button1click(button2);
    end;所以,加上free还是保险啊。这是种良好的编程习惯。----------------------------------------------
                       riff ur life
      

  11.   

    楼主的需求明显应该把tempQuery声明成全局的啊,formclose的时候free掉不就得了。总之保证只创建一次,释放一次。在创建的时候做一下判断
    if not assigned(TempQuery) then
      TempQuery:=AdoQuery.create(nil);
    ----------------------------------------------
                       riff ur life
      

  12.   

    同意 : outer2000(天外流星)