我是Delphi新組件開發,因此想知道,是否有可能實現我的任務。這可能嗎? TCollection後裔實現任意內容的TPanel容器的存儲
我需要創建一個基於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的內容的手動序列化 - 反序列化,但我不知道該怎麼做。在Internet上找不到任何示例。 Plase給我一些指導,如果這樣的實現是可能的。
加成:
這是我的DFM文件片段的樣子加入3片成網後:
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中。
在設計時用鼠標右鍵單擊表單並選擇「作爲文本查看」。如果您不介意的話,找到與您的組件相關的部分並將其添加到您的帖子中。我不知道這應該如何實現,我自己,但讓我們先看看存儲的內容。 – himself 2010-09-27 16:28:13
從TComponents繼承的已發佈屬性不會被流式傳輸系統存儲。 – 2010-09-27 17:59:22
自己,做完了,請看dfm。 – Andrew 2010-09-27 18:46:24