c# 調用showDialog后需要Dispose


對於winform來說,大家可能有一個慣性認識或者潛意識,Winform在關閉時(Close()方法被調用時),會自動調用Dispose。確實,對很多對象,Close()方法會調用Dispose。然而,對Winform,並不總是成立,只有當Winform以Show的方式,及無模式的方式彈出時,Close才會調用Dispose,也就是說用戶在這種情況下關閉對話框,Dispose會馬上被調用,資源會馬上被釋放。

但是對ShowDialog,及模式對話框的情況就不是這樣了,你必須顯示調用dispose。

Microsoft代碼:

http://msdn.microsoft.com/zh-cn/library/c7ykbedk(VS.80).aspx 

public void ShowMyDialogBox()
{
   Form2 testDialog = new Form2();

   // Show testDialog as a modal dialog and determine if DialogResult = OK.
   if (testDialog.ShowDialog(this) == DialogResult.OK)
   {
      // Read the contents of testDialog's TextBox.
      this.txtResult.Text = testDialog.TextBox1.Text;
   }
   else
   {
      this.txtResult.Text = "Cancelled";
   }
   testDialog.Dispose();
}

這是為什么呢。原來Winform的設計者不得不這么做,如果在Close時就調用Dispose,模式對話框的調用者就沒法訪問對話框的屬性,比如DialogResult,用戶在TextBox上的輸入等等,所以記住,在用ShowDialog模式顯示窗口時,在下面加上一行代碼,form.Dispose()來釋放資源。

擴展:模式對話框和非模式對話框

  模態  非模態 
形式上 ①一個模式對話框是一個有系統菜單、標題欄、邊線等的彈出式窗口。在創建對話框時指定WS_POPUP, WS_SYSMENU, WS_CAPTION和 DS_MODALFRAME風格。即使沒有指定WS_VISIBLE風格,模式對話框也會被顯示。

②創建對話框窗口時,將發送WM_INITDIALOG消息(如果指定對話框的DS_SETFONT風格,還有WM_SETFONT消息)給對話框過程。(對話框的窗口過程由Windows系統提供,用戶在創建對話框窗口時提供一個對話框過程由窗口過程調用。)

③對話框窗口被創建之后,Windows使得它成為一個激活的窗口,它保持激活直到對話框過程調用::EndDialog函數結束對話框的運行或者Windows激活另一個應用程序為止,在激活時,用戶或者應用程序不可以激活它的所屬窗口(Owner window)。

①一個無模式對話框是一個有系統菜單、標題欄、邊線等的彈出式窗口。在創建對話框模板時指定WS_POPUP、WS_CAPTION、WS_BORDER和WS_SYSMENU風格。如果沒有指定WS_VISIBLE風格,無模式對話框不會自動地顯示出來。

②一個無模式對話框既不會禁止所屬窗口,也不會給它發送消息。當創建一個模式對話框時,Windows使它成為活動窗口,但用戶或者程序可以隨時改變和設置活動窗口。如果對話框失去激活,那么即使所屬窗口是活動的,在Z軸順序上,它仍然在所屬窗口之上。

創建 DoModal() Create()
銷毀 一個應用程序通過調用::EndDialog函數來銷毀一個模式對話框。一般情況下,當用戶從系統菜單里選擇了關閉(Close)命令或者按下了確認(OK)或取消(CANCLE)按鈕,::EndDialog被對話框過程所調用。調用::EndDialog時,指定其參數nResult的值,Windows將在銷毀對話框窗口后返回這個值,一般,程序通過返回值判斷對話框窗口是否完成了任務或者被用戶取消。

※ EndDialog(IDC_BUTTON_DEFAULT);我們的代碼中EndDialog方法在指定的BUTTON處理事件結束時調用,來關閉對話框

在應用程序結束之前,它必須銷毀所有的無模式對話框。使用::DestroyWindow銷毀一個無模式對話框,不是使用::EndDiaLog。一般來說,對話框過程響應用戶輸入,如用戶選擇了“取消”按鈕,則自動調用::DestroyWindow;如果用戶沒有有關動作,則應用程序必須調用::DestroyWindow。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM