使用Timer通过标题栏上的“关闭”按钮关闭Delphi表格

时间:2012-07-16 08:31:23

标签: delphi delphi-xe2

我有一个带有一个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;

FadeOut定时器代码:

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

我的要求是,如果单击标题栏的“X”按钮,FadeOut Timer将处于活动状态。所以我定义了

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

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

2 个答案:

答案 0 :(得分: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;

&LT;&LT;&LT; 2012/07/17编辑&gt;&gt;&gt;

当用户单击表单上的“X”按钮时,阻止表单关闭的唯一方法是在OnCloseQuery事件中取消它。然后,当您完成淡出表单时,关闭表单。您需要一个全局变量,例如FAllowClose来表示关闭表单的OnCloseQuery事件,而不是用户。这段代码更具说明性,应该处理用户在淡出时再次点击“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;

答案 1 :(得分:1)

我认为这是James L's answer的正确淡出代码:

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;