9.多頁組件
68)問:我覺得C++Builder的組件模板的管理方式很好,在這個模板中通過單擊頁就可以在各個頁之間進行切換,在C++Builder中我應該怎樣來實現呢?
答:我們可以用多頁組件來實現,它的好處就是可以在有限的空間中盡量多地存放信息,而且便於把信息分類。就拿組件模板來說吧,在那麼小的屏幕中放置了上百個組件,而且並不顯得凌亂,這都是多頁組件的功勞。
如果窗體上要放置大量的組件,而且這些組件又是分組使用的,那麼可以考慮使用多頁組件。這樣做可以使窗體更加簡潔明了。多頁組件既有多頁的特性,又是一個容器組件,它就像窗體一樣可以包含其他的組件。
C++Builder提供了幾種功能相似的多頁組件,它們是:Win32頁中的TabControl,PageControl組件,Win31頁中的TabSet和TabbedNoteBook組件。從它們所在的頁的不同就可以知道,前兩個組件是應用在32位系統中的組件,無論從性能還是風格上來看,這兩個組件都更適合在Windows 95以上的板本中使用。後面兩種組件是為喜愛Windows 3.1風格的用戶保留的,其實我們完全可以只使用前兩種組件。
69)問:TabControl組件和PageControl組件他們看起來簡直是一模一樣?
答:初看起來這兩種組件的確差不多,我們可以通過下面的操作可以說明這一點。
(1)在窗體上放置這兩個組件,通過修改Height和Width屬性把它們的尺寸設置成相同的。
(2)在對象編輯器中,單擊TabControl的屬性Tabs中的省略號按鈕,這時會彈出一個字符串編輯器。在這個編輯器中分三行輸入第一頁,第二頁和第三頁。然後點擊OK按鈕。
(3)在窗體中選取PageControl組件,用鼠標右鍵單擊該組件,在彈出的快捷菜單中選擇NewPage命令,PageControl組件將生成一個缺省名為“TabSheetN”的頁,其中N是從1開始的整數。第一次運行New Page命令生成的頁名為TabSheet1,第二次生成的名為TabSheet2,以此類推。我們使用這個命令生成三個頁。
與TabControl組件不同的是,你可以直接單擊頁來切換頁面。單擊頁在切換頁面的同時也選中了整個PageControl組件。如果要選擇某個頁,可以先單擊頁切換到該頁,然後再單擊頁面就可以了。
(4)在對象編輯器中,選擇TabSheet1,TabSheet2和TabSheet3的Caption屬性,把它分別修改為第一頁,第二頁和第三頁。
這樣看起來他們就完全一樣。
70)問:但要是一樣,為什麼有兩個不同的組件呢,用一個不就行了,好象他們並不真的完全一樣?
答:你說的對,千萬不要被他們的外表假象所蒙蔽,實際上它們並不一樣。TabControl是一種“假”多頁組件,而PageControl才是“真”多頁組件。
我們知道多頁組件把所要顯示的信息放在不同的頁中,實際上每個頁都是一個窗體,並可以通過頁來進行頁的切換。TabControl組件雖然有多個頁,但是實際上只有一個頁的模板,也就是說,每次用戶單擊頁時,這個頁都要根據頁模板更新一次,以便對用戶的選擇作出響應。
很顯然,如果需要在每個頁上顯示不同的組件,那麼TabControl肯定無法勝任這種工作。因為你每次換頁時,必須用代碼更新頁模板,這在C++Builder中實在不是一個好辦法。如果每個頁所顯示的組件相同只是內容有變化,那麼使用TabControl會更加合適,因為它消耗的系統資源比較少。
而PageControl則是每頁對應一個頁模板。所以,它適宜於每頁都不同的情況。
71)問:TabControl組件有哪些常用的屬性?
答:HotTrack屬性用來確定當鼠標指向頁時,頁上的標簽是否自動被加亮顯示。缺省值為False。
MultiLine屬性用來確定當頁一行顯示不下時是否顯示到下一行。缺省值False表示在一行無法顯示完時,在行的右邊自動出現一個雙向箭頭,可以用來移動頁。
TabHeight屬性用來設置頁的高度。缺省值0表示頁的高度將自動適應頁上文本的高度。
TabWidth屬性用來設置頁的寬度。缺省值0表示頁的寬度將自動適應頁上文本的寬度。
TabPosition屬性為tpTop時,表示將頁放在TabControl組件的上面,為tpBottom時則表示放在下面。
TabControl組件上的每一個頁都有自己的索引,最左邊的頁的索引為0,緊接著的頁的索引為1,以此類推。TabIndex屬性返回當前被按下的頁。
Tabs屬性用來設置頁的個數及其標題,在設計時是使用一個字符串編輯器來實現的。
72)問:TabControl控件有哪些比較重要的事件呢?
答:TabControl有兩個比較重要的事件OnChange和OnChanging。每當頁被選中後就會發生OnChange事件,這時可以根據屬性TabIndex判斷哪個頁被選中,然後再采取響應的動作。
OnChanging事件正好發生在頁被選中之前,也就是正好在一個頁切換到另一個頁之前。這個事件使得我們可以在頁切換之前采取某些行動,例如在某些條件沒有設置之前不准離開這一頁。
其實這兩個事件以前我們已經詳細的研究過,這裡就不再舉例說明了。
73)問:PageControl組件好像比TabControl組件功能更強大,它是怎樣使用的?
答:與TabControl相比,PageControl組件的功能確實更加強大,但是卻並不復雜。PageControl中的每一個頁都是一個TTabSheet組件,這個組件實際上是一個容器,你可以在上面放置各種控件。每個TTabSheet組件都有自己的屬性。
實際上這裡有兩層關系。最頂層的是PageControl組件,它負責管理多個TTabSheet組件,而每個TTabSheet組件也管理著放在它上面的組件。
74)問:PageControl組件有哪些比較重要的屬性呢?
答:ActivePage這個屬性顯示當前被選中的頁,它也可以用來切換頁。
MultiLine屬性用來確定當頁一行顯示不下時是否顯示到下一行。缺省值False表示在一行無法顯示完時,在行的右邊自動出現一個雙向箭頭,可以用來移動頁。缺省值為False。
TabHeight屬性用來設置頁的高度。缺省值0表示頁的高度將自動適應頁上文本的高度。
TabWidth屬性用來設置頁的寬度。缺省值0表示頁的寬度將自動適應頁上文本的寬度。
TabPosition這個屬性的值為tpTop時,頁將放在TabControl組件的上面,而為tpBottom時將顯示在下面。
此外,還有運行時態屬性:
Pages這個只讀屬性是PageControl組件上所有的頁組成的數組。
PageCount這個屬性返回PageControl組件上的頁數。
75)問: PageControl的每一頁都是一個TTabSheet組件,那TTabSheet有些什麼屬性呢?
答:TabVisible 這個屬性用來屏蔽某一頁的顯示。也說是說,它的值為False的時候PageControl組件將不顯示這個頁了,但是這個頁還存在,你還可以把這個屬性設置為True來恢復它的顯示。在程序運行期間不能刪除頁,只能屏蔽頁的顯示。
PageIndex是頁的索引號,
此外,還有運行時態屬性。
PageControl屬性返回該頁所在的PageControl組件。
TabIndex屬性返回該頁在所有可見頁中的索引號。
因為在程序運行時是不能刪除頁的,所以PageIndex索引號是固定不變的。但是頁可以被屏蔽,當沒有頁被屏蔽時,TabIndex與PageIndex完全相同;當有頁被屏蔽時,TabIndex就與PageIndex就不同了。TabIndex是這一頁在所有可見頁中的索引號,也就是說,第一個可見頁的TabIndex是0,第二個可見頁的TabIndex是1,以此類推。
76)問:能設計一個例子讓我更好的理解一下它們嗎?
答:好的 ,首先在TabControl組件的頁面上放置一個編輯框組件。
然後在PageControl組件的Tab1頁中放置一個編輯框組件。
接著將PageControl組件切換到Tab2頁,放置一個文本編輯框組件。
最後,編譯並運行這個程序。
點擊tabControl組件的tab1到tab3標簽,可以看出,編輯框出現在組件的每一頁中。
點擊PageControl組件的tab1到tab3標簽,可以看出,每一頁組件都不相同。