¿Cómo puedo hacer que una propiedad TList desde mi control personalizado se pueda transmitir?
Visión de conjunto
Estoy escribiendo mi propio control de cuadro de lista derivado deTCustomListBox
.
También comencé a implementar mi propio editor de propiedades para permitir la edición del subtítulo y el índice de imagen de los elementos en el momento del diseño (estoy personalizado dibujando el cuadro de lista y he publicado mi propia propiedad ImageList desde mi control).
Problema
Hasta ahora todo funciona bien, sin embargo, no puedo hacer que los elementos se transmitan al dfm. Creo que esto podría deberse al hecho de que el cuadro de lista estándarItems
la propiedad es deTStrings
, y desde mi control he publicado mi propia propiedad que también se llamaItems
, pero es deTList
clase. No quiero el estándarItems
propiedad del cuadro de lista para aparecer, pero en mi lugarItems
tipo.
Entonces, aunque puedo soltar mi control en un formulario en el momento designado, edite elItems
con mi propio editor de propiedades, si ejecuto la aplicación, los cuadros de lista están vacíos, si veo el DFM en el momento designado y luego vuelvo a la vista de formulario, los elementos también desaparecieron, básicamente no se almacenaron en el DFM y no estoy seguro de cómo para corregir esto?
Los extractos relevantes del código se ven así (comentarios agregados para el propósito de esta pregunta):
Mi propio tipo de elemento de cuadro de lista:
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;
El control personalizado:
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;
Ese es el control en su forma más simple. Todo lo que quiero hacer con el control, como el dibujo personalizado y el editor de propiedades para miItems
propiedad, etc. está funcionando como quiero.
Pregunta
¿Qué necesito hacer para hacerFItems
propiedad transferible a la DFM? El DFM debe mostrar cada uno de mis propios tipos de elementos de cuadro de lista enItems
.
Gracias.