1

Delphi でのコンポーネント開発は初めてなので、知りたいのですが、自分のタスクを実装することはまったく可能ですか。

TScrollBox に基づいてビジュアル コンポーネント (ユーザー コントロール) を作成する必要があります。これは TPanel の束を表し、すべてのパネルはその TScrollBox 内で「上」に配置され、異なる高さを持つことができます。これは TCollection (追加、削除、並べ替え) として機能する必要があり、設計時にユーザーがこれらのパネルに他のコントロールを追加できるようにする必要があります。

コンポーネント用にこれらのクラスを作成しました:

type
  TPanelsGrid = class;

  TPanelsGridItem = class(TCollectionItem)
  private
    FPanel: TPanel;
    procedure SetPanel(Value: TPanel);
    function GetGrid: TPanelsGrid;
  protected
    function GetDisplayName: string; override;
  public
    constructor Create(Collection: TCollection); override;
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
  published
    // This is my TPanel object that should be used at designtime
    // I thought "stored True" will serialize it automatically but I was wrong
    property Panel: TPanel read FPanel write SetPanel stored True; 
  end;

  TPanelsGridItems = class(TCollection)
  private
    FPanelsGrid: TPanelsGrid;
  protected
    function GetItem(Index: Integer): TPanelsGridItem;
    procedure SetItem(Index: Integer; Value: TPanelsGridItem);

    function GetOwner: TPersistent; override;
    procedure Update(Item: TCollectionItem); override;
  public
    property EditorsGrid: TPanelsGrid read FPanelsGrid;
    property Items[Index: Integer]: TPanelsGridItem
      read GetItem write SetItem; default;

    constructor Create(PanelsGrid: TPanelsGrid);
    function Add: TPanelsGridItem;
    procedure Delete(Index: Integer);
  end;

  TPanelsGrid = class(TScrollBox)
  private
    FItems: TPanelsGridItems;
    procedure SetItems(Value: TPanelsGridItems);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Items: TPanelsGridItems read FItems write SetItems;
  end;

このコンポーネントは設計時に正常に動作しています。スタック内のパネルを追加/削除できます。任意のパネルにコントロール (TCheckbox など) をドロップすると、「そのパネルが所有」と表示されます: たとえば、このチェックボックスをドラッグできませんパネル外。

ただし、このチェックボックスは DFM ファイルに保存されず、[構造] ウィンドウには表示されません。

TPanel のコンテンツを手動でシリアライズ/デシリアライズする必要があると思いますが、その方法がわかりません。インターネット上で例が見つかりません。そのような実装が可能であれば、ガイドラインを教えてください。

追加

これは、3 つのパネルをグリッドに追加した後の DFM ファイル フラグメントの外観です。

  object PanelsGrid1 : TPanelsGrid 
    Left = 8
    Top = 8
    Width = 536
    Height = 382
    Anchors = [akLeft, akTop, akRight, akBottom]
    TabOrder = 0
    Items = <
      item
      end
      item
      end
      item
      end>
  end

ご覧のとおり、すべてのアイテムは空ですが、チェックボックスとラジオボタンをアイテム #3 にドロップしました。

4

3 に答える 3

1

結局、DefineProperties メソッドのテスト中に一貫して IDE がクラッシュしたため、TCollection の使用をあきらめることにしました。TCollection はそのようなタスク用に設計されていなかったと思います。

ExtCtrls.TCustomCategoryPanelGroup コントロール内の Delphi ソース内に適切な実装を作成しました。設計時と実行時の両方で追加または削除できるパネルのスタックを維持します。TCustomCategoryPanelGroup と TCustomCategoryPanel のソース コードを使用して独自のクラスを作成しましたが、思い通りに動作します。

于 2010-09-30T14:51:58.393 に答える
0

TMS Poly List コントロールを見ることができると思います

TMS Advanced Poly List コンポーネントは、非常に用途が広く柔軟なアーキテクチャを提供し、ユーザー インターフェース内の可能な項目のリストをほぼすべて作成します。これは一般的に見られますが、新しい Office 2010 アプリケーション メニューに限定されません。リストが同じタイプのアイテムまたは同じタイプのアイテムのコレクションで構成されるほとんどのユーザー インターフェイス リスト コントロールとは対照的に、TMS Advanced Poly List コンポーネントはポリモーフ アイテムを保持できます。すべての項目は基本クラス TCustomItem から派生する必要があり、継承された項目を追加できます。TMS Advanced Poly List コンポーネントには、事前に作成された多数のリスト アイテムが付属していますが、カスタム アイテム クラスは、TCustomItem 基本クラスまたは既に提供されているいずれかのクラスのいずれかを継承して追加できます。リスト セクション アイテムとして表示するアイテム クラスがあり、HTML フォーマットのテキスト アイテム、ボタン付きのテキスト アイテム、展開/折りたたみ動作のアイテム、画像付きのアイテムなど。アイテムは、設計時に機能豊富な設計時エディタを使用して、またはコードを介して実行時にポリモーフ リストに追加できます。

于 2010-09-27T16:37:45.540 に答える
0

子パネルに名前があることを確認してください。TCollection.Notify をオーバーライドできます。Action が cnAdded の場合は、パネルに名前があることを確認してください。

于 2010-09-28T08:35:23.977 に答える