2009-08-17 3 views
14

私はDelphi(2007)が同じことをするような3つのウィジェットを提供しているのか、それぞれのメリットとデメリットが何であるのだろうと思いました。TTabSet対TTabControl対TPageCtrl/TTabSheet?

同じトピックで、異なるコントロールのセットを表示したい場合、なぜ私はどうすればよいでしょうか。 PageControl + TabSheets + Framesを使用して、親フォームに異なるフレームを直接表示するのではなく、

ありがとうございます。 TTabSet上のヘルプファイルから

答えて

23

:タブセットコントロールは、一般的に ディスプレイに使用されている

は、ダイアログ ボックス内のページをタブ付き。 TTabSetは後方互換のために提供されます 32ビットWindows アプリケーションのTTabControl コンポーネントを使用してください。

本当の質問は、TTabControlとTPageControlの違いは何ですか?違いは、TageControlは1つの "ページ"しか持たないのに対し、TPageControlは各タブごとに1ページあります。これにより、さまざまな状況で役立ちます。

TPageControlは、画面にUIを収めるダイアログボックスに適しています。UIをカテゴリに分類し、各カテゴリを1ページに配置します。たとえば、このダイアログボックスのオプションダイアログでは、このパターンが多く表示されます。

TTabControlは、オブジェクトの配列/リストの作業に適しています。単一のオブジェクトのプロパティを表示および編集するためのUIを作成し、TTabControlに配置し、オブジェクトごとに1つのタブを作成し、イベントハンドラを設定して、アレイからコントロールに新しいオブジェクトをロードしますタブを変更します。

フレームの質問については、フレームと一緒にTPageControlを使用する主な理由は、表示するフレームを決定するための事前作成された方法を提供するためです。そうすれば、あなたはそれのための仕組みを改革する必要はありません。

+0

ありがとうございます。したがって、TTabControlは、実行時にオブジェクトをタブに埋め込む際に推奨される解決策ですが、デザイン時にUIを設定するときは、PageControl + TabSheets + Framesを使用する方が適切ですか? – Gulbahar

+2

いいえ。TTabControlは、タブを変更しても表示されるコントロールは変更されず、タブインデックスのみが変更されるため、同じタイプのオブジェクトのリストのプロパティを編集する場合の推奨ソリューションです。ページコントロールは、一度にフォーム上に異なるコントロールの複数のページ分を配置するためのものです。 (そして、ジムはその答えを書いていませんでした。彼はそれを編集しました。) –

+0

おかげさまでメイソンは理にかなっています。私の使用のために、それはPageControl +いくつかのタブシートのように見えますが、それぞれフレームを保持するのは私がしなければならないもののための望ましい解決策です。 – Gulbahar

5

私が大きな成功を収めた1つの方法は、TPageControlでフレームを使用し、ページが初めて選択されたときにフレームをtPageControlにバインドすることです。これにより、決して表示されないフレームを作成せずに、フォームの読み込み時間を短縮しますが、作成する柔軟性を可能にするため、タブ間で変更するときには状態が維持されます。最近、私はフォームを使用し、フレームの代わりにそれらを埋め込むように切り替えました...しかし、コンセプトは同じです。

TTabControlで1つの「マウントポイント」を使用し、タブが変更されたときに同じように切り替えることもできますが、タブが切り替わってもタブの状態に対処する方法の問題が発生します。

[EDIT]フレームと親フォーム間の通信をどのように処理するのですか?これは実際にはインターフェイスを使用して非常に簡単です。ただ、フォームによって共有される新しいユニットとフレームを作成し、二つのインタフェースを追加します。フォームがIFormInterfaceを実装し、フレームはIFrameInterfaceを実装持っ

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

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

を。あなたはタブをクリックし、フレームを表示すると、その後のようなコードを実行し、以下:

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