释放包含 TJvAppDBStorage 的数据模块会在 TComponent.RemoveNotification()



我有一个我无法释放的数据模块(听起来很有趣(。无论我尝试手动销毁它,还是让另一个组件(甚至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吗?这是其正常预期的行为吗?

我没有

JvAppDBStorage的经验,但我可以猜测正在发生的事情。

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

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

相关内容

  • 没有找到相关文章

最新更新