我尝试从数据库中获取数据并填充TDBGrid
。在使用try/finally
块时,DataSource中的所有记录都被清除,因为我在finally
中执行了Free
。
我在Google上研究了一下,所有的例子都在finally
块中使用了q.Free
。
procedure TSubjektiForm.FormActivate(Sender: TObject);
var
q : TZQuery;
ds : TDataSource;
begin
q := TZQuery.Create(nil);
ds := TDataSource.Create(nil);
try
DBGrid1.DataSource := ds;
ds.DataSet := q;
q.Active := False;
q.SQL.Clear;
q.Connection := DataModule1.ZConnection1;
q.SQL.Text := 'SELECT id, naziv, telefon FROM subjekti';
q.Open;
finally
q.Free;
end;
end;
如果删除q.Free
,则数据显示在TDBGrid
中。
我读到:
Finally关键字用于标记Try语句中最后一个语句块的开始。不管Try语句中发生了什么,它们都会被执行。
但我的问题是,我如何才能释放这个查询?还有别的办法吗?
- 对不起,愚蠢的问题,我是新的 Delphi ,我来自C#,这是真的不同!*
1条答案
按热度按时间92vpleto1#
与C#不同, Delphi 中的对象不进行引用计数或垃圾收集。当你在 Delphi 中
Free()
一个对象时,它会立即消失。在C#中,等价的是在实现IDisposable
的对象上调用Dispose()
。TDBGrid
仅显示可通过指定的TDataSource
访问的数据。您的TDataSource
只是将数据连接到网格的中介。不复制数据。TZQuery
保存了实际的数据,所以当你释放这个对象时,它和它的数据就消失了。这就是为什么在运行finally
后,网格不会显示任何内容。因此,您需要确保正在创建的
TZQuery
和TDataSource
对象的寿命比检索数据的过程长。如果您不打算在设计时将组件放到Form/DataModule上(您应该这样做),那么至少在Form/DataModule的构造函数或
OnCreate
事件中创建它们。您可以将您的Form/DataModule指定为它们的Owner
,以便在释放Form/DataModule时释放它们。例如: