3

私は、さまざまな場所で一種のイディオムを再利用するこのアプリケーションを持っています。TPanel があり、その上にいくつかのラベルとボタンがあります。目的は、ユーザーが日付範囲を選択できるようにすることです。

実行時のそのようなパネルの 1 つの例を次に示します。

"&Dates" キャプションは 1 つのラベルで、"All Dates" 部分は 2 つ目のラベルです。ユーザーが [選択] ボタンをクリックすると、フォームがポップアップ表示され、ユーザーに日付/時刻コントロールと [OK]/[キャンセル] ボタンのペアが表示されます。ユーザーがいくつかの日付を選択した後に [OK] をクリックすると、2 番目のラベルが「From mm/dd/yyyy To mm/dd/yyyy」に変わります。

これらのコントロールをパッケージ化するコンポーネントを作成することは妥当でしょうか? コンポーネント作成者向けのさまざまなリソースを見てきましたが、ボタンの onclick イベントの処理など、私が考えている問題を指摘していないようです。これが妥当な試みである場合は、そのような「複合コントロール」を作成する方法の説明へのポインタもいただければ幸いです。

4

4 に答える 4

6

合理的です、はい。

このようなコンポーネントを作成するには、インスタンス TCustomPanel から新しいクラスを派生させ、サブコンポーネントをクラス内のフィールドとして追加します。

このような:

TMyDatePicker = class(TCustomPanel)
protected
  FChooseButton: TButton;
  FClearButton: TButton;
public
  constructor Create(Owner: TComponent); override; 
end;

constructor TMyDatePicker.Create(Owner: TComponent)
begin
  // Inherited
  Inherited;

  // Create Choose Button
  FChooseButton := TButton.Create(Self);
  FChooseButton.Parent := Self;
  FChooseButton.Align := alRight;
  FChooseButton.Caption := 'Choose';

  // Create Clear Button
  FClearButton := TButton.Create(Self);
  FClearButton.Parent := Self;
  FClearButton.Align := alRight;
  FClearButton.Caption := 'Clear';
end;

イベント ハンドラーを追加するには、新しい保護されたプロシージャをクラスに追加するだけです。

例えば:

procedure TMyDatePicker.HandleChooseButtonClick(Sender: TObject)
begin
  // Do whatever you want to do when the choose button is clicked
end;

次に、イベント ハンドラーを選択ボタンの OnClick イベントに接続します (これは、クラスの Create メソッド内で行う必要があります)。

FChooseButton.OnClick := HandleChooseButtonClick;

もちろん、ボタンの配置を微調整したり、アイコンを追加したりするなど、これ以上のことはありません。また、OnDateSelected や OnDateModified などの独自のイベントを作成する必要があります。

しかし、それとは別に、上記の例は少なくともあなたを動かすはずだと思います. :)

于 2012-06-05T21:22:57.990 に答える
5

はい、大量のコーディングを節約できるため、そのようなコンポーネントを構築することは絶対に賢明です。

これらを半視覚的に作成するためのガイドは次のとおりです。Delphi で集約/複合コンポーネントを構築する方法

基本的に、このドキュメントで概説されているプロセスは次のとおりです。

  1. Delphi のフォーム内のコンポーネントのレイアウトを設計し、すべてのコンポーネントを TPanel(またはその子孫)内に配置します。
  2. パネルを選択してコピーし、テキスト ファイルに貼り付けます。
  3. 「 = 」のすべてのインスタンスを「 := 」に置き換え、各行の末尾にセミコロンを追加します。
  4. すべての DFM「オブジェクト」宣言行を適切なオブジェクト コンストラクター コードに変換し、すべてのビジュアル コントロールの親をコンテナー パネルに設定します。
  5. 残りのコードをクリーンアップします。ビットマップはリソース ファイルに配置する必要があります。
  6. この新しいパスカル コードを、コンポーネントの create コンストラクター内に配置します。コンストラクター内で、適切なサブコンポーネント クリエーターの下にオブジェクト セクションをグループ化します。

ドキュメントが間違っていると思うのは、たとえば、サンプル コンポーネントが TPanel から派生しているのに対して、TCustomPanel を使用して必要なメソッドのみを公開する方が理にかなっていることです。

ただし、OnClick ハンドラなどを追加する方法についても説明しています。

この方法の利点は、パネル内のコンポーネントのレイアウトを視覚的に行えることです。

于 2012-06-05T21:33:13.367 に答える
2

複合コントロールを開発するための非常に実用的な方法は、TFrameをベースとして使用することです。

そうすれば、コントロールを視覚的に設計し、イベントまたは継承を使用できます。

監視する必要があることがいくつかありますが、全体として、すべてを手動でコーディングするよりもはるかに簡単なプロセスです (他の回答のいくつかが示唆するように)。

注意すべきこと (完全なリストではありませんが、近いものです):

  • 小枝を忘れないで
  • 設計時 (TFrame と複合コントロールをデザイン サーフェイスに配置するときの両方) では、Visible=True とマークされたサブコントロールは引き続き表示されます。これを解決する 2 つの方法: これらのコントロールを破棄するか、非表示領域に移動します (上/左をマイナスの値にするか、親の幅/高さよりも大きな値にします)。
  • TFrame の子孫がプロジェクトの一部でもあるコンポーネントとして TFrame の子孫を登録すると、IDE が混乱することがあります。簡単な解決策: TFrame の子孫 "TMyCustomControl" を呼び出し、そこから "TMyControl" を派生させ、"TMyControl" をコンポーネントとして登録します。

おまけとして、ベベル/ボーダーとキャプションを TPanel から削除する必要はありません。

于 2012-06-06T07:58:38.163 に答える
2

さらに別の方法は、コンポーネントのグループをコンポーネント テンプレートにすることです。

于 2012-06-06T12:12:01.617 に答える