首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放包含TJvAppDBStorage的数据模块会引发TComponent.RemoveNotification()中的访问冲突

释放包含TJvAppDBStorage的数据模块会引发TComponent.RemoveNotification()中的访问冲突
EN

Stack Overflow用户
提问于 2013-03-18 12:17:33
回答 1查看 599关注 0票数 0

我有一个我不能免费的数据模块(听起来很有趣)。无论我尝试手动销毁它,还是让另一个组件(甚至是Application)来帮我销毁它,我都会得到一个带有这个堆栈跟踪的AV:

代码语言:javascript
复制
exception class   : EAccessViolation
exception message : Access violation at address 0048FC2B in module 'Instruments.exe'. Read of address 80808088.

main thread ($1e28):
0048fc2b Instruments.exe System.Classes    TComponent.RemoveNotification
00408a01 Instruments.exe System         57 @Halt0
00ac86f0 Instruments.exe Instruments    82 initialization

这个数据模块包含一组TADOxxx组件,外加两个TJvDataSource、一个TApplicationEvents、一个TClientDataSet和一个TJvAppDBStorage。它的代码只包含打开ADO连接、将几条记录写入表、运行几个查询等等(没有什么不寻常的)。除了我上面提到的,它不拥有任何其他组件。我不知道这个对RemoveNotificaion()的虚假电话是从哪里来的。有什么想法吗?

更新

删除TJvAppDBStorage后,我可以销毁数据模块。以下是组件的属性:

代码语言:javascript
复制
object AppStorage: TJvAppDBStorage
  StorageOptions.BooleanStringTrueValues = 'TRUE, YES, Y'
  StorageOptions.BooleanStringFalseValues = 'FALSE, NO, N'
  DataSource = dsConfiguration
  KeyField = 'Key'
  SectionField = 'Section'
  SubStorages = <>
  ValueField = 'Value'
  Left = 272
  Top = 304
end

有人用过JvAppDBStorage吗?这是正常和预期的行为吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-18 13:35:06

我没有使用JvAppDBStorage的经验,但我可以猜测发生了什么。

此组件将设置存储到数据库,这是由DataSource实例的JvAppDBStorage属性指定的。在您的例子中,这是dsConfiguration。因此,为了使所有这些都能工作,您需要dsConfigurationAppStorage读取和写入设置时可用。我敢打赌,当dsConfiguration试图存储到它时,它已经被摧毁了。我希望当AppStorage被释放时会发生这种情况。因此,对这个问题的解释是,dsConfigurationAppStorage之前被释放。

解决方案是确保dsConfiguration在释放AppStorage时仍然有效。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15476675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档