-1

经过大量研究,我决定在这里发布我的问题。

在排除大量代码后,我收到了漂亮的消息“访问冲突......”。在调试模式下,我看到这一行“dsPRINCIPAL.DataSet.FieldByName('ID_NATURE').AsInteger” 和我的数据集的所有属性都显示了这个 “Violation d'accès pour 4034D1E0 accédant à FFFFFFFF”。

我的 dsPRINCIPAL 和数据集处于活动状态并处于编辑模式,并且有 1 条记录(非空)。

你能帮我理解为什么我在这条线上有访问冲突吗?

这是代码:

if dsCTC_PRINCIPAL.DataSet.FieldByName('ID_NATURE_CTC').AsInteger:=Variable.Get(VCA‌​_PREFERENCES +'.ID_NATURE_CTC_MGE_SUIVI',scGlobal).asInteger; dsCTC_PRINCIPAL.DataSet.FieldByName('ID_OBJET_CTC').AsInteger:=Variable.Get(VCA_‌​PREFERENCES +'.ID_OBJET_HL_MGE',scGlobal).asInteger; dsCTC_PRINCIPAL.DataSet.FieldByName('QTEPASSE').AsInteger:=0;

问候。

4

1 回答 1

2

我怀疑dsPRINCIPAL.DataSet甚至dsPRINCIPAL.DataSet.FieldByName('ID_NATURE')返回nil,所以调用AsInteger虚方法引发了访问冲突。

尝试这个:

var NatureField: TField;

if dsPRINCIPAL.DataSet=nil then
  raise Exception.Create('dsPRINCIPAL.DataSet not assigned');
NatureField := dsPRINCIPAL.DataSet.FieldByName('ID_NATURE');
if NatureField=nil then
  raise Exception.Create('ID_NATURE field missing');
...
NatureValue := NatureField.AsInteger;

顺便说一句,出于性能原因,由于FieldByName()可能很慢,当您在循环中检索一些数据时,使用NatureField: TField本地评估器是一个好习惯。

于 2013-03-19T10:53:37.717 回答