当多次调用此代码时(在组合框的更改时调用),在第二次更改时得到错误“当对象打开时不允许操作”,在第三次更改时得到“无效指针操作”。
if loadfile.Database <> nil then
loadfile.Database.destroy;
Loadfile.Database := Tdatabase.create(CardSets.Text, false);
LoadFile.Database.create(CardSets.Text, false);
refreshlist;
创建代码只是
DataSource :=
'Provider=Microsoft.Jet.OLEDB.4.0' +
';Data Source=' + Path +
';Jet OLEDB:Engine Type=5';
with MainWindow do
begin
ADOConnection.ConnectionString := Datasource;
ADOConnection.LoginPrompt := False;
end;
而refreshlist只更新数据库中数据的可视列表。
我看过一些类似的堆栈溢出问题,但我看不出答案对我的问题有什么帮助。
附带的问题是,什么时候使用.Destroy或.Free?在这种情况下,.Free只会给出一个不同的错误。
谢谢。
发布于 2014-02-04 00:48:28
首先,调用Create
两次;第二次是不必要的:
if loadfile.Database <> nil then
loadfile.Database.destroy;
Loadfile.Database := Tdatabase.create(CardSets.Text, false); // First call
LoadFile.Database.create(CardSets.Text, false); // Second call
将您的代码更改为:
LoadFile.Database.Free;
LoadFile.Database := TDatabase.Create(CardSets.Text, False);
第二,永远不要直接调用Destroy
。使用Free
代替,因为它首先检查未赋值的指针,然后调用Destroy
,如果这样做是安全的。TObject.Free
基本上是这样的代码:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
https://stackoverflow.com/questions/21540862
复制