2009-09-23 2 views
7

昨日私は「MDIとタブ付きインターフェイス」について議論を開始しました。私は私のアプリケーションをMDIベースで開発し続けるべきかどうか、または子フォームをタブシートに埋め込むべきかどうかを尋ねました。 誰かが私の代わりにTFramesを使うべきだと指摘しました...私の質問は:なぜですか?Delphi、frames vs forms。マルチドキュメントインターフェイスはどうですか?

TFrameにフォームを埋め込む際に、TFramesを使用するメリットは何ですか?これまでのところ、私は切り替え、いずれかを知らないだけで(私はとにかく設計時に埋め込む使用するつもりはない!)

...コードの一部を書き換えるために、事前に

おかげで、私を必要とする

答えて

11

はフレームを使用する理由を提供するために、コメントに答える:

私は、設計時に、GUIのブロックを構築するために、フレームを検討します既存のコンポーネントとより高度なコンポーネントの組み合わせ。 Delphi 5より前のバージョンでは、子コントロールの子孫であるTCustomPanelを使用し、これを新しいコンポーネントとして登録しました。フォームにドロップする準備ができました。フレームを使用することで、同じことが簡単にできます。

これにより、必要な機能だけを開発することに集中することができます。右クリックすると、タブコントロールシート、モーダルダイアログ、モードレスダイアログ、MDI子フレーム、標準フレームに埋め込むことができます。 1つのフォームにいくつかを追加することもできます - 埋め込まれたフォームではおそらくないものがあります。要点は、最大限の再利用性のためには、階層化されたアプローチがしばしば必要であり、フレームがそれを助けることです。

フレームは外出先から埋め込むのに適しています。キャプションバーと境界線を表示しないようにフォームを調整する必要があります。通常、CreateParams()をオーバーライドし、それに応じてウィンドウスタイルを調整します。インスペクタには、埋め込みフォームに意味をなさない多くのフォームプロパティがあります。 IMHOは、最も基本的で一般的なエンティティを使用する必要があります。フォームは、埋め込みのためのコントロールコンテナよりもはるかに優れています。

OTOHフォームに埋め込まれていないフレームを埋め込むことの不利な点についてはわかりません。

編集:

フレームはありませんOnCreateまたはOnShowなどのイベントに関するコメントがあります。実際には、イベントハンドラにはパラメータがないため、フレームの別の利点があると考えています。そのため、多くのものがフォームにハードコードされています。

OnCreateには、利用可能な情報が多くないため、定数またはINIファイルセクションのフォーム名が使用されてしまい、再利用が非常に困難または不可能になってしまいますフォームを作成したり、複数のインスタンスを作成することができます。一方、フレームを使用すると、メソッドLoadSettingsがそれを実行する明白な方法であり、必要なパラメータを持つことができます。このようにして、コントロールは、それが属する場所、埋め込まれたフレーム/フォームのコンテナに戻されます。再利用可能性は、外部から振る舞いを調整できる場合にのみ可能です。

コンポーネントではなく、ライフタイム管理が必要な格納オブジェクトの場合は、たとえばAfterConstructionBeforeDestructionがあります。

-1

フォームは、フォーム内で「サブフォーム」を複数回繰り返す場合に適しています。埋め込みフォームはMDI/Tabbedインターフェイスの使用に適したソリューションなので、タブ付きのインターフェイスには使用しません。

+3

のためのインタフェースを作成することによって、私たちに手を与えることができることを行うが、余分なコーディングが必要です)

埋め込みフォームはフレームよりも優れたソリューションになります。 – mghie

+2

mghie、私はあなたと議論しているわけではありません - 何らかの理由を提供してください** **)私はフレームが複数のドキュメントのタブ付きインターフェイスの方が優れている理由を本当に知りたいですか? – migajek

+0

まさに私の考え:代わりにフレームを使うことができるのであれば、誰が埋め込みフォームに行くのだろうか?フレームはほんの少しだけ面倒です。後でフォームとして使用する必要がある場合でも、空のフォーム広告を作成するだけで、align = alClientというフレームを追加することができます。 – dummzeuch

