Delphi でのフレームの使用による GUI 情報の非表示
-
19-09-2019 - |
質問
私は過去 3 年間、趣味/職業レベルで Delphi を学習しています。今では、自分の初期のコードを恐怖と恥ずかしさとともに振り返ることができるところまで進歩したと言えることをうれしく思います。そこで私は現在、初期のアプリのいくつかを調べて、書き直したりリファクタリングしたりしています。
私がやめようとしている悪い習慣の 1 つは、あるフォーム上のコンポーネントに別のユニットからアクセスすることです。これを強制するために、私は情報を隠す方法としてフレームを使用する実験を行ってきました。したがって、コンポーネントを含むフォームを作成する代わりに、すべてのフォーム コンポーネントを保持するフレームを作成し、そのフレームをフォーム上に配置し、フレーム宣言をプライベート宣言に移動します。
type
TMyForm = class(TForm)
private
MyFrame: TMyFrame;
procedure SetTimeDate(const Value: TMyItem);
function ReadTimeDate:TMyItem ;
次に、フォーム初期化セクションにフレームを登録します
initialization
begin
RegisterClasses([TMyFrame])
次に、フレームとそのコンポーネントにアクセスできるフォーム ユニットのパブリック セクションで必要なプロパティを宣言します。
public
property TimeDate: TOverlayItem read ReadTimeDate write SetTimeDate;
また、フレームを使用して、頻繁に繰り返されるコンポーネント グループを統合しています。
これは私が望む目的(Myframeとそのコンポーネントを隠す)には機能するようですが、他にこの方法を経験した人はいますか?
フレームを使用することに欠点はありますか?これを行うことで実際に利益を得られますか?フレーム内でネストされたフレームを使用することに問題はありますか?Delphi でフレームを使用するための優れた実践ガイドはありますか?Delphi で非表示にする GUI 情報に関して、同じ効果を達成するより良い/より簡単な方法はありますか?
HMcG
解決
これが鳴ります。フォームは/パネルは、(おそらくダイアログを除く)それほど価値の性質を持つべきではありません。
あなたはMVCパターンをよく読んでより多くの構造をしたい場合。
すべてのことを言って、フレームは、GUIを整理するための良い方法にすることができます。すべてのものと同じように、ではない乱用ん。
他のヒント
私は一般に、複雑な再利用可能なビットを作成するためのフレームが好きです。ほとんどの場合、これらは画面を構築する非常にクリーンな方法になると思います。ただし、先述のように、 ヘンク・ホルターマン 画面とフレームには UI の機能に関連するロジックのみを含める必要があり、ビジネス ロジックについてはできる限り無視する必要があります。
いくつかのポイントは、UI 内に隠されているフレームと情報を再構成します。
- 説明したように StackOverflow の別の質問で フレーム内でイベント ハンドラーを使用する場合は注意が必要です。
- フレームには依然として多くの公開されたプロパティがあり、フォームが相互に不適切にビットを操作できるという問題は実際には解決されていません。あなたがそうしなくても、コードがそれを許可していれば、最終的に誰かが改ざんすべきではない場所に改ざんするコードを書くことになります。私は常にグローバル フォーム変数を削除します。Delphi はコードを汚し、ラッパー オブジェクトを作成したり、UI への制御されたアクセスを提供するインターフェイスを実装したりすることがよくあります。
したがって、次のようなコードの代わりに:
ClientForm := TClientViewForm.Create(Self);
try
ClientForm.Client := MyClient;
ClientForm.ShowModal;
finally
ClientForm.Free;
end;
私は通常、次のようなものを書くように人々に強制します。
ClientViewer := TClientViewer.Create(MyClient);
try
ClientViewer.Show;
finally
ClientViewer.Free;
end;
あるいは
TClientViewer.ShowClient(MyClient);
そしてクラスメソッド ShowClient で最初のリストに示されているビットを処理させます。そうすることで、呼び出し元のコードはフォーム ポインターを決して受け取らず、ラッパー クラスによって特別に提供されていないビットには触れられなくなります。