Delphi之面向?qū)ο蟮慕缑鎻?fù)用技術(shù)_第1頁(yè)
Delphi之面向?qū)ο蟮慕缑鎻?fù)用技術(shù)_第2頁(yè)
Delphi之面向?qū)ο蟮慕缑鎻?fù)用技術(shù)_第3頁(yè)
Delphi之面向?qū)ο蟮慕缑鎻?fù)用技術(shù)_第4頁(yè)
Delphi之面向?qū)ο蟮慕缑鎻?fù)用技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Delphi之面向?qū)ο蟮慕缑鎻?fù)用技術(shù)代碼復(fù)用和界面復(fù)用 面向?qū)ο蟮木幊趟枷霃?qiáng)調(diào)代碼的可復(fù)用。而Delphi的精髓實(shí)際上就是Object Pascal語(yǔ)言,Object Pascal語(yǔ)言是一個(gè)非常強(qiáng)大的面向?qū)ο蟮木幊陶Z(yǔ)言,可以通過(guò)對(duì)象的繼承實(shí)現(xiàn)代碼復(fù)用。同時(shí)Delphi作為一個(gè)強(qiáng)大的RAD開(kāi)發(fā)工具,不僅可以實(shí)現(xiàn)代 碼復(fù)用,還可以實(shí)現(xiàn)可視化界面的復(fù)用。 基于復(fù)制粘貼的界面重用 Delphi最早提出的復(fù)用不是面向?qū)ο蟮?,而是?lèi)似于代碼庫(kù)的重用,比如在執(zhí)行窗體右鍵菜單的Add To Repository命令,可以將一些常用的窗體如關(guān)于對(duì)話框添加到Delphi的代碼庫(kù)中,以

