StringGridに入力した内容をParadox7のTableに書き込みたいのですが、
実行すると
EOleErrorクラスの例外を生成しました。’バリアントはオートメーションオブジェクトを参照していません’
というエラーが起きます。
何が原因なのか、いえ、どんなエラーなのかさえ分からず困っています。
どなたかご教授お願いします。
以下、エラーの起こる部分のコードです。
with DataModule2.StandardTable do
begin
Open;
Append;
FieldValues['StaffNo'].AsInteger:=StrToInt(StringGrid1.Cells[2,1]);
Post;
Close;
end;
上記のFieldValues['StaffNo'].AsInteger:=StrToInt(StringGrid1.Cells[2,1]);
の部分でエラーが起きます。
環境は、Delphi5 Pro/Win98です。
よろしくお願いします。
>FieldValues['StaffNo'].AsInteger:=StrToInt(StringGrid1.Cells[2,1]);
FieldByName('StaffNo').AsInteger:=StrToInt(StringGrid1.Cells[2,1]);
ではないですか?
@っしーさん、ありがとうございます。
教えて頂いた様にFieldByNameでエラーは出なくなりました。
でも、ヘルプを見る限りでは項目の値を設定する場合はFieldValuesを使えと書いてあります。
何故なんでしょうか?
FeldValues['StaffNo'] := StrToInt(StringGrid1.Cells[2,1]);
でも、問題ないと思います。
私はD7なんで、D5のマニュアルにはどう書かれているかわかりませんが
D7のマニュアルには、FieldValuesよりFieldByNameを使うように勧めています。
Delphi7ではFieldNameですか。
エラーが出なくなったという事はDelphi5でもFieldNameの方がいいのでしょうか?
それとも両者には使い分けの方法でもあるのでしょうか?
--D7EntのHelpより引用-----------------------------------------------
FieldByName メソッド (TDataSet)
説明
FieldByName メソッドを呼び出すと,項目の名前がわかっている場合に,その項目の情報を取得することができます。FieldName は既存項目の名前です。FieldByName は,指定した項目を表す TField オブジェクトを返します。指定した項目が存在しない場合,FieldByName は EDatabaseError 例外を 生成 します。
FieldName には,単純な項目名,親項目の名前によって限定されるオブジェクト項目の下位項目の名前,集合項目の名前を指定できます。このような柔軟性のために,Fields プロパティや AggFields プロパティよりも,FieldByName プロパティ(または FieldByName メソッド)の使用をお勧めします。
---------------------------------------------------------------------
しかし、ヒントには次のようなことが、、、
ヒント:指定した項目の値を取得または設定する場合は,FieldByName ではなく,データセットのデフォルトプロパティの FieldValues を使用します。
---------------------------------------------------------------------
要は、場合によって使い分けてね! ということです。
今回の場合は、どちらでも良いと思いますが、数値に変換できない場合の処理を書く必要があると思います。
@っしーさん、Helpまで引用して頂きありがとうございます。
今の私には、場合によって使い分けというのがそもそも難しい様ですが、
FieldByNameを使って、エラーが出たらFieldValuesを使う事にします。
色々ありがとうございました。
ツイート | ![]() |