<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GSaraiva&#039;s Projects &#187; TChainedList</title>
	<atom:link href="http://projects.pro.br/gsaraiva/tag/tchainedlist/feed/" rel="self" type="application/rss+xml" />
	<link>http://projects.pro.br/gsaraiva</link>
	<description>Step by step</description>
	<lastBuildDate>Tue, 01 Sep 2009 13:14:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Delphi: Chained List</title>
		<link>http://projects.pro.br/gsaraiva/2009/06/delphi-chained-list/</link>
		<comments>http://projects.pro.br/gsaraiva/2009/06/delphi-chained-list/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 13:54:10 +0000</pubDate>
		<dc:creator>Gilberto Saraiva</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[Chain List]]></category>
		<category><![CDATA[Chained list]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[TChainedList]]></category>

		<guid isPermaLink="false">http://gsaraiva.projects.pro.br/?p=418</guid>
		<description><![CDATA[Folks,
Some times when we need to hold stripped informations, like socket or audio buffers, we need to create a chained list that control all the information sequentially and provide a navigation on the holded data only by stepping forward(next) or stepping back(prior).
A structure of a Chained List is divided on 2 main variables: Data and [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Folks,</strong></p>
<p>Some times when we need to hold stripped informations, like socket or audio buffers, we need to create a chained list that control all the information sequentially and provide a navigation on the holded data only by stepping forward(next) or stepping back(prior).</p>
<p>A structure of a Chained List is divided on 2 main variables: Data and Next(or Prior, as needed), for every Item on the Chain you have the Data(Pointer, value or someting you have to hold) and a reference for the next or prior item on the list. Chained list don&#8217;t provide a direct access for items, so you can&#8217;t access a item without navigate on others. Chained Lists can be improved, but the main goal is provide a near infinite list that have the best performance of all others techniques.</p>
<p>As you know now, Chained lists don&#8217;t hold indexs for items (don&#8217;t have a direct access) and that avoid re-index procedures that consume a big time when you&#8217;ve a large list. When you need to remove a item in a Chained list that have a predecessor and a antecessor, you&#8217;ll have to make the first improvement on the chain structure to hold the Prior and the Next item for each Item you have, and thats provide you a confortable way to manipulate items without writing a lot of code and variables.</p>
<p><a href="http://gsaraiva.projects.pro.br/?p=417">A basic structure of a Chained List on Delphi</a></p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Delphi"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">uses</span> ChainedListCtrl<span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">type</span></li><li>&nbsp;&nbsp;TfrmMain <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">class</span><span style="color: #000066;">&#40;</span>TForm<span style="color: #000066;">&#41;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;edtWord<span style="color: #000066;">:</span> TEdit<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;btnAdd<span style="color: #000066;">:</span> TButton<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;lblPhrase<span style="color: #000066;">:</span> TLabel<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;btnClean<span style="color: #000066;">:</span> TButton<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">procedure</span> FormCreate<span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">procedure</span> FormDestroy<span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">procedure</span> btnAddClick<span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">procedure</span> btnCleanClick<span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">private</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; font-style: italic;">{ Private declarations }</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Phrase<span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">procedure</span> UpdateList<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">var</span></li><li>&nbsp;&nbsp;frmMain<span style="color: #000066;">:</span> TfrmMain<span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">implementation</span></li><li>&nbsp;</li><li><span style="color: #008000; font-style: italic;">{$R *.dfm}</span></li><li>&nbsp;</li><li><span style="color: #808080; font-style: italic;">{ Note: Create the Chain List Control Object</span></li><li><span style="color: #808080; font-style: italic;">}</span></li><li><span style="color: #000000; font-weight: bold;">procedure</span> TfrmMain<span style="color: #000066;">.</span><span style="color: #006600;">FormCreate</span><span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;Phrase <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #808080; font-style: italic;">{ Note: Destroy the Chain Object</span></li><li><span style="color: #808080; font-style: italic;">}</span></li><li><span style="color: #000000; font-weight: bold;">procedure</span> TfrmMain<span style="color: #000066;">.</span><span style="color: #006600;">FormDestroy</span><span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;Phrase<span style="color: #000066;">.</span><span style="color: #006600;">Free</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #808080; font-style: italic;">{ Note: Update the Label to hold all the words</span></li><li><span style="color: #808080; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; included on the Chained list</span></li><li><span style="color: #808080; font-style: italic;">}</span></li><li><span style="color: #000000; font-weight: bold;">procedure</span> TfrmMain<span style="color: #000066;">.</span><span style="color: #006600;">UpdateList</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">var</span></li><li>&nbsp;&nbsp;sPhrase<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;sPhrase <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;Phrase<span style="color: #000066;">.</span><span style="color: #006600;">First</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">while</span> Phrase<span style="color: #000066;">.</span><span style="color: #006600;">Current</span> &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">do</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">if</span> sPhrase &lt;&gt; <span style="color: #ff0000;">''</span> <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sPhrase <span style="color: #000066;">:</span><span style="color: #000066;">=</span> sPhrase <span style="color: #000066;">+</span> <span style="color: #ff0000;">' '</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;sPhrase <span style="color: #000066;">:</span><span style="color: #000066;">=</span> sPhrase <span style="color: #000066;">+</span> <span style="color: #000066; font-weight: bold;">PChar</span><span style="color: #000066;">&#40;</span>Phrase<span style="color: #000066;">.</span><span style="color: #006600;">Current</span><span style="color: #000066;">^</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Phrase<span style="color: #000066;">.</span><span style="color: #006600;">Next</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;lblPhrase<span style="color: #000066;">.</span><span style="color: #006600;">Caption</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> sPhrase<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #808080; font-style: italic;">{ Note: Add the text on the Chain</span></li><li><span style="color: #808080; font-style: italic;">&nbsp;&nbsp;&nbsp;p.s: StrNew create a copy of the string that will be managed</span></li><li><span style="color: #808080; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out of the garbage collector(str refcount structure)</span></li><li><span style="color: #808080; font-style: italic;">}</span></li><li><span style="color: #000000; font-weight: bold;">procedure</span> TfrmMain<span style="color: #000066;">.</span><span style="color: #006600;">btnAddClick</span><span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;Phrase<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">.</span><span style="color: #006600;">Current</span><span style="color: #000066;">^</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">StrNew</span><span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">PChar</span><span style="color: #000066;">&#40;</span>edtWord<span style="color: #000066;">.</span><span style="color: #006600;">Text</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;UpdateList<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #808080; font-style: italic;">{ Note: Clean the Chain list</span></li><li><span style="color: #808080; font-style: italic;">&nbsp;&nbsp;&nbsp;p.s: StrDispose release the memory of the create string</span></li><li><span style="color: #808080; font-style: italic;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to avoid memory leaks</span></li><li><span style="color: #808080; font-style: italic;">}</span></li><li><span style="color: #000000; font-weight: bold;">procedure</span> TfrmMain<span style="color: #000066;">.</span><span style="color: #006600;">btnCleanClick</span><span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;Phrase<span style="color: #000066;">.</span><span style="color: #006600;">Last</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">while</span> Phrase<span style="color: #000066;">.</span><span style="color: #006600;">Current</span> &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">do</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Phrase<span style="color: #000066;">.</span><span style="color: #006600;">Remove</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">@</span><span style="color: #000066;">StrDispose</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;UpdateList<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>I wrote some comments on the code to refers the goals of each method, but some things have to be said:<br />
  <strong>1st.</strong> Many improviments can be done on a Chained List, but some times a improvement can be bad to the performance result so keep it on the mind when you change some thing.<br />
  <strong>2nd.</strong> Chained List as the name says, chained, so don&#8217;t try to put a index control on it because can be a big mistake.<br />
  <strong>3rd.</strong> Use it when you need a great performance, not when you only need to hold some common data. A Indexed List control will be better and easy to manipulate then a Chained List.</p>
<p>Feel free to use and ask some thing.</p>
<p>Hugs for all</p>
]]></content:encoded>
			<wfw:commentRss>http://projects.pro.br/gsaraiva/2009/06/delphi-chained-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi: Utils :: TChainedList</title>
		<link>http://projects.pro.br/gsaraiva/2009/06/delphi-utils-tchainedlist/</link>
		<comments>http://projects.pro.br/gsaraiva/2009/06/delphi-utils-tchainedlist/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 13:54:08 +0000</pubDate>
		<dc:creator>Gilberto Saraiva</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[Chain List]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[TChainedList]]></category>
		<category><![CDATA[Usefull functions]]></category>

		<guid isPermaLink="false">http://gsaraiva.projects.pro.br/?p=417</guid>
		<description><![CDATA[Folks,
For everybody thats use a lot Chained lists on your projects:
uses SysUtils;&#160;type&#160;&#160;PPointer = ^Pointer;&#160;&#160;&#160;TChainedList = class&#160;&#160;private&#160;&#160;&#160;&#160;FFirst&#160;&#160; : Pointer;&#160;&#160;&#160;&#160;FLast&#160;&#160;&#160;&#160;: Pointer;&#160;&#160;&#160;&#160;FCurrent : Pointer;&#160;&#160;&#160;&#160;FCount&#160;&#160; : Integer;&#160;&#160;&#160;&#160;function GetCurrent: PPointer;&#160;&#160;public&#160;&#160;&#160;&#160;constructor Create;&#160;&#160;&#160;&#160;destructor Destroy; override;&#160;&#160;&#160;&#160;&#160;function First : TChainedList;&#160;&#160;&#160;&#160;function Last&#160;&#160;: TChainedList;&#160;&#160;&#160;&#160;function Prior : TChainedList;&#160;&#160;&#160;&#160;function Next&#160;&#160;: TChainedList;&#160;&#160;&#160;&#160;&#160;function Add: TChainedList;&#160;&#160;&#160;&#160;function Remove: TChainedList; overload;&#160;&#160;&#160;&#160;function Remove&#40;AChainedReleaser: Pointer&#41;: TChainedList; overload;&#160;&#160;&#160;&#160;&#160;property Current: PPointer read GetCurrent;&#160;&#160;&#160;&#160;property Count: Integer read FCount;&#160;&#160;end;&#160;implementation&#160;type&#160;&#160;PChainedItem [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Folks,</strong></p>
<p>For everybody thats use a lot Chained lists on your projects:<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Delphi"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">uses</span> SysUtils<span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">type</span></li><li>&nbsp;&nbsp;<span style="color: #000066; font-weight: bold;">PPointer</span> <span style="color: #000066;">=</span> <span style="color: #000066;">^</span>Pointer<span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;TChainedList <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">class</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">private</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FFirst&nbsp;&nbsp; <span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Pointer</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FLast&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Pointer</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Pointer</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FCount&nbsp;&nbsp; <span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> GetCurrent<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">PPointer</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">public</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">constructor</span> Create<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">destructor</span> Destroy<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">override</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> First <span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> Last&nbsp;&nbsp;<span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> Prior <span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> Next&nbsp;&nbsp;<span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> Add<span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> Remove<span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">overload</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">function</span> Remove<span style="color: #000066;">&#40;</span>AChainedReleaser<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Pointer</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">overload</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">property</span> Current<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">PPointer</span> <span style="color: #000066;">read</span> GetCurrent<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">property</span> Count<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span> <span style="color: #000066;">read</span> FCount<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">implementation</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">type</span></li><li>&nbsp;&nbsp;PChainedItem <span style="color: #000066;">=</span> <span style="color: #000066;">^</span>TChainedItem<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;TChainedItem <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">record</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Prior<span style="color: #000066;">,</span> Next<span style="color: #000066;">:</span> PChainedItem<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Data<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Pointer</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #808080; font-style: italic;">{ TChainedList }</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">constructor</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;FCount <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;FFirst <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;FLast <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">destructor</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">Destroy</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;First<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">while</span> Current &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">do</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Remove<span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">inherited</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">function</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">GetCurrent</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">PPointer</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">if</span> FCurrent &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">@</span>PChainedItem<span style="color: #000066;">&#40;</span>FCurrent<span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">Data</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">else</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">function</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">First</span><span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> FFirst<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">Self</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">function</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">Last</span><span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> FLast<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">Self</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">function</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">Prior</span><span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">if</span> FCurrent &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> PChainedItem<span style="color: #000066;">&#40;</span>FCurrent<span style="color: #000066;">&#41;</span><span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Prior</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">else</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">Self</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">function</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">Next</span><span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">if</span> FCurrent &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> PChainedItem<span style="color: #000066;">&#40;</span>FCurrent<span style="color: #000066;">&#41;</span><span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Next</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">else</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">Self</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">function</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">var</span></li><li>&nbsp;&nbsp;pNew<span style="color: #000066;">:</span> PChainedItem<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;<span style="color: #000066;">New</span><span style="color: #000066;">&#40;</span>pNew<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;pNew<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Prior</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;pNew<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Next</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;pNew<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Data</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">if</span> FFirst <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FFirst <span style="color: #000066;">:</span><span style="color: #000066;">=</span> pNew<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FLast <span style="color: #000066;">:</span><span style="color: #000066;">=</span> pNew<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">end</span> <span style="color: #000000; font-weight: bold;">else</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;pNew<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Prior</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> PChainedItem<span style="color: #000066;">&#40;</span>FLast<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;PChainedItem<span style="color: #000066;">&#40;</span>FLast<span style="color: #000066;">&#41;</span><span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Next</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> pNew<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FLast <span style="color: #000066;">:</span><span style="color: #000066;">=</span> pNew<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> FLast<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">Self</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span>FCount<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">function</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">Remove</span><span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">var</span></li><li>&nbsp;&nbsp;pCur<span style="color: #000066;">:</span> PChainedItem<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;pCur <span style="color: #000066;">:</span><span style="color: #000066;">=</span> FCurrent<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">if</span> pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Data</span> &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">raise</span> Exception<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Current item memory leak detected.'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">if</span> pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Next</span> &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Next</span><span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Prior</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Prior</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">if</span> pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Prior</span> &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Prior</span><span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Next</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Next</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">if</span> pCur <span style="color: #000066;">=</span> FFirst <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FFirst <span style="color: #000066;">:</span><span style="color: #000066;">=</span> pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Next</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> FFirst<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">end</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> pCur <span style="color: #000066;">=</span> FLast <span style="color: #000000; font-weight: bold;">then</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FLast <span style="color: #000066;">:</span><span style="color: #000066;">=</span> pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Prior</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> FLast<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000000; font-weight: bold;">end</span> <span style="color: #000000; font-weight: bold;">else</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;FCurrent <span style="color: #000066;">:</span><span style="color: #000066;">=</span> pCur<span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Next</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">Self</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000066;">Dispose</span><span style="color: #000066;">&#40;</span>pCur<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;<span style="color: #000066;">Dec</span><span style="color: #000066;">&#40;</span>FCount<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">function</span> TChainedList<span style="color: #000066;">.</span><span style="color: #006600;">Remove</span><span style="color: #000066;">&#40;</span>AChainedReleaser<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Pointer</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TChainedList<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">type</span></li><li>&nbsp;&nbsp;TRelease <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">procedure</span><span style="color: #000066;">&#40;</span>APointer<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Pointer</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">var</span></li><li>&nbsp;&nbsp;PdrRelease<span style="color: #000066;">:</span> TRelease<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">begin</span></li><li>&nbsp;&nbsp;<span style="color: #000066;">@</span>PdrRelease <span style="color: #000066;">:</span><span style="color: #000066;">=</span> AChainedReleaser<span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;PdrRelease<span style="color: #000066;">&#40;</span>PChainedItem<span style="color: #000066;">&#40;</span>FCurrent<span style="color: #000066;">&#41;</span><span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Data</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;PChainedItem<span style="color: #000066;">&#40;</span>FCurrent<span style="color: #000066;">&#41;</span><span style="color: #000066;">^</span><span style="color: #000066;">.</span><span style="color: #006600;">Data</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span></li><li>&nbsp;&nbsp;Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> Remove<span style="color: #000066;">;</span></li><li><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>See how to use it here: <a href="http://gsaraiva.projects.pro.br/?p=418">Delphi: Chained List</a></p>
<p>Hugs!</p>
]]></content:encoded>
			<wfw:commentRss>http://projects.pro.br/gsaraiva/2009/06/delphi-utils-tchainedlist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
