Delphi 禁用TDataset.ObjectView是否有副作用?
今天我无意中发现了Delphi数据集中的错误。我们使用自定义客户端数据集将对象绑定到视图中的数据集。使用该数据集和我们的自定义派生的Delphi 禁用TDataset.ObjectView是否有副作用?,delphi,access-violation,vcl,tclientdataset,delphi-10-seattle,Delphi,Access Violation,Vcl,Tclientdataset,Delphi 10 Seattle,今天我无意中发现了Delphi数据集中的错误。我们使用自定义客户端数据集将对象绑定到视图中的数据集。使用该数据集和我们的自定义派生的TDbGrid,并启用FastMM4完全调试模式,我们获得了以下堆栈跟踪的访问冲突: System.Generics.Collections.TListHelper.DoIndexOfFwd4((kein Wert)) System.Classes.TComponent.FreeNotification($7F961CE0) Vcl.DBGrids.TColumn.
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
禁用内部字段列表
,访问冲突消失
由于我们不使用ADT字段类型,我怀疑禁用它并没有坏处,但人们永远不会知道
背景
我已经在TDataSet
和TDbGrid
方面遇到了很多问题,首先是网格中闪烁的scollbar的固有问题,最后是oracle数据库的BCD参数损坏。我们从XE3更新到DX10,之前没有发生访问冲突
- 我无法发布自定义数据集/自定义网格的代码
- 我们将在网格之前释放数据集
GetField
正在调用SetField
,其中包含导致异常的已处理字段。我认为这是因为t字段。LifeCycle
是lcAutomatic
和lcPersistent
,因为我们在网格中定义了显示列。这个问题的一个原因是我假设adt字段类型的功能很少使用。我以前从未听说过。。