-1

多くの調査の後、ここに質問を投稿することにしました。

大量のコードを言い訳した後、「Access Violation ....」という美しいメッセージが表示されます。デバッグモードでは、この行「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 に答える