2013-06-29 30 views
1

我需要知道Windows 7中一個奇怪行爲的原因(和可能的解決方法)。 我有Form1上有一個按鈕,還有第二個窗體稱爲Form2。在按鈕的點擊處理我有:出現影響,第二次顯示窗口時

Form2.Show; 

運行我的程序後,我第一次點擊按鈕,我的Form2出現一個漂亮的淡入效果(對不起,我不知道確切的療效在Windows 7中的名稱。告訴我,如果你知道!)。好。我關閉Form2並再次點擊按鈕。這一次Form2根本沒有任何效果。

我希望我的Form2每次點擊按鈕時都會出現這種效果。更具體地說,當用戶點擊托盤圖標時,我需要一個真實應用程序的主要形式。第一次點擊托盤圖標顯示帶動畫的窗口,但第二次沒有。我該如何解決這個問題?

+0

OT:通過使用['AnimateWindow'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms632669(v = vs.85).aspx)函數,你可以得到更好的效果。 – TLama

+1

「有什麼想法?」不是一個非常具體的問題。我已經發布了一個答案,但你應該[編輯]更清楚地問一些問題。 「我想編寫一個程序來做一些事情,我寫了這行代碼,這是第一次,但不是之後,任何想法?」這不是一個真正的問題。 –

+0

@KenWhite,我對造成的任何困惑表示歉意。我編輯了我的問題。我的問題仍然存在。 –

回答

4

Windows在第一次顯示窗口時顯示動畫。因此,您只需確保每次顯示錶格時都會首次顯示關聯的窗口。

您可以在關閉時銷燬表單並在需要再次顯示時創建新實例。但是,這可能對您不方便,具體取決於您的表單如何管理狀態。從您的編輯和評論來看,當您關閉該表單時,您無法承擔損失。相反,您需要強制爲您的表單創建一個新窗口,每次顯示它。

例如,在窗體的OnClose事件中添加對DestroyHandle的調用。或在顯示窗口之前立即致電RecreateWnd。請注意,後者將涉及使受保護的方法RecreateWnd可以在窗體上調用Show的人看到。

+0

我在Form2的FormClose事件中調用了RecreateWnd。但它沒有任何區別。 –

+0

在這裏可以正常工作。我添加了更多的細節來幫助你做對。但我所說的是正確的。默認情況下,您想要的動畫僅在窗口的生命週期中顯示一次。所以你所要做的就是確保每次你的表單顯示時,這是第一次顯示關聯的窗口。 –

+0

當我說「工作正常」時,我並不是說在OnClose事件中調用RecreateWnd。這是行不通的。正如我在答案中所描述的,從那裏調用DestroyWnd。 –

3

從自動創建列表中刪除您的Form2。 (Project->Options->Forms,點擊Form2在左窗格中,單擊標>將其移動到右側的按鈕)。

更改ButtonClick處理程序:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    TempFrm: TForm2; 
begin 
    TempFrm := TForm2.Create(nil); 
    TempForm.Show; 
end; 

一個FormClose事件添加到TForm2(而你「它再次,刪除全局變量Form2: TForm2;剛剛implementation條款上面,這樣你就不會錯誤地再次使用它)::

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

注意:您應該去Tools->Options->VCL Designer,取消選擇Auto create forms and data modules在底部的Module creation options。自動創建表單幾乎總是一個壞主意;我唯一允許自動創建的(除了主窗體)是任何需要立即可用的TDataModule,我將它移動到您在第一段中看到的自動創建列表的頂部,以便它在主窗體之前創建。

+0

我知道我可以防止表單被自動創建,並在我需要展示它們之前創建它們。但問題是,在我的真實應用程序中,即使主窗體已關閉,只能通過單擊托盤圖標來顯示。所以我第一次點擊托盤圖標時,動畫就起作用了。但不是第二次。該怎麼做?! –

相關問題