1

私は数年前の私たちのアプリケーションで同じ決断をしていましたが、埋め込みフォームにしたいと思っていました。最初にフレームを使い、それを管理するクラスを作成しました。

その後、埋め込みフォームを非常に簡単なタスクにするLMDToolsのTLMDDisplayFormコンポーネントが見つかったので、使用されているコードが少なくなりました。

フレームからフォームに変更した主な目標の1つに、TControlのようないくつかのイベントがありませんでした:ActiveControlなどのいくつかのプロパティが欠落している、アプリケーションのいくつかのタスクに使用するOnCreate、OnShow、覚えていない。

あなたはフォームと一緒に行きたい場合は、私はあなたが基本的なバージョンの横に、あなたのためのより容易なタスクを作るLMDToolsを使用することをお勧めは、私が個人的に好む動的に挿入フォーム/フレームの場合

1

無料です:-)フレームに埋め込みフォームを使用する。いくつかのバージョンでは、alClientに設定されたフレームを編集するときに、フレームが編集の間にサイズ変更され、フレームの右側に固有に整列されたコントロールが位置を変更します。埋め込みフォームを使用すると、これは起こらなかったので、私はスイッチを作った。この問題は現在、Delphiのそれ以降のバージョンで修正されていると思います。

私は、通知イベントを介して埋め込みフォームに情報を渡すことができないという点に関して、Mghieが以前に指摘した点に強く同意します。これを解決するために、私は一般に通信のために各埋め込みフォームに一連のインターフェースを実装します。これは実際にコードを単純化し、多くの異なるタイプの埋め込みフォーム/フレームを扱う単一の "コンテナ"を持つより一般的な実装を可能にします。これのいくつかの例は私の設計したウィザードフレームワークの一部として私のblogにあります。

2

フレームは、フレームを作成するときに最も速い負荷を使用し、遅延なしに使用します。

しかし、フレームには親が埋め込まれている必要があります。 onCreateイベントやonShowイベントが発生しないというデメリットが発生しました。フレームのプライベートセクションに

プット:しかし、あなたはonShowこのようなイベントのトリガのためのメッセージを呼び出すことができます

procedure CMShowingChanged(var M: TMessage); message CM_SHOWINGCHANGED; 

してから、このようなコードを作成します:

procedure TFrame1.CMShowingChanged(var M: TMessage); 
begin 
    inherited; 
    if Showing then 
    begin 
    // .... put your code for onShowing is triggered 
    end 
    else 
    begin 
    // .... put your code for onHiding is triggered 
    end; 
end; 

希望を支援することができますあなたはGUI用の組み込みフレームを検討する必要があります。

PageControlと組み合わせて、フレームの開きを制御することができます。

マンズ

0

私はどちらも使うべきだと思います。たとえば、dbnavigator、dbgrid、およびdatasourceコンポーネントを持つ "標準"フレームがあり、これは一般的なデータブラウジングに非常に便利です。そのようなコンポーネントを毎回挿入するのではなく、データを(JVCL:Dで)複数のフォーマットにエクスポートする機能を持つフレームを挿入します...しかし、私は設計時に表示したいものを知っています。簡単なルール:設計時にわかっている場合はフレームを使用し、そうでない場合は埋め込みフォームを使用します。

ただし、フォームは埋め込まれるようには設計されていないことに注意してください。そのようなものを使用すると、その不自然な(吸血鬼は彼女が80歳の娘を葬ったと言い、彼女は30:Dのように見える)。埋め込みフォームは、それを所有するフォームについてはほとんど分かっていませんし、埋め込まれていないフォームも(論理的に)想定できます。

これを補うために、フレームはコンポーネントであり、フォームに埋め込まれている(所有している)とき、フォームはそれを知り、フレームはフォームについて知っています(そのメソッドとプロパティを使用できます。また、任意**理由**おそらく、エンバカデロが提供してくださいTEmbeddableFormまたはそのような目的

よろしく、 アルバロCastiello

関連する問題