今天我偶然发现了德尔福数据集中的adt field types。我们使用自定义客户端数据集将对象绑定到视图中的数据集。使用该数据集和我们的TDbGrid
自定义派生并启用FastMM4完全调试模式,我们获得了以下堆栈跟踪的访问冲突:
System.Generics.Collections.TListHelper.DoIndexOfFwd4((kein Wert))
System.Classes.TComponent.FreeNotification($7F961CE0)
Vcl.DBGrids.TColumn.SetField($7F971700)
Vcl.DBGrids.TColumn.GetField
Vcl.DBGrids.TCustomDBGrid.Notification($7F971220,???)
System.Classes.TComponent.RemoveFreeNotifications
System.Classes.TComponent.Destroy
Data.DB.TField.Destroy
System.TObject.Free
Data.DB.TFields.ClearBase(True)
Data.DB.TFields.ClearAutomatic`
Data.DB.TDataSet.DestroyFields
Datasnap.DBClient.TCustomClientDataSet.InternalClose
Data.DB.TDataSet.CloseCursor
Datasnap.DBClient.TCustomClientDataSet.CloseCursor
Data.DB.TDataSet.SetActive(???)
经过一些调试之后,我发现数据集的内部FieldList
包含已经销毁的字段。在做了一些更多的研究之后,我发现了禁用属性
DataSet.ObjectView
禁用内部FieldList
,访问冲突就会消失。
由于我们不使用ADT字段类型,我怀疑禁用它并没有坏处,但是人们永远不会知道。
背景
我已经遇到了TDataSet
和TDbGrid
的许多问题,从网格中闪烁的scollbar的固有问题开始,到oracle数据库的损坏的BCD参数结束。我们从XE3更新到DX10,之前没有发生访问冲突。