0

変数が「プライベート」の下で定義されている場合(このユニット内でのアクセスを制限する必要がある場合)、何らかの理由で、与えられたコードを整理しています。それらに書き込むときに EAccessViolation エラーが発生します。実装の直前に Var の下で大まかに定義すると、問題なくアクセスできます。私は自分の構造を他の同様のユニットと比較していますが、プライベートユニットは正常に機能し、大きな違いを見つけることはできません.. 何か提案はありますか?

エラー MSG: プロジェクト --- 例外クラス EAccessViolation エラーが発生し、メッセージ「モジュール内のアクセス違反エラー----」が発生しました。アドレス0000050Fのリード

interface
uses
  dialogs, math, dateutils, SysUtils, classes;
type
     //double = extended;   
     TDoubleDoubleArray = array of array of double;
     TSunPositionAlgorithm = class (TObject)
         private
           FLocationChanged: boolean;
         public
           Constructor Create;
           Destructor Destroy;
           procedure SetDefaults;
         end;
  Var
    SunPositionAlgorithm : TSunPositionAlgorithm;
           F_L0: Double;
           F_L1: TDoubleDoubleArray;

implementation
  {TSunPositionAlgorithm }

constructor TSunPositionAlgorithm.Create;
begin
  SetDefaults;
end;

procedure TSunPositionAlgorithm.SetDefaults;
Begin
F_L0:= 1;                   // works ok
  FLocationChanged:=true;  // throws eaccess violation error
End;

呼び出し機能 (David H の最初の質問の後に投稿に追加):

  procedure TSun.NRELPositionOfSun(const DateTime: TDateTime; var Azimuth, Elevation, Declination: double);
  Var

    LSunPositionAlgorithm : TSunPositionAlgorithm;
  Begin
    LSunPositionAlgorithm := TSunPositionAlgorithm.Create;
    Try
      LSunPositionAlgorithm.SetDefaults;

  blah..


    Finally
      LSunPositionAlgorithm.Destroy;
    End;
  End;
4

1 に答える 1

4

このコードを呼び出すコードを示していません。TSunPositionAlgorithmただし、有効なオブジェクトがないことは明らかです。

次のようなもののいずれかを取得します。

procedure Test;
var
  spa: TSunPositionAlgorithm;
begin
  spa := TSunPositionAlgorithm.Create;
  try
    spa.SetDefaults;
  finally
    spa.Free;
  end;
end;

おそらく次のようなコードがあります。

procedure Test;
var
  spa: TSunPositionAlgorithm;
begin
  spa.SetDefaults;//oops, spa has not been initialised yet  
end;

またはおそらく次のように:

procedure Test;
var
  spa: TSunPositionAlgorithm;
begin
  spa.Create;//oops, spa has not been initialised yet  
end;

更新呼び出しコードを表示しましたが、問題のコードはあなたが説明した動作を示さないため、すべてを表示していないことは明らかです。私が主張したいのは、無効なオブジェクト参照がどこかにあるに違いないということです。そのための最も一般的な方法をいくつか示しました。ただし、無効なオブジェクト参照を取得する方法は他にもあります。


問題のコードのもう1つの問題は、デストラクタです。それらは常にoverrideディレクティブでマークする必要があります。

destructor Destroy; override;

オブジェクトが解放されたときにデストラクタが呼び出されるようにするには、これを行う必要があります。

于 2012-09-14T10:09:45.697 に答える