fpc/rtl/objpas/typinfo.pp
1998-09-06 21:27:05 +00:00

156 lines
4.3 KiB
ObjectPascal

{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1998 by Florian Klaempfl
member of the Free Pascal development team
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program 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.
**********************************************************************}
{ This unit provides the same functionality as the TypInfo Unit }
{ of Delphi }
unit typinfo;
interface
uses
sysutils;
type
{$MINENUMSIZE 1 this saves a lot of memory }
// if you change one of the following enumeration types
// you have also to change the compiler in an appropriate way !
TTypeKind = (tkUnknown,tkInteger,tkChar,tkEnumeration,
tkFloat,tkSet,tkMethod,tkSString,tkLString,tkAString,
tkWString,tkVariant,tkArray,tkRecord,tkInterface,
tkClass,tkObject,tkWChar);
TTOrdType = (otSByte,otUByte,otSWord,otUWord,otSLong,otULong);
TFloatType = (ftSingle,ftDouble,ftExtended,ftComp,ftCurr,
ftFixed16,ftFixed32);
{$MINENUMSIZE DEFAULT}
const
tkString = tkSString;
type
TMethodKind = Byte;
TTypeKinds = set of TTypeKind;
TTypeInfo = record
Kind : TTypeKind;
Name : ShortString;
end;
PTypeInfo = ^TTypeInfo;
PPTypeInfo = ^PTypeInfo;
PTypeData = ^TTypeData;
TTypeData = packed record
case TTypeKind of
tkUnKnown,tkLString,tkWString,tkAString,tkVariant:
();
tkInteger,tkChar,tkEnumeration,tkWChar:
( //!!!!! To be added );
tkFloat:
(FloatType : TFloatType);
tkSString:
(MaxLength : Byte);
tkClass:
(ClassType : TClass;
ParentInfo : PTypeInfo;
PropCount : SmallInt;
UnitName : ShortString;
end;
PPropInfo = ^TPropInfo;
TPropInfo = packed record
PropType : PTypeInfo;
GetProc : Pointer;
SetProc : Pointer;
StoredProc : Pointer;
Index : Integer;
Default : Longint;
NameIndex : SmallInt;
Name : ShortString;
end;
TProcInfoProc = procedure(PropInfo : PPropInfo) of object;
PPropList = ^TPropList;
TPropList = array[0..65535] of PPropInfo;
const
tkAny = [Low(TTypeKind)..High(TTypeKind)];
tkMethods = [tkMethod];
tkProperties = tkAny-tkMethods-[tkUnknown];
// just skips the id and the name
function GetTypeData(TypeInfo : PTypeInfo) : PTypeData;
// searches in the property PropName
function GetPropInfo(TypeInfo : PTypeInfo;const PropName : string) : PPropInfo;
procedure GetPropInfos(TypeInfo : PTypeInfo;PropList : PPropList);
function GetPropList(TypeInfo : PTypeInfo;TypeKinds : TTypeKinds;
PropList : PPropList) : Integer;
implementation
function GetTypeData(TypeInfo : PTypeInfo) : PTypeData;
begin
GetTypeData:=PTypeData(TypeInfo)+2+PByte(TypeInfo+1)^;
end;
function GetPropInfo(TypeInfo : PTypeInfo;const PropName : string) : PPropInfo;
var
hp : PTypeData;
begin
Result:=Nil;
while Assigned(hp) do
begin
// skip the name
hp:=GetTypeData;
// the class info rtti the property rtti follows
// immediatly
Result:=PPropInfo(@hp^.UnitName)+byte(hp^.UnitName[0])+1;
for i:=1 to hp^.PropCount do
begin
// found a property of that name ?
if Result^.Name=PropName then
exit;
// skip to next property
Result:=PPropInfo(@Result^.Name)+byte(Result^.Name[0])+1;
end;
// parent class
hp:=hp^.ParentInfo;
end;
end;
end.
{
$Log$
Revision 1.2 1998-09-06 21:27:05 florian
+ some methods and declarations added
Revision 1.1 1998/08/25 22:30:00 florian
+ initial revision:
o constants
o basic type data record
}