2

私は過去 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

4

2 に答える 2

3

UIレイヤーにはまだ多くのロジックがあるようです。Forms/Panels には、それほど多くの Value プロパティがあってはなりません (Dialogs を除いて)。

MVC パターンを読むよりも多くの構造が必要な場合。

とはいえ、フレームは GUI を整理するための優れた方法です。すべてと同様に、使いすぎないでください。

于 2009-07-23T11:33:09.003 に答える
0

私は一般的に、複雑な再利用可能なビットを作成するためのフレームが好きです。ほとんどの場合、画面を作成するための非常にクリーンな方法になると思います。ただし、Henk Holtermanが述べたように、画面とフレームにはUIの機能に関連するロジックのみが含まれ、ビジネスロジックについては可能な限り無知である必要があります。

UIに隠されているフレームと情報に関するいくつかのポイント:

  1. StackOverflowに関する別の質問で説明されているように、フレームでイベントハンドラーを使用する場合は注意が必要です。
  2. フレームにはまだ多くの公開されたプロパティがあり、フォームがお互いのビットを不適切にいじることができるという問題を実際には解決していません。あなたがそれをしなくても、コードがそれを許可するならば、誰かが最終的にそれがすべきでないところを改ざんするコードを書くでしょう。私は常にグローバルフォーム変数を削除します。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に、最初のリストに示されているビットを処理させます。このように、呼び出し元のコードはフォームポインターを受け取ることはなく、ラッパークラスによって具体的に提供されていないビットに触れることはできません。

于 2009-07-23T20:35:55.370 に答える