1

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;

なぜそのアクセス違反が発生するのですか?

4

1 に答える 1

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 の新しいインスタンスを割り当てるため、メモリ リークが発生するためです。解決策の 1 つは、TimerAccess を Form クラスのプロパティ (またはフィールド) にすることです。

于 2012-07-23T17:19:16.133 に答える