国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++ Builder 控制窗體何時駐留內存

2019-11-17 05:13:42
字體:
來源:轉載
供稿:網友

  4.3 窗體的更多細節

    使用IDE創建一個窗體的同時,C++Builder會自動地通過在WinMain()函數中加入代碼來在內存中創建窗體。這也是一般所需的方式,可以不必去改變。也就是說,在整個程序范圍內主窗口是一直存在的,所以為主窗口創建窗體時,可以不必改變C++Builder的缺省方式。
    不過,你可能不希望在程序運行時,所有應用程序的窗體都駐留在內存中,若不希望應用程序的 對 話框同時留在內存中,可以在需要的時候動態地創建它們 。
    窗體可分為模態(Modal)和非模態(Modeless)兩類,模態窗體指的是用戶在切換到其他窗體之前需與之交互的窗體(例如,對話框就要求用戶的輸入)。非模態窗體是指一直顯示的窗口,直到用戶關閉或將其最小化,或者是被其他窗口蓋住。

4.3.1 控制窗體何時駐留內存
    缺省時C++Builder會通過在應用程序的WinMain()函數中加入下列代碼,自動地在內存中創建應用程序主窗體。
C++ Builder 控制窗體何時駐留內存(圖一)
    這個函數創建了一個與窗體同名的全局變量,應用程序中的每個窗體都對應一個全局變量,這個變量是指向窗體類的實例的指針,并在程序運行的同用于引用窗體,所有包含窗體頭文件(.h)的源代碼 (.cpp)文件都可以通過這個變量來訪問窗體。
    因為窗體被加入到WinMain()函數中,所以當程序一激活,窗體就會出現,同時在整個應用程序運行時都駐留在內存中。

1.顯示自動生成的窗體
    假如選擇在程序啟動時創建窗體,但想在稍后再顯示它,這時可在窗體事件處理程序中用Show Modal方法來顯示一個已存在于內存中的窗體。
C++ Builder 控制窗體何時駐留內存(圖二)

    在這種情況下,由于窗體已存在于內存中,故不用再創建另一個實例或析構那個實例。

2.動態創建窗體
    有時不希望應用程序中的所有窗體都駐留在內存中,為減少程序載入時所需的內存數,可以在需要使用某些窗體時才創建它們。例如,對話框就只在用戶需和它交互時才需出現在內存中。
    為在運行時不同階段使用IDE創建窗體:

1) 從組件欄中選擇FileNewForm菜單項以顯示新窗體。
2) 從PRojectOptionsForms頁中的自動創建的窗體列表中,將該窗體刪除。這也就是從WinMain()函數中刪除窗體的調用,也可自行從WinMain()函數中刪除下面這一行:
C++ Builder 控制窗體何時駐留內存(圖三)
3) 需要調用窗體時,對于非模態窗體可使用Show方法,對于模態窗體可使用ShowModal方法。
C++ Builder 控制窗體何時駐留內存(圖四)

    主窗體的事件處理程序必須創建結果窗體的實例,并負責刪除它,調用結果窗體的方式之一是使用全局變量,如下所示。注重ResultsForm是一個模態窗體,處理程序將使用ShowModal方法。
    例中事件處理程序會在窗體關閉之后刪除它,因此若需要在應用程序的其他地方使用ResultsForm,就需要使用new重新創建它,若窗體是使用Show方法顯示的,則不能在文件處理程序中刪除它,因為Show需在窗體是打開時返回。
    注重使用new操作符創建窗體時,要確保該窗體不在ProjectOptionsForms頁的自動創建窗體的列表中,確切地說,假如創建一個窗體而沒有從自動創建窗體列表中刪除同名的窗體,則C++Builder會在啟動時創建窗體,同時事件處理程序會創建一個新的實例,并會重載對自創建實例的引用,自動創建的實例雖存在,但應用程序無法再訪問到它。而當事件處理程序結束時,全局變量不再指向一個有效窗體,所有對該全局變量的調用都可能會造成應用程序崩潰。

3.創建窗口之類的非模態窗體
    只要窗體仍在使用,就必須保證非模態窗體的引用變量的存在,也就是說這此變量必須有全局范圍,大多數情況下,必須使用窗體創建時生成的全局變量(變量名和窗體的Name屬性相同),假如應用程序需要窗體的額外的實例,必須為每個實例聲明單獨的全局變量。

4.使用局部變量創建窗體實例
    創建模態窗體個別實例的較安全方法是在事件處理程序中使用局部變量作為新實例的引用。假如使用局部變量,就可以不必關心ResultsForm是否為自動創建的了,事件處理程序的代碼不會引用全局窗體變量。例如:
C++ Builder 控制窗體何時駐留內存(圖五)

    可以注重在這個事件處理程序中沒有使用窗體的全局實例。應用程序一般使用窗體的全局實例。不過,若需要模態窗體的新實例。或是在應用程序的個別的塊(例如某一個函數)中使用窗體。使用局部實例則是最安全有效的方式。
    當然,非模態窗體的事件處理程序中不能使用局部變量。因為非模態窗體必須具有全局范圍以保證在窗體使用過程中一直是存在的窗體一打開。Show就會返回。因此,若使用局部變量,將會立即失去其作用域。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇赉县| 武川县| 扶风县| 聊城市| 黄大仙区| 喀什市| 武义县| 咸阳市| 屏东市| 吉安市| 雅江县| 察隅县| 巴里| 崇州市| 太仓市| 德州市| 中山市| 宁陵县| 宝清县| 河东区| 美姑县| 辽宁省| 浪卡子县| 东平县| 桓仁| 镇江市| 赣州市| 彰化市| 绥中县| 揭阳市| 平江县| 雅江县| 会同县| 丁青县| 潜江市| 沛县| 蓬溪县| 平定县| 宁南县| 赤城县| 平湖市|