How to replace TListbox Items property with my own published object list based type in a TCustomListBox control?
<p><strong>Overview</strong></p>

<p>This question is a second attempt based on this one I recently asked: <a href="https://stackoverflow.com/questions/37500480/how-can-i-make-a-tlist-property-from-my-custom-control-streamable">How can I make a TList property from my custom control streamable?</a></p>

<p>Although I accepted the answer in that question and it worked, I soon realized that <code>TCollection</code> is not the solution or requirement I was looking for.</p>

<p><strong>Requirements</strong></p>

<p>To keep my requirements as simple and clear to understand as possible, this is what I am attempting to:</p>

<ul>
<li>Derive a new custom control based on <code>TCustomListBox</code></li>
<li>Replace the <code>Items</code> property with my own <code>Items</code> type, eg a <code>TList</code>.</li>
<li>The <code>TList</code> (Items property) will hold objects, each containing a caption and a image index property etc.</li>
<li>Ownerdraw my listbox and draw its icons and text etc.</li>
<li>Create a property editor to edit the <code>Items</code> at design-time.</li>
</ul>

<p>With that in mind, I know how to create the custom control, I know how to work with <code>TList</code> or even <code>TObjectList</code> for example, I know how to ownerdraw the control and I also know how to create the property editor.</p>

<p><strong>Problem</strong></p>

<p>What I don't know is how to replace the standard listbox <code>Items</code> type with my own? well I kind of do (publishing my own property that shares the same name), only I need to make sure it is fully streamable with the dfm.</p>

<p>I have searched extensively on this subject and have tried studying code where <code>TListView</code> and <code>TTreeView</code> etc publishes its <code>Items</code> type but I have found myself more confused than ever.</p>

<p>In fact I came across this very old question asked by someone else on a different website which asks very much what I want to do: <a href="https://www.experts-exchange.com/questions/20654155/Streaming-a-TList-property-of-a-component-to-a-dfm.html" rel="nofollow noreferrer">Streaming a TList property of a component to a dfm</a>. I have quoted it below in the event the link is lost:</p>

<blockquote>
  <p>I recently wrote a component that publishes a TList property.  I then created a property editor for the TList to enable design-time editing. The problem is that the TList doesn't stream to the dfm file, so all changes are lost when the project is closed. I assume this is because TList inherits from TObject and not from TPersistant. I was hoping there was an easy work around for this situation (or that I have misunderstood the problem to begin with). Right now all I can come up with is to switch to a TCollection or override the DefineProperties method. Is there any other way to get the information in the TList streamed to and from the dfm?</p>
</blockquote>

<p>I came across that whilst searching keywords such as <code>DefineProperties()</code> given that this was an alternative option Remy Lebeau briefly touched upon in the previous question linked at the top, it also seemed to be the answer to that question.</p>

<p><strong>Question</strong></p>

<p>I need to know how to replace the <code>Items (TStrings)</code> property of a <code>TCustomListBox</code> derived control with my own <code>Items (TList)</code> or <code>Items (TObjectList)</code> etc type but make it fully streamable with the dfm. I know from previous comments <code>TList</code> is not streamable but I cannot use <code>TStrings</code> like the standard <code>TListBox</code> control does, I need to use my own object based list that is streamable.</p>

<p>I don't want to use <code>TCollection</code>, <code>DefineProperties</code> sounds promising but I don't know how exactly I would implement this?</p>

<p>I would greatly appreciate some help with this please.</p>

<p>Thank you.</p>