私が大きな成功を収めた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;
ありがとうございます。したがって、TTabControlは、実行時にオブジェクトをタブに埋め込む際に推奨される解決策ですが、デザイン時にUIを設定するときは、PageControl + TabSheets + Framesを使用する方が適切ですか? – Gulbahar
いいえ。TTabControlは、タブを変更しても表示されるコントロールは変更されず、タブインデックスのみが変更されるため、同じタイプのオブジェクトのリストのプロパティを編集する場合の推奨ソリューションです。ページコントロールは、一度にフォーム上に異なるコントロールの複数のページ分を配置するためのものです。 (そして、ジムはその答えを書いていませんでした。彼はそれを編集しました。) –
おかげさまでメイソンは理にかなっています。私の使用のために、それはPageControl +いくつかのタブシートのように見えますが、それぞれフレームを保持するのは私がしなければならないもののための望ましい解決策です。 – Gulbahar