<br><font size=2 face="sans-serif">Gabor,</font>
<br>
<br><font size=2 face="sans-serif">Thanks for responding. You gave a very lucid and helpful answer.</font>
<br>
<br><font size=2 face="sans-serif">> Although TCollection is implemented as an object, there is nothing<br>
> very OOP in the way you need to use it. You can think about it as<br>
> an 'array of pointer' with an indeterminate number of elements,<br>
> plus a bunch of subroutines handling it. Unlike with normal arrays,<br>
> you cannot directly reference to its elements but you have methods<br>
> (functions and subroutines) that provide all this functionality and<br>
> more.</font>
<br>
<br><font size=2 face="sans-serif">I realize that a TCollection is not OOP, in the strictest sense, but it sounded good for a object beginner like me!  :-)</font>
<br>
<br>
<br><font size=2 face="sans-serif">> Let's suppose you have<br>
> var<br>
>    Coll : TCollection<br>
>    CollArray : array [1..MaxCollectionSize] of pointer;</font>
<br>
<br><font size=2 face="sans-serif">This seems to imply a physical limit (MaxCollectionSize) has been defined. Is that correct? In rtl\inc\objects.pp I found the following:</font>
<br>
<br><font size=2 face="sans-serif">  MaxBytes = 128*1024*1024;<br>
  MaxCollectionSize = MaxBytes DIV SizeOf(Pointer);</font>
<br>
<br><font size=2 face="sans-serif">if a Pointer is 4 bytes (just guessing) then the upper limit of a TCollection using MaxCollectionSize would be about 33,554,432?</font>
<br>
<br>
<br><font size=2 face="sans-serif">> Unlike a simple array, you have to initialize the collection:<br>
>    new (Coll);<br>
>    Coll.Init (Limit, Delta);</font>
<br>
<br><font size=2 face="sans-serif">This makes sense. But what is the Limit and Delta for?</font>
<br>
<br>
<br><font size=2 face="sans-serif">> To put something into the collection at a given location, use<br>
>   Coll.AtPut (Index, ItemPointer)</font>
<br>
<br><font size=2 face="sans-serif">So this would be the pointer to the "record" itself? For example, suppose I've defined the following:</font>
<br>
<br><font size=2 face="sans-serif">const<br>
  MAX_LINES = ???;      // if there's no "limit" what should this be?</font>
<br>
<br><font size=2 face="sans-serif">type<br>
  DataRecord  = packed object<br>
                private<br>
                  Data    : string;<br>
                  Display : boolean;<br>
                  Actual  : longint;<br>
                  Color   : byte;<br>
                end;<br>
var<br>
  Index        : longint;<br>
  DataFromFile : array [0..MAX_LINES] of ^DataRecord;</font>
<br>
<br><font size=2 face="sans-serif">With an array I can assign values like this:</font>
<br>
<br><font size=2 face="sans-serif">DataFromFile [Index]^.Data    := 'Some data';<br>
DataFromFile [Index]^.Display := TRUE;<br>
DataFromFile [Index]^.Actual  := Index;<br>
DataFromFile [Index]^.Color   := 23;</font>
<br>
<br><font size=2 face="sans-serif">But using 'Coll.AtPut (Index, ItemPointer)' how can I assign values to the different "elements" in the DataRecord structure? Would it be something like:</font>
<br>
<br><font size=2 face="sans-serif">Coll.AtPut (Index,ItemPointer.Data);<br>
Coll.AtPut (Index,ItemPointer.Display);<br>
Coll.AtPut (Index,ItemPointer.Actual);<br>
Coll.AtPut (Index,ItemPointer.Color);</font>
<br>
<br><font size=2 face="sans-serif">BTW; I can easily redo that DataRecord structure if needed. While the 4 pieces of information are essential I'm certainly not adverse to trying something different their.</font>
<br>
<br>
<br><font size=2 face="sans-serif">> To read from a given location, use<br>
>    ItemPointer := Coll.At (Index),</font>
<br>
<br><font size=2 face="sans-serif">I guess if I can comprehend how to store values I can just reverse the logic to read them back?</font>
<br>
<br>
<br><font size=2 face="sans-serif">> And, unlike with the array, you have to dispose of the collection<br>
> at the end with</font>
<br>
<br><font size=2 face="sans-serif">>   Coll.Done;<br>
>   dispose (Coll);</font>
<br>
<br><font size=2 face="sans-serif">Yes, this I will do.</font>
<br>
<br>
<br><font size=2 face="sans-serif">> Actually, the collection gives you more than that. There is<br>
> Coll.Insert which keeps track of the items put into the collection<br>
> and places the new item directly at the end; thus, if you want to<br>
> place item after item into the collection, you don't have to keep<br>
> track of the indexes, just call Insert repeatedly. Or there is<br>
> AtInsert which inserts your new item at the position you specify,<br>
> not overwriting what is already there but making room for it,<br>
> shifting every item behind that by one position. Or if you have a<br>
> pointer to an item, you can learn which index it has by calling<br>
> Coll.IndexOf.</font>
<br>
<br><font size=2 face="sans-serif">This all sounds like what I would like to do, so I guess a TCollection is indeed what I need.</font>
<br>
<br>
<br><font size=2 face="sans-serif">> For a description of all methods, visit Units.pdf. You'll also find<br>
> examples there.</font>
<br>
<br><font size=2 face="sans-serif">I've done that a few times now, but unfortunately I was having a bit of a rough time figuring it all out. I'm going to read it again though, if for no other reason then to see how many more times it takes before I fully understand it.  :-)</font>
<br>
<br><font size=2 face="sans-serif">Thanks again.</font>
<br>
<br><font size=2 face="sans-serif">Jim</font>