我正在整理我给出的一些代码,出于某种原因,如果变量是在'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;
答案 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;
您必须执行此操作才能在释放对象时调用析构函数。