Browse Source

+ initial check in

michael 24 years ago
parent
commit
bf2329a40f
1 changed files with 532 additions and 0 deletions
  1. 532 0
      docs/typinfo.tex

+ 532 - 0
docs/typinfo.tex

@@ -0,0 +1,532 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The TYPINFO unit
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{The TYPINFO unit}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Constants, Types and variables
+\section{Constants, Types and variables}
+\subsection{Constants}
+The following constants are used in the implementation section of the unit.
+
+\begin{verbatim}
+BooleanIdents: array[Boolean] of String = ('False', 'True');
+DotSep: String = '.';
+\end{verbatim}
+The following constants determine the access method for the \var{Stored} 
+identifier of a property as used in the \var{PropProcs} field of the 
+\var{TPropInfo} record:
+\begin{verbatim}
+ptField = 0;
+ptStatic = 1;
+ptVirtual = 2;
+ptConst = 3;
+\end{verbatim}
+The following typed constants are used for easy selection of property types.
+\begin{verbatim}
+tkAny = [Low(TTypeKind)..High(TTypeKind)];
+tkMethods = [tkMethod];
+tkProperties = tkAny-tkMethods-[tkUnknown];
+\end{verbatim}
+
+\subsection{types}
+The following pointer types are defined:
+\begin{verbatim}
+PShortString =^ShortString;
+PByte        =^Byte;
+PWord        =^Word;
+PLongint     =^Longint;
+PBoolean     =^Boolean;
+PSingle      =^Single;
+PDouble      =^Double;
+PExtended    =^Extended;
+PComp        =^Comp;
+PFixed16     =^Fixed16;
+Variant      = Pointer;
+\end{verbatim}
+
+The \var{TTypeKind} determines the type of a property:
+\begin{verbatim}
+TTypeKind = (tkUnknown,tkInteger,tkChar,tkEnumeration,
+             tkFloat,tkSet,tkMethod,tkSString,tkLString,tkAString,
+             tkWString,tkVariant,tkArray,tkRecord,tkInterface,
+             tkClass,tkObject,tkWChar,tkBool,tkInt64,tkQWord,
+             tkDynArray,tkInterfaceRaw);
+tkString = tkSString;
+\end{verbatim}
+\var{tkString} is an alias that is introduced for Delphi compatibility.
+
+If the property is and ordinal type, then \var{TTOrdType} determines the 
+size and sign of the ordinal type:
+\begin{verbatim}
+TTOrdType = (otSByte,otUByte,otSWord,otUWord,otSLong,otULong);
+\end{verbatim}
+The size of a float type is determined by \var{TFloatType}:
+\begin{verbatim}
+TFloatType = (ftSingle,ftDouble,ftExtended,ftComp,ftCurr,
+              ftFixed16,ftFixed32);
+\end{verbatim}
+A method property (e.g. an event) can have one of several types:
+\begin{verbatim}
+TMethodKind = (mkProcedure,mkFunction,mkConstructor,mkDestructor,
+               mkClassProcedure, mkClassFunction);
+\end{verbatim}
+The kind of parameter to a method is determined by \var{TParamFlags}:
+\begin{verbatim}
+TParamFlags = set of (pfVar,pfConst,pfArray,pfAddress,pfReference,pfOut);
+\end{verbatim}
+Interfaces are described further with \var{TntfFlags}:
+\begin{verbatim}
+TIntfFlags = set of (ifHasGuid,ifDispInterface,ifDispatch);
+\end{verbatim}
+The following defines a set of \var{TTypeKind}:
+\begin{verbatim}
+TTypeKinds = set of TTypeKind;
+\end{verbatim}
+The \var{TypeInfo} function returns a pointer to a \var{TTypeInfo} record:
+\begin{verbatim}
+TTypeInfo = record
+  Kind : TTypeKind;
+  Name : ShortString;
+end;
+PTypeInfo = ^TTypeInfo;
+PPTypeInfo = ^PTypeInfo;
+\end{verbatim}
+Note that the Name is stored with as much bytes as needed to store the name,
+it is not padded to 255 characters. 
+The type data immediatly follows the \var{TTypeInfo} record as a \var{TTypeData} record:
+\begin{verbatim}
+PTypeData = ^TTypeData;
+TTypeData = packed record
+case TTypeKind of
+  tkUnKnown,tkLString,tkWString,tkAString,tkVariant:
+    ();
+  tkInteger,tkChar,tkEnumeration,tkWChar:
+    (OrdType : TTOrdType;
+     case TTypeKind of
+       tkInteger,tkChar,tkEnumeration,tkBool,tkWChar : (
+         MinValue,MaxValue : Longint;
+         case TTypeKind of
+           tkEnumeration: (
+             BaseType : PTypeInfo;
+             NameList : ShortString
+           )
+         );
+       tkSet: (
+             CompType : PTypeInfo
+         )
+     );
+  tkFloat: (
+    FloatType : TFloatType
+    );
+  tkSString:
+    (MaxLength : Byte);
+  tkClass:
+    (ClassType : TClass;
+     ParentInfo : PTypeInfo;
+     PropCount : SmallInt;
+     UnitName : ShortString
+     );
+  tkMethod:
+    (MethodKind : TMethodKind;
+     ParamCount : Byte;
+     ParamList : array[0..1023] of Char
+     {in reality ParamList is a array[1..ParamCount] of:
+	  record
+	    Flags : TParamFlags;
+	    ParamName : ShortString;
+	    TypeName : ShortString;
+	  end;
+	followed by
+	  ResultType : ShortString}
+    );
+  tkInt64:
+   (MinInt64Value, MaxInt64Value: Int64);
+  tkQWord:
+   (MinQWordValue, MaxQWordValue: QWord);
+  tkInterface:
+	();
+end;
+\end{verbatim}
+If the typeinfo kind is \var{tkClass}, then the property 
+information follows the \var{UnitName} string, as an array of \var{TPropInfo} records.
+
+The \var{TPropData} record is not used, but is provided for completeness.
+\begin{verbatim}
+TPropData = packed record
+  PropCount : Word;
+  PropList : record end;
+end;
+\end{verbatim}
+The \var{TPropInfo} record describes one published property of a class:
+\begin{verbatim}
+PPropInfo = ^TPropInfo;
+TPropInfo = packed record
+  PropType : PTypeInfo;
+  GetProc : Pointer;
+  SetProc : Pointer;
+  StoredProc : Pointer;
+  Index : Integer;
+  Default : Longint;
+  NameIndex : SmallInt;
+  PropProcs : Byte;
+  Name : ShortString;
+end;
+\end{verbatim}
+The \var{Name} field is stored not with 255 characters, but with just as many characters
+as required to store the name.
+\begin{verbatim}
+TProcInfoProc = procedure(PropInfo : PPropInfo) of object;
+\end{verbatim}
+The following pointer and array types are used for typecasts:
+\begin{verbatim}
+PPropList = ^TPropList;
+TPropList = array[0..65535] of PPropInfo;
+\end{verbatim}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Functions and procedures
+\section{Functions and Procedures}
+
+\begin{function}{GetTypeData}
+\Declaration
+Function GetTypeData(TypeInfo : PTypeInfo) : PTypeData;
+\Description
+\var{GetTypeData} returns a pointer to the \var{TTypeData} record that
+follows after the \var{TTypeInfo} record pointed to by \var{TypeInfo}.
+It essentially skips the \var{Kind} and \var{Name} fields in the 
+\var{TTypeInfo} record.
+\Errors
+None.
+\SeeAlso
+\end{function}
+
+
+\begin{function}{GetPropInfo}
+\Declaration
+function GetPropInfo(TypeInfo: PTypeInfo; 
+                     const PropName: string) : PPropInfo;
+\Description
+\var{GetPropInfo} returns a pointer to the \var{TPropInfo} record for a the \var{PropName}
+property of a class that has \var{TypeInfo} as class info. 
+\Errors
+If the property \var{PropName} does not exist, \var{Nil} is returned.
+\SeeAlso
+\seep{GetPropInfos},\seef{GetPropList}
+\end{function}
+
+
+\begin{procedure}{GetPropInfos}
+\Declaration
+Procedure GetPropInfos(TypeInfo: PTypeInfo;PropList: PPropList);
+\Description
+\var{GetPropInfos} stores pointers to the property information of all published
+properties of a class with class info \var{TypeInfo} in the list pointed to by
+\var{Proplist}. The \var{PropList} pointer must point to a memory location that
+contains enough space to hold all properties of the class and its parent classes.
+\Errors
+No checks are done to see whether \var{PropList} points to a memory area that 
+is big enough to hold all pointers.
+\SeeAlso
+\seef{GetPropInfo},\seef{GetPropList}
+\end{procedure}
+
+
+\begin{function}{GetPropList}
+\Declaration
+Function GetPropList(TypeInfo : PTypeInfo;
+                     TypeKinds : TTypeKinds; 
+                     PropList : PPropList) : Integer;
+\Description
+\var{GetPropList} stores pointers to property information of the class with class
+info \var{TypeInfo} for properties of kind \var{TypeKinds} in the list pointed to
+by \var{Proplist}. \var{PropList} must contain enough space to hold all properties.
+
+The function returns the number of pointers that matched the criteria and were stored
+in \var{PropList}.
+\Errors
+No checks are done to see whether \var{PropList} points to a memory area that is big enough
+to hold all pointers.
+\SeeAlso
+\seep{GetPropInfos}, \seef{GetPropInfo}
+\end{function}
+
+
+\begin{function}{IsStoredProp}
+\Declaration
+Function IsStoredProp(Instance : TObject;PropInfo : PPropInfo) : Boolean;
+\Description
+\var{IsStoredProp} returns \var{True} if the \var{Stored} modifier evaluates
+to \var{True} for the property described by \var{PropInfo} for object 
+\var{Instance}. It returns \var{False} otherwise. If the function returns
+\var{True}, this indicates that the property should be written when
+streaming the object \var{Instance}.
+
+If there was no \var{stored} modifier in the declaration of the property, 
+\var{True} will be returned. 
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid property of \var{Instance}.
+\SeeAlso
+\end{function}
+
+
+\begin{function}{GetOrdProp}
+\Declaration
+Function GetOrdProp(Instance : TObject;PropInfo : PPropInfo) : Longint;
+\Description
+\var{GetOrdProp} returns the value of the ordinal property described by
+\var{PropInfo} for the object \var{Instance}. The value is returned as a
+longint, which should be typecasted to the needed type.
+
+Ordinal properties that can be retrieved include:
+\begin{description}
+\item[Integers and subranges of integers] The value of the integer will be
+returned.
+\item[Enumerated types and subranges of enumerated types] The ordinal value
+of the enumerated type will be returned.
+\item[Sets] If the base type of the set has less than 31 possible values.
+If a bit is set in the return value, then the corresponding element of the
+base ordinal class of the set type must be included in the set.
+\end{description}
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid ordinal property of \var{Instance}
+\SeeAlso
+\seep{SetOrdProp}, \seef{GetStrProp}, \seef{GetFloatProp},
+\seef{GetInt64Prop},\seef{GetMethodProp}
+
+\end{function}
+
+
+\begin{procedure}{SetOrdProp}
+\Declaration
+Procedure SetOrdProp(Instance : TObject;PropInfo : PPropInfo; Value : Longint);
+\Description
+\var{SetOrdProp} assigns \var{Value} to the the ordinal property described by 
+\var{PropInfo} for the object \var{Instance}. 
+
+Ordinal properties that can be set include:
+\begin{description}
+\item[Integers and subranges of integers] The actual value of the integer must be 
+passed.
+\item[Enumerated types and subranges of enumerated types] The ordinal value
+of the enumerated type must be passed.
+\item[Subrange types] of integers or enumerated types. Here the ordinal
+value must be passed.
+\item[Sets] If the base type of the set has less than 31 possible values.
+For each possible value; the corresponding bit of \var{Value} must be set.
+\end{description}
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid ordinal property of \var{Instance}. 
+No range checking is performed.
+\SeeAlso
+\seef{GetOrdProp}, \seep{SetStrProp}, \seep{SetFloatProp},
+\seep{SetInt64Prop},\seep{SetMethodProp}
+\end{procedure}
+
+
+\begin{function}{GetStrProp}
+\Declaration
+Function GetStrProp(Instance : TObject;PropInfo : PPropInfo) : Ansistring;
+\Description
+\var{GetStrProp} returns the value of the string property described by
+\var{PropInfo} for object \var{Instance}. 
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid string property of \var{Instance}.
+\SeeAlso
+\seep{SetStrProp}, \seef{GetOrdProp}, \seef{GetFloatProp},
+\seef{GetInt64Prop},\seef{GetMethodProp}
+\end{function}
+
+\begin{procedure}{SetStrProp}
+\Declaration
+    procedure SetStrProp(Instance : TObject;PropInfo : PPropInfo;
+      const Value : Ansistring);
+\Description
+\var{GetStrProp} assigns \var{Value} to the string property described by
+\var{PropInfo} for object \var{Instance}. 
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid string property of \var{Instance}.
+\SeeAlso
+\seef{GetStrProp}, \seep{SetOrdProp}, \seep{SetFloatProp},
+\seep{SetInt64Prop},\seep{SetMethodProp}
+
+
+\end{procedure}
+
+\begin{function}{GetFloatProp}
+\Declaration
+Function GetFloatProp(Instance : TObject;PropInfo : PPropInfo) : Extended;
+\Description
+\var{GetFloatProp} returns the value of the float property described by 
+\var{PropInfo} for the object \var{Instance}. All float types are converted
+to extended.
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid float property of \var{Instance}.
+\SeeAlso
+\seep{SetFloatProp}, \seef{GetOrdProp}, \seef{GetStrProp},
+\seef{GetInt64Prop},\seef{GetMethodProp}
+\end{function}
+
+
+\begin{procedure}{SetFloatProp}
+\Declaration
+Procedure SetFloatProp(Instance : TObject;
+                       PropInfo : PPropInfo;
+                       Value : Extended);
+\Description
+\var{SetFloatProp} assigns \var{Value} to the property described by
+\var{PropInfo} for the object \var{Instance}.
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid float property of \var{Instance}.
+\SeeAlso
+\seef{GetFloatProp}, \seep{SetOrdProp}, \seep{SetStrProp},
+\seep{SetInt64Prop},\seep{SetMethodProp}
+
+\end{procedure}
+
+
+\begin{function}{GetVariantProp}
+\Declaration
+Function GetVariantProp(Instance : TObject;PropInfo : PPropInfo): Variant;
+\Description
+Not yet implemented. Provided for Delphi compatibility only.
+\Errors
+\SeeAlso
+\end{function}
+
+
+\begin{procedure}{SetVariantProp}
+\Declaration
+Procedure SetVariantProp(Instance : TObject;
+                         PropInfo : PPropInfo;
+                         Const Value: Variant);
+\Description
+Not yet implemented. Provided for Delphi compatibility only.
+\Errors
+\SeeAlso
+\end{procedure}
+
+
+\begin{function}{GetMethodProp}
+\Declaration
+Function GetMethodProp(Instance : TObject;PropInfo : PPropInfo) : TMethod;
+\Description
+\var{GetMethodProp} returns the method the property described by
+\var{PropInfo} for object \var{Instance}.
+The return type \var{TMethod} is defined in the \file{SysUtils} unit as:
+\begin{verbatim}
+TMethod = packed record
+  Code, Data: Pointer;
+end;                                                                         
+\end{verbatim}
+\var{Data} points to the instance of the class with the method \var{Code}.
+
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid method property of \var{Instance}.
+\SeeAlso
+\seep{SetMethodProp}, \seef{GetOrdProp}, \seef{GetStrProp},
+\seef{GetFloatProp}, \seef{GetInt64Prop}
+\end{function}
+
+
+\begin{procedure}{SetMethodProp}
+\Declaration
+Procedure SetMethodProp(Instance : TObject;PropInfo : PPropInfo; const Value : TMethod);
+\Description
+\var{SetMethodProp} assigns \var{Value} to the method the property described 
+by \var{PropInfo} for object \var{Instance}.
+
+The type \var{TMethod} of the \var{Value} parameter is defined in the
+\file{SysUtils} unit as:
+\begin{verbatim}
+TMethod = packed record
+  Code, Data: Pointer;
+end;                                                                         
+\end{verbatim}
+\var{Data} should point to the instance of the class with the method \var{Code}.
+
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid method property of \var{Instance}.
+\SeeAlso
+\seef{GetMethodProp}, \seep{SetOrdProp}, \seep{SetStrProp},
+\seep{SetFloatProp}, \seep{SetInt64Prop}
+\end{procedure}
+
+\begin{function}{GetInt64Prop}
+\Declaration
+Function GetInt64Prop(Instance: TObject; PropInfo: PPropInfo): Int64;
+\Description
+\var{GetInt64Prop} returns the value of the property of type
+\var{Int64} that is described by \var{PropInfo} for the object
+\var{Instance}.
+
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid \var{Int64} property of \var{Instance}.
+\SeeAlso
+\seep{SetInt64Prop}, \seef{GetOrdProp}, \seef{GetStrProp},
+\seef{GetFloatProp}, \seef{GetMethodProp}
+
+\end{function}
+
+\begin{procedure}{SetInt64Prop}
+\Declaration
+Procedure SetInt64Prop(Instance: TObject; PropInfo: PPropInfo; const Value: Int64);
+\Description
+\var{SetInt64Prop} assigns \var{Value} to the property of type
+\var{Int64} that is described by \var{PropInfo} for the object
+\var{Instance}.
+\Errors
+No checking is done whether \var{Instance} is non-nil, or whether
+\var{PropInfo} describes a valid \var{Int64} property of \var{Instance}.
+\SeeAlso
+\seef{GetInt64Prop}, \seef{GetMethodProp}, \seep{SetOrdProp}, \seep{SetStrProp},
+\seep{SetFloatProp}
+\end{procedure}
+
+\begin{function}{GetEnumName}
+\Declaration
+Function GetEnumName(TypeInfo : PTypeInfo;Value : Integer) : string;
+\Description
+\var{GetEnumName} scans the type information for the enumeration type
+desribed by \var{TypeInfo} and returns the name of the enumeration 
+constant for the element with ordinal value equal to \var{Value}.
+
+If \var{Value} is out of range, the first element of the enumeration type
+is returned. The result is lowercased, but this may change in the future.
+
+This can be used in combination with \var{GetOrdProp} to stream a property
+of an enumerated type.
+\Errors
+No check is done whether \var{TypeInfo} points to the type information
+for an enumerated type. 
+\SeeAlso
+\seef{GetOrdProp}, \seef{GetEnumValue}
+\end{function}
+
+\begin{function}{GetEnumValue}
+\Declaration
+Function GetEnumValue(TypeInfo : PTypeInfo;const Name : string) : Integer;
+\Description
+\var{GetEnumValue} scans the type information for the enumeration type
+described by \var{TypeInfor} and returns the ordinal value for the element
+in the enumerated type that has identifier \var{Name}. The identifier is
+searched in a case-insensitive manner.
+
+This can be used to set the value of enumerated properties from a stream. 
+\Errors
+If \var{Name} is not found in the list of enumerated values, then -1 is
+returned. No check is done whether \var{TypeInfo} points to the type information
+for an enumerated type. 
+\SeeAlso
+\seef{GetEnumName}, \seep{SetOrdProp}
+\end{function}