123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- Program trtti1;
- {$Mode Delphi}
- {$M+}
- Uses
- Rttiobj,Typinfo;
- Procedure DumpMem ( PL : PByte );
- Var I,j : longint;
- begin
- For I:=1 to 16 do
- begin
- Write ((I-1)*16:3,' :');
- For J:=1 to 10 do
- begin
- If (PL^>31) and (PL^<129) then
- Write(' ',CHar(PL^))
- else
- Write (PL^:3);
- Write (' ');
- inc(pl);
- end;
- writeln;
- end;
- end;
- Function ProcType (PP : Byte) : String;
- begin
- Case PP and 3 of
- ptfield : Result:='from Field';
- ptstatic : Result:='with static method';
- ptVirtual : Result:='with virtual method';
- ptconst : Result:='with Const';
- end;
- end;
- Procedure DumpTypeInfo (O : TMyTestObject);
- Var
- PT : PTypeData;
- PI : PTypeInfo;
- I : Longint;
- PP : PPropList;
- begin
- PI:=O.ClassInfo;
- Writeln ('Type kind : ',TypeNames[PI^.Kind]);
- Writeln ('Type name : ',PI^.Name);
- PT:=GetTypeData(PI);
- //DumpMem(PByte(PI));
- If PT^.ParentInfo=Nil then
- Writeln ('Object has no parent info')
- else
- Writeln ('Object has parent info');
- Writeln ('Property Count : ',PT^.PropCount);
- Writeln ('Unit name : ',PT^.UnitName);
- GetMem (PP,PT^.PropCount*SizeOf(Pointer));
- GetPropInfos(PI,PP);
- For I:=0 to PT^.PropCount-1 do
- If PP^[i]<>Nil then
- With PP^[I]^ do
- begin
- Writeln ('Property name : ',Name);
- Writeln (' Type kind: ',TypeNames[PropType^.Kind]);
- Writeln (' Type Name: ',PropType^.Name);
- If GetProc=Nil then Write ('No');
- Writeln (' Getproc available');
- If SetProc=Nil then Write ('No');
- Writeln (' Setproc available');
- If StoredProc=Nil then Write ('No');
- Writeln (' Storedproc available');
- Writeln (' Get property ',proctype(Propprocs));
- Writeln (' Set Property ',proctype(propprocs shr 2));
- Writeln (' Stored Property ',proctype(propprocs shr 4));
- Writeln (' Default : ',Default,' Index : ',Index);
- Writeln (' NameIndex : ',NameIndex);
- end;
- end;
- Procedure PrintObject ( Obj: TMyTestObject);
- begin
- With Obj do
- begin
- Writeln ('Field properties :');
- Writeln ('Property booleanField : ',booleanField);
- Writeln ('Property ByteField : ',ByteField);
- Writeln ('Property CharField : ',CharField);
- Writeln ('Property WordField : ',WordField);
- Writeln ('Property IntegerField : ',IntegerField);
- Writeln ('Property LongintField : ',LongintField);
- Writeln ('Property CardinalField : ',CardinalField);
- Writeln ('Property RealField : ',RealField);
- Writeln ('Property ExtendedField : ',ExtendedFIeld);
- Writeln ('Property AnsiStringField : ',AnsiStringField);
- Writeln ('Property MyEnumField : ',ord(MyEnumField));
- Writeln ('Method properties :');
- Writeln ('Property booleanMethod : ',BooleanMethod);
- Writeln ('Property ByteMethod : ',ByteMethod);
- Writeln ('Property CharMethod : ',CharMethod);
- Writeln ('Property WordMethod : ',WordMethod);
- Writeln ('Property IntegerMethod : ',IntegerMethod);
- Writeln ('Property LongintMethod : ',LongintMethod);
- Writeln ('Property CardinalMethod : ',CardinalMethod);
- Writeln ('Property RealMethod : ',RealMethod);
- Writeln ('Property ExtendedMethod : ',ExtendedMethod);
- Writeln ('Property AnsiStringMethod : ',AnsiStringMethod);
- Writeln ('Property MyEnumMethod : ',ord(MyEnumMethod));
- Writeln ('VirtualMethod properties :');
- Writeln ('Property booleanVirtualMethod : ',BooleanVirtualMethod);
- Writeln ('Property ByteVirtualMethod : ',ByteVirtualMethod);
- Writeln ('Property CharVirtualMethod : ',CharVirtualMethod);
- Writeln ('Property WordVirtualMethod : ',WordVirtualMethod);
- Writeln ('Property IntegerVirtualMethod : ',IntegerVirtualMethod);
- Writeln ('Property LongintVirtualMethod : ',LongintVirtualMethod);
- Writeln ('Property CardinalVirtualMethod : ',CardinalVirtualMethod);
- Writeln ('Property RealVirtualMethod : ',RealVirtualMethod);
- Writeln ('Property ExtendedVirtualMethod : ',ExtendedVirtualMethod);
- Writeln ('Property AnsiStringVirtualMethod : ',AnsiStringVirtualMethod);
- Writeln ('Property MyEnumVirtualMethod : ',ord(MyEnumVirtualMethod));
- end;
- end;
- Procedure TestGet (O : TMyTestObject);
- Var
- PT : PTypeData;
- PI : PTypeInfo;
- I,J : Longint;
- PP : PPropList;
- prI : PPropInfo;
- begin
- PI:=O.ClassInfo;
- Writeln ('Type kind : ',TypeNames[PI^.Kind]);
- Writeln ('Type name : ',PI^.Name);
- PT:=GetTypeData(PI);
- If PT^.ParentInfo=Nil then
- Writeln ('Object has no parent info')
- else
- Writeln ('Object has parent info');
- Writeln ('Property Count : ',PT^.PropCount);
- Writeln ('Unit name : ',PT^.UnitName);
- GetMem (PP,PT^.PropCount*SizeOf(Pointer));
- GetPropInfos(PI,PP);
- For I:=0 to PT^.PropCount-1 do
- begin
- pri:=PP^[i];
- With Pri^ do
- begin
- Write ('(Examining ',name,' : Type : ',TypeNames[PropType^.Kind],', ');
- If (Proptype^.kind in Ordinaltypes) Then
- begin
- J:=GetOrdProp(O,pri);
- Write ('Value : ',j);
- If PropType^.Kind=tkenumeration then
- Write ('(=',GetEnumName(Proptype,J),')')
- end
- else
- Case pri^.proptype^.kind of
- tkfloat : begin
- Write ('Value : ');
- Flush(output);
- Write(GetFloatProp(O,pri))
- end;
- tkAstring : begin
- Write ('value : ');
- flush (output);
- Write(GetStrProp(O,Pri));
- end;
- else
- Write ('Untested type:',ord(pri^.proptype^.kind));
- end;
- Writeln (')');
- end;
- end;
- end;
- Var O : TMyTestObject;
- begin
- O:=TMyTestObject.Create;
- DumpTypeInfo(O);
- PrintObject(O);
- testget(o);
- end.
|