2009-08-17 41 views
14

我想知道爲什麼德爾福(2007)提供了三個似乎做同樣事情的小部件,以及每個部件的優缺點。TTabSet與TTabControl與TPageCtrl/TTabSheet?

在同一主題上,如果我想顯示不同的控件集合,爲什麼我應該喜歡eg。 PageControl + TabSheets +框架,而不是直接在父窗體上顯示不同的框架?

謝謝。

回答

23

從上TTabSet幫助文件:

選項卡中設置控件通常用於 顯示選項卡式對話 框內的網頁。 TTabSet提供用於向後兼容 。在32位Windows 應用程序中使用TTabControl 組件。

所以真正的問題是,TTabControl和TPageControl有什麼區別?不同之處在於TTabControl只有一個「頁面」,而TPageControl對於每個選項卡都有一個頁面。這使它們在不同情況下有用。

TPageControl對於您希望在屏幕上放置更多UI的對話框非常有用,它比您有適合的屏幕空間。將您的UI組織到類別中並將每個類別放在一個頁面上。例如,您在「選項」對話框中會看到很多這種模式。另一方面,TTabControl可以很好地處理數組/對象列表。TTabControl可以在數組/對象列表上工作。創建一個UI以顯示和編輯單個對象的屬性,並將其放置在TTabControl上,然後爲每個對象創建一個選項卡並設置事件處理程序,以便每當您將該對象從數組中加載到控件時更改標籤。

至於框架問題,將TPageControl與框架結合使用的主要原因是因爲它提供了一種預先構建的方式來決定顯示哪個框架。這樣你就不必重新創建一個機制。

+0

謝謝吉姆。因此,在運行時用對象填充選項卡時,TTabControl是首選解決方案,而在設計時設置UI時,PageControl + TabSheets + Frames是更好的選擇? – Gulbahar 2009-08-20 12:14:52

+2

編號TTabControl是編輯同一類型對象列表屬性時的首選解決方案,因爲更改標籤不會更改您看到的控件,只會更改標籤索引。頁面控件是一次將多個頁面的不同控件放在一個表單上。 (吉姆沒有寫出答案,我做了,他做了一個編輯。) – 2009-08-20 13:08:35

+0

感謝梅森,這很有道理。對於我的使用,它看起來像一個PageControl +一些tabheets,每個持有一個框架是我需要做的首選解決方案。 – Gulbahar 2009-08-21 11:45:38

5

我使用過的一個非常成功的方法是在TPageControl中使用框架,並在第一次選擇頁面時將框架延遲綁定到tPageControl。這樣可以減少表單加載時間,不會創建從不被查看的框架,但可以創建靈活的框架,在製表符之間切換時保持狀態。最近我轉向使用表單並嵌入它們而不是框架......但概念是相同的。

使用TTabControl上的單個「掛載點」可以完成同樣的工作,並在標籤更改時將其切換出去,但是隨着標籤切換回來,如何處理標籤狀態也會出現。

[編輯]問題出現在我如何處理框架和父窗體之間的通信。這實際上很容易使用接口。只要創建將由形式和框架共享一個新的單位,並添加兩個接口:

type 
    IFormInterface = interface 
    [guid] 
    procedure FormProc; 
    end; 

    IFrameInterface = interface 
    [guid] 
    procedure SetFormController(Intf:IFormInterface); 
    end; 

的形式爲實現IFormInterface,和框架實施IFrameInterface。當你點擊一個選項卡上,並顯示一個框架,然後運行像以下代碼:

var 
    FrameIntf : IFrameInterface; 
begin 
    if Supports(FrameObj,IFrameINterface,FrameIntf) then 
    FrameIntf.SetFormController(Self); 
end; 

的SetFormController方法的框架實施將隨後守住通過參考,這將允許它向上調入形式。

procedure TFrame1.SetFormController(Intf:IFormInterface); 
begin 
    fFormController := Intf; 
end; 

Procedure TFrame1.Destroy; override; 
begin 
    fFormController := nil; // release the reference 
    inherited; 
end; 

Procedure TFrame1.Button1Click(Sender:tObject); 
begin 
    if fFormController <> nil then 
    fFormController.FormProc 
    else 
    Raise Exception.Create('Form controller not set'); 
end; 
+0

感謝您的提示。當您使用PageControl和多個框架時,您是如何從父窗體中檢查在哪個框架中單擊了哪個按鈕的? – Gulbahar 2009-08-21 11:47:00