Delphi中的窗體建立與銷毀

2022-06-21 12:00:12 字數 1985 閱讀 3012

delphi中的窗體,有模式窗體與非模式窗體兩種。兩種窗體的呼叫方式不同,模式窗體使用showmodal顯示,非模式窗體使用show顯示。當顯示模式窗體的時候你是不能操作本程式的其他窗體的,你不能把焦點從模式窗體轉到其他窗體上。而非模式窗體則沒有這種限制,你可以從乙個非模式窗體切換到另外乙個非模式窗體上。兩種窗體的區別僅僅在呼叫的方式上有區別。

窗體的建立:

當使用delphi的ide new乙個窗體後,在project1.dpr檔案中,會出現一句

1.createform(tform2, form2);

意思是當程式啟動的時候會建立tform2類的form2例項,也就是窗體2。這一過程是自動的,不管你是否呼叫顯示form2,

form2已經存在了,其oncreate事件也已經觸發了。這時候,如果你想顯示form2,那麼可以顯式呼叫form2的show或showmodal方法,以非模式或模式顯示窗體。

如果你不想隨程式啟動而建立窗體,而是動態的建立窗體,那麼,你可以刪除上面的那句**,然後在程式中你想動態建立窗體的地方加上以下**:12

//需要在頭部引用tform2所在的單元檔案,並宣告form2變數。

.createform(tform2, form2);

或者使用12

//和上面一樣,需要引用並宣告。注意,一定不要直接這樣寫form2.create

form2 := tform2.

窗體銷毀:

有建立,就必須有銷毀,不然的話會產生記憶體洩漏。

當我們呼叫form的close或者點選窗體右上角的x時,窗體真的已經釋放了麼?答案是否定的,如果你想驗證的話……你可以去看原始碼。對於程式自動生成的窗體,在程式結束的時候會自己釋放,對於這種窗體,我不建議進行手動釋放,除非你確定釋放後絕對不會再用到這個窗體了,不然就會產生記憶體訪問錯誤。

對於動態生成的窗體,一旦不再使用,一定要手動釋放資源,不然你會看到程式占有記憶體瘋狂**,然後就被任務管理器乾掉了~手動釋放主要有兩種方式,第一種是顯示呼叫form.free這個方法。對於上面用的例子form2來說:12

form2.free;

form2 :=nil;

至於為什麼要將變數form2賦值為nil,是為了防止此後的**通過form2變數訪問已經被釋放的tform2例項。

另一種方法是在窗體的onclose事件中將變數action設定為cafree。12

345proceduretform2.formclose(sender: tobject;varaction: tcloseaction);

begin

action := cafree;// tcloseaction = (canone, cahide, cafree, caminimize);

form2 :=nil;

end;

這兩種方法沒有什麼本質區別,可以根據實際情況來使用,但是一定不要忘記在釋放資源後將變數指向空,不然很容易出現非法訪問的情況。實際上在tform2的formclose中寫form2 := nil 是無用的,應該寫在建立form2的單元中,因為這兩個form2變數是不同的,tform2所在單元的form2變數是乙個私有變數,別人是訪問不到的,別人可以訪問到的,也就是可能觸發非法訪問的是在tform2所在單元外的form2變數(有點繞口令了,不知道大家看懂沒有……)。

Delphi窗體的建立與銷毀基礎教程

delphi中的窗體分為模式窗體和無模式窗體。二者的區別在於,使用者可以在無模式窗體和其他窗體之間切換。這樣,使用者就可以同時工作於乙個應用程式的幾個部分。delphi中窗體的初始化有兩種情況,動態建立,和自動建立。通過show顯示乙個無模式窗體,showmodal顯示乙個模式窗體。窗體有建立對應的...

Delphi 窗體建立過程

來自大富翁.1 tcustomform.create 在 tcustomform.create 中呼叫 tcustomform.createnew 2 tcustomform.createnew 呼叫 fcanvas tcontrolcanvas.create 觸發 tcontrolcanvas.c...

DELPHI動態建立窗體

第一種方式 procedure tform1.btn1click sender tobject begin try showmodal finally free end end 第二種方式 procedure tform1.btn2click sender tobject begin if not ...