如果直接在界面上放置控件,以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没有释放?请高手解惑,谢谢! ^_^
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没有释放?请高手解惑,谢谢! ^_^
更重要的,也就是我最大的疑惑,如果tempquery真的没有释放,那第二次创建了tempquery后第一个tempquery怎么办?会不会造成内存泄漏?
也许你应该
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;
----------------------------------------------
riff ur life
有没有其他更加好的办法?
这是个类的实例,不同于一般的变量。
但怎样在这个过程外检测这个实例是否还存在呢?请高手指教!
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
if not assigned(TempQuery) then
TempQuery:=AdoQuery.create(nil);
----------------------------------------------
riff ur life