mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 03:48:55 +02:00

* provided local copies or required styles since debian does not supply the listings.sty anymore
2531 lines
76 KiB
TeX
2531 lines
76 KiB
TeX
%
|
|
% $Id$
|
|
% This file is part of the FPC documentation.
|
|
% Copyright (C) 1998, by Michael Van Canneyt
|
|
%
|
|
% The FPC documentation is free text; you can redistribute it and/or
|
|
% modify it under the terms of the GNU Library General Public License as
|
|
% published by the Free Software Foundation; either version 2 of the
|
|
% License, or (at your option) any later version.
|
|
%
|
|
% The FPC Documentation is distributed in the hope that it will be useful,
|
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
% Library General Public License for more details.
|
|
%
|
|
% You should have received a copy of the GNU Library General Public
|
|
% License along with the FPC documentation; see the file COPYING.LIB. If not,
|
|
% write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
% Boston, MA 02111-1307, USA.
|
|
%
|
|
\chapter{The Objects unit.}
|
|
\label{ch:objectsunit}
|
|
|
|
\FPCexampledir{objectex}
|
|
This chapter documents the \file{objects} unit. The unit was implemented by
|
|
many people, and was mainly taken from the FreeVision sources. It has been
|
|
ported to all supported platforms.
|
|
|
|
The methods and fields that are in a \var{Private} part of an object
|
|
declaration have been left out of this documentation.
|
|
|
|
\section{Constants}
|
|
The following constants are error codes, returned by the various stream
|
|
objects.
|
|
|
|
\begin{verbatim}
|
|
CONST
|
|
stOk = 0; { No stream error }
|
|
stError = -1; { Access error }
|
|
stInitError = -2; { Initialize error }
|
|
stReadError = -3; { Stream read error }
|
|
stWriteError = -4; { Stream write error }
|
|
stGetError = -5; { Get object error }
|
|
stPutError = -6; { Put object error }
|
|
stSeekError = -7; { Seek error in stream }
|
|
stOpenError = -8; { Error opening stream }
|
|
\end{verbatim}
|
|
These constants can be passed to constructors of file streams:
|
|
\begin{verbatim}
|
|
CONST
|
|
stCreate = $3C00; { Create new file }
|
|
stOpenRead = $3D00; { Read access only }
|
|
stOpenWrite = $3D01; { Write access only }
|
|
stOpen = $3D02; { Read/write access }
|
|
\end{verbatim}
|
|
|
|
The following constants are error codes, returned by the collection list
|
|
objects:
|
|
\begin{verbatim}
|
|
CONST
|
|
coIndexError = -1; { Index out of range }
|
|
coOverflow = -2; { Overflow }
|
|
\end{verbatim}
|
|
|
|
Maximum data sizes (used in determining how many data can be used.
|
|
|
|
\begin{verbatim}
|
|
CONST
|
|
MaxBytes = 128*1024*1024; { Maximum data size }
|
|
MaxWords = MaxBytes DIV SizeOf(Word); { Max word data size }
|
|
MaxPtrs = MaxBytes DIV SizeOf(Pointer); { Max ptr data size }
|
|
MaxCollectionSize = MaxBytes DIV SizeOf(Pointer); { Max collection size }
|
|
\end{verbatim}
|
|
|
|
\section{Types}
|
|
The follwing auxiliary types are defined:
|
|
\begin{verbatim}
|
|
TYPE
|
|
{ Character set }
|
|
TCharSet = SET Of Char;
|
|
PCharSet = ^TCharSet;
|
|
|
|
{ Byte array }
|
|
TByteArray = ARRAY [0..MaxBytes-1] Of Byte;
|
|
PByteArray = ^TByteArray;
|
|
|
|
{ Word array }
|
|
TWordArray = ARRAY [0..MaxWords-1] Of Word;
|
|
PWordArray = ^TWordArray;
|
|
|
|
{ Pointer array }
|
|
TPointerArray = Array [0..MaxPtrs-1] Of Pointer;
|
|
PPointerArray = ^TPointerArray;
|
|
|
|
{ String pointer }
|
|
PString = ^String;
|
|
|
|
{ Filename array }
|
|
AsciiZ = Array [0..255] Of Char;
|
|
|
|
Sw_Word = Cardinal;
|
|
Sw_Integer = LongInt;
|
|
\end{verbatim}
|
|
The following records are used internaly for easy type conversion:
|
|
\begin{verbatim}
|
|
TYPE
|
|
{ Word to bytes}
|
|
WordRec = packed RECORD
|
|
Lo, Hi: Byte;
|
|
END;
|
|
|
|
{ LongInt to words }
|
|
LongRec = packed RECORD
|
|
Lo, Hi: Word;
|
|
END;
|
|
|
|
{ Pointer to words }
|
|
PtrRec = packed RECORD
|
|
Ofs, Seg: Word;
|
|
END;
|
|
\end{verbatim}
|
|
|
|
The following record is used when streaming objects:
|
|
|
|
\begin{verbatim}
|
|
TYPE
|
|
PStreamRec = ^TStreamRec;
|
|
TStreamRec = Packed RECORD
|
|
ObjType: Sw_Word;
|
|
VmtLink: pointer;
|
|
Load : Pointer;
|
|
Store: Pointer;
|
|
Next : PStreamRec;
|
|
END;
|
|
\end{verbatim}
|
|
|
|
The \var{TPoint} basic object is used in the \var{TRect} object (see
|
|
\sees{TRect}):
|
|
\begin{verbatim}
|
|
TYPE
|
|
PPoint = ^TPoint;
|
|
TPoint = OBJECT
|
|
X, Y: Sw_Integer;
|
|
END;
|
|
\end{verbatim}
|
|
|
|
\section{Procedures and Functions}
|
|
|
|
\begin{function}{NewStr}
|
|
\Declaration
|
|
Function NewStr (Const S: String): PString;
|
|
\Description
|
|
\var{NewStr} makes a copy of the string \var{S} on the heap,
|
|
and returns a pointer to this copy.
|
|
|
|
The allocated memory is not based on the declared size of the string passed
|
|
to \var{NewStr}, but is baed on the actual length of the string.
|
|
\Errors
|
|
If not enough memory is available, an 'out of memory' error will occur.
|
|
\SeeAlso
|
|
\seep{DisposeStr}
|
|
\end{function}
|
|
|
|
\FPCexample{ex40}
|
|
|
|
\begin{procedure}{DisposeStr}
|
|
\Declaration
|
|
Procedure DisposeStr (P: PString);
|
|
\Description
|
|
\var{DisposeStr} removes a dynamically allocated string from the heap.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seef{NewStr}
|
|
\end{procedure}
|
|
|
|
For an example, see \seef{NewStr}.
|
|
|
|
\begin{procedure}{Abstract}
|
|
\Declaration
|
|
Procedure Abstract;
|
|
\Description
|
|
When implementing abstract methods, do not declare them as \var{abstract}.
|
|
Instead, define them simply as \var{virtual}. In the implementation of such
|
|
abstract methods, call the \var{Abstract} procedure. This allows explicit
|
|
control of what happens when an abstract method is called.
|
|
|
|
The current implementation of \var{Abstract} terminates the program with
|
|
a run-time error 211.
|
|
\Errors
|
|
None.
|
|
\SeeAlso Most abstract types.
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{RegisterObjects}
|
|
\Declaration
|
|
Procedure RegisterObjects;
|
|
\Description
|
|
\var{RegisterObjects} registers the following objects for streaming:
|
|
\begin{enumerate}
|
|
\item \var{TCollection}, see \sees{TCollection}.
|
|
\item \var{TStringCollection}, see \sees{TStringCollection}.
|
|
\item \var{TStrCollection}, see \sees{TStrCollection}.
|
|
\end{enumerate}
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seep{RegisterType}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{RegisterType}
|
|
\Declaration
|
|
Procedure RegisterType (Var S: TStreamRec);
|
|
\Description
|
|
\var{RegisterType} registers a new type for streaming. An object cannot
|
|
be streamed unless it has been registered first.
|
|
The stream record \var{S} needs to have the following fields set:
|
|
|
|
\begin{description}
|
|
\item[ObjType: Sw\_Word] This should be a unique identifier. Each possible
|
|
type should have it's own identifier.
|
|
\item[VmtLink: pointer] This should contain a pointer to the VMT (Virtual
|
|
Method Table) of the object you try to register. You can get it with the
|
|
following expression:
|
|
\begin{verbatim}
|
|
VmtLink: Ofs(TypeOf(MyType)^);
|
|
\end{verbatim}
|
|
\item[Load : Pointer] is a pointer to a method that initializes an instance
|
|
of that object, and reads the initial values from a stream. This method
|
|
should accept as it's sole argument a \var{PStream} type variable.
|
|
\item[Store: Pointer]is a pointer to a method that stores an instance of the
|
|
object to a stream. This method should accept as it's sole argument
|
|
a \var{PStream} type variable.
|
|
\end{description}
|
|
\Errors
|
|
In case of error (if a object with the same \var{ObjType}) is already
|
|
registered), run-time error 212 occurs.
|
|
\end{procedure}
|
|
|
|
\FPCexample{myobject}
|
|
|
|
\begin{function}{LongMul}
|
|
\Declaration
|
|
Function LongMul (X, Y: Integer): LongInt;
|
|
\Description
|
|
\var{LongMul} multiplies \var{X} with \var{Y}. The result is of
|
|
type \var{Longint}. This avoids possible overflow errors you would normally
|
|
get when multiplying \var{X} and \var{Y} that are too big.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seef{LongDiv}
|
|
\end{function}
|
|
|
|
\begin{function}{LongDiv}
|
|
\Declaration
|
|
Function LongDiv (X: Longint; Y: Integer): Integer;
|
|
\Description
|
|
\var{LongDiv} divides \var{X} by \var{Y}. The result is of
|
|
type \var{Integer} instead of type \var{Longint}, as you would get
|
|
normally.
|
|
\Errors
|
|
If Y is zero, a run-time error will be generated.
|
|
\SeeAlso
|
|
\seef{LongMul}
|
|
\end{function}
|
|
|
|
\section{TRect}
|
|
\label{se:TRect}
|
|
|
|
The \var{TRect} object is declared as follows:
|
|
\begin{verbatim}
|
|
TRect = OBJECT
|
|
A, B: TPoint;
|
|
FUNCTION Empty: Boolean;
|
|
FUNCTION Equals (R: TRect): Boolean;
|
|
FUNCTION Contains (P: TPoint): Boolean;
|
|
PROCEDURE Copy (R: TRect);
|
|
PROCEDURE Union (R: TRect);
|
|
PROCEDURE Intersect (R: TRect);
|
|
PROCEDURE Move (ADX, ADY: Sw_Integer);
|
|
PROCEDURE Grow (ADX, ADY: Sw_Integer);
|
|
PROCEDURE Assign (XA, YA, XB, YB: Sw_Integer);
|
|
END;
|
|
\end{verbatim}
|
|
|
|
\begin{function}{TRect.Empty}
|
|
\Declaration
|
|
Function TRect.Empty: Boolean;
|
|
\Description
|
|
\var{Empty} returns \var{True} if the rectangle defined by the corner points
|
|
\var{A}, \var{B} has zero or negative surface.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seef{TRect.Equals}, \seef{TRect.Contains}
|
|
\end{function}
|
|
|
|
\FPCexample{ex1}
|
|
|
|
\begin{function}{TRect.Equals}
|
|
\Declaration
|
|
Function TRect.Equals (R: TRect): Boolean;
|
|
\Description
|
|
\var{Equals} returns \var{True} if the rectangle has the
|
|
same corner points \var{A,B} as the rectangle R, and \var{False}
|
|
otherwise.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seefl{Empty}{TRect.Empty}, \seefl{Contains}{TRect.Contains}
|
|
\end{function}
|
|
|
|
For an example, see \seef{TRect.Empty}
|
|
|
|
\begin{function}{TRect.Contains}
|
|
\Declaration
|
|
Function TRect.Contains (P: TPoint): Boolean;
|
|
\Description
|
|
\var{Contains} returns \var{True} if the point \var{P} is contained
|
|
in the rectangle (including borders), \var{False} otherwise.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Intersect}{TRect.Intersect}, \seefl{Equals}{TRect.Equals}
|
|
\end{function}
|
|
|
|
\begin{procedure}{TRect.Copy}
|
|
\Declaration
|
|
Procedure TRect.Copy (R: TRect);
|
|
\Description
|
|
Assigns the rectangle R to the object. After the call to \var{Copy}, the
|
|
rectangle R has been copied to the object that invoked \var{Copy}.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Assign}{TRect.Assign}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex2}
|
|
|
|
\begin{procedure}{TRect.Union}
|
|
\Declaration
|
|
Procedure TRect.Union (R: TRect);
|
|
\Description
|
|
\var{Union} enlarges the current rectangle so that it becomes the union
|
|
of the current rectangle with the rectangle \var{R}.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Intersect}{TRect.Intersect}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex3}
|
|
|
|
\begin{procedure}{TRect.Intersect}
|
|
\Declaration
|
|
Procedure TRect.Intersect (R: TRect);
|
|
\Description
|
|
\var{Intersect} makes the intersection of the current rectangle with
|
|
\var{R}. If the intersection is empty, then the rectangle is set to the empty
|
|
rectangle at coordinate (0,0).
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Union}{TRect.Union}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex4}
|
|
|
|
\begin{procedure}{TRect.Move}
|
|
\Declaration
|
|
Procedure TRect.Move (ADX, ADY: Sw\_Integer);
|
|
\Description
|
|
\var{Move} moves the current rectangle along a vector with components
|
|
\var{(ADX,ADY)}. It adds \var{ADX} to the X-coordinate of both corner
|
|
points, and \var{ADY} to both end points.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Grow}{TRect.Grow}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex5}
|
|
|
|
\begin{procedure}{TRect.Grow}
|
|
\Declaration
|
|
Procedure TRect.Grow (ADX, ADY: Sw\_Integer);
|
|
\Description
|
|
\var{Grow} expands the rectangle with an amount \var{ADX} in the \var{X}
|
|
direction (both on the left and right side of the rectangle, thus adding a
|
|
length 2*ADX to the width of the rectangle), and an amount \var{ADY} in
|
|
the \var{Y} direction (both on the top and the bottom side of the rectangle,
|
|
adding a length 2*ADY to the height of the rectangle.
|
|
|
|
\var{ADX} and \var{ADY} can be negative. If the resulting rectangle is empty, it is set
|
|
to the empty rectangle at \var{(0,0)}.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Move}{TRect.Move}.
|
|
\end{procedure}
|
|
|
|
|
|
\FPCexample{ex6}
|
|
|
|
\begin{procedure}{TRect.Assign}
|
|
\Declaration
|
|
Procedure Trect.Assign (XA, YA, XB, YB: Sw\_Integer);
|
|
\Description
|
|
\var{Assign} sets the corner points of the rectangle to \var{(XA,YA)} and
|
|
\var{(Xb,Yb)}.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Copy}{TRect.Copy}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TRect.Copy}.
|
|
|
|
\section{TObject}
|
|
\label{se:TObject}
|
|
|
|
The full declaration of the \var{TObject} type is:
|
|
\begin{verbatim}
|
|
TYPE
|
|
TObject = OBJECT
|
|
CONSTRUCTOR Init;
|
|
PROCEDURE Free;
|
|
DESTRUCTOR Done;Virtual;
|
|
END;
|
|
PObject = ^TObject;
|
|
\end{verbatim}
|
|
\begin{procedure}{TObject.Init}
|
|
\Declaration
|
|
Constructor TObject.Init;
|
|
\Description
|
|
Instantiates a new object of type \var{TObject}. It fills the instance up
|
|
with Zero bytes.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Free}{TObject.Free}, \seepl{Done}{TObject.Done}
|
|
\end{procedure}
|
|
|
|
For an example, see \seepl{Free}{TObject.Free}
|
|
|
|
\begin{procedure}{TObject.Free}
|
|
\Declaration
|
|
Procedure TObject.Free;
|
|
\Description
|
|
\var{Free} calls the destructor of the object, and releases the memory
|
|
occupied by the instance of the object.
|
|
\Errors
|
|
No checking is performed to see whether \var{self} is \var{nil} and whether
|
|
the object is indeed allocated on the heap.
|
|
\SeeAlso
|
|
\seepl{Init}{TObject.Init}, \seepl{Done}{TObject.Done}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex7}
|
|
|
|
\begin{procedure}{TObject.Done}
|
|
\Declaration
|
|
Destructor TObject.Done;Virtual;
|
|
\Description
|
|
\var{Done}, the destructor of \var{TObject} does nothing. It is mainly
|
|
intended to be used in the \seep{TObject.Free} method.
|
|
|
|
The destructore Done does not free the memory occupied by the object.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Free}{TObject.Free}, \seepl{Init}{TObject.Init}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex8}
|
|
|
|
\section{TStream}
|
|
\label{se:TStream}
|
|
|
|
The \var{TStream} object is the ancestor for all streaming objects, i.e.
|
|
objects that have the capability to store and retrieve data.
|
|
|
|
It defines a number of methods that are common to all objects that implement
|
|
streaming, many of them are virtual, and are only implemented in the
|
|
descendrnt types.
|
|
|
|
Programs should not instantiate objects of type TStream directly, but
|
|
instead instantiate a descendant type, such as \var{TDosStream},
|
|
\var{TMemoryStream}.
|
|
|
|
This is the full declaration of the \var{TStream} object:
|
|
\begin{verbatim}
|
|
TYPE
|
|
TStream = OBJECT (TObject)
|
|
Status : Integer; { Stream status }
|
|
ErrorInfo : Integer; { Stream error info }
|
|
StreamSize: LongInt; { Stream current size }
|
|
Position : LongInt; { Current position }
|
|
FUNCTION Get: PObject;
|
|
FUNCTION StrRead: PChar;
|
|
FUNCTION GetPos: Longint; Virtual;
|
|
FUNCTION GetSize: Longint; Virtual;
|
|
FUNCTION ReadStr: PString;
|
|
PROCEDURE Open (OpenMode: Word); Virtual;
|
|
PROCEDURE Close; Virtual;
|
|
PROCEDURE Reset;
|
|
PROCEDURE Flush; Virtual;
|
|
PROCEDURE Truncate; Virtual;
|
|
PROCEDURE Put (P: PObject);
|
|
PROCEDURE StrWrite (P: PChar);
|
|
PROCEDURE WriteStr (P: PString);
|
|
PROCEDURE Seek (Pos: LongInt); Virtual;
|
|
PROCEDURE Error (Code, Info: Integer); Virtual;
|
|
PROCEDURE Read (Var Buf; Count: Sw_Word); Virtual;
|
|
PROCEDURE Write (Var Buf; Count: Sw_Word); Virtual;
|
|
PROCEDURE CopyFrom (Var S: TStream; Count: Longint);
|
|
END;
|
|
PStream = ^TStream;
|
|
\end{verbatim}
|
|
|
|
\begin{function}{TStream.Get}
|
|
\Declaration
|
|
Function TStream.Get : PObject;
|
|
\Description
|
|
\var{Get} reads an object definition from a stream, and returns
|
|
a pointer to an instance of this object.
|
|
\Errors
|
|
On error, \var{TStream.Status} is set, and NIL is returned.
|
|
\SeeAlso
|
|
\seepl{Put}{TStream.Put}
|
|
\end{function}
|
|
|
|
\FPCexample{ex9}
|
|
|
|
\begin{function}{TStream.StrRead}
|
|
\Declaration
|
|
Function TStream.StrRead: PChar;
|
|
\Description
|
|
\var{StrRead} reads a string from the stream, allocates memory
|
|
for it, and returns a pointer to a null-terminated copy of the string
|
|
on the heap.
|
|
\Errors
|
|
On error, \var{Nil} is returned.
|
|
\SeeAlso
|
|
\seepl{StrWrite}{TStream.StrWrite}, \seefl{ReadStr}{TStream.ReadStr}
|
|
\end{function}
|
|
|
|
\FPCexample{ex10}
|
|
|
|
|
|
\begin{function}{TStream.GetPos}
|
|
\Declaration
|
|
TSTream.GetPos : Longint; Virtual;
|
|
\Description
|
|
If the stream's status is \var{stOk}, \var{GetPos} returns the current
|
|
position in the stream. Otherwise it returns \var{-1}
|
|
\Errors
|
|
\var{-1} is returned if the status is an error condition.
|
|
\SeeAlso
|
|
\seepl{Seek}{TStream.Seek}, \seefl{GetSize}{TStream.GetSize}
|
|
\end{function}
|
|
|
|
\FPCexample{ex11}
|
|
|
|
|
|
\begin{function}{TStream.GetSize}
|
|
\Declaration
|
|
Function TStream.GetSize: Longint; Virtual;
|
|
\Description
|
|
If the stream's status is \var{stOk} then \var{GetSize} returns
|
|
the size of the stream, otherwise it returns \var{-1}.
|
|
\Errors
|
|
\var{-1} is returned if the status is an error condition.
|
|
\SeeAlso
|
|
\seepl{Seek}{TStream.Seek}, \seefl{GetPos}{TStream.GetPos}
|
|
\end{function}
|
|
|
|
\FPCexample{ex12}
|
|
|
|
|
|
\begin{function}{TStream.ReadStr}
|
|
\Declaration
|
|
Function TStream.ReadStr: PString;
|
|
\Description
|
|
\var{ReadStr} reads a string from the stream, copies it to the heap
|
|
and returns a pointer to this copy. The string is saved as a pascal
|
|
string, and hence is NOT null terminated.
|
|
\Errors
|
|
On error (e.g. not enough memory), \var{Nil} is returned.
|
|
\SeeAlso
|
|
\seefl{StrRead}{TStream.StrRead}
|
|
\end{function}
|
|
|
|
\FPCexample{ex13}
|
|
|
|
|
|
\begin{procedure}{TStream.Open}
|
|
\Declaration
|
|
Procedure TStream.Open (OpenMode: Word); Virtual;
|
|
\Description
|
|
\var{Open} is an abstract method, that should be overridden by descendent
|
|
objects. Since opening a stream depends on the stream's type this is not
|
|
surprising.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Close}{TStream.Close}, \seepl{Reset}{TStream.Reset}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TDosStream.Open}.
|
|
|
|
\begin{procedure}{TStream.Close}
|
|
\Declaration
|
|
Procedure TStream.Close; Virtual;
|
|
\Description
|
|
\var{Close} is an abstract method, that should be overridden by descendent
|
|
objects. Since Closing a stream depends on the stream's type this is not
|
|
surprising.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Open}{TStream.Open}, \seepl{Reset}{TStream.Reset}
|
|
\end{procedure}
|
|
|
|
for an example, see \seep{TDosStream.Open}.
|
|
|
|
\begin{procedure}{TStream.Reset}
|
|
\Declaration
|
|
PROCEDURE TStream.Reset;
|
|
\Description
|
|
\var{Reset} sets the stream's status to \var{0}, as well as the ErrorInfo
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Open}{TStream.Open}, \seepl{Close}{TStream.Close}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TStream.Flush}
|
|
\Declaration
|
|
Procedure TStream.Flush; Virtual;
|
|
\Description
|
|
\var{Flush} is an abstract method that should be overridden by descendent
|
|
objects. It serves to enable the programmer to tell streams that implement
|
|
a buffer to clear the buffer.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Truncate}{TStream.Truncate}
|
|
\end{procedure}
|
|
|
|
for an example, see \seep{TBufStream.Flush}.
|
|
|
|
\begin{procedure}{TStream.Truncate}
|
|
\Declaration
|
|
Procedure TStream.Truncate; Virtual;
|
|
\Description
|
|
\var{Truncate} is an abstract procedure that should be overridden by
|
|
descendent objects. It serves to enable the programmer to truncate the
|
|
size of the stream to the current file position.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Seek}{TStream.Seek}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TDosStream.Truncate}.
|
|
|
|
\begin{procedure}{TStream.Put}
|
|
\Declaration
|
|
Procedure TStream.Put (P: PObject);
|
|
\Description
|
|
\var{Put} writes the object pointed to by \var{P}. \var{P} should be
|
|
non-nil. The object type must have been registered with \seep{RegisterType}.
|
|
|
|
After the object has been written, it can be read again with \seefl{Get}{TStream.Get}.
|
|
\Errors
|
|
No check is done whether P is \var{Nil} or not. Passing \var{Nil} will cause
|
|
a run-time error 216 to be generated. If the object has not been registered,
|
|
the status of the stream will be set to \var{stPutError}.
|
|
\SeeAlso
|
|
\seefl{Get}{TStream.Get}
|
|
\end{procedure}
|
|
|
|
For an example, see \seef{TStream.Get};
|
|
|
|
\begin{procedure}{TStream.StrWrite}
|
|
\Declaration
|
|
Procedure TStream.StrWrite (P: PChar);
|
|
\Description
|
|
\var{StrWrite} writes the null-terminated string \var{P} to the stream.
|
|
\var{P} can only be 65355 bytes long.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{WriteStr}{TStream.WriteStr}, \seefl{StrRead}{TStream.StrRead},
|
|
\seefl{ReadStr}{TStream.ReadStr}
|
|
\end{procedure}
|
|
|
|
For an example, see \seef{TStream.StrRead}.
|
|
|
|
\begin{procedure}{TStream.WriteStr}
|
|
\Declaration
|
|
Procedure TStream.WriteStr (P: PString);
|
|
\Description
|
|
\var{StrWrite} writes the pascal string pointed to by \var{P} to the stream.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{StrWrite}{TStream.StrWrite}, \seefl{StrRead}{TStream.StrRead},
|
|
\seefl{ReadStr}{TStream.ReadStr}
|
|
\end{procedure}
|
|
|
|
For an example, see \seef{TStream.ReadStr}.
|
|
|
|
\begin{procedure}{TStream.Seek}
|
|
\Declaration
|
|
PROCEDURE TStream.Seek (Pos: LongInt); Virtual;
|
|
\Description
|
|
Seek sets the position to \var{Pos}. This position is counted
|
|
from the beginning, and is zero based. (i.e. seeek(0) sets the position
|
|
pointer on the first byte of the stream)
|
|
\Errors
|
|
If \var{Pos} is larger than the stream size, \var{Status} is set to
|
|
\var{StSeekError}.
|
|
\SeeAlso
|
|
\seefl{GetPos}{TStream.GetPos}, \seefl{GetSize}{TStream.GetSize}
|
|
\end{procedure}
|
|
|
|
|
|
For an example, see \seep{TDosStream.Seek}.
|
|
|
|
\begin{procedure}{TStream.Error}
|
|
\Declaration
|
|
Procedure TStream.Error (Code, Info: Integer); Virtual;
|
|
\Description
|
|
\var{Error} sets the stream's status to \var{Code} and \var{ErrorInfo}
|
|
to \var{Info}. If the \var{StreamError} procedural variable is set,
|
|
\var{Error} executes it, passing \var{Self} as an argument.
|
|
|
|
This method should not be called directly from a program. It is intended to
|
|
be used in descendent objects.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TStream.Read}
|
|
\Declaration
|
|
Procedure TStream.Read (Var Buf; Count: Sw\_Word); Virtual;
|
|
\Description
|
|
\var{Read} is an abstract method that should be overridden by descendent
|
|
objects.
|
|
|
|
\var{Read} reads \var{Count} bytes from the stream into \var{Buf}.
|
|
It updates the position pointer, increasing it's value with \var{Count}.
|
|
\var{Buf} must be large enough to contain \var{Count} bytes.
|
|
\Errors
|
|
No checking is done to see if \var{Buf} is large enough to contain
|
|
\var{Count} bytes.
|
|
\SeeAlso
|
|
\seepl{Write}{TStream.Write}, \seefl{ReadStr}{TStream.ReadStr},
|
|
\seefl{StrRead}{TStream.StrRead}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex18}
|
|
|
|
|
|
\begin{procedure}{TStream.Write}
|
|
\Declaration
|
|
Procedure TStream.Write (Var Buf; Count: Sw\_Word); Virtual;
|
|
\Description
|
|
\var{Write} is an abstract method that should be overridden by descendent
|
|
objects.
|
|
|
|
\var{Write} writes \var{Count} bytes to the stream from \var{Buf}.
|
|
It updates the position pointer, increasing it's value with \var{Count}.
|
|
\Errors
|
|
No checking is done to see if \var{Buf} actually contains \var{Count} bytes.
|
|
\SeeAlso
|
|
\seepl{Read}{TStream.Read}, \seepl{WriteStr}{TStream.WriteStr},
|
|
\seepl{StrWrite}{TStream.StrWrite}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TStream.Read}.
|
|
|
|
\begin{procedure}{TStream.CopyFrom}
|
|
\Declaration
|
|
Procedure TStream.CopyFrom (Var S: TStream; Count: Longint);
|
|
\Description
|
|
\var{CopyFrom} reads Count bytes from stream \var{S} and stores them
|
|
in the current stream. It uses the \seepl{Read}{TStream.Read} method
|
|
to read the data, and the \seepl{Write}{TStream.Write} method to
|
|
write in the current stream.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Read}{TStream.Read}, \seepl{Write}{TStream.Write}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex19}
|
|
|
|
|
|
\section{TDosStream}
|
|
\label{se:TDosStream}
|
|
|
|
\var{TDosStream} is a stream that stores it's contents in a file.
|
|
it overrides a couple of methods of \var{TSteam} for this.
|
|
|
|
In addition to the fields inherited from \var{TStream} (see \sees{TStream}),
|
|
there are some extra fields, that describe the file. (mainly the name and
|
|
the OS file handle)
|
|
|
|
No buffering in memory is done when using \var{TDosStream}.
|
|
All data are written directly to the file. For a stream that buffers
|
|
in memory, see \sees{TBufStream}.
|
|
|
|
Here is the full declaration of the \var{TDosStream} object:
|
|
\begin{verbatim}
|
|
TYPE
|
|
TDosStream = OBJECT (TStream)
|
|
Handle: THandle; { DOS file handle }
|
|
FName : AsciiZ; { AsciiZ filename }
|
|
CONSTRUCTOR Init (FileName: FNameStr; Mode: Word);
|
|
DESTRUCTOR Done; Virtual;
|
|
PROCEDURE Close; Virtual;
|
|
PROCEDURE Truncate; Virtual;
|
|
PROCEDURE Seek (Pos: LongInt); Virtual;
|
|
PROCEDURE Open (OpenMode: Word); Virtual;
|
|
PROCEDURE Read (Var Buf; Count: Sw_Word); Virtual;
|
|
PROCEDURE Write (Var Buf; Count: Sw_Word); Virtual;
|
|
END;
|
|
PDosStream = ^TDosStream;
|
|
\end{verbatim}
|
|
|
|
\begin{procedure}{TDosStream.Init}
|
|
\Declaration
|
|
Constructor Init (FileName: FNameStr; Mode: Word);
|
|
\Description
|
|
\var{Init} instantiates an instance of \var{TDosStream}. The name of the
|
|
file that contains (or will contain) the data of the stream is given in
|
|
\var{FileName}. The \var{Mode} parameter determines whether a new file
|
|
should be created and what access rights you have on the file.
|
|
It can be one of the following constants:
|
|
\begin{description}
|
|
\item[stCreate] Creates a new file.
|
|
\item[stOpenRead] Read access only.
|
|
\item[stOpenWrite] Write access only.
|
|
\item[stOpen] Read and write access.
|
|
\end{description}
|
|
\Errors
|
|
On error, \var{Status} is set to \var{stInitError}, and \var{ErrorInfo}
|
|
is set to the \dos error code.
|
|
\SeeAlso
|
|
\seepl{Done}{TDosStream.Done}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TDosStream.Truncate}.
|
|
|
|
\begin{procedure}{TDosStream.Done}
|
|
\Declaration
|
|
Destructor TDosStream.Done; Virtual;
|
|
\Description
|
|
\var{Done} closes the file if it was open and cleans up the
|
|
instance of \var{TDosStream}.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Init}{TDosStream.Init},
|
|
\seepl{Close}{TDosStream.Close}
|
|
\end{procedure}
|
|
|
|
for an example, see e.g. \seep{TDosStream.Truncate}.
|
|
|
|
\begin{procedure}{TDosStream.Close}
|
|
\Declaration
|
|
Pocedure TDosStream.Close; Virtual;
|
|
\Description
|
|
\var{Close} closes the file if it was open, and sets \var{Handle} to -1.
|
|
Contrary to \seepl{Done}{TDosStream.Done} it does not clean up the instance
|
|
of \var{TDosStream}
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seep{TStream.Close}, \seepl{Init}{TDosStream.Init},
|
|
\seepl{Done}{TDosStream.Done}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TDosStream.Open}.
|
|
|
|
\begin{procedure}{TDosStream.Truncate}
|
|
\Declaration
|
|
Procedure TDosStream.Truncate; Virtual;
|
|
\Description
|
|
If the status of the stream is \var{stOK}, then \var{Truncate} tries to
|
|
truncate the stream size to the current file position.
|
|
\Errors
|
|
If an error occurs, the stream's status is set to \var{stError} and
|
|
\var{ErrorInfo} is set to the OS error code.
|
|
\SeeAlso
|
|
\seep{TStream.Truncate}, \seefl{GetSize}{TStream.GetSize}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex16}
|
|
|
|
|
|
\begin{procedure}{TDosStream.Seek}
|
|
\Declaration
|
|
Procedure TDosStream.Seek (Pos: LongInt); Virtual;
|
|
\Description
|
|
If the stream's status is \var{stOK}, then \var{Seek} sets the
|
|
file position to \var{Pos}. \var{Pos} is a zero-based offset, counted from
|
|
the beginning of the file.
|
|
\Errors
|
|
In case an error occurs, the stream's status is set to \var{stSeekError},
|
|
and the OS error code is stored in \var{ErrorInfo}.
|
|
\SeeAlso
|
|
\seep{TStream.Seek}, \seefl{GetPos}{TStream.GetPos}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex17}
|
|
|
|
|
|
\begin{procedure}{TDosStream.Open}
|
|
\Declaration
|
|
Procedure TDosStream.Open (OpenMode: Word); Virtual;
|
|
\Description
|
|
If the stream's status is \var{stOK}, and the stream is closed then
|
|
\var{Open} re-opens the file stream with mode \var{OpenMode}.
|
|
This call can be used after a \seepl{Close}{TDosStream.Close} call.
|
|
\Errors
|
|
If an error occurs when re-opening the file, then \var{Status} is set
|
|
to \var{stOpenError}, and the OS error code is stored in \var{ErrorInfo}
|
|
\SeeAlso
|
|
\seep{TStream.Open}, \seepl{Close}{TDosStream.Close}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex14}
|
|
|
|
|
|
\begin{procedure}{TDosStream.Read}
|
|
\Declaration
|
|
Procedure TDosStream.Read (Var Buf; Count: Sw\_Word); Virtual;
|
|
\Description
|
|
If the Stream is open and the stream status is \var{stOK} then
|
|
\var{Read} will read \var{Count} bytes from the stream and place them
|
|
in \var{Buf}.
|
|
\Errors
|
|
In case of an error, \var{Status} is set to \var{StReadError}, and
|
|
\var{ErrorInfo} gets the OS specific error, or 0 when an attempt was
|
|
made to read beyond the end of the stream.
|
|
\SeeAlso
|
|
\seep{TStream.Read}, \seepl{Write}{TDosStream.Write}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TStream.Read}.
|
|
|
|
\begin{procedure}{TDosStream.Write}
|
|
\Declaration
|
|
Procedure TDosStream.Write (Var Buf; Count: Sw\_Word); Virtual;
|
|
\Description
|
|
If the Stream is open and the stream status is \var{stOK} then
|
|
\var{Write} will write \var{Count} bytes from \var{Buf} and place them
|
|
in the stream.
|
|
\Errors
|
|
In case of an error, \var{Status} is set to \var{StWriteError}, and
|
|
\var{ErrorInfo} gets the OS specific error.
|
|
\SeeAlso
|
|
\seep{TStream.Write}, \seepl{Read}{TDosStream.Read}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TStream.Read}.
|
|
|
|
\section{TBufStream}
|
|
\label{se:TBufStream}
|
|
|
|
\var{Bufstream} implements a buffered file stream. That is, all data written
|
|
to the stream is written to memory first. Only when the buffer is full, or
|
|
on explicit request, the data is written to disk.
|
|
|
|
Also, when reading from the stream, first the buffer is checked if there is
|
|
any unread data in it. If so, this is read first. If not the buffer is
|
|
filled again, and then the data is read from the buffer.
|
|
|
|
The size of the buffer is fixed and is set when constructing the file.
|
|
|
|
This is useful if you need heavy throughput for your stream, because it
|
|
speeds up operations.
|
|
|
|
\begin{verbatim}
|
|
TYPE
|
|
TBufStream = OBJECT (TDosStream)
|
|
LastMode: Byte; { Last buffer mode }
|
|
BufSize : Sw_Word; { Buffer size }
|
|
BufPtr : Sw_Word; { Buffer start }
|
|
BufEnd : Sw_Word; { Buffer end }
|
|
Buffer : PByteArray; { Buffer allocated }
|
|
CONSTRUCTOR Init (FileName: FNameStr; Mode, Size: Word);
|
|
DESTRUCTOR Done; Virtual;
|
|
PROCEDURE Close; Virtual;
|
|
PROCEDURE Flush; Virtual;
|
|
PROCEDURE Truncate; Virtual;
|
|
PROCEDURE Seek (Pos: LongInt); Virtual;
|
|
PROCEDURE Open (OpenMode: Word); Virtual;
|
|
PROCEDURE Read (Var Buf; Count: Sw_Word); Virtual;
|
|
PROCEDURE Write (Var Buf; Count: Sw_Word); Virtual;
|
|
END;
|
|
PBufStream = ^TBufStream;
|
|
\end{verbatim}
|
|
|
|
\begin{procedure}{TBufStream.Init}
|
|
\Declaration
|
|
Constructor Init (FileName: FNameStr; Mode,Size: Word);
|
|
\Description
|
|
\var{Init} instantiates an instance of \var{TBufStream}. The name of the
|
|
file that contains (or will contain) the data of the stream is given in
|
|
\var{FileName}. The \var{Mode} parameter determines whether a new file
|
|
should be created and what access rights you have on the file.
|
|
It can be one of the following constants:
|
|
\begin{description}
|
|
\item[stCreate] Creates a new file.
|
|
\item[stOpenRead] Read access only.
|
|
\item[stOpenWrite] Write access only.
|
|
\item[stOpen] Read and write access.
|
|
\end{description}
|
|
The \var{Size} parameter determines the size of the buffer that will be
|
|
created. It should be different from zero.
|
|
\Errors
|
|
On error, \var{Status} is set to \var{stInitError}, and \var{ErrorInfo}
|
|
is set to the \dos error code.
|
|
\SeeAlso
|
|
\seep{TDosStream.Init}, \seepl{Done}{TBufStream.Done}
|
|
\end{procedure}
|
|
|
|
For an example see \seep{TBufStream.Flush}.
|
|
|
|
\begin{procedure}{TBufStream.Done}
|
|
\Declaration
|
|
Destructor TBufStream.Done; Virtual;
|
|
\Description
|
|
\var{Done} flushes and closes the file if it was open and cleans up the
|
|
instance of \var{TBufStream}.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seep{TDosStream.Done}, \seepl{Init}{TBufStream.Init},
|
|
\seepl{Close}{TBufStream.Close}
|
|
\end{procedure}
|
|
|
|
For an example see \seep{TBufStream.Flush}.
|
|
|
|
\begin{procedure}{TBufStream.Close}
|
|
\Declaration
|
|
Pocedure TBufStream.Close; Virtual;
|
|
\Description
|
|
\var{Close} flushes and closes the file if it was open, and sets \var{Handle} to -1.
|
|
Contrary to \seepl{Done}{TBufStream.Done} it does not clean up the instance
|
|
of \var{TBufStream}
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seep{TStream.Close}, \seepl{Init}{TBufStream.Init},
|
|
\seepl{Done}{TBufStream.Done}
|
|
\end{procedure}
|
|
|
|
For an example see \seep{TBufStream.Flush}.
|
|
|
|
\begin{procedure}{TBufStream.Flush}
|
|
\Declaration
|
|
Pocedure TBufStream.Flush; Virtual;
|
|
\Description
|
|
When the stream is in write mode, the contents of the buffer are written to
|
|
disk, and the buffer position is set to zero.
|
|
|
|
When the stream is in read mode, the buffer position is set to zero.
|
|
\Errors
|
|
Write errors may occur if the file was in write mode.
|
|
see \seepl{Write}{TBufStream.Write} for more info on the errors.
|
|
\SeeAlso
|
|
\seep{TStream.Close}, \seepl{Init}{TBufStream.Init},
|
|
\seepl{Done}{TBufStream.Done}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex15}
|
|
|
|
|
|
\begin{procedure}{TBufStream.Truncate}
|
|
\Declaration
|
|
Procedure TBufStream.Truncate; Virtual;
|
|
\Description
|
|
If the status of the stream is \var{stOK}, then \var{Truncate} tries to
|
|
flush the buffer, and then truncates the stream size to the current
|
|
file position.
|
|
\Errors
|
|
Errors can be those of \seepl{Flush}{TBufStream.Flush} or
|
|
\seep{TDosStream.Truncate}.
|
|
\SeeAlso
|
|
\seep{TStream.Truncate}, \seep{TDosStream.Truncate},
|
|
\seefl{GetSize}{TStream.GetSize}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TDosStream.Truncate}.
|
|
|
|
\begin{procedure}{TBufStream.Seek}
|
|
\Declaration
|
|
Procedure TBufStream.Seek (Pos: LongInt); Virtual;
|
|
\Description
|
|
If the stream's status is \var{stOK}, then \var{Seek} sets the
|
|
file position to \var{Pos}. \var{Pos} is a zero-based offset, counted from
|
|
the beginning of the file.
|
|
\Errors
|
|
In case an error occurs, the stream's status is set to \var{stSeekError},
|
|
and the OS error code is stored in \var{ErrorInfo}.
|
|
\SeeAlso
|
|
\seep{TStream.Seek}, \seefl{GetPos}{TStream.GetPos}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TStream.Seek};
|
|
|
|
\begin{procedure}{TBufStream.Open}
|
|
\Declaration
|
|
Procedure TBufStream.Open (OpenMode: Word); Virtual;
|
|
\Description
|
|
If the stream's status is \var{stOK}, and the stream is closed then
|
|
\var{Open} re-opens the file stream with mode \var{OpenMode}.
|
|
This call can be used after a \seepl{Close}{TBufStream.Close} call.
|
|
\Errors
|
|
If an error occurs when re-opening the file, then \var{Status} is set
|
|
to \var{stOpenError}, and the OS error code is stored in \var{ErrorInfo}
|
|
\SeeAlso
|
|
\seep{TStream.Open}, \seepl{Close}{TBufStream.Close}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TDosStream.Open}.
|
|
|
|
\begin{procedure}{TBufStream.Read}
|
|
\Declaration
|
|
Procedure TBufStream.Read (Var Buf; Count: Sw\_Word); Virtual;
|
|
\Description
|
|
If the Stream is open and the stream status is \var{stOK} then
|
|
\var{Read} will read \var{Count} bytes from the stream and place them
|
|
in \var{Buf}.
|
|
|
|
\var{Read} will first try to read the data from the stream's internal
|
|
buffer. If insufficient data is available, the buffer will be filled before
|
|
contiunuing to read. This process is repeated until all needed data
|
|
has been read.
|
|
|
|
\Errors
|
|
In case of an error, \var{Status} is set to \var{StReadError}, and
|
|
\var{ErrorInfo} gets the OS specific error, or 0 when an attempt was
|
|
made to read beyond the end of the stream.
|
|
\SeeAlso
|
|
\seep{TStream.Read}, \seepl{Write}{TBufStream.Write}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TStream.Read}.
|
|
|
|
\begin{procedure}{TBufStream.Write}
|
|
\Declaration
|
|
Procedure TBufStream.Write (Var Buf; Count: Sw\_Word); Virtual;
|
|
\Description
|
|
If the Stream is open and the stream status is \var{stOK} then
|
|
\var{Write} will write \var{Count} bytes from \var{Buf} and place them
|
|
in the stream.
|
|
|
|
\var{Write} will first try to write the data to the stream's internal
|
|
buffer. When the internal buffer is full, then the contents will be written
|
|
to disk. This process is repeated until all data has been written.
|
|
\Errors
|
|
In case of an error, \var{Status} is set to \var{StWriteError}, and
|
|
\var{ErrorInfo} gets the OS specific error.
|
|
\SeeAlso
|
|
\seep{TStream.Write}, \seepl{Read}{TBufStream.Read}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TStream.Read}.
|
|
|
|
\section{TMemoryStream}
|
|
\label{se:TMemoryStream}
|
|
|
|
The \var{TMemoryStream} object implements a stream that stores it's data
|
|
in memory. The data is stored on the heap, with the possibility to specify
|
|
the maximum amout of data, and the the size of the memory blocks being used.
|
|
|
|
\begin{verbatim}
|
|
TYPE
|
|
TMemoryStream = OBJECT (TStream)
|
|
BlkCount: Sw_Word; { Number of segments }
|
|
BlkSize : Word; { Memory block size }
|
|
MemSize : LongInt; { Memory alloc size }
|
|
BlkList : PPointerArray; { Memory block list }
|
|
CONSTRUCTOR Init (ALimit: Longint; ABlockSize: Word);
|
|
DESTRUCTOR Done; Virtual;
|
|
PROCEDURE Truncate; Virtual;
|
|
PROCEDURE Read (Var Buf; Count: Sw_Word); Virtual;
|
|
PROCEDURE Write (Var Buf; Count: Sw_Word); Virtual;
|
|
END;
|
|
PMemoryStream = ^TMemoryStream;
|
|
\end{verbatim}
|
|
|
|
\begin{procedure}{TMemoryStream.Init}
|
|
\Declaration
|
|
Constructor TMemoryStream.Init (ALimit: Longint; ABlockSize: Word);
|
|
\Description
|
|
\var{Init} instantiates a new \var{TMemoryStream} object. The
|
|
memorystreamobject will initially allocate at least \var{ALimit} bytes memory,
|
|
divided into memory blocks of size \var{ABlockSize}.
|
|
The number of blocks needed to get to \var{ALimit} bytes is rounded up.
|
|
|
|
By default, the number of blocks is 1, and the size of a block is 8192. This
|
|
is selected if you specify 0 as the blocksize.
|
|
\Errors
|
|
If the stream cannot allocate the initial memory needed for the memory blocks, then
|
|
the stream's status is set to \var{stInitError}.
|
|
\SeeAlso
|
|
\seepl{Done}{TMemoryStream.Done}
|
|
\end{procedure}
|
|
|
|
For an example, see e.g \seep{TStream.CopyFrom}.
|
|
|
|
\begin{procedure}{TMemoryStream.Done}
|
|
\Declaration
|
|
Destructor TMemoryStream.Done; Virtual;
|
|
\Description
|
|
\var{Done} releases the memory blocks used by the stream, and then cleans up
|
|
the memory used by the stream object itself.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Init}{TMemoryStream.Init}
|
|
\end{procedure}
|
|
|
|
For an example, see e.g \seep{TStream.CopyFrom}.
|
|
|
|
\begin{procedure}{TMemoryStream.Truncate}
|
|
\Declaration
|
|
Procedure TMemoryStream.Truncate; Virtual;
|
|
\Description
|
|
\var{Truncate} sets the size of the memory stream equal to the current
|
|
position. It de-allocates any memory-blocks that are no longer needed, so
|
|
that the new size of the stream is the current position in the stream,
|
|
rounded up to the first multiple of the stream blocksize.
|
|
\Errors
|
|
If an error occurs during memory de-allocation, the stream's status is set
|
|
to \var{stError}
|
|
\SeeAlso
|
|
\seep{TStream.Truncate}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex20}
|
|
|
|
|
|
\begin{procedure}{TMemoryStream.Read}
|
|
\Declaration
|
|
Procedure Read (Var Buf; Count: Sw\_Word); Virtual;
|
|
\Description
|
|
\var{Read} reads \var{Count} bytes from the stream to \var{Buf}. It updates
|
|
the position of the stream.
|
|
\Errors
|
|
If there is not enough data available, no data is read, and the stream's
|
|
status is set to \var{stReadError}.
|
|
\SeeAlso
|
|
\var{TStream.Read}, \seepl{Write}{TMemoryStream.Write}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TStream.Read}.
|
|
|
|
\begin{procedure}{TMemoryStream.Write}
|
|
\Declaration
|
|
Procedure Write (Var Buf; Count: Sw\_Word); Virtual;
|
|
\Description
|
|
\var{Write} copies \var{Count} bytes from \var{Buf} to the stream. It
|
|
updates the position of the stream.
|
|
|
|
If not enough memory is available to hold the extra \var{Count} bytes,
|
|
then the stream will try to expand, by allocating as much blocks with
|
|
size \var{BlkSize} (as specified in the constuctor call
|
|
\seepl{Init}{TMemoryStream.Init}) as needed.
|
|
\Errors
|
|
If the stream cannot allocate more memory, then the status is set to
|
|
\var{stWriteError}
|
|
\SeeAlso
|
|
\seep{TStream.Write}, \seepl{Read}{TMemoryStream.Read}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TStream.Read}.
|
|
|
|
\section{TCollection}
|
|
\label{se:TCollection}
|
|
|
|
The \var{TCollection} object manages a collection of pointers or objects.
|
|
It also provides a series of methods to manipulate these pointers or
|
|
objects.
|
|
|
|
Whether or not objects are used depends on the kind of calls you use.
|
|
ALl kinds come in 2 flavors, one for objects, one for pointers.
|
|
|
|
This is the full declaration of the \var{TCollection} object:
|
|
|
|
\begin{verbatim}
|
|
TYPE
|
|
TItemList = Array [0..MaxCollectionSize - 1] Of Pointer;
|
|
PItemList = ^TItemList;
|
|
|
|
TCollection = OBJECT (TObject)
|
|
Items: PItemList; { Item list pointer }
|
|
Count: Sw_Integer; { Item count }
|
|
Limit: Sw_Integer; { Item limit count }
|
|
Delta: Sw_Integer; { Inc delta size }
|
|
Constructor Init (ALimit, ADelta: Sw_Integer);
|
|
Constructor Load (Var S: TStream);
|
|
Destructor Done; Virtual;
|
|
Function At (Index: Sw_Integer): Pointer;
|
|
Function IndexOf (Item: Pointer): Sw_Integer; Virtual;
|
|
Function GetItem (Var S: TStream): Pointer; Virtual;
|
|
Function LastThat (Test: Pointer): Pointer;
|
|
Function FirstThat (Test: Pointer): Pointer;
|
|
Procedure Pack;
|
|
Procedure FreeAll;
|
|
Procedure DeleteAll;
|
|
Procedure Free (Item: Pointer);
|
|
Procedure Insert (Item: Pointer); Virtual;
|
|
Procedure Delete (Item: Pointer);
|
|
Procedure AtFree (Index: Sw_Integer);
|
|
Procedure FreeItem (Item: Pointer); Virtual;
|
|
Procedure AtDelete (Index: Sw_Integer);
|
|
Procedure ForEach (Action: Pointer);
|
|
Procedure SetLimit (ALimit: Sw_Integer); Virtual;
|
|
Procedure Error (Code, Info: Integer); Virtual;
|
|
Procedure AtPut (Index: Sw_Integer; Item: Pointer);
|
|
Procedure AtInsert (Index: Sw_Integer; Item: Pointer);
|
|
Procedure Store (Var S: TStream);
|
|
Procedure PutItem (Var S: TStream; Item: Pointer); Virtual;
|
|
END;
|
|
PCollection = ^TCollection;
|
|
\end{verbatim}
|
|
|
|
|
|
\begin{procedure}{TCollection.Init}
|
|
\Declaration
|
|
Constructor TCollection.Init (ALimit, ADelta: Sw\_Integer);
|
|
\Description
|
|
\var{Init} initializes a new instance of a collection. It sets the (initial) maximum number
|
|
of items in the collection to \var{ALimit}. \var{ADelta} is the increase
|
|
size : The number of memory places that will be allocatiod in case \var{ALimit} is reached,
|
|
and another element is added to the collection.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Load}{TCollection.Load}, \seepl{Done}{TCollection.Done}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TCollection.ForEach}.
|
|
|
|
\begin{procedure}{TCollection.Load}
|
|
\Declaration
|
|
Constructor TCollection.Load (Var S: TStream);
|
|
\Description
|
|
\var{Load} initializes a new instance of a collection. It reads from stream
|
|
\var{S} the item count, the item limit count, and the increase size. After
|
|
that, it reads the specified number of items from the stream.
|
|
|
|
% Do not call this method if you intend to use only pointers in your collection.
|
|
\Errors
|
|
Errors returned can be those of \seefl{GetItem}{TCollection.GetItem}.
|
|
\SeeAlso
|
|
\seepl{Init}{TCollection.Init}, \seefl{GetItem}{TCollection.GetItem},
|
|
\seepl{Done}{TCollection.Done}.
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex22}
|
|
|
|
|
|
\begin{procedure}{TCollection.Done}
|
|
\Declaration
|
|
Destructor TCollection.Done; Virtual;
|
|
\Description
|
|
\var{Done} frees all objects in the collection, and then releases all memory
|
|
occupied by the instance.
|
|
|
|
% Do not call this method if you intend to use only pointers in your collection.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Init}{TCollection.Init}, \seepl{FreeAll}{TCollection.FreeAll}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TCollection.ForEach}.
|
|
|
|
\begin{function}{TCollection.At}
|
|
\Declaration
|
|
Function TCollection.At (Index: Sw\_Integer): Pointer;
|
|
\Description
|
|
\var{At} returns the item at position \var{Index}.
|
|
\Errors
|
|
If \var{Index} is less than zero or larger than the number of items
|
|
in the collection, seepl{Error}{TCollection.Error} is called with
|
|
\var{coIndexError} and \var{Index} as arguments, resulting in a run-time
|
|
error.
|
|
\SeeAlso
|
|
\seepl{Insert}{TCollection.Insert}
|
|
\end{function}
|
|
|
|
\FPCexample{ex23}
|
|
|
|
|
|
\begin{function}{TCollection.IndexOf}
|
|
\Declaration
|
|
Function TCollection.IndexOf (Item: Pointer): Sw\_Integer; Virtual;
|
|
\Description
|
|
\var{IndexOf} returns the index of \var{Item} in the collection.
|
|
If \var{Item} isn't present in the collection, -1 is returned.
|
|
\Errors
|
|
\SeeAlso
|
|
\end{function}
|
|
|
|
\FPCexample{ex24}
|
|
|
|
|
|
\begin{function}{TCollection.GetItem}
|
|
\Declaration
|
|
Function TCollection.GetItem (Var S: TStream): Pointer; Virtual;
|
|
\Description
|
|
\var{GetItem} reads a single item off the stream \var{S}, and
|
|
returns a pointer to this item. This method is used internally by the Load
|
|
method, and should not be used directly.
|
|
\Errors
|
|
Possible errors are the ones from \seef{TStream.Get}.
|
|
\SeeAlso
|
|
\seef{TStream.Get}, seepl{Store}{TCollection.Store}
|
|
\end{function}
|
|
|
|
\begin{function}{TCollection.LastThat}
|
|
\Declaration
|
|
Function TCollection.LastThat (Test: Pointer): Pointer;
|
|
\Description
|
|
This function returns the last item in the collection for which \var{Test}
|
|
returns a non-nil result. \var{Test} is a function that accepts 1 argument:
|
|
a pointer to an object, and that returns a pointer as a result.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seefl{FirstThat}{TCollection.FirstThat}
|
|
\end{function}
|
|
|
|
\FPCexample{ex25}
|
|
|
|
|
|
\begin{function}{TCollection.FirstThat}
|
|
\Declaration
|
|
Function TCollection.FirstThat (Test: Pointer): Pointer;
|
|
\Description
|
|
This function returns the first item in the collection for which \var{Test}
|
|
returns a non-nil result. \var{Test} is a function that accepts 1 argument:
|
|
a pointer to an object, and that returns a pointer as a result.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seefl{LastThat}{TCollection.LastThat}
|
|
\end{function}
|
|
|
|
\FPCexample{ex26}
|
|
|
|
|
|
\begin{procedure}{TCollection.Pack}
|
|
\Declaration
|
|
Procedure TCollection.Pack;
|
|
\Description
|
|
\var{Pack} removes all \var{Nil} pointers from the collection, and adjusts
|
|
\var{Count} to reflect this change. No memory is freed as a result of this
|
|
call. In order to free any memory, you can call \var{SetLimit} with an
|
|
argument of \var{Count} after a call to \var{Pack}.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{SetLimit}{TCollection.SetLimit}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex26}
|
|
|
|
|
|
\begin{procedure}{TCollection.FreeAll}
|
|
\Declaration
|
|
Procedure TCollection.FreeAll;
|
|
\Description
|
|
\var{FreeAll} calls the destructor of each object in the collection.
|
|
It doesn't release any memory occumpied by the collection itself, but it
|
|
does set \var{Count} to zero.
|
|
\Errors
|
|
\SeeAlso
|
|
\seepl{DeleteAll}{TCollection.DeleteAll}, \seepl{FreeItem}{TCollection.FreeItem}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex28}
|
|
|
|
|
|
\begin{procedure}{TCollection.DeleteAll}
|
|
\Declaration
|
|
Procedure TCollection.DeleteAll;
|
|
\Description
|
|
\var{DeleteAll} deletes all elements from the collection. It just sets
|
|
the \var{Count} variable to zero. Contrary to
|
|
\seepl{FreeAll}{TCollection.FreeAll}, \var{DeletAll} doesn't call the
|
|
destructor of the objects.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{FreeAll}{TCollection.FreeAll}, \seepl{Delete}{TCollection.Delete}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex29}
|
|
|
|
|
|
\begin{procedure}{TCollection.Free}
|
|
\Declaration
|
|
Procedure TCollection.Free (Item: Pointer);
|
|
\Description
|
|
\var{Free} Deletes \var{Item} from the collection, and calls the destructor
|
|
\var{Done} of the object.
|
|
\Errors
|
|
If the \var{Item} is not in the collection, \var{Error} will be called with
|
|
\var{coIndexError}.
|
|
\SeeAlso
|
|
\seepl{FreeItem}{TCollection.FreeItem},
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex30}
|
|
|
|
|
|
\begin{procedure}{TCollection.Insert}
|
|
\Declaration
|
|
Procedure TCollection.Insert (Item: Pointer); Virtual;
|
|
\Description
|
|
\var{Insert} inserts \var{Item} in the collection. \var{TCollection}
|
|
inserts this item at the end, but descendent objects may insert it at
|
|
another place.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{AtInsert}{TCollection.AtInsert}, \seepl{AtPut}{TCollection.AtPut},
|
|
\end{procedure}
|
|
|
|
|
|
\begin{procedure}{TCollection.Delete}
|
|
\Declaration
|
|
Procedure TCollection.Delete (Item: Pointer);
|
|
\Description
|
|
\var{Delete} deletes \var{Item} from the collection. It doesn't call the
|
|
item's destructor, though. For this the \seepl{Free}{TCollection.Free}
|
|
call is provided.
|
|
\Errors
|
|
If the \var{Item} is not in the collection, \var{Error} will be called with
|
|
\var{coIndexError}.
|
|
\SeeAlso
|
|
\seepl{AtDelete}{TCollection.AtDelete},\seepl{Free}{TCollection.Free}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex31}
|
|
|
|
|
|
\begin{procedure}{TCollection.AtFree}
|
|
\Declaration
|
|
Procedure TCollection.AtFree (Index: Sw\_Integer);
|
|
\Description
|
|
\var{AtFree} deletes the item at position \var{Index} in the collection,
|
|
and calls the item's destructor if it is not \var{Nil}.
|
|
\Errors
|
|
If \var{Index} isn't valid then \seepl{Error}{TCollection.Error} is called
|
|
with \var{CoIndexError}.
|
|
\SeeAlso
|
|
\seepl{Free}{TCollection.Free}, \seepl{AtDelete}{TCollection.AtDelete}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex32}
|
|
|
|
|
|
\begin{procedure}{TCollection.FreeItem}
|
|
\Declaration
|
|
Procedure TCollection.FreeItem (Item: Pointer); Virtual;
|
|
\Description
|
|
\var{FreeItem} calls the destructor of \var{Item} if it is not nil.
|
|
|
|
This function is used internally by the TCollection object, and should not be
|
|
called directly.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Free}{TCollection.AtFree}, seepl{AtFree}{TCollection.AtFree}
|
|
\end{procedure}
|
|
|
|
|
|
\begin{procedure}{TCollection.AtDelete}
|
|
\Declaration
|
|
Procedure TCollection.AtDelete (Index: Sw\_Integer);
|
|
\Description
|
|
\var{AtDelete} deletes the pointer at position \var{Index} in the
|
|
collection. It doesn't call the object's destructor.
|
|
\Errors
|
|
If \var{Index} isn't valid then \seepl{Error}{TCollection.Error} is called
|
|
with \var{CoIndexError}.
|
|
\SeeAlso
|
|
\seepl{Delete}{TCollection.Delete}
|
|
\end{procedure}
|
|
|
|
|
|
\FPCexample{ex33}
|
|
|
|
|
|
\begin{procedure}{TCollection.ForEach}
|
|
\Declaration
|
|
Procedure TCollection.ForEach (Action: Pointer);
|
|
\Description
|
|
\var{ForEach} calls \var{Action} for each element in the collection,
|
|
and passes the element as an argument to \var{Action}.
|
|
|
|
\var{Action} is a procedural type variable that accepts a pointer as an
|
|
argument.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seefl{FirstThat}{TCollection.FirstThat}, \seefl{LastThat}{TCollection.LastThat}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex21}
|
|
|
|
|
|
\begin{procedure}{TCollection.SetLimit}
|
|
\Declaration
|
|
Procedure TCollection.SetLimit (ALimit: Sw\_Integer); Virtual;
|
|
\Description
|
|
\var{SetLimit} sets the maximum number of elements in the collection.
|
|
\var{ALimit} must not be less than \var{Count}, and should not be larger
|
|
than \var{MaxCollectionSize}
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Init}{TCollection.Init}
|
|
\end{procedure}
|
|
|
|
For an example, see \seepl{Pack}{TCollection.Pack}.
|
|
|
|
\begin{procedure}{TCollection.Error}
|
|
\Declaration
|
|
Procedure TCollection.Error (Code, Info: Integer); Virtual;
|
|
\Description
|
|
\var{Error} is called by the various \var{TCollection} methods
|
|
in case of an error condition. The default behaviour is to make
|
|
a call to \var{RunError} with an error of \var{212-Code}.
|
|
|
|
This method can be overridden by descendent objects to implement
|
|
a different error-handling.
|
|
\Errors
|
|
\SeeAlso
|
|
\seep{Abstract}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TCollection.AtPut}
|
|
\Declaration
|
|
Procedure TCollection.AtPut (Index: Sw\_Integer; Item: Pointer);
|
|
\Description
|
|
\var{AtPut} sets the element at position \var{Index} in the collection
|
|
to \var{Item}. Any previous value is overwritten.
|
|
\Errors
|
|
If \var{Index} isn't valid then \seepl{Error}{TCollection.Error} is called
|
|
with \var{CoIndexError}.
|
|
\SeeAlso
|
|
\end{procedure}
|
|
|
|
For an example, see \seepl{Pack}{TCollection.Pack}.
|
|
|
|
\begin{procedure}{TCollection.AtInsert}
|
|
\Declaration
|
|
Procedure TCollection.AtInsert (Index: Sw\_Integer; Item: Pointer);
|
|
\Description
|
|
\var{AtInsert} inserts \var{Item} in the collection at position \var{Index},
|
|
shifting all elements by one position. In case the current limit is reached,
|
|
the collection will try to expand with a call to \var{SetLimit}
|
|
\Errors
|
|
If \var{Index} isn't valid then \seepl{Error}{TCollection.Error} is called
|
|
with \var{CoIndexError}. If the collection fails to expand, then
|
|
\var{coOverFlow} is passd to \var{Error}.
|
|
\SeeAlso
|
|
\seepl{Insert}{TCollection.Insert}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex34}
|
|
|
|
|
|
\begin{procedure}{TCollection.Store}
|
|
\Declaration
|
|
Procedure TCollection.Store (Var S: TStream);
|
|
\Description
|
|
\var{Store} writes the collection to the stream \var{S}. It does
|
|
this by writeing the current \var{Count}, \var{Limit} and \var{Delta}
|
|
to the stream, and then writing each item to the stream.
|
|
|
|
The contents of the stream are then suitable for instantiating another
|
|
collection with \seepl{Load}{TCollection.Load}.
|
|
\Errors
|
|
Errors returned are those by \seep{TStream.Put}.
|
|
\SeeAlso
|
|
\seepl{Load}{TCollection.Load}, \seepl{PutItem}{TCollection.PutItem}
|
|
\end{procedure}
|
|
|
|
For an example, see seepl{Load}{TCollection.Load}.
|
|
|
|
\begin{procedure}{TCollection.PutItem}
|
|
\Declaration
|
|
Procedure TCollection.PutItem (Var S: TStream; Item: Pointer); Virtual;
|
|
\Description
|
|
\var{PutItem} writes \var{Item} to stream \var{S}. This method is used
|
|
internaly by the \var{TCollection} object, and should not be called
|
|
directly.
|
|
\Errors
|
|
Errors are those returned by \seep{TStream.Put}.
|
|
\SeeAlso
|
|
\seepl{Store}{TCollection.Store}, \seefl{GetItem}{TCollection.GetItem}.
|
|
\end{procedure}
|
|
|
|
\section{TSortedCollection}
|
|
\label{se:TSortedCollection}
|
|
|
|
\var{TSortedCollection} is an abstract class, implementing a sorted
|
|
collection. You should never use an instance of \var{TSortedCollection}
|
|
directly, instead you should declare a descendent type, and override the
|
|
\seefl{Compare}{TSortedCollection.Compare} method.
|
|
|
|
Because the collection is ordered, \var{TSortedCollection} overrides some
|
|
\var{TCollection} methods, to provide faster routines for lookup.
|
|
|
|
The \seefl{Compare}{TSortedCollection.Compare} method decides how elements
|
|
in the collection should be ordered. Since \var{TCollection} has no way
|
|
of knowing how to order pointers, you must override the compare method.
|
|
|
|
Additionally, \var{TCollection} provides a means to filter out duplicates.
|
|
if you set \var{Duplicates} to \var{False} (the default) then duplicates
|
|
will not be allowed.
|
|
|
|
Here is the complete declaration of \var{TSortedCollection}
|
|
|
|
\begin{verbatim}
|
|
TYPE
|
|
TSortedCollection = OBJECT (TCollection)
|
|
Duplicates: Boolean; { Duplicates flag }
|
|
Constructor Init (ALimit, ADelta: Sw_Integer);
|
|
Constructor Load (Var S: TStream);
|
|
Function KeyOf (Item: Pointer): Pointer; Virtual;
|
|
Function IndexOf (Item: Pointer): Sw_Integer; Virtual;
|
|
Function Compare (Key1, Key2: Pointer): Sw_Integer; Virtual;
|
|
Function Search (Key: Pointer; Var Index: Sw_Integer): Boolean;Virtual;
|
|
Procedure Insert (Item: Pointer); Virtual;
|
|
Procedure Store (Var S: TStream);
|
|
END;
|
|
PSortedCollection = ^TSortedCollection;
|
|
\end{verbatim}
|
|
|
|
In the subsequent examples, the following descendent of
|
|
\var{TSortedCollection} is used:
|
|
|
|
\FPCexample{mysortc}
|
|
|
|
|
|
\begin{procedure}{TSortedCollection.Init}
|
|
\Declaration
|
|
Constructor TSortedCollection.Init (ALimit, ADelta: Sw\_Integer);
|
|
\Description
|
|
\var{Init} calls the inherited constuctor (see \seep{TCollection.Init}) and
|
|
sets the \var{Duplicates} flag to false.
|
|
|
|
You should not call this method directly, since \var{TSortedCollection} is a
|
|
abstract class. Instead, the descendent classes should call it via the
|
|
\var{inherited} keyword.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Load}{TSortedCollection.Load}, \seepl{Done}{TCollection.Done}
|
|
\end{procedure}
|
|
|
|
For an example, see
|
|
|
|
\begin{procedure}{TSortedCollection.Load}
|
|
\Declaration
|
|
Constructor Load (Var S: TStream);
|
|
\Description
|
|
\var{Load} calls the inherited constuctor (see \seep{TCollection.Load}) and
|
|
reads the \var{Duplicates} flag from the stream..
|
|
|
|
You should not call this method directly, since \var{TSortedCollection} is a
|
|
abstract class. Instead, the descendent classes should call it via the
|
|
\var{inherited} keyword.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Init}{TSortedCollection.Init}, \seepl{Done}{TCollection.Done}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TCollection.Load}.
|
|
|
|
\begin{function}{TSortedCollection.KeyOf}
|
|
\Declaration
|
|
Function TSortedCollection.KeyOf (Item: Pointer): Pointer; Virtual;
|
|
\Description
|
|
\var{KeyOf} returns the key associated with \var{Item}.
|
|
\var{TSortedCollection} returns the item itself as the key, descendent
|
|
objects can override this method to calculate a (unique) key based on the
|
|
item passed (such as hash values).
|
|
|
|
\var{Keys} are used to sort the objects, they are used to search and sort
|
|
the items in the collection. If descendent types override this method then
|
|
it allows possibly for faster search/sort methods based on keys rather than
|
|
on the objects themselves.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seefl{IndexOf}{TSortedCollection.IndexOf},
|
|
\seefl{Compare}{TSortedCollection.Compare}.
|
|
\end{function}
|
|
|
|
\begin{function}{TSortedCollection.IndexOf}
|
|
\Declaration
|
|
Function TSortedCollection.IndexOf (Item: Pointer): Sw\_Integer; Virtual;
|
|
\Description
|
|
\var{IndexOf} returns the index of \var{Item} in the collection. It searches
|
|
for the object based on it's key. If duplicates are allowed, then it returns
|
|
the index of last object that matches \var{Item}.
|
|
|
|
In case \var{Item} is not found in the collection, -1 is returned.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seefl{Search}{TSortedCollection.Search},
|
|
\seefl{Compare}{TSortedCollection.Compare}.
|
|
\end{function}
|
|
|
|
For an example, see \seef{TCollection.IndexOf}
|
|
|
|
\begin{function}{TSortedCollection.Compare}
|
|
\Declaration
|
|
Function TSortedCollection.Compare (Key1, Key2: Pointer): Sw\_Integer; Virtual;
|
|
\Description
|
|
\var{Compare} is an abstract method that should be overridden by descendent
|
|
objects in order to compare two items in the collection. This method is used
|
|
in the \seefl{Search}{TSortedCollection.Search} method and in the
|
|
\seepl{Insert}{TSortedCollection.Insert} method to determine the ordering of
|
|
the objects.
|
|
|
|
The function should compare the two keys of items and return the following
|
|
function results:
|
|
\begin{description}
|
|
\item [Result < 0] If \var{Key1} is logically before \var{Key2}
|
|
(\var{Key1<Key2})
|
|
\item [Result = 0] If \var{Key1} and \var{Key2} are equal. (\var{Key1=Key2})
|
|
\item [Result > 0] If \var{Key1} is logically after \var{Key2}
|
|
(\var{Key1>Key2})
|
|
\end{description}
|
|
\Errors
|
|
An 'abstract run-time error' will be generated if you call
|
|
\var{TSortedCollection.Compare} directly.
|
|
\SeeAlso
|
|
\seefl{IndexOf}{TSortedCollection.IndexOf},
|
|
\seefl{Search}{TSortedCollection.Search}
|
|
\end{function}
|
|
|
|
\FPCexample{mysortc}
|
|
|
|
|
|
\begin{function}{TSortedCollection.Search}
|
|
\Declaration
|
|
Function TSortedCollection.Search (Key: Pointer; Var Index: Sw\_Integer): Boolean;Virtual;
|
|
\Description
|
|
\var{Search} looks for the item with key \var{Key} and returns the position
|
|
of the item (if present) in the collection in \var{Index}.
|
|
|
|
Instead of a linear search as \var{TCollection} does, \var{TSortedCollection}
|
|
uses a binary search based on the keys of the objects. It uses the
|
|
\seefl{Compare}{TSortedCollection.Compare} function to implement this
|
|
search.
|
|
|
|
If the item is found, \var{Search} returns \var{True}, otherwise \var{False}
|
|
is returned.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seefl{IndexOf}{TCollection.IndexOf}.
|
|
\end{function}
|
|
|
|
\FPCexample{ex36}
|
|
|
|
|
|
\begin{procedure}{TSortedCollection.Insert}
|
|
\Declaration
|
|
Procedure TSortedCollection.Insert (Item: Pointer); Virtual;
|
|
\Description
|
|
\var{Insert} inserts an item in the collection at the correct position, such
|
|
that the collection is ordered at all times. You should never use
|
|
\seepl{Atinsert}{TCollection.AtInsert}, since then the collection ordering
|
|
is not guaranteed.
|
|
|
|
If \var{Item} is already present in the collection, and \var{Duplicates} is
|
|
\var{False}, the item will not be inserted.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{AtInsert}{TCollection.AtInsert}
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex35}
|
|
|
|
|
|
\begin{procedure}{TSortedCollection.Store}
|
|
\Declaration
|
|
Procedure TSortedCollection.Store (Var S: TStream);
|
|
\Description
|
|
\var{Store} writes the collection to the stream \var{S}. It does this by
|
|
calling the inherited \seep{TCollection.Store}, and then writing the
|
|
\var{Duplicates} flag to the stream.
|
|
|
|
After a \var{Store}, the collection can be loaded from the stream with the
|
|
constructor \seepl{Load}{TSortedCollection.Load}
|
|
\Errors
|
|
Errors can be those of \seep{TStream.Put}.
|
|
\SeeAlso
|
|
\seepl{Load}{TSortedCollection.Load}
|
|
\end{procedure}
|
|
|
|
For an example, see \seep{TCollection.Load}.
|
|
|
|
\section{TStringCollection}
|
|
\label{se:TStringCollection}
|
|
|
|
The \var{TStringCollection} object manages a sorted collection of pascal
|
|
strings.
|
|
To this end, it overrides the \seefl{Compare}{TSortedCollection.Compare}
|
|
method of \var{TSortedCollection}, and it introduces methods to read/write
|
|
strings from a stream.
|
|
|
|
Here is the full declaration of the \var{TStringCollection} object:
|
|
\begin{verbatim}
|
|
TYPE
|
|
TStringCollection = OBJECT (TSortedCollection)
|
|
Function GetItem (Var S: TStream): Pointer; Virtual;
|
|
Function Compare (Key1, Key2: Pointer): Sw_Integer; Virtual;
|
|
Procedure FreeItem (Item: Pointer); Virtual;
|
|
Procedure PutItem (Var S: TStream; Item: Pointer); Virtual;
|
|
END;
|
|
PStringCollection = ^TStringCollection;
|
|
\end{verbatim}
|
|
|
|
\begin{function}{TStringCollection.GetItem}
|
|
\Declaration
|
|
Function TStringCollection.GetItem (Var S: TStream): Pointer; Virtual;
|
|
\Description
|
|
\var{GetItem} reads a string from the stream \var{S} and returns a pointer
|
|
to it. It doesn't insert the string in the collection.
|
|
|
|
This method is primarily introduced to be able to load and store the
|
|
collection from and to a stream.
|
|
\Errors
|
|
The errors returned are those of \seef{TStream.ReadStr}.
|
|
\SeeAlso
|
|
\seepl{PutItem}{TStringCollection.PutItem}
|
|
\end{function}
|
|
|
|
\begin{function}{TStringCollection.Compare}
|
|
\Declaration
|
|
Function TStringCollection.Compare (Key1, Key2: Pointer): Sw\_Integer; Virtual;
|
|
\Description
|
|
\var{TStringCollection} overrides the \var{Compare} function so it compares
|
|
the two keys as if they were pointers to strings. The compare is done case
|
|
sensitive. It returns the following results:
|
|
\begin{description}
|
|
\item[-1] if the first string is alphabetically earlier than the second
|
|
string.
|
|
\item[0] if the two strings are equal.
|
|
\item[1] if the first string is alphabetically later than the second string.
|
|
\end{description}
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seef{TSortedCollection.Compare}
|
|
\end{function}
|
|
|
|
\FPCexample{ex37}
|
|
|
|
|
|
\begin{procedure}{TStringCollection.FreeItem}
|
|
\Declaration
|
|
Procedure TStringCollection.FreeItem (Item: Pointer); Virtual;
|
|
\Description
|
|
\var{TStringCollection} overrides \var{FreeItem} so that the string pointed
|
|
to by \var{Item} is disposed from memory.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seep{TCollection.FreeItem}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TStringCollection.PutItem}
|
|
\Declaration
|
|
Procedure TStringCollection.PutItem (Var S: TStream; Item: Pointer); Virtual;
|
|
\Description
|
|
\var{PutItem} writes the string pointed to by \var{Item} to the stream
|
|
\var{S}.
|
|
|
|
This method is primarily used in the \var{Load} and \var{Store} methods,
|
|
and should not be used directly.
|
|
\Errors
|
|
Errors are those of \seep{TStream.WriteStr}.
|
|
\SeeAlso
|
|
\seefl{GetItem}{TStringCollection.GetItem}
|
|
\end{procedure}
|
|
|
|
|
|
\section{TStrCollection}
|
|
\label{se:TStrCollection}
|
|
|
|
The \var{TStrCollection} object manages a sorted collection
|
|
of null-terminated strings (pchar strings).
|
|
To this end, it overrides the \seefl{Compare}{TSortedCollection.Compare}
|
|
method of \var{TSortedCollection}, and it introduces methods to read/write
|
|
strings from a stream.
|
|
|
|
Here is the full declaration of the \var{TStrCollection} object:
|
|
|
|
\begin{verbatim}
|
|
TYPE
|
|
TStrCollection = OBJECT (TSortedCollection)
|
|
Function Compare (Key1, Key2: Pointer): Sw_Integer; Virtual;
|
|
Function GetItem (Var S: TStream): Pointer; Virtual;
|
|
Procedure FreeItem (Item: Pointer); Virtual;
|
|
Procedure PutItem (Var S: TStream; Item: Pointer); Virtual;
|
|
END;
|
|
PStrCollection = ^TStrCollection;
|
|
\end{verbatim}
|
|
|
|
\begin{function}{TStrCollection.GetItem}
|
|
\Declaration
|
|
Function TStrCollection.GetItem (Var S: TStream): Pointer; Virtual;
|
|
\Description
|
|
\var{GetItem} reads a null-terminated string from the stream \var{S}
|
|
and returns a pointer to it. It doesn't insert the string in the
|
|
collection.
|
|
|
|
This method is primarily introduced to be able to load and store the
|
|
collection from and to a stream.
|
|
\Errors
|
|
The errors returned are those of \seef{TStream.StrRead}.
|
|
\SeeAlso
|
|
\seepl{PutItem}{TStrCollection.PutItem}
|
|
\end{function}
|
|
|
|
\begin{function}{TStrCollection.Compare}
|
|
\Declaration
|
|
Function TStrCollection.Compare (Key1, Key2: Pointer): Sw\_Integer; Virtual;
|
|
\Description
|
|
\var{TStrCollection} overrides the \var{Compare} function so it compares
|
|
the two keys as if they were pointers to strings. The compare is done case
|
|
sensitive. It returns
|
|
\begin{description}
|
|
\item[-1] if the first string is alphabetically earlier than the second
|
|
string.
|
|
\item[0] if the two strings are equal.
|
|
\item[1] if the first string is alphabetically later than the second string.
|
|
\end{description}
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seef{TSortedCollection.Compare}
|
|
\end{function}
|
|
|
|
\FPCexample{ex38}
|
|
|
|
|
|
\begin{procedure}{TStrCollection.FreeItem}
|
|
\Declaration
|
|
Procedure TStrCollection.FreeItem (Item: Pointer); Virtual;
|
|
\Description
|
|
\var{TStrCollection} overrides \var{FreeItem} so that the string pointed
|
|
to by \var{Item} is disposed from memory.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seep{TCollection.FreeItem}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TStrCollection.PutItem}
|
|
\Declaration
|
|
Procedure TStrCollection.PutItem (Var S: TStream; Item: Pointer); Virtual;
|
|
\Description
|
|
\var{PutItem} writes the string pointed to by \var{Item} to the stream
|
|
\var{S}.
|
|
|
|
This method is primarily used in the \var{Load} and \var{Store} methods,
|
|
and should not be used directly.
|
|
\Errors
|
|
Errors are those of \seep{TStream.StrWrite}.
|
|
\SeeAlso
|
|
\seefl{GetItem}{TStrCollection.GetItem}
|
|
\end{procedure}
|
|
|
|
\section{TUnSortedStrCollection}
|
|
\label{se:TUnSortedStrCollection}
|
|
|
|
The \var{TUnSortedStrCollection} object manages an unsorted list of strings.
|
|
To this end, it overrides the \seep{TStringCollection.Insert} method to add
|
|
strings at the end of the collection, rather than in the alphabetically
|
|
correct position.
|
|
|
|
Take care, the \seefl{Search}{TSortedCollection.Search} and
|
|
\seefl{IndexOf}{TCollection.IndexOf} methods will not work on an unsorted
|
|
string collection.
|
|
|
|
Here is the full declaration of the {TUnsortedStrCollection} object:
|
|
\begin{verbatim}
|
|
TYPE
|
|
TUnSortedStrCollection = OBJECT (TStringCollection)
|
|
Procedure Insert (Item: Pointer); Virtual;
|
|
END;
|
|
PUnSortedStrCollection = ^TUnSortedStrCollection;
|
|
\end{verbatim}
|
|
|
|
\begin{procedure}{TUnSortedStrCollection.Insert}
|
|
\Declaration
|
|
Procedure TUnSortedStrCollection.Insert (Item: Pointer); Virtual;
|
|
\Description
|
|
\var{Insert} inserts a string at the end of the collection, instead
|
|
of on it's alphabetical place, resulting in an unsorted collection of
|
|
strings.
|
|
\Errors
|
|
\SeeAlso
|
|
\end{procedure}
|
|
|
|
\FPCexample{ex39}
|
|
|
|
|
|
\section{TResourceCollection}
|
|
\label{se:TResourceCollection}
|
|
|
|
A \var{TResourceCollection} manages a collection of resource names.
|
|
It stores the position and the size of a resource, as well as the name of
|
|
the resource. It stores these items in records that look like this:
|
|
\begin{verbatim}
|
|
TYPE
|
|
TResourceItem = packed RECORD
|
|
Posn: LongInt;
|
|
Size: LongInt;
|
|
Key : String;
|
|
End;
|
|
PResourceItem = ^TResourceItem;
|
|
\end{verbatim}
|
|
|
|
It overrides some methods of \var{TStringCollection} in order to accomplish
|
|
this.
|
|
|
|
Remark that the \var{TResourceCollection} manages the names of the
|
|
resources and their assiciated positions and sizes, it doesn't manage
|
|
the resources themselves.
|
|
|
|
Here is the full declaration of the \var{TResourceCollection} object:
|
|
\begin{verbatim}
|
|
TYPE
|
|
TResourceCollection = OBJECT (TStringCollection)
|
|
Function KeyOf (Item: Pointer): Pointer; Virtual;
|
|
Function GetItem (Var S: TStream): Pointer; Virtual;
|
|
Procedure FreeItem (Item: Pointer); Virtual;
|
|
Procedure PutItem (Var S: TStream; Item: Pointer); Virtual;
|
|
END;
|
|
PResourceCollection = ^TResourceCollection;
|
|
\end{verbatim}
|
|
|
|
\begin{function}{TResourceCollection.KeyOf}
|
|
\Declaration
|
|
Function TResourceCollection.KeyOf (Item: Pointer): Pointer; Virtual;
|
|
\Description
|
|
\var{KeyOf} returns the key of an item in the collection. For resources, the
|
|
key is a pointer to the string with the resource name.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seef{TStringCollection.Compare}
|
|
\end{function}
|
|
|
|
\begin{function}{TResourceCollection.GetItem}
|
|
\Declaration
|
|
Function TResourceCollection.GetItem (Var S: TStream): Pointer; Virtual;
|
|
\Description
|
|
\var{GetItem} reads a resource item from the stream \var{S}. It reads the
|
|
position, size and name from the stream, in that order. It DOES NOT read the
|
|
resource itself from the stream.
|
|
|
|
The resulting item is not inserted in the collection. This call is manly for
|
|
internal use by the \seep{TCollection.Load} method.
|
|
\Errors
|
|
Errors returned are those by \seep{TStream.Read}
|
|
\SeeAlso
|
|
\seep{TCollection.Load}, \seep{TStream.Read}
|
|
\end{function}
|
|
|
|
\begin{procedure}{TResourceCollection.FreeItem}
|
|
\Declaration
|
|
Procedure TResourceCollection.FreeItem (Item: Pointer); Virtual;
|
|
\Description
|
|
\var{FreeItem} releases the memory occupied by \var{Item}. It de-allocates
|
|
the name, and then the resourceitem record.
|
|
|
|
It does NOT remove the item from the collection.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seep{TCollection.FreeItem}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TResourceCollection.PutItem}
|
|
\Declaration
|
|
Procedure TResourceCollection.PutItem (Var S: TStream; Item: Pointer); Virtual;
|
|
\Description
|
|
\var{PutItem} writes \var{Item} to the stream \var{S}. It does this by
|
|
writing the position and size and name of the resource item to the stream.
|
|
|
|
This method is used primarily by the \seepl{Store}{TCollection.Store}
|
|
method.
|
|
\Errors
|
|
Errors returned are those by \seep{TStream.Write}.
|
|
\SeeAlso
|
|
\seepl{Store}{TCollection.Store}
|
|
\end{procedure}
|
|
|
|
|
|
\section{TResourceFile}
|
|
\label{se:TResourceFile}
|
|
|
|
\begin{verbatim}
|
|
TYPE
|
|
TResourceFile = OBJECT (TObject)
|
|
Stream : PStream; { File as a stream }
|
|
Modified: Boolean; { Modified flag }
|
|
Constructor Init (AStream: PStream);
|
|
Destructor Done; Virtual;
|
|
Function Count: Sw_Integer;
|
|
Function KeyAt (I: Sw_Integer): String;
|
|
Function Get (Key: String): PObject;
|
|
Function SwitchTo (AStream: PStream; Pack: Boolean): PStream;
|
|
Procedure Flush;
|
|
Procedure Delete (Key: String);
|
|
Procedure Put (Item: PObject; Key: String);
|
|
END;
|
|
PResourceFile = ^TResourceFile;
|
|
\end{verbatim}
|
|
|
|
\subsection{TResourceFile Fields}
|
|
|
|
\var{TResourceFile} has the following fields:
|
|
\begin{description}
|
|
\item[Stream] contains the (file) stream that has the executable image and
|
|
the resources. It can be initialized by the \seepl{Init}{TResourceFile.Init}
|
|
constructor call.
|
|
\item[Modified] is set to \var{True} if one of the resources has been changed.
|
|
It is set by the \seepl{SwitchTo}{TResourceFile.Init},
|
|
\seepl{Delete}{TResourceFile.Delete} and \seepl{Put}{TResourceFile.Put}
|
|
methods. Calling \seepl{Flush}{TResourceFile.Flush} will clear the
|
|
\var{Modified} flag.
|
|
\end{description}
|
|
|
|
\begin{procedure}{TResourceFile.Init}
|
|
\Declaration
|
|
Constructor TResourceFile.Init (AStream: PStream);
|
|
\Description
|
|
\var{Init} instantiates a new instance of a \var{TResourceFile} object.
|
|
If \var{AStream} is not nil then it is considered as a stream describing an
|
|
executable image on disk.
|
|
|
|
\var{Init} will try to position the stream on the start of the resources section,
|
|
and read all resources from the stream.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Done}{TResourceFile.Done}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TResourceFile.Done}
|
|
\Declaration
|
|
Destructor TResourceFile.Done; Virtual;
|
|
\Description
|
|
\var{Done} cleans up the instance of the \var{TResourceFile} Object.
|
|
If \var{Stream} was specified at initialization, then \var{Stream} is
|
|
disposed of too.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Init}{TResourceFile.Init}
|
|
\end{procedure}
|
|
|
|
\begin{function}{TResourceFile.Count}
|
|
\Declaration
|
|
Function TResourceFile.Count: Sw\_Integer;
|
|
\Description
|
|
\var{Count} returns the number of resources. If no resources were
|
|
read, zero is returned.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Init}{TResourceFile.Init}
|
|
\end{function}
|
|
|
|
\begin{function}{TResourceFile.KeyAt}
|
|
\Declaration
|
|
Function TResourceFile.KeyAt (I: Sw\_Integer): String;
|
|
\Description
|
|
\var{KeyAt} returns the key (the name) of the \var{I}-th resource.
|
|
\Errors
|
|
In case \var{I} is invalid, \var{TCollection.Error} will be executed.
|
|
\SeeAlso
|
|
\seefl{Get}{TResourceFile.Get}
|
|
\end{function}
|
|
|
|
\begin{function}{TResourceFile.Get}
|
|
\Declaration
|
|
Function TResourceFile.Get (Key: String): PObject;
|
|
\Description
|
|
\var{Get} returns a pointer to a instance of a resource identified by
|
|
\var{Key}. If \var{Key} cannot be found in the list of resources, then
|
|
\var{Nil} is returned.
|
|
\Errors
|
|
Errors returned may be those by \var{TStream.Get}
|
|
\SeeAlso
|
|
\end{function}
|
|
|
|
\begin{function}{TResourceFile.SwitchTo}
|
|
\Declaration
|
|
Function TResourceFile.SwitchTo (AStream: PStream; Pack: Boolean): PStream;
|
|
\Description
|
|
\var{SwitchTo} switches to a new stream to hold the resources in.
|
|
\var{AStream} will be the new stream after the call to \var{SwitchTo}.
|
|
|
|
If \var{Pack} is true, then all the known resources will be copied from
|
|
the current stream to the new stream (\var{AStream}). If \var{Pack} is
|
|
\var{False}, then only the current resource is copied.
|
|
|
|
The return value is the value of the original stream: \var{Stream}.
|
|
|
|
The \var{Modified} flag is set as a consequence of this call.
|
|
\Errors
|
|
Errors returned can be those of \seep{TStream.Read} and
|
|
\seep{TStream.Write}.
|
|
\SeeAlso
|
|
\seepl{Flush}{TResourceFile.Flush}
|
|
\end{function}
|
|
|
|
\begin{procedure}{TResourceFile.Flush}
|
|
\Declaration
|
|
Procedure TResourceFile.Flush;
|
|
\Description
|
|
If the \var{Modified} flag is set to \var{True}, then \var{Flush}
|
|
writes the resources to the stream \var{Stream}. It sets the \var{Modified}
|
|
flag to true after that.
|
|
\Errors
|
|
Errors can be those by \seep{TStream.Seek} and \seep{TStream.Write}.
|
|
\SeeAlso
|
|
\seefl{SwitchTo}{TResourceFile.SwitchTo}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TResourceFile.Delete}
|
|
\Declaration
|
|
Procedure TResourceFile.Delete (Key: String);
|
|
\Description
|
|
\var{Delete} deletes the resource identified by \var{Key} from the
|
|
collection. It sets the \var{Modified} flag to true.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Flush}{TResourceFile.Flush}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TResourceFile.Put}
|
|
\Declaration
|
|
Procedure TResourceFile.Put (Item: PObject; Key: String);
|
|
\Description
|
|
\var{Put} sets the resource identified by \var{Key} to \var{Item}.
|
|
If no such resource exists, a new one is created. The item is written
|
|
to the stream.
|
|
\Errors
|
|
Errors returned may be those by \seep{TStream.Put} and \var{TStream.Seek}
|
|
\SeeAlso
|
|
\seefl{Get}{TResourceFile.Get}
|
|
\end{procedure}
|
|
|
|
\section{TStringList}
|
|
\label{se:TStringList}
|
|
|
|
A \var{TStringList} object can be used to read a collection of strings
|
|
stored in a stream. If you register this object with the \seep{RegisterType}
|
|
function, you cannot register the \var{TStrListMaker} object.
|
|
|
|
This is the public declaration of the \var{TStringList} object:
|
|
\begin{verbatim}
|
|
TYPE
|
|
TStrIndexRec = Packed RECORD
|
|
Key, Count, Offset: Word;
|
|
END;
|
|
|
|
TStrIndex = Array [0..9999] Of TStrIndexRec;
|
|
PStrIndex = ^TStrIndex;
|
|
|
|
TStringList = OBJECT (TObject)
|
|
Constructor Load (Var S: TStream);
|
|
Destructor Done; Virtual;
|
|
Function Get (Key: Sw_Word): String;
|
|
END;
|
|
PStringList = ^TStringList;
|
|
\end{verbatim}
|
|
|
|
\begin{procedure}{TStringList.Load}
|
|
\Declaration
|
|
Constructor TstringList.Load (Var S: TStream);
|
|
\Description
|
|
The \var{Load} constructor reads the \var{TStringList} object from the
|
|
stream \var{S}. It also reads the descriptions of the strings from the
|
|
stream. The string descriptions are stored as an array of
|
|
\var{TstrIndexrec} records, where each record describes a string on the
|
|
stream. These records are kept in memory.
|
|
\Errors
|
|
If an error occurs, a stream error is triggered.
|
|
\SeeAlso
|
|
\seepl{Done}{TStringList.Done}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TStringList.Done}
|
|
\Declaration
|
|
Destructor TstringList.Done; Virtual;
|
|
\Description
|
|
The \var{Done} destructor frees the memory occupied by the string
|
|
descriptions, and destroys the object.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Load}{TStringList.Load}, \seep{TObject.Done}
|
|
\end{procedure}
|
|
|
|
\begin{function}{TStringList.Get}
|
|
\Declaration
|
|
Function TStringList.Get (Key: Sw\_Word): String;
|
|
\Description
|
|
\var{Get} reads the string with key \var{Key} from the list of strings on the
|
|
stream, and returns this string. If there is no string with such a key, an
|
|
empty string is returned.
|
|
\Errors
|
|
If no string with key \var{Key} is found, an empty string is returned.
|
|
A stream error may result if the stream doesn't contain the needed strings.
|
|
\SeeAlso
|
|
\seep{TStrListMaker.Put}
|
|
\end{function}
|
|
\section{TStrListMaker}
|
|
\label{se:TStrListMaker}
|
|
|
|
The \var{TStrListMaker} object can be used to generate a stream with
|
|
strings, which can be read with the \var{TStringList} object.
|
|
If you register this object with the \seep{RegisterType}
|
|
function, you cannot register the \var{TStringList} object.
|
|
|
|
This is the public declaration of the \var{TStrListMaker} object:
|
|
\begin{verbatim}
|
|
TYPE
|
|
TStrListMaker = OBJECT (TObject)
|
|
Constructor Init (AStrSize, AIndexSize: Sw_Word);
|
|
Destructor Done; Virtual;
|
|
Procedure Put (Key: SwWord; S: String);
|
|
Procedure Store (Var S: TStream);
|
|
END;
|
|
PStrListMaker = ^TStrListMaker;
|
|
\end{verbatim}
|
|
|
|
\begin{procedure}{TStrListMaker.Init}
|
|
\Declaration
|
|
Constructor TStrListMaker.Init (AStrSize, AIndexSize: SwWord);
|
|
\Description
|
|
The \var{Init} constructor creates a new instance of the \var{TstrListMaker}
|
|
object. It allocates \var{AStrSize} bytes on the heap to hold all the
|
|
strings you wish to store. It also allocates enough room for
|
|
\var{AIndexSize} key description entries (of the type \var{TStrIndexrec}).
|
|
|
|
\var{AStrSize} must be large enough to contain all the strings you wish to
|
|
store. If not enough memory is allocated, other memory will be overwritten.
|
|
The same is true for \var{AIndexSize} : maximally \var{AIndexSize} strings
|
|
can be written to the stream.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seep{TObject.Init}, \seepl{Done}{TStrListMaker.Done}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TStrListMaker.Done}
|
|
\Declaration
|
|
Destructor TStrListMaker.Done; Virtual;
|
|
\Description
|
|
The \var{Done} destructor de-allocates the memory for the index description
|
|
records and the string data, and then destroys the object.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seep{TObject.Done}, \seepl{Init}{TStrListMaker.Init}
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TStrListMaker.Put}
|
|
\Declaration
|
|
Procedure TStrListMaker.Put (Key: Sw\_Word; S: String);
|
|
\Description
|
|
\var{Put} adds they string \var{S} with key \var{Key} to the collection of
|
|
strings. This action doesn't write the string to a stream. To write the
|
|
strings to the stream, see the \seepl{Store}{TStrListMaker.Store} method.
|
|
\Errors
|
|
None.
|
|
\SeeAlso
|
|
\seepl{Store}{TStrListMaker.Store}.
|
|
\end{procedure}
|
|
|
|
\begin{procedure}{TStrListMaker.Store}
|
|
\Declaration
|
|
Procedure TStrListMaker.Store (Var S: TStream);
|
|
\Description
|
|
\var{Store} writes the collection of strings to the stream \var{S}.
|
|
The collection can then be read with the \var{TStringList} object.
|
|
\Errors
|
|
A stream error may occur when writing the strings to the stream.
|
|
\SeeAlso
|
|
\seep{TStringList.Load}, \seepl{Put}{TStrListMaker.Put}.
|
|
\end{procedure}
|
|
|
|
|