2012-07-16 55 views
0

我有一個FadeIn定時器和一個FadeOut定時器的項目。我的表單由FadeIn Timer創建,並由FadeOut Timer關閉。最初,FadeIn Timer被啓用,FadeOut Timer被禁用。淡入定時器代碼:使用定時器的標題欄上的關閉按鈕關閉的Delphi窗體

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; 

但它不工作。請幫幫我。

回答

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這樣的全局變量來發送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; 
+0

非常感謝。我根據你的解決方案嘗試過。但還有另一個問題。當鼠標指針位於「X」按鈕時,表單將立即關閉而不使用FadeOutTimer。請幫幫我。 – 2012-07-17 07:30:12

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; 
+0

非常感謝。您的解決方案根據我的需要正常工作。 – 2012-07-17 16:43:53