| 導購 | 订阅 | 在线投稿
分享
 
 
 

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

2008-06-01 01:55:12  編輯來源:互聯網  简体版  手機版  移動版  評論  字體: ||
 

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就會返回。因此,若使用局部變量,將會立即失去其作用域。

 
  4.3 窗體的更多細節 使用IDE創建一個窗體的同時,C++Builder會自動地通過在WinMain()函數中加入代碼來在內存中創建窗體。這也是一般所需的方式,可以不必去改變。也就是說,在整個程序範圍內主窗口是一直存在的,所以爲主窗口創建窗體時,可以不必改變C++Builder的缺省方式。 不過,你可能不希望在程序運行時,所有應用程序的窗體都駐留在內存中,若不希望應用程序的 對 話框同時留在內存中,可以在需要的時候動態地創建它們 。 窗體可分爲模態(Modal)和非模態(Modeless)兩類,模態窗體指的是用戶在切換到其他窗體之前需與之交互的窗體(例如,對話框就要求用戶的輸入)。非模態窗體是指一直顯示的窗口,直到用戶關閉或將其最小化,或者是被其他窗口蓋住。 4.3.1 控制窗體何時駐留內存 缺省時C++Builder會通過在應用程序的WinMain()函數中加入下列代碼,自動地在內存中創建應用程序主窗體。 [url=/bbs/detail_1784989.html][img]http://image.wangchao.net.cn/it/1323425080496.gif[/img][/url] 這個函數創建了一個與窗體同名的全局變量,應用程序中的每個窗體都對應一個全局變量,這個變量是指向窗體類的實例的指針,並在程序運行的同用于引用窗體,所有包含窗體頭文件(.h)的源代碼 (.cpp)文件都可以通過這個變量來訪問窗體。 因爲窗體被加入到WinMain()函數中,所以當程序一激活,窗體就會出現,同時在整個應用程序運行時都駐留在內存中。 1.顯示自動生成的窗體 假如選擇在程序啓動時創建窗體,但想在稍後再顯示它,這時可在窗體事件處理程序中用Show Modal方法來顯示一個已存在于內存中的窗體。 [url=/bbs/detail_1784989.html][img]http://image.wangchao.net.cn/it/1323425080528.gif[/img][/url] 在這種情況下,由于窗體已存在于內存中,故不用再創建另一個實例或析構那個實例。 2.動態創建窗體 有時不希望應用程序中的所有窗體都駐留在內存中,爲減少程序載入時所需的內存數,可以在需要使用某些窗體時才創建它們。例如,對話框就只在用戶需和它交互時才需出現在內存中。 爲在運行時不同階段使用IDE創建窗體: 1) 從組件欄中選擇FileNewForm菜單項以顯示新窗體。 2) 從PRojectOptionsForms頁中的自動創建的窗體列表中,將該窗體刪除。這也就是從WinMain()函數中刪除窗體的調用,也可自行從WinMain()函數中刪除下面這一行: [url=/bbs/detail_1784989.html][img]http://image.wangchao.net.cn/it/1323425080564.gif[/img][/url] 3) 需要調用窗體時,對于非模態窗體可使用Show方法,對于模態窗體可使用ShowModal方法。 [url=/bbs/detail_1784989.html][img]http://image.wangchao.net.cn/it/1323425080581.gif[/img][/url] 主窗體的事件處理程序必須創建結果窗體的實例,並負責刪除它,調用結果窗體的方式之一是使用全局變量,如下所示。注重ResultsForm是一個模態窗體,處理程序將使用ShowModal方法。 例中事件處理程序會在窗體關閉之後刪除它,因此若需要在應用程序的其他地方使用ResultsForm,就需要使用new重新創建它,若窗體是使用Show方法顯示的,則不能在文件處理程序中刪除它,因爲Show需在窗體是打開時返回。 注重使用new操作符創建窗體時,要確保該窗體不在ProjectOptionsForms頁的自動創建窗體的列表中,確切地說,假如創建一個窗體而沒有從自動創建窗體列表中刪除同名的窗體,則C++Builder會在啓動時創建窗體,同時事件處理程序會創建一個新的實例,並會重載對自創建實例的引用,自動創建的實例雖存在,但應用程序無法再訪問到它。而當事件處理程序結束時,全局變量不再指向一個有效窗體,所有對該全局變量的調用都可能會造成應用程序崩潰。 3.創建窗口之類的非模態窗體 只要窗體仍在使用,就必須保證非模態窗體的引用變量的存在,也就是說這此變量必須有全局範圍,大多數情況下,必須使用窗體創建時生成的全局變量(變量名和窗體的Name屬性相同),假如應用程序需要窗體的額外的實例,必須爲每個實例聲明單獨的全局變量。 4.使用局部變量創建窗體實例 創建模態窗體個別實例的較安全方法是在事件處理程序中使用局部變量作爲新實例的引用。假如使用局部變量,就可以不必關心ResultsForm是否爲自動創建的了,事件處理程序的代碼不會引用全局窗體變量。例如: [url=/bbs/detail_1784989.html][img]http://image.wangchao.net.cn/it/1323425080609.gif[/img][/url] 可以注重在這個事件處理程序中沒有使用窗體的全局實例。應用程序一般使用窗體的全局實例。不過,若需要模態窗體的新實例。或是在應用程序的個別的塊(例如某一個函數)中使用窗體。使用局部實例則是最安全有效的方式。 當然,非模態窗體的事件處理程序中不能使用局部變量。因爲非模態窗體必須具有全局範圍以保證在窗體使用過程中一直是存在的窗體一打開。Show就會返回。因此,若使用局部變量,將會立即失去其作用域。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有