使用计时器通过标题栏上的关闭按钮关闭Delphi表单

使用计时器通过标题栏上的关闭按钮关闭Delphi表单,delphi,delphi-xe2,Delphi,Delphi Xe2,我有一个项目,有一个FadeIn定时器和一个FadeOut定时器。我的表单由FadeIn计时器创建,并由FadeOut计时器关闭。最初,淡入淡出定时器启用,淡出定时器禁用。FadeIn定时器代码: if MainForm.AlphaBlendValue >= 235 then Timer01.Enabled := false else MainForm.AlphaBlendValue := MainForm.AlphaBlendValue + 5; if MainForm.A

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

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;
淡出计时器代码:

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;

但它不起作用。请帮助我。

如果表单刚刚立即关闭,则需要一个全局表单变量,如创建表单时设置为
False的
FAllowClose
。然后需要为
表单.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;
>

当用户单击表单上的“X”按钮时,阻止表单关闭的唯一方法是在
OnCloseQuery
事件中取消它。然后,当您淡出表单后,关闭表单。您需要一个全局变量,如
FAllowClose
,来向
OnCloseQuery
事件发出关闭表单而不是用户的信号。这段代码更具说明性,应该能够处理用户在“X”淡出时再次单击“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;
接口
类型TForm1=类(TForm)
过程表单创建(发送方:ToObject);
过程FormCloseQuery(发送方:ToObject;变量CanClose:布尔);
程序淡出器(发送方:TObject);
私有的
FAllowClose:布尔型;
公众的
结束;
实施
过程TForm1.FormCreate(发送方:TObject);
开始
FAllowClose:=假;
结束;
过程TForm1.FormCloseQuery(发送方:ToObject;变量CanClose:Boolean);
开始

如果FAllowClose then//如果表单刚刚立即关闭,则需要一个全局表单变量,如创建表单时设置为
False的
FAllowClose
。然后需要为
表单.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;
>

当用户单击表单上的“X”按钮时,阻止表单关闭的唯一方法是在
OnCloseQuery
事件中取消它。然后,当您淡出表单后,关闭表单。您需要一个全局变量,如
FAllowClose
,来向
OnCloseQuery
事件发出关闭表单而不是用户的信号。这段代码更具说明性,应该能够处理用户在“X”淡出时再次单击“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;
接口
类型TForm1=类(TForm)
过程表单创建(发送方:ToObject);
过程FormCloseQuery(发送方:ToObject;变量CanClose:布尔);
程序淡出器(发送方:TObject);
私有的
FAllowClose:布尔型;
公众的
结束;
实施
过程TForm1.FormCreate(发送方:TObject);
开始
FAllowClose:=假;
结束;
过程TForm1.FormCloseQuery(发送方:ToObject;变量CanClose:Boolean);
开始

如果FAllowClose,那么//我认为这是适合以下情况的淡出代码:

procedure Form.FormCloseQuery(发送方:TObject;变量CanClose:Boolean);
开始
如果你输了
开始
CanClose:=真;
出口
结束;
CanClose:=假;
淡出启用:=真;
结束;
程序表。淡出计时器(发送方:TObject);
开始

如果MainForm.AlphaBlendValue我认为这是适合以下情况的淡出代码:

procedure Form.FormCloseQuery(发送方:TObject;变量CanClose:Boolean);
开始
如果你输了
开始
CanClose:=真;
出口
结束;
CanClose:=假;
淡出启用:=真;
结束;
程序表。淡出计时器(发送方:TObject);
开始

如果MainForm.AlphaBlendValue,非常感谢。我已经按照你的解决办法试过了。但还有另一个问题。当鼠标指针位于“X”按钮上时,窗体将立即关闭,而无需使用淡出器。请帮帮我,非常感谢。我已经按照你的解决办法试过了。但还有另一个问题。当鼠标指针位于“X”按钮上时,窗体将立即关闭,而无需使用淡出器。请帮帮我,非常感谢。您的解决方案正根据我的需要正常工作。非常感谢。您的解决方案正根据我的需要正常工作。