0

1 つの FadeIn タイマーと 1 つの FadeOut タイマーを含むプロジェクトがあります。私のフォームは FadeIn Timer によって作成され、FadeOut Timer によって閉じられます。最初は、FadeIn タイマーが有効で、FadeOut タイマーが無効になっています。フェードイン タイマー コード:

if MainForm.AlphaBlendValue >= 235 then
  Timer01.Enabled := false 
else 
  MainForm.AlphaBlendValue := MainForm.AlphaBlendValue + 5;

フェードアウトタイマーコード:

if MainForm.AlphaBlendValue <= 0 then 
  Timer02.Enabled := false 
else 
  MainForm.AlphaBlendValue := MainForm.AlphaBlendValue - 5; 
close;

私の要件は、キャプション バーの [X] ボタンをクリックすると、フェードアウト タイマーがアクティブになることです。だから私は定義した

if Msg.Result=htClose then 
  FadeOutTimer.Enabled:=true;

しかし、それは機能しません。私を助けてください。

4

2 に答える 2

3

フォームがすぐに閉じる場合は、フォームの作成時に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;
于 2012-07-16T20:17:42.560 に答える
1

これはJamesLの答えの適切なフェードアウトコードだと思います:

procedure Form.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if FAllowClose then
  begin
    CanClose := True;
    Exit;
  end;

  CanClose := False;
  FadeOut.Enabled := True;
end;

procedure Form.FadeOutOnTimer(Sender: TObject);
begin
  if MainForm.AlphaBlendValue <= 0 then
  begin
    FadeOut.Enabled := false 
    FAllowClose := True;
    Self.Close
  end
  else 
    MainForm.AlphaBlendValue := MainForm.AlphaBlendValue - 5; 
end;
于 2012-07-17T13:18:40.167 に答える