Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 禁用TDataset.ObjectView是否有副作用?_Delphi_Access Violation_Vcl_Tclientdataset_Delphi 10 Seattle - Fatal编程技术网

Delphi 禁用TDataset.ObjectView是否有副作用?

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.

今天我无意中发现了Delphi数据集中的错误。我们使用自定义客户端数据集将对象绑定到视图中的数据集。使用该数据集和我们的自定义派生的
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字段类型的功能很少使用。我以前从未听说过。。