关于RTTI的问题!!! ( 积分: 200 )

  • 主题发起人 主题发起人 sundayboys
  • 开始时间 开始时间
S

sundayboys

Unregistered / Unconfirmed
GUEST, unregistred user!
我查看了delphibbs以前的一些帖子关于如何动态取得控件published属性的, 我在使用高手们提供的过程中,出现一点小问题,所以还想请教一下.问题是这样的,我自己有一个类,继承自TObject,可以调用下面的过程时:
procedure GetClassProperties1(AClass: TClass
AStrings: TStrings);
var
PropCount, I: SmallInt;
PropList: PPropList;
PropStr: string;
begin
PropCount := GetTypeData(AClass.ClassInfo).PropCount;
GetPropList(AClass.ClassInfo, PropList);
for I := 0 to PropCount - 1 do
begin
case PropList^.PropType^.Kind of
tkClass : PropStr := '[Class] ';
tkMethod : PropStr := '[Method]';
tkSet : PropStr := '[Set] ';
tkEnumeration: PropStr := '[Enum] ';
else
PropStr := '[Field] ';
end;
PropStr := PropStr + PropList^.Name;
PropStr := PropStr + ': ' + PropList^.PropType^.Name;
AStrings.Add(PropStr);
end;
FreeMem(PropList);
end;

procedure GetClassProperties(AClass: TObject
AStrings: TStrings);
{ This method retrieves the property names and types for the given object
and adds that information to the AStrings parameter. }
var
PropList: PPropList;
ClassTypeInfo: PTypeInfo;
ClassTypeData: PTypeData;
i: integer;
NumProps: Integer;
begin
ClassTypeInfo := aClass.ClassType.ClassInfo ;
ClassTypeData := GetTypeData(ClassTypeInfo);
if ClassTypeData.PropCount <> 0 then
begin
GetMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
try
GetPropInfos(AClass.ClassInfo, PropList);
for i := 0 to ClassTypeData.PropCount - 1 do
if not (PropList^.PropType^.Kind = tkMethod) then
AStrings.Add(Format('%s: %s', [PropList^.Name, PropList^.PropType^.Name]));
NumProps := GetPropList(AClass.ClassInfo, [tkMethod], PropList);
if NumProps <> 0 then begin
AStrings.Add('');
AStrings.Add(' EVENTS ================ ');
AStrings.Add('');
end;
// Fill the AStrings with the events.
for i := 0 to NumProps - 1 do
AStrings.Add(Format('%s: %s', [PropList^.Name, PropList^.PropType^.Name]));

finally
FreeMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
end;
end;
end;

无论调用那个过程,都说AClass.ClassInfo为nil,我认为TObject也存在VTM的,为什么会为nil呢?望高手给说一下,是不是TObject不存在VTM?如果不存在那我继承自TObject类的published属性,编译器把它放到哪儿了?
 
我查看了delphibbs以前的一些帖子关于如何动态取得控件published属性的, 我在使用高手们提供的过程中,出现一点小问题,所以还想请教一下.问题是这样的,我自己有一个类,继承自TObject,可以调用下面的过程时:
procedure GetClassProperties1(AClass: TClass
AStrings: TStrings);
var
PropCount, I: SmallInt;
PropList: PPropList;
PropStr: string;
begin
PropCount := GetTypeData(AClass.ClassInfo).PropCount;
GetPropList(AClass.ClassInfo, PropList);
for I := 0 to PropCount - 1 do
begin
case PropList^.PropType^.Kind of
tkClass : PropStr := '[Class] ';
tkMethod : PropStr := '[Method]';
tkSet : PropStr := '[Set] ';
tkEnumeration: PropStr := '[Enum] ';
else
PropStr := '[Field] ';
end;
PropStr := PropStr + PropList^.Name;
PropStr := PropStr + ': ' + PropList^.PropType^.Name;
AStrings.Add(PropStr);
end;
FreeMem(PropList);
end;

procedure GetClassProperties(AClass: TObject
AStrings: TStrings);
{ This method retrieves the property names and types for the given object
and adds that information to the AStrings parameter. }
var
PropList: PPropList;
ClassTypeInfo: PTypeInfo;
ClassTypeData: PTypeData;
i: integer;
NumProps: Integer;
begin
ClassTypeInfo := aClass.ClassType.ClassInfo ;
ClassTypeData := GetTypeData(ClassTypeInfo);
if ClassTypeData.PropCount <> 0 then
begin
GetMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
try
GetPropInfos(AClass.ClassInfo, PropList);
for i := 0 to ClassTypeData.PropCount - 1 do
if not (PropList^.PropType^.Kind = tkMethod) then
AStrings.Add(Format('%s: %s', [PropList^.Name, PropList^.PropType^.Name]));
NumProps := GetPropList(AClass.ClassInfo, [tkMethod], PropList);
if NumProps <> 0 then begin
AStrings.Add('');
AStrings.Add(' EVENTS ================ ');
AStrings.Add('');
end;
// Fill the AStrings with the events.
for i := 0 to NumProps - 1 do
AStrings.Add(Format('%s: %s', [PropList^.Name, PropList^.PropType^.Name]));

finally
FreeMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
end;
end;
end;

无论调用那个过程,都说AClass.ClassInfo为nil,我认为TObject也存在VTM的,为什么会为nil呢?望高手给说一下,是不是TObject不存在VTM?如果不存在那我继承自TObject类的published属性,编译器把它放到哪儿了?
 

Similar threads

I
回复
0
查看
416
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
551
import
I
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部