我正在尝试在某些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;


为什么会出现访问冲突?

最佳答案

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

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

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类的属性(或字段)。

09-13 04:24