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

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

C++Builder給窗體傳遞其他參數
C++Builder給窗體傳遞其他參數
通常會在IDE中創建應用程序的窗體,以這種方式創建窗體,窗體會擁有一個只包含一個參數Owner的構造函數。Owner是指向所創建窗體的擁有者的指針(擁有者一般是應用程序對象或窗體對象)。Owner可以爲Null。要將其他的...查看完整版>>C++Builder給窗體傳遞其他參數
 
使用C++Builder的內存流建立文件包
C++Builder爲我們提供了很多的有用的組件,這就不用我多說了,我寫這篇文章是因爲我剛給我們實驗室做完了一個數據庫的程序,其中有一部分産品數據管理(PDM),要將每一張PRO/E工程圖存放到數據庫中的一個字段中,數據...查看完整版>>使用C++Builder的內存流建立文件包
 
C++Builder 內存泄漏檢查工具-CodeGuard
關于如何在BCB中使用CodeGuard一、爲什麽寫這篇東西自己在使用BCB5寫一些程序時需要檢查很多東西,例如內存泄漏、資源是否有釋放等等,在使用了很多工具後,發覺BCB5本身自帶的工具——CodeGuard,非常不錯,使用也挺...查看完整版>>C++Builder 內存泄漏檢查工具-CodeGuard
 
也說說c++builder中的不規則窗體的實現
也說說c++builder中的不規則窗體的實現 也說說c++builder中的不規則窗體的實現   最近看了《C++Builder中不規則窗體的快速顯示》{ Form1->TransparentColorValue=clWhite; Form1->TransparentCo...查看完整版>>也說說c++builder中的不規則窗體的實現
 
利用C++Builder自定義Windows窗體“系統菜單”
利用C++Builder自定義Windows窗體“系統菜單” 安徽合肥智能機械研究所張建軍------------------------------------------------------------------------------- 在開發Windows應用程序時,軟件人員希...查看完整版>>利用C++Builder自定義Windows窗體“系統菜單”
 
C++Builder從窗體獲取數據
C++Builder從窗體獲取數據
大多數實際的應用程序由多個窗體組成。信息經常需要在窗體之間傳遞。將信息傳遞給窗體,可借助傳遞給窗體的參數,或通過設置窗體的屬性。獲得消息的方式依靠于窗體模態的還是非模態的。1.從非模態窗體獲取數據 通...查看完整版>>C++Builder從窗體獲取數據
 
也說說c++builder中的不規則窗體的實現
  最近看了《C++Builder中不規則窗體的快速顯示》2000-09-07· 陶志才·yesky(),自己去做了,發現原來它上面的方法不是最簡便的。所以在這裏和大家討論一下。  首先上文中的內容我就不再重複了。我要改變的關...查看完整版>>也說說c++builder中的不規則窗體的實現
 
C++BUILDER中一些實現界面效果的技巧。。不規則窗體等等。。
以下源碼是快速創建不規則窗體的,還可以移動。#ifndef Unit1H#define Unit1H#include <Classes.hpp>#include <Controls.hpp>#include <StdCtrls.hpp>#include <Forms.hpp>#include <Ext...查看完整版>>C++BUILDER中一些實現界面效果的技巧。。不規則窗體等等。。
 
Excel在.Net下駐留內存的解決方法
  這段時間在VS 2003 的WebForm 方式下對Excel 進行操作,遇到一個最爲頭疼的問題就是對Excel操作完畢後Excel不能夠正常關閉,系統退出後,Excel總是駐留在內存中。但是這段代碼放到WinForm的程序中又沒有問題。在...查看完整版>>Excel在.Net下駐留內存的解決方法
 
 
回到王朝網路移動版首頁