[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]