0

我有一个带有一个 FadeIn Timer 和一个 FadeOut Timer 的项目。我的表单由 FadeIn Timer 创建并由 FadeOut Timer 关闭。最初启用 FadeIn Timer 并禁用 FadeOut Timer。淡入定时器代码:

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

如果表单立即关闭,那么您需要一个全局表单变量,就像FAllowCloseFalse在创建表单时设置的那样。然后你需要为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事件中取消它。然后,当您完成淡出表单时,关闭表单。您将需要一个全局变量FAllowCloseOnCloseQuery表示正在关闭表单而不是用户的事件。这段代码更具说明性,应该处理用户在“X”淡出时再次单击它的情况。

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

我认为这是James L 答案的正确淡出代码:

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 回答