在Private中使用变量的EAccessviolation AV错误

时间:2012-09-14 10:03:30

标签: delphi pascal

我正在整理我给出的一些代码,出于某种原因,如果变量是在'Private'下定义的(他们需要在这个单元内约束访问)。写入时我收到EAccessViolation错误。如果我在实现之前松散地在Var下定义它们,可以访问它们。我将我的结构与其他类似的单位进行比较,其中私人单位工作正常和无法发现任何重大差异..有什么建议吗?

错误MSG:Project ---引发异常类EAccessViolation错误,消息'模块中的访问vilation错误----。读取地址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;

1 个答案:

答案 0 :(得分: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;

更新您现在已经显示了调用代码,但您显然没有全部显示,因为问题中的代码没有显示您描述的行为。我提出的观点仍然存在,你必须在某处有一个无效的对象引用。我已经展示了几种最常见的方法。但是还有其他方法可以获得无效的对象引用。


问题中代码的另一个问题是你的析构函数。必须始终使用override指令标记它们。

destructor Destroy; override;

您必须执行此操作才能在释放对象时调用析构函数。