Delphi項(xiàng)目的框架類

大多數(shù) Delphi 7 的應(yīng)用程序至少有一個(gè) TForm的實(shí)例。Delphi 7 VCL 應(yīng)用程序也只能有一個(gè) TApplication 的實(shí)例和一個(gè) TScreen 的實(shí)例凭语。TForm、TApplication拾因、TScreen 3 個(gè)類在 Delphi 7 中起著舉足輕重的作用∪糇ǎ可根據(jù)需要修改它們的默認(rèn)功能脖含。

1.? TForm類

TForm 類(即窗體類)是Delphi 7 應(yīng)用程序的焦點(diǎn)。

大多數(shù)情況下角骤,整個(gè)應(yīng)用程序都是圍繞窗體操作的隅忿。從主窗體中可以打開其他窗體,通常要通過菜單命令或按鈕邦尊”惩可以自動(dòng)創(chuàng)建窗體,也可以選擇在運(yùn)行期間動(dòng)態(tài)創(chuàng)建窗體蝉揍。

注意:Delphi 可以創(chuàng)建不使用窗體的程序(例如控制臺(tái)程序链峭、服務(wù)和COM服務(wù)器),在這種情況下又沾,TForm 就不再是應(yīng)用程序的焦點(diǎn)弊仪。

顯示給用戶的窗體有兩種:有模式的和無模式的。具體使用哪一種窗體杖刷,取決于用戶是否希望能夠同時(shí)用這個(gè)窗體和其他窗體交互励饵。

1.1?顯示一個(gè)模式窗體

當(dāng)打開一個(gè)模式窗體后,用戶無法與應(yīng)用程序的其他部分交互滑燃,直到用戶關(guān)閉了這個(gè)窗體役听。模式窗體通常是對話框,就像Delphi 7 本身自帶的對話框一樣表窘。事實(shí)上典予,大多數(shù)情況下應(yīng)當(dāng)使用模式窗體。

要顯示一個(gè)模式窗體蚊丐,只要調(diào)用 ShowModal 就可以了熙参。下面的代碼演示了如何創(chuàng)建 TModalForm,并把它作為模式窗體打開麦备。

var

ModalForm:TModalForm;

begin ? //創(chuàng)建 TModalForm 的實(shí)例 ??

ModalForm:=TModalForm.Create(Application); ??

try ????

if ModalForm.ShowModal=mrOk then???? //顯示這個(gè)窗體 ?????

?{執(zhí)行一些代碼} ??

finally ????

ModalForm.Free; ????

ModalForm:=nil; ?

end; end;


上面的代碼演示了如何動(dòng)態(tài)地創(chuàng)建TModalForm 以及把實(shí)例賦值給ModalForm 變量孽椰。

注意:如果需要?jiǎng)討B(tài)創(chuàng)建一個(gè)窗體的實(shí)例,就要把這個(gè)窗體從“Project Options”對話框中的“Auto-Create forms”框中去掉凛篙。

如果窗體的實(shí)例已經(jīng)存在黍匾,可以調(diào)用ShowModal 函數(shù)打開它,其他代碼可以刪掉呛梆,縮減代碼如下:

begin ?

if ModalForm.ShowModal = mrOk then???? //如果 ModalForm 已經(jīng)存在 ???

{執(zhí)行一些代碼}

end;

ShowModal函數(shù)的返回值是ModalForm 的ModalResult屬性值锐涯。默認(rèn)情況下,ModalResult 屬性

的值為0填物,相當(dāng)于預(yù)定義的常量mrNone纹腌。如果ModalResult 屬性被賦值為其他非零值霎终,則窗體將關(guān)閉。

可以在運(yùn)行時(shí)對窗體的ModalResult 屬性進(jìn)行賦值升薯,代碼如下:

begin

? ModalForm.ModalResult := 100;

end;


表 --1 所示為預(yù)定義的 ModalResult值莱褒。

?常量 ?????????值

mrNone???? ?0 ?

mrOk ?????????idOk ?

mrCancel? ?idCancel ?

mrAbort???? ?idAbort ?

mrRetry? ? ? idRetry ?

mrIgnore? ? ?idIgnore ?

mrYes? ? ? ? ?idYes ?

mrNo? ? ? ? ? idNo ?

mrAll? ? ? ? ? mrNo+1 ?


2.打開一個(gè)無模式窗體

要打開一個(gè)無模式窗體,可以調(diào)用Show 方法涎劈。無模式窗體與有模式窗體的區(qū)別在于用戶可以在無模式窗體和其他窗體之間切換广凸。這樣,用戶就可以同時(shí)工作于一個(gè)應(yīng)用程序的幾個(gè)部分蛛枚。下面的代碼演示了怎樣動(dòng)態(tài)地創(chuàng)建一個(gè)無模式的窗體谅海。

var


? Modeless:TModeless;

begin

? if not Assigned(Modeless) then??????????????? //檢查無模式窗體的實(shí)例是否已經(jīng)存在?


? Modeless:=TModeless.Create(Application);??? //創(chuàng)建窗體


? Modeless.Show;??????????????????????????? //顯示無模式窗體 end;

上述代碼同時(shí)演示了怎樣防止一個(gè)窗體的多個(gè)實(shí)例存在。注意蹦浦,無模式的窗體允許用戶與應(yīng)用程序的其他部分交互扭吁,這樣,用戶可以照常使用菜單命令白筹,或者創(chuàng)建TModeless 的另一個(gè)實(shí)例智末。因此谅摄,需要考慮這些實(shí)例的創(chuàng)建和刪除問題徒河。

要特別注意窗體的實(shí)例:當(dāng)通過窗體的系統(tǒng)菜單或者窗體上的Close 按鈕關(guān)閉這個(gè)窗體時(shí),窗體并沒有真正從內(nèi)存中釋放送漠,它仍然還在內(nèi)存中顽照,除非關(guān)閉了主窗體(即應(yīng)用程序)。在上述程序示例中闽寡,then 后面的語句只會(huì)執(zhí)行一次代兵,前提是這個(gè)窗體不是自動(dòng)創(chuàng)建的。如果希望用戶關(guān)閉了窗體就在內(nèi)存中釋放它爷狈,必須處理它的OnClose 事件植影,并且把Action 參數(shù)設(shè)為caFree,這樣涎永,VCL 就會(huì)在這個(gè)窗體關(guān)閉時(shí)釋放它思币。

procedure

? TModeless.FormClose(Sender:TObject;var Action:TCloseAction); begin

? Action:=caFree;????? //當(dāng)關(guān)閉時(shí)釋放窗體實(shí)例?

end;


上述代碼就可以解決窗體實(shí)例在內(nèi)存釋放的問題了。還有一個(gè)問題羡微,注意下面這行代碼:

?if not Assigned(Modeless) then

上述代碼檢查TModeless 的實(shí)例是否已經(jīng)有Modeless 變量引用谷饿,這實(shí)際上就是檢查Modeless 是否為nil。盡管第1 次進(jìn)入例程的時(shí)候妈倔,Modeless 可能是nil博投,但第2 次進(jìn)入這個(gè)例程的時(shí)候,它已經(jīng)不是nil盯蝴。這是因?yàn)閂CL 并沒有把Modeless變量設(shè)為nil毅哗,因此听怕,必須手工把這個(gè)變量設(shè)為nil。

與模式窗體不同的是虑绵,無法在代碼中判斷無模式窗體什么時(shí)候?qū)h除叉跛,這樣就無法在創(chuàng)建窗體實(shí)例的例程中刪除窗體的實(shí)例。用戶有可能在應(yīng)用程序正在運(yùn)行的任何時(shí)候關(guān)閉無模式窗體蒸殿。因此筷厘,無模式窗體本身一定要把Modeless 變量設(shè)為nil,而且最好在處理窗體的OnDestroy 事件的處理過程中設(shè)置這個(gè)變量:

procedure

TModeless.FormDestroy(Sender: TObject);

begin

? Modeless:=nil;???? //把Modeless

? 變量設(shè)置為nil

end;


這樣就能保證每次關(guān)閉窗體時(shí)宏所,Modeless 變量總是被設(shè)為nil酥艳,從而防止Assigned()函數(shù)失敗。注意爬骤,同一時(shí)刻只能創(chuàng)建TModeless的一個(gè)實(shí)例充石。

注意,對于無模式窗體來說霞玄,要避免出現(xiàn)下列有缺陷的代碼:

begin

? Modeless:=TModeless.Create(Application);

? Modeless.Show;

end;


上述代碼會(huì)導(dǎo)致每次創(chuàng)建窗體的實(shí)例骤铃,重復(fù)以前被Modeless 引用的實(shí)例,從而消耗了大量的內(nèi)存坷剧。

盡管通過Screen.Forms可以訪問這些實(shí)例惰爬,但最好還是盡量避免使用上述代碼。向構(gòu)造器Create()傳遞nil造成無法在Modeless 實(shí)例變量被覆蓋后惫企,無法再引用這個(gè)窗體實(shí)例指針撕瞧。


3.窗體的圖標(biāo)和邊框

TForm 有一個(gè)BorderIcons屬性,包含下列元素:biSystemMenu狞尔、biMinimize丛版、biMaximize 和biHelp。只要讓這個(gè)集合不包含其中的某個(gè)元素偏序,就可以使窗體上不出現(xiàn)相應(yīng)的系統(tǒng)菜單页畦、最大化按鈕和最小化按鈕,但窗體上總是有關(guān)閉按鈕研儒。

還可以通過BorderStyle 屬性改變窗體的非客戶區(qū)豫缨。BorderStyle 有6 個(gè)值供用戶選擇,具體如下:

[if !supportLists]??? [endif]bsNone:無邊框殉摔,尺寸的大小不可以改變州胳。

[if !supportLists]??? [endif]bsSingle:單線邊框,尺寸的大小不可以改變逸月。

[if !supportLists]??? [endif]bsDialog:標(biāo)準(zhǔn)的對話框邊框栓撞,尺寸的大小不可以改變。

[if !supportLists]??? [endif]bsSizeable:標(biāo)準(zhǔn)的可變尺寸邊框。

[if !supportLists]??? [endif]bsToolWindow:和bsSingle 相同瓤湘,但標(biāo)題只有一個(gè)小的“關(guān)閉”按鈕瓢颅。

[if !supportLists]??? [endif]bsSizeToolWin:和bsSizeable 相同,但標(biāo)題只有一個(gè)小的“關(guān)閉”按鈕弛说。

注意:窗體屬性BorderIcons 的設(shè)置與屬性BorderStyle 的設(shè)置可能會(huì)發(fā)生互斥挽懦,例如屬性BorderIcons 的biMinimize 和biMaximize會(huì)與屬性BorderStyle 的bsDialog 沖突,屬性BorderIcons 的biHelp 會(huì)與屬性BorderStyle的bsSizeable 沖突木人。?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末信柿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子醒第,更是在濱河造成了極大的恐慌渔嚷,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稠曼,死亡現(xiàn)場離奇詭異形病,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霞幅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門漠吻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人司恳,你說我怎么就攤上這事途乃。” “怎么了抵赢?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵欺劳,是天一觀的道長。 經(jīng)常有香客問我铅鲤,道長,這世上最難降的妖魔是什么枫弟? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任邢享,我火速辦了婚禮,結(jié)果婚禮上淡诗,老公的妹妹穿的比我還像新娘骇塘。我一直安慰自己,他們只是感情好韩容,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布款违。 她就那樣靜靜地躺著,像睡著了一般群凶。 火紅的嫁衣襯著肌膚如雪插爹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音赠尾,去河邊找鬼力穗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛气嫁,可吹牛的內(nèi)容都是我干的当窗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寸宵,長吁一口氣:“原來是場噩夢啊……” “哼崖面!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梯影,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘶朱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后光酣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疏遏,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年救军,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了财异。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唱遭,死狀恐怖戳寸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拷泽,我是刑警寧澤疫鹊,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站司致,受9級特大地震影響拆吆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脂矫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一枣耀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庭再,春花似錦飒箭、人聲如沸木蹬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽髓抑。三九已至鼓蜒,卻和暖如春蝗茁,著一層夾襖步出監(jiān)牢的瞬間娜汁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留一疯,地道東北人撼玄。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像墩邀,于是被迫代替她去往敵國和親掌猛。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 已離開簡書眉睹,原因參見 http://www.reibang.com/p/0f12350a6b66荔茬。 雖人微言輕,但...
    冴羽閱讀 817評論 0 0
  • 《三生三世》追完竹海,猶為東華鳳九那一段情唏噓慕蔚。其實(shí)電視里的結(jié)局是極好的,惟其花開兩朵斋配,天各一方孔飒,才令無數(shù)看客久久回味...
    翼如閱讀 1,335評論 0 12
  • 1,我愛你艰争,因?yàn)槟阌刑嗖煌昝赖牡胤交得椋热缒愕墓放雷帧?2,我無法去尋找他人甩卓,因?yàn)殡x開了你鸠匀,我就會(huì)失去我人生的一部...
    沐府墓主閱讀 225評論 0 0
  • 《合歡樹》 想起史鐵生所寫懷念母親的散文《合歡樹》,曾被之感動(dòng)落淚逾柿。文中的兒子對母親眷眷的思念痛入心扉缀棍,那...
    慶青閱讀 656評論 0 4