2 つの質問をされているので、2 つの回答でお答えします。
最初の質問は、TTimers の使用に関するものです。それらは常にメインスレッドで実行されます。
ほとんどの場合、例外はアクセス違反です。
そうである場合、通常は次のいずれかが原因です。
- a- TTimer が起動したときに親フォームが既に破棄されている。
- b- TTimer が起動したときに、親フォームへの参照がまだありません。
b は簡単です。参照がnilかどうかを確認するだけです。
a はより難しく、親フォームをどのように参照するかによって異なります。
基本的に、親が破棄または削除されているときに参照が nil になるようにする必要があります。
グローバル変数 (この例ではForm2 )を介して親フォームを参照する場合、次のように OnDestroy イベントを使用して、TForm2 でForm2 変数をnilにする必要があります。
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormDestroy(Sender: TObject);
begin
Form2 := nil;
end;
end.
親フォームへのフィールド参照 ( FMyForm2Reference など) を使用している場合は、次のように Notification メソッドを追加する必要があります。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2;
type
TForm1 = class(TForm)
private
FMyForm2Reference: TForm2;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) then
if (AComponent = FMyForm2Reference) then
FMyForm2Reference := nil;
end;
end.
よろしく、
ジェローン・プルイマーズ