私のアプリケーションには、ユーザーが何をしているかに応じて異なる「状態」を持ついくつかのフォームがあります。例えば、彼のファイルをリストするとき、フォームはそのファイルに関するいくつかのデータをグリッドに表示するが、何らかのボタンをクリックすると、グリッドはそれに関連するグラフに置き換えられる。簡単に言えば、フォーム内のコントロールは、ユーザーが何をしたいかによって異なります。複数ページのフォームには、デルファイのTフレームを使用する必要がありますか?
もちろん、それを行う明白な方法は、必要に応じてコントロールを表示/隠していましたが、小さな数字の魅力のように機能しますが、状態ごとに10/15 +コントロールに達すると使用できません。
私は今、TFramesを使って実験しています:すべての状態のフレームを作成し、それぞれのフォーム上の各フレームのインスタンスを作成し、Visibleを使用して表示します - whileそれらのすべてがそれらを共有しているので、フレームの上にいくつかのコントロールがあります。
これは正しい方法ですか、途中で何かを逃しましたか?私は1つのtframeインスタンスしか作成できないと思って、それにどのインスタンスを表示するかを選択しましたが、それはそのようには見えません。
ありがとうございました
+1ですが、このコードではメモリがリークしていることに注意してください。以前にMYFrame1.CurrentFrameが明示的にnilに設定されていない場合、またはMYFrame1が破棄された場合は解放されません。 MyFrame1を所有者としてコンストラクタに渡し、VCLで自動ライフタイム管理を利用する方がよいでしょう。 – mghie
@mghie:IIRCコントロールの親もまた生涯管理を引き継ぐので、Timのコードではメモリリークが発生しません。 –
実際には、TSomeFrame.Create(nil)を呼び出すのではなく、TSomeFrame.Create(Self)を呼び出してフォームを所有者のフォームにし、フォームが破棄されたときにそのフォームを解放すると、私は思っています。また、OnDestroyイベントでCurrentFrameをnilに設定することもできます。あるフレームから別のフレームに変更しても、セッターは別のフレームに設定する前にFCurrentFrameを解放するため、メモリーリークは発生しません。 –