2、后可以在新建窗體時(shí),直接創(chuàng)建一個(gè)完全的一樣的對(duì)話框。其 實(shí)這種復(fù)用無(wú)法是幫助我們簡(jiǎn)化了復(fù)制粘貼的過(guò)程而已,會(huì)帶來(lái)很多后續(xù)維護(hù)的問(wèn)題,過(guò)多的使用這種方式編程,會(huì)導(dǎo)致大量重復(fù)的代碼,大量重復(fù)的錯(cuò)誤。而現(xiàn)代 的編程思想如XP,則認(rèn)為不允許復(fù)制粘貼代碼,一旦遇到這種情況,就要進(jìn)行重構(gòu)。 可視化窗體繼承(Visual Form Inheritance 可視化窗體繼承,以下我們 簡(jiǎn)稱(chēng)其為VFI是Delphi2開(kāi)始出現(xiàn)的一種軟件復(fù)用技術(shù)。允許我們創(chuàng)建一個(gè)基類(lèi)窗體,并從這個(gè)基類(lèi)窗體派生新的窗體。它在標(biāo)準(zhǔn)的以代碼重用為目的類(lèi)繼 承的基礎(chǔ)上實(shí)現(xiàn)了對(duì)可視化界面元素的重用。讓我們做個(gè)試驗(yàn),假設(shè)我們

3、現(xiàn)在編寫(xiě)一組系統(tǒng)配置管理界面,為了統(tǒng)計(jì)界面樣式,規(guī)定所有的配置管理界面都應(yīng)該有一 個(gè)容器面板,一個(gè)確定和一個(gè)取消按鈕,由于這樣的界面非常多,為了界面的統(tǒng)一,我們就來(lái)創(chuàng)建這樣一個(gè)基類(lèi)界面,首先新建一個(gè)項(xiàng)目起名VFI,然后使用 File | New Form菜單命令新建一個(gè)界面,起名為T(mén)BaseOptionDlg,界面示意圖如下: 然后下面創(chuàng)建一個(gè)派生類(lèi)窗 體,用來(lái)配置數(shù)據(jù)庫(kù)連接的參數(shù),選擇 File | New 菜單,調(diào)出New Items 對(duì)話框中,切換到當(dāng)前的項(xiàng)目VFI下,選中剛才創(chuàng)建的基類(lèi)BaseOptionDlg,注意在界面的下邊inherit的單選框處于選中的狀態(tài)。點(diǎn)擊確 定

4、,就會(huì)創(chuàng)建一個(gè)新的派生配置管理界面了。 可以看到我們的派生類(lèi)自動(dòng)就繼承了父窗體所有的按鈕和面板等界面元素。下面,在主窗體上添加一個(gè)數(shù)據(jù)庫(kù)連接參數(shù)菜單,添加我們的DB參數(shù)配置界面,procedure TFormMain.N4Click(Sender: TObject;var  AForm:TDBOptionDlg;begin  AForm:=TDBOptionDlg.Create(Application;  try    AForm.ShowModal;  finally    AFor

5、m.Free;  end;end; 運(yùn)行一下后,我突然想起 來(lái),一般配置管理界面都會(huì)有一個(gè)默認(rèn)值的按鈕,可以用來(lái)恢復(fù)默認(rèn)配置參數(shù)的值,而剛才設(shè)計(jì)界面時(shí)忽略了這個(gè)問(wèn)題。打開(kāi)基類(lèi)窗體,在窗體上放置一個(gè)新的默認(rèn) 設(shè)置按鈕,保存后。回過(guò)頭來(lái),可以發(fā)現(xiàn)我們的數(shù)據(jù)庫(kù)配置界面也神奇增加了一個(gè)新的按鈕。想像一下,如果你的工程中需要編寫(xiě)幾十個(gè)配置管理窗體,如果不使用 窗體繼承的方式來(lái)編寫(xiě)的話,在程序已經(jīng)進(jìn)入測(cè)試階段時(shí)候,客戶(hù)突然發(fā)現(xiàn)上面這個(gè)問(wèn)題,要求修改,那么修改的工作量就會(huì)非常大,而且很難保證不會(huì)因?yàn)槭韬龆?忘記修改某個(gè)配置界面。而使用窗體繼承的方式,我們只要修改基類(lèi)窗體就可以保證修改對(duì)所

6、有的派生類(lèi)都生效。 除了界面繼承之外,VFI也可以實(shí)現(xiàn)代碼繼承,在基類(lèi)窗體的OnCreate事件中顯示一個(gè)提示信息對(duì)話框:procedure TBaseOptionDlg.FormCreate(Sender: TObject;begin  ShowMessage('配置參數(shù)界面'end; 運(yùn)行程序后,你會(huì)發(fā)現(xiàn)雖然我們沒(méi)有編寫(xiě)派生窗體的OnCreate事件處理過(guò)程,但是顯示界面時(shí),仍然會(huì)彈出消息對(duì)話框。 同時(shí),由于窗體的屬性通過(guò)VFI被共用,可以有效地減 少占用的系統(tǒng)資源,比如有時(shí)我們可能會(huì)在界面上放上一個(gè)大的圖片進(jìn)行界面美化,如果這個(gè)圖片

7、被放在多個(gè)界面中,而這些界面之間沒(méi)有繼承關(guān)系的話,圖片就會(huì) 被多次編譯進(jìn)資源中,在我們不知不覺(jué)中文件大小可能會(huì)翻了幾倍。而將圖片放在基類(lèi)窗體中,無(wú)論圖片被多少個(gè)子窗體共用,資源都只被編譯一次,因此可以極大 的減少生成的可執(zhí)行文件尺寸和加載速度。 VFI窗體屬性及代碼重載 VFI支持繼承,使我們可以重用一些有共性的代碼,但是每個(gè)界面又有它特性的一面,這可以通過(guò)重載來(lái)實(shí)現(xiàn)。 比如這回我覺(jué)得配置管理窗 體上面板的顏色有些單調(diào),想調(diào)整為淡黃色的,但是我又不確定其它人是否會(huì)贊同我的審美眼光,所以我不打算修改基類(lèi)的窗體面板顏色屬性,而只是修改派生的數(shù) 據(jù)庫(kù)配置界面上面板的顏色

8、為clInfoback,可以看到我們的派生類(lèi)窗體上面板的顏色變成了淡黃色,但是基類(lèi)的面板仍然保持不變,也就是說(shuō)我在子類(lèi)窗 體中對(duì)父類(lèi)窗體的屬性進(jìn)行了重載。如果修改之后,客戶(hù)不滿意我的顏色搭配,而喜歡基類(lèi)的顏色搭配,有一個(gè)簡(jiǎn)便的辦法可以恢復(fù)繼承的父類(lèi)屬性,那就是選中面 板,然后執(zhí)行右鍵菜單中的Revert to inherited命令就可以了。見(jiàn)下圖: 除了屬性重載外, Delphi還支持事件重載。接下來(lái),在數(shù)據(jù)庫(kù)參數(shù)配置界面上添加一個(gè)編輯框,用來(lái)指定數(shù)據(jù)庫(kù)名,當(dāng)顯示界面的時(shí)候,需要在編輯框中給用戶(hù)展現(xiàn)當(dāng)前配置的 數(shù)據(jù)庫(kù)名,因此要在窗體的OnCreate事件中進(jìn)行編輯框內(nèi)容的初始化。雙

9、擊窗體,創(chuàng)建OnCreate事件處理函數(shù),你會(huì)發(fā)現(xiàn)新建的OnCreate 事件不同于普通的OnCreate事件,窗體設(shè)計(jì)器自動(dòng)在代碼中加了一句Inherited語(yǔ)句,代碼示意: procedure TDBOptionDlg.FormCreate(Sender: TObject;begin  inherited; end; 新加的inherited 語(yǔ)句調(diào)用的其實(shí)就是基類(lèi)的OnCreate事件處理過(guò)程。前面基類(lèi)的OnCreate事件中只是簡(jiǎn)單的顯示一個(gè)消息對(duì)話框。如果在派生的 TDBOptionDlg中不想顯示那個(gè)愚蠢的消息框,只要把inherited注釋

10、掉就可以了。下面是修改后的初始化代碼:procedure TDBOptionDlg.FormCreate(Sender: TObject;begin  /inherited;  edtDB.Text:='c:hubdog.db'end; VFI的局限 在好的技術(shù)都有它的局限 性,不能包制百病,VFI同樣如此。第一個(gè)限制就是在派生類(lèi)的窗體中,我們不能刪除從父類(lèi)繼承的組件,同時(shí)我們也不能象代碼繼承那樣,使用 protected等關(guān)鍵字降低某些界面組件的保護(hù)級(jí)別,使其對(duì)于子類(lèi)不可見(jiàn),從這一點(diǎn)上來(lái)說(shuō)VFI不能實(shí)現(xiàn)界面元素信息的隱藏,這不符合面向?qū)?/p>

11、象的封裝 要求。那么這就產(chǎn)生一個(gè)問(wèn)題,在某些配置界面中,可能我們不想提供基類(lèi)界面要求的恢復(fù)默認(rèn)值的操作功能,一個(gè)比較丑陋的辦法就是修改默認(rèn)值按鈕的 visible屬性為false。與此相關(guān)的一個(gè)問(wèn)題是,如果基類(lèi)中定義了一個(gè)面板,而在派生類(lèi)中在面板上放了一個(gè)按鈕,如果修改基類(lèi)界面時(shí)將面板刪除的 話,則派生類(lèi)中的按鈕也將被刪除,這類(lèi)問(wèn)題處理不好的話,有時(shí)會(huì)產(chǎn)生很大的混亂。 另外,雖然VFI允許重載 屬性和事件,這就會(huì)產(chǎn)生另外一個(gè)問(wèn)題,平時(shí)很多人習(xí)慣了使用事件來(lái)實(shí)現(xiàn)界面初始化,響應(yīng)按鈕點(diǎn)擊實(shí)現(xiàn)參數(shù)配置更新等操作。但是由于VFI默認(rèn)情況會(huì)調(diào)用基 類(lèi)繼承的事件,而如果窗體的繼承層次很多,并且在

12、不同層次上都使用事件處理函數(shù)來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯,那么很有可能會(huì)出現(xiàn),在不同繼承層次上的事件處理函數(shù)實(shí)現(xiàn) 了互相矛盾的業(yè)務(wù)處理,比如在繼承樹(shù)的中間的某個(gè)界面在初始化時(shí),向界面上某個(gè)列表框添加了很多字符串,而后面的派生類(lèi)界面的作者不清楚這個(gè)問(wèn)題,在初始 化時(shí)先清空列表框的字符串,然后又添加了一些字符串,這就造成了原來(lái)信息的丟失。因此使用VFI的時(shí)候,建議繼承的層次不要太多,同時(shí)盡量使用虛方法來(lái)代 替事件的使用,對(duì)于需要某些強(qiáng)制派生類(lèi)實(shí)現(xiàn)的方法,要用定義純虛方法。 回到我們的參數(shù)配置基類(lèi),對(duì)于一般參數(shù)配置過(guò)程,可以抽象出以下一些共性的必須執(zhí)行的方法:1、   顯示界面時(shí),初

13、始化參數(shù)值。2、   輸入?yún)?shù)的有效性校驗(yàn),如果無(wú)效,禁止點(diǎn)擊確定按鈕。3、   執(zhí)行參數(shù)的修改,如果成功,則關(guān)閉窗體,如果失敗,則等待用戶(hù)重新輸入。4、   點(diǎn)擊默認(rèn)設(shè)置時(shí),恢復(fù)參數(shù)默認(rèn)設(shè)置。 為了強(qiáng)制實(shí)現(xiàn)上面的四個(gè)業(yè)務(wù)邏輯,修改后的基類(lèi)代碼如下:type  TBaseOptionDlg = class(TForm  public    Public declarations     constructor Create(AOwner:TCom

14、ponent;override;    procedure InitUI;virtual;abstract;    function ParamsValid:Boolean;virtual;abstract;    function UpdateParams:Boolean;virtual;abstract;    procedure DefaultParams;virtual;abstract;  end;procedure TBaseOptionDlg.Acti

15、onOKUpdate(Sender: TObject;begin  (Sender as TAction.Enabled:=ParamsValid;end; procedure TBaseOptionDlg.ActionOKExecute(Sender: TObject;begin  if UpdateParams then  begin    ModalResult:=mrOk;  end;end; procedure TBaseOptionDlg.ActionCancelExecute(Sender:

16、 TObject;begin  ModalResult:=mrCancel;end;constructor TBaseOptionDlg.Create(AOwner: TComponent;begin  inherited;  initUI;end; procedure TBaseOptionDlg.ActionDefaultExecute(Sender: TObject;begin  DefaultParams;end; end. 為了實(shí)現(xiàn)前面定義的業(yè)務(wù)邏 輯,我們?cè)诖绑w構(gòu)造方法中調(diào)用InitUI過(guò)程來(lái)初始化界面,而在Ac

17、tion的OnUpdate事件中不停調(diào)用ParamsValid函數(shù)判斷當(dāng)前輸入 的參數(shù)是否有效,如果有效,則允許點(diǎn)擊確定按鈕。點(diǎn)擊確定按鈕后,會(huì)調(diào)用UpdateParams方法來(lái)更新參數(shù),如果更新成功,則關(guān)閉界面,否則等待用 戶(hù)重新輸入。最后,在用戶(hù)點(diǎn)擊恢復(fù)默認(rèn)參數(shù)值按鈕時(shí),調(diào)用DefaultParams方法來(lái)完成。要注意的是,基類(lèi)中的initUI, ParamValid,UpdateParams和DefaultParams過(guò)程都被定義為純虛的抽象方法。這是因?yàn)閷?duì)于基類(lèi)來(lái)說(shuō),由于沒(méi)有具體的參數(shù) 輸入界面元素,實(shí)現(xiàn)這些方法是沒(méi)有意義的,只有到了具體的參數(shù)配置界面,才需要實(shí)現(xiàn)這些方法,同時(shí)定義為A

18、bstract抽象方法可以強(qiáng)迫派生類(lèi)必須實(shí)現(xiàn) 這幾個(gè)方法來(lái)完成業(yè)務(wù)邏輯,否則編譯后無(wú)法正確運(yùn)行。 下面是TDBOptionDlg實(shí)現(xiàn)的示意性代碼:procedure TDBOptionDlg.DefaultParams;begin  edtDB.Text:='c:hubdog.db'end; procedure TDBOptionDlg.InitUI;begin  edtDB.Text:='c:hubdog.db'end; function TDBOptionDlg.ParamsValid: Boolean;be

19、gin  Result:=trim(edtDB.Text<>''end; function TDBOptionDlg.UpdateParams: Boolean;begin  Result:=True;end; end. 另外,窗體繼承不支持窗口嵌套,也就是不支持窗口的組合復(fù)用,因此為了擴(kuò)充窗口的功能,無(wú)形中鼓勵(lì)人們使用繼承機(jī)制,而不是組合機(jī)制。這加深了窗口之間的偶合度,不利于靈活性和擴(kuò)展性。 窗體繼承還有一個(gè)很大的問(wèn)題就是它只支持窗口級(jí)別的組件復(fù)用,但是更多的時(shí)候,我們想要的只是粒度更小的界面中某一部分顯

20、示區(qū)域或者組件級(jí)別的復(fù)用。Borland也考慮到了這個(gè)問(wèn)題,因此在Delphi4中給出了Component Template的解決方案。 組件模板組件模板技術(shù)相當(dāng)簡(jiǎn)單,比如下圖所示意的雙列表框組合界面是很常用的一類(lèi)界面,可以用來(lái)從一個(gè)列表框向另一個(gè)列表框移動(dòng)對(duì)象。 那么我們就可以選擇列表框和按鈕,然后執(zhí)行 Component | Create Component Template.命令來(lái)創(chuàng)建組件模板,示意圖如下:設(shè)定組件模板名稱(chēng)為T(mén)DualListBox,并將其作為一個(gè)組件放到Templates組件面板上,組件面板除了能保存各個(gè)組件的屬性外,還可以保存相關(guān)組件的事件代碼。還

21、有一點(diǎn)限制是它不能將窗體設(shè)定為組件模板。生成好的組件模板可以象其它組件一樣從組件面板上拖放到窗體,并生成模版副本。組件模板同VFI本質(zhì)上的不同在于它不能實(shí)現(xiàn)繼承,當(dāng)把TDualListBox作為一個(gè)組件放到窗體上之后,它只相當(dāng)于原來(lái)所有的組件的一個(gè)拷貝,我們可以隨意地將一個(gè)按鈕刪除,而VFI的派生類(lèi)則不允許我們刪除從父類(lèi)繼承的組件。因此,組件模板不能算是一個(gè)面向?qū)ο蟮慕缑鎻?fù)用解決方案,即便我們隨后修改了組件模板的設(shè)計(jì),這些設(shè)計(jì)的變化并不會(huì)影響到先前的被實(shí)例化了的組件。因此可以認(rèn)為,組件模板只是一個(gè)簡(jiǎn)化我們操作的復(fù)制粘貼工具。另外,組件模板還有一個(gè)很致命的問(wèn)題就是,它很難被共享,因?yàn)榻M件模板信息

22、是被統(tǒng)一保存到Delphi.dct文件中的,而不是保存在pas文件中的,因此要想在不同機(jī)器間共享模版,必須將Delphi.dct拷貝到其它機(jī)器上,或者將Delphi.dct進(jìn)行共享,而Delphi.dct又是一個(gè)單獨(dú)的文件,你無(wú)法從中抽取單獨(dú)的一些模板出來(lái)分發(fā)。所以,Component Template不太適用于多人開(kāi)發(fā)的項(xiàng)目中。針對(duì)VFI和Component Template等技術(shù)暴露出來(lái)的問(wèn)題,Borland進(jìn)一步的提出了TFrame的解決方案。基于TFrame的復(fù)用TFrame比較像一個(gè)綜合了Component Template和VFI優(yōu)點(diǎn)的產(chǎn)物,本身的實(shí)現(xiàn)機(jī)制同VFI非常類(lèi)似,都是面向

23、對(duì)象的,對(duì)基類(lèi)的可視化變更會(huì)立刻反映到派生類(lèi),支持代碼共享和界面共 享,很容易分發(fā)。同時(shí),它又像Component Template那樣支持小粒度的組件復(fù)用,支持子窗口嵌套,是一個(gè)比VFI更為輕量級(jí)的解決方案。對(duì)于那些非常復(fù)雜有很多輸入選項(xiàng)的獨(dú)立的界面編程,TFrame是非常適合的,因?yàn)槔肨Frame我們可以將一個(gè)復(fù)雜的界面分解為多個(gè)簡(jiǎn)單的模塊 的編程。假設(shè)這回客戶(hù)要求我們編寫(xiě)一個(gè)客戶(hù)資源信息錄入界面。客戶(hù)資源信息包括很多內(nèi)容,比如Email,電話,地址幾十項(xiàng)信息。分析一下客戶(hù)對(duì)象這個(gè)實(shí)體的屬性,一個(gè)客戶(hù)可以對(duì)應(yīng)多個(gè)Email地址 ,多個(gè)電話號(hào)碼,對(duì)于這種一對(duì)多的關(guān)系,可以采用一個(gè)輸入框,一

24、個(gè)列表框和添加,刪除按鈕來(lái)完成信息的編輯修改的,同時(shí)考慮到電話和Email地址同客戶(hù) 的關(guān)系都為一對(duì)多,那么就需要編輯組件和大同小異的功能實(shí)現(xiàn)。對(duì)于這種情況,我們就可以使用TFrame來(lái)復(fù)用這樣的一對(duì)多信息輸入界面。首先,新建項(xiàng)目,在主界面上添加一個(gè)面板,然后在窗體上放上確定和取消按鈕。然后,使用菜單命令 File | New Frame新建一個(gè)TFrame。在新建的Frame上添加列表框等輸入組件,完成的界面示意圖如下:為Frame添加信息編輯的代碼type  TFrameList = class(TFrame  protected    f

25、unction CanAdd:Boolean;virtual;  end;procedure TFrameList.ActionAddUpdate(Sender: TObject;begin  (Sender as TAction.Enabled:=CanAdd;end; function TFrameList.CanAdd: Boolean;begin  Result:=(trim(edtInput.Text<>''end;  procedure TFrameList.ActionAddExecute(S

26、ender: TObject;beginend; procedure TFrameList.ActionDelUpdate(Sender: TObject;begin  (Sender as TAction.Enabled:=ListBox.ItemIndex>-1;end; procedure TFrameList.ActionDelExecute(Sender: TObject;beginend; FrameList使用 Action對(duì)添加刪除動(dòng)作會(huì)進(jìn)行有效性判斷,添加時(shí)調(diào)用函數(shù)CanAdd判斷是否可以添加,F(xiàn)rameList基類(lèi)的CanAdd

27、函數(shù)只是簡(jiǎn)單的判斷當(dāng) 前輸入框中文本是否為空,以及當(dāng)前輸入框中文本是否已經(jīng)被添加進(jìn)了列表框,如果不滿足,禁止添加按鈕。注意為了派生類(lèi)擴(kuò)展的需要,這里CanAdd聲明為 虛方法,后面我們的Email和電話輸入Frame要想對(duì)Email和電話的有效性進(jìn)行校驗(yàn)的話,可以重載這個(gè)函數(shù)。刪除前只是簡(jiǎn)單的判斷ListBox 中是否有選中的要被刪除的信息。 接下來(lái)就是從我們的基類(lèi)派 生出Email和電話的編輯框架,其中電話的編輯框架只是修改的按鈕和標(biāo)簽的Caption,顯示添加電話,刪除電話,以及電話列表等信息,同時(shí)重載了 CanAdd函數(shù),提供了對(duì)電話號(hào)碼的簡(jiǎn)單判斷。而Email除了修改顯示信息

28、和重載CanAdd函數(shù)外,還為列表框增加了雙擊列表框,激活向Email 地址發(fā)送郵件的功能。 /判斷是否可以添加電話號(hào)碼function TFrameTele.CanAdd: Boolean;var  I, code:Integer;begin  if inherited CanAdd then  begin    Val(trim(edtInput.Text, I, code;    Result:=code=0;  end;end; /判斷是否可以添加Emailfunct

29、ion TFrameEmail.CanAdd: Boolean;begin  if inherited CanAdd then  begin    result:=Pos('', trim(edtInput.Text>0;  end;end;/激活Email客戶(hù)端,收件人為當(dāng)前Email賬戶(hù)procedure TFrameEmail.ListBoxDblClick(Sender: TObject;begin  inherited;  if ListBox.ItemIndex>-1 the

30、n    ShellExecute(Handle,'open', PChar('mailto:'+trim(edtInput.text,nil,nil,SW_NORMAL;end; 注意由于本例子只是演示Frame的用法,所以我只是簡(jiǎn)單的進(jìn)行輸入有效性判斷,真正完備的判斷應(yīng)該是基于正則表達(dá)式的,雖然VCL庫(kù)中沒(méi)有提供正則表達(dá)式的支持,但是有一些免費(fèi)的第三方庫(kù),比如TRegExpr可以使用,這里就不詳述了。 接下來(lái)選中面板,然后點(diǎn)擊組件面板Standard頁(yè)面上的Frames圖標(biāo),調(diào)出Frames列表框, 

31、;在面板上添加FrameEmail和FrameTele,接下來(lái)是編寫(xiě)界面初始化代 碼來(lái)加載,這時(shí)你會(huì)發(fā)現(xiàn)TFrame不同于TForm,它沒(méi)有提供OnCreate和OnDestroy事件(不知道是什么原因,我猜測(cè)Borland的 R&D Team一定也研究這個(gè)問(wèn)題,不知是出于什么考慮從Delphi5到Delphi7一直沒(méi)有實(shí)現(xiàn)這一顯而易見(jiàn)的需求,所以要想在TFrame創(chuàng)建時(shí)對(duì)其 進(jìn)行初始化,只能是在TFrame的OnCreate事件中進(jìn)行初始化。 constructor TFrameEmail.Create(AOwner: TComponent;begin  inhe

32、rited;'hubdog''hubcat'end;constructor TFrameTele.Create(AOwner: TComponent;begin  inherited;'861088888888''861066666666'end; 可以看到,使用TFrame后,原來(lái)需要集中在主界面完成的代碼,現(xiàn)在全都分散到各個(gè)單元來(lái)實(shí)現(xiàn),同時(shí)TFrame可以嵌套在主界面中實(shí)現(xiàn)可視化修改,甚至TFrame中也可以繼續(xù)嵌套TFrame,將TFrame想像成建筑中的磚頭,工人可以通過(guò)磚頭的堆砌和組合建立起摩天大樓,

33、同樣的我們通過(guò)TFrame的組件組合的復(fù)用模式,也可以實(shí)現(xiàn)操作復(fù)雜的交互界面。 TFrame的局限性 雖 然TFrame有著很多的好處,但是也一樣有它的缺點(diǎn),比如它和VFI一樣,無(wú)法實(shí)現(xiàn)信息隱藏,因?yàn)榻缑嫔纤械慕M件默認(rèn)都是published屬性,并 且無(wú)法像代碼那樣通過(guò)protected等保護(hù)級(jí)別關(guān)鍵字進(jìn)行隱藏,它暴露了內(nèi)部的太多的實(shí)現(xiàn)細(xì)節(jié),不滿足面向?qū)ο笏枷胫姓涌诘姆庋b原則。要想實(shí)現(xiàn)真正 的信息隱藏,必須通過(guò)純代碼方式編寫(xiě)的組件來(lái)實(shí)現(xiàn),但是編寫(xiě)組件雖然能滿足封裝的原則,但是無(wú)法像TFrame那樣無(wú)須編譯注冊(cè),就可以在設(shè)計(jì)時(shí)可以通過(guò) 窗體設(shè)計(jì)器隨時(shí)修改可視化設(shè)計(jì),做到所見(jiàn)即所得,正所謂魚(yú)和熊掌不可得兼。在這方面Sergey Orlik給出了一個(gè)比較好的解決方案,他編寫(xiě)的Custom Containers Pac

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論