0

我有一个无法释放的数据模块(听起来很有趣)。无论我是尝试手动销毁它,还是让另一个组件(甚至Application)为我完成它,我都会得到一个带有此堆栈跟踪的 AV:

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,我可以销毁数据模块。这是组件的属性:

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吗?这是正常预期的行为吗?

4

1 回答 1

2

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

该组件将设置存储到数据库中,由实例的DataSource属性指定。JvAppDBStorage在你的情况下是dsConfiguration. 因此,为了使这一切正常工作,您需要在读写设置dsConfiguration时随时可用。AppStorage我敢打赌,当尝试存储它时,它dsConfiguration已经被破坏了。AppStorage我希望在AppStorage被释放时会发生这种情况。所以这个问题的解释dsConfiguration是之前释放的AppStorage

解决方案是确保它在被释放dsConfiguration时仍然活着。AppStorage

于 2013-03-18T13:35:06.763 回答