【问题标题】:TClientDataSet faulted with messageTClientDataSet 出现错误消息
【发布时间】:2011-01-21 22:45:53
【问题描述】:

这里有一个小情况,我直到最近才使用 TClientDataSet(它需要 midas.dll)所以现在我面临一个非常尴尬的错误,不是很具有描述性:

调试器故障通知

项目 E:\Work\XXX\binary\XXX.exe 出现错误消息:“0x00678827 处的访问冲突:写入地址 0x00030a38”。进程停止。使用 Step 或 Run 继续。

每当我尝试在客户端数据集中设置字段的值(我将其用作内存数据集)时,都会发生这种情况:

with ADataModule do begin
  cdsTest.Append;
  cdsTestAField.AsString := ATableField.AsString;
  // ...
end;

两个字段都是 TStringField,cdsTestAField 大小为 64,ATableField 大小为 32

注意:我先调用 CreateDataSet 方法,这也只发生在字符串字段中,非常感谢任何帮助。

感谢您的宝贵时间。

【问题讨论】:

  • 小心使用with;当ADataModule 不包含cdsTest,但您当前的范围包含,那么您可能会陷入困境。
  • 感谢 Jeroen 的提醒,但我总是在数据模块上保留非可视组件。

标签: delphi tclientdataset


【解决方案1】:

ATableField 是从哪里来的?会不会是对已经被释放的对象的无效引用?

此外,您可以在项目中包含 midaslib.pas 以消除对外部 midaslib.dll 的使用。但是,它会使您的项目稍大一些,因为您基本上是在 exe 中编译 dll。

【讨论】:

  • @GolezTrol ATableField 未被释放,它由数据模块创建和释放。 ATableField中字符串的长度是11个字符或22个字节(CTRL+F7)才能看到数据,是的,你需要添加ADataModule.ATableField.AsString才能看到值。
  • 嗯,很难找到访问冲突的原因。如果您的代码中的所有对象都存在并且有效,则代码没问题并且应该可以正常工作。据我所知,在使用单独的 midas.dll 时,您不需要 ShareMem 来处理 ClientDataset 中的字符串字段,但您可以通过在项目中包含 ShareMem 或 MidasLib 来尝试。如果不是这种情况,则错误必须在代码的另一部分。
  • 每当我尝试将值分配给特定的 TStringField 时,违规者就会发挥作用,这也是有效的,但是有些事情没有意义,所有其他字段都正常工作,只是这个不想遵守,奇怪……
  • 好的,所以我设法找到了问题,你是对的,问题出在另一个地方:我有一个 AfterScroll 事件,在这个事件中我做了一些事情,然后我有一个 cxDBLookupComboBox它已经分配了 OnEditValueChanged(它也尝试为 cdsATestField 设置值)——这就是问题所在,我相信这是一个堆栈溢出:D 只是它没有引发堆栈溢出。非常感谢您抽出时间 GolezTrol。
  • midaslib.pas 仅包含在最新版本的 Delphi 中。例如,在 Delphi 7 中它不可用。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2021-06-17
  • 2016-06-08
  • 2013-09-17
  • 2016-11-17
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
相关资源
最近更新 更多