フォームがすぐに閉じる場合は、フォームの作成時にFAllowClose
設定するようなグローバル フォーム変数が必要False
です。Form.CloseQuery
次に、イベントのコードを記述する必要があります。このような単純なものが機能するはずです:
procedure Form.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if FAllowClose then
Exit;
CanClose := False;
FadeOut.Enabled := True;
end;
procedure Form.FadeOutOnTimer(Sender: TObject);
begin
// do fade out
FAllowClose := True;
Self.Close
end;
<<< 2012/07/17 追記 >>>
ユーザーがフォームの「X」ボタンをクリックしたときに、フォームが閉じないようにする唯一の方法は、OnCloseQuery
イベントでフォームをキャンセルすることです。フォームのフェードアウトが完了したら、フォームを閉じます。ユーザーの代わりにフォームを閉じているというイベントFAllowClose
を通知するために、グローバル変数 like が必要です。このコードはもう少し説明的で、フェードアウト中にユーザーが「X」を再度クリックする状況を処理する必要があります。OnCloseQuery
interface
type TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FadeOutTimer(Sender: TObject);
private
FAllowClose: Boolean;
public
end;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
FAllowClose := False;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if FAllowClose then // <- is 'False' when user clicks "X"
Exit;
CanClose := False; // <- cancels close when user clicks "X"
FadeOut.Enabled := True;
end;
procedure TForm1.FadeOutTimer(Sender: TObject);
begin
if Form1.AlphaBlendValue > 0 then
Form1.AlphaBlendValue := Form1.AlphaBlendValue - 5
else
begin
FadeOut.Enabled := False;
FAllowClose := True;
Self.Close;
end;
end;