[Back to STREAMS SWAG index] [Back to Main SWAG index] [Original]

    {
    > I need to find exactly how many entries are in the stream, to do random
    > access.  To find this, I was using TBufStream.GetSize to find the total
    > size.  Then, I was dividing by the size of each object to find how many
    > there are.

    > Is there another way to find how many entries are in a stream?
    > Something like TCollection.Count?

    Actually there is _no_ way of determining how many objects are stored in a
    stream -- I suggest you either

            1)  Store the number in a header at the start
                of the file, or

            2)  Maintain an index for the stream.

    An index would just be a stream with lots of Longints.  Each entry would be
    an offset into the other stream.

    To read object # 100 from the data stream, read a Longint at position #
    (100 * SizeOf(Longint)) from the index stream.  Use this Longint with Seek
    to seek with the data stream.

    Here's a bit of sample code:

    lew.romney@thcave.bbs.no
    }
    var
      Index, Data : TBufStream;

    procedure AddObject (P : PObject);
    var
      Pos : Longint;
    begin
      Pos:=Data.GetSize;

      Data.Seek(Data.GetSize);
      Data.Put(P);

      Index.Seek(Index.GetSize);
      Index.Write(Pos, SizeOf(Pos));
    end;

    function GetObject (Number : Longint) : PObject;
    var
      Pos : Longint;
    begin
      Index.Seek(Number * SizeOf(Longint));
      Index.Read(Pos, SizeOf(Pos));

      Data.Seek(Pos);
      GetObject:=Data.Get;
    end;
    {
    Look up the TResourceFile object in your manuals or the online help.  This
    object lets you maintain a library of objects inside a stream, each object
    "filed" under a unique name.  TResourceFile also stores an index in the
    same stream.
    }

[Back to STREAMS SWAG index] [Back to Main SWAG index] [Original]