Wie kann ich eine TList-Eigenschaft aus meinem benutzerdefinierten Steuerelement streamen?

Überblic

Ich schreibe mein eigenes Listbox-Steuerelement, das von @ abgeleitet isTCustomListBox.

Ich habe auch damit begonnen, meinen eigenen Eigenschaftseditor zu implementieren, um das Bearbeiten der Beschriftung und des Bildindex von Elementen zur Entwurfszeit zu ermöglichen (ich zeichne das Listenfeld benutzerdefiniert und habe meine eigene ImageList-Eigenschaft aus meinem Steuerelement heraus veröffentlicht).

Proble

So funktioniert soweit alles gut, allerdings kann ich die Items nicht zum dfm streamen lassen. Ich glaube, das könnte daran liegen, dass die Standard-ListboxItems Eigenschaft ist vonTStrings, und von meiner Kontrolle habe ich mein eigenes Eigentum veröffentlicht, das auch @ heiItems, aber ist vonTList Klasse. Ich möchte nicht den StandardItems Eigenschaft der Listbox erscheint aber stattdessen meine eigeneItems Art

So obwohl ich mein Steuerelement zur Entwurfszeit auf ein Formular legen kann, bearbeite dasItems Wenn ich mit meinem eigenen Eigenschafteneditor die Anwendung ausführe, sind die Listenfelder leer. Wenn ich das DFM zur Entwurfszeit anzeige und dann zur Formularansicht zurückkehre, sind die Elemente ebenfalls verschwunden. Grundsätzlich sind sie nicht im DFM gespeichert, und ich bin nicht sicher wie kann man das korrigieren?

Relevante Auszüge des Codes sehen so aus (Kommentare, die zum Zweck dieser Frage hinzugefügt wurden):

Mein eigener Listbox-Elementtyp:

TListBoxItem = class(TObject) // Also tried TPersistent
private
  FCaption: string;
  FImageIndex: Integer;
public // Also tried Published
  property Caption: string read FCaption write FCaption;
  property ImageIndex: Integer read FImageIndex write FImageIndex;
end;

Das benutzerdefinierte Steuerelement:

TMyListBox = class(TCustomListBox)
private
  FImageList: TImageList;
  FItems: TList;
  procedure SetImageList(const Value: TImageList);
protected
  procedure Notification(AComponent: TComponent;
    Operation: TOperation); override;
  procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); Override;
  procedure MeasureItem(Index: Integer; var Height: Integer); override;
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;

  procedure AddItem(ACaption: string; AImageIndex: Integer); // adds a new item to FItems and the listbox control
published
  .....
  property Color;
  property Images: TImageList read FImageList write SetImageList;
  property Items: TList read FItems write FItems; // take over standard Items type and publish my own Items type instead
  .....
  property Sorted;
  property TabOrder;
  property TabStop;
  property Visible;
  property OnClick;
  property OnContextPopup;
  property OnDblClick;
  property OnDragDrop;
  property OnDragOver;
  //property OnDrawItem;
  property OnEndDock;
  property OnEndDrag;
  property OnEnter;
  property OnExit;
  property OnKeyDown;
  property OnKeyPress;
  property OnKeyUp;
  //property OnMeasureItem;
  property OnMouseDown;
  property OnMouseEnter;
  property OnMouseLeave;
  property OnMouseMove;
  property OnMouseUp;
  .....
end;

Das ist das Steuerelement in seiner einfachsten Form. Alles, was ich mit dem Steuerelement tun möchte, z. B. die benutzerdefinierte Zeichnung und der Eigenschafteneditor für meinItems Eigenschaft usw. funktioniert, wie ich will.

Frag

Was muss ich tun, um @ zu machFItems Eigenschaft kann auf DFM gestreamt werden? Das DFM sollte unter @ jeden meiner Listbox-Elementtypen anzeigeItems.

Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage