【问题标题】:Delphi invalid pointer operation using ADODelphi使用ADO进行无效指针操作
【发布时间】:2014-02-04 00:43:35
【问题描述】:

当多次调用此代码时(在更改组合框时调用),我在第二次更改和第三次更改时收到错误“对象打开时不允许操作” “无效的指针操作”。

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 只是更新数据库中数据的可视化列表。

我查看了一些类似的 stackoverflow 问题,但我无法看到答案如何帮助解决我的问题。

附带问题,何时使用 .Destroy 或 .Free? .Free 在这种情况下只会给出不同的错误。

谢谢。

【问题讨论】:

  • 你为什么要给create打两次电话?
  • 无论如何,使用FreeAndNil - 既不要将destroy 也不要free 设置为nil。
  • 这不是你创建对象的方式吗? NVM:我是个白痴,谢谢!
  • 任何时候你在同一个表达式中看到两个点,这表明你的设计很弱。您不应该分配给 LoadFile.Database。 LoadFile 类中的一个方法应该分配给数据库。看起来数据库是读/写的。第 1 步是使其只读,甚至是私有的。更广泛地说,您的模型似乎与您的 GUI 混合在一起。真是一团糟。

标签: delphi ado


【解决方案1】:

首先,您呼叫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,因为它首先检查未分配的指针,然后在安全的情况下调用DestroyTObject.Free基本上就是这个代码:

procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;

【讨论】:

  • 如果我在对象尚未创建时调用Loadfile.Database.Free,我会收到错误消息吗?那么If业务没用吗?
  • 您没有提供足够的上下文。 LoadFile 的构造函数(不管是什么)应该是创建初始数据库实例;我不确定在创建它之前如何访问它。坦率地说,我什至不清楚为什么要释放数据库并重新创建它。您可以简单地断开连接,更改连接字符串,然后重新连接,完全没有调用构造函数的开销。
  • 要直接回答您的评论问题,但是:TObject.Free 在调用析构函数之前首先检查以确保Self &lt;&gt; nil(您可以在System.pas 中看到自己)。那里的代码是if Self &lt;&gt; nil then Destroy;。 (请参阅我编辑的答案。)
  • Loadfile 是一种形式,并且(当前)TDatabase 对象几乎只是一堆数据库更改功能的持有者和 ADOX_TLB 目录类型的持有者。是的,我明白你在说什么,我的方式有点复杂。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
相关资源
最近更新 更多