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 にドロップしました。