为什么访问违规?

时间:2012-07-23 17:17:04

标签: delphi

我正在尝试在某些Delphi项目中构建自己的类。代码是这样的:

type
 TMyClass = class(TObject)
private
 hwnMain, hwnChild: HWND;
 Buffer, URL: string;
 Timer: TTimer;
public
 procedure ScanForClass;
end;

var
Form1: TForm1;
TimerAccess: TMyClass;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
 TimerAccess.ScanForClass;
end;

procedure TMyClass.ScanForClass;
begin
 Timer:= TTimer.Create(Application); **here I get Access Violation!!**
 Timer.Interval:= 5000;
 Timer.Enabled:= true;

为什么要获取该访问权限?

1 个答案:

答案 0 :(得分:14)

您的代码在使用之前不会创建该类的实例。

因此,它会在此代码中引发访问冲突异常:

procedure TForm1.FormCreate(Sender: TObject);
begin
  TimerAccess.ScanForClass;
end;

因为TimerAccess仍然未初始化(未定义)。

在FormCreate中

,调用构造函数并将实例分配给变量

procedure TForm1.FormCreate(Sender: TObject);
begin
  TimerAccess := TMyClass.Create; 
  TimerAccess.ScanForClass;
end;
在FormDestroy中

,调用析构函数进行清理:

procedure TForm1.FormDestroy(Sender: TObject);
begin
  TimerAccess.Free;
end;

注意:如果TForm1有很多实例,代码将不起作用,因为变量TimerAccess是全局的,并且每个Form实例都会在FormCreate中分配一个新的TMyClass实例,从而导致内存泄漏。一种解决方案是使TimerAccess成为Form类的属性(或字段)。