最近在写脚本生成,所以用到了RTTI的系列方法,记载记之。
class function TSomeClass.GetCtmWnd(Component: TComponent): TPersistent;
var
PropList: PPropList;
ClassTypeInfo: PTypeInfo;
classTypeData: PTypeData;
vSize: integer;
vPropName: string;
vObject: TObject;
i: integer;
begin
result := nil;
ClassTypeInfo := Component.ClassInfo;
ClassTypeData := GetTypeData(ClassTypeInfo);
if ClassTypeData.PropCount <> 0 then
begin
vSize := SizeOf(PPropInfo) * ClassTypeData.PropCount;
GetMem(PropList, vSize);
try
GetPropInfos(Component.ClassInfo, PropList);
for i := 0 to ClassTypeData.PropCount - 1 do
begin
if PropList[i]^.PropType^.Kind = tkClass then
begin
vPropName := PropList[i]^.Name;
vObject := GetObjectProp(Component, vPropName);
if vObject is TPersistent then
begin
result := TPersistent(vObject);
break;
end;
end;
end;
finally
FreeMem(PropList, vSize);
end;
end;
end;
class function TSomeClass.GetCtmWnd(Component: TComponent): TPersistent;
var
PropList: PPropList;
ClassTypeInfo: PTypeInfo;
classTypeData: PTypeData;
vSize: integer;
vPropName: string;
vObject: TObject;
i: integer;
begin
result := nil;
ClassTypeInfo := Component.ClassInfo;
ClassTypeData := GetTypeData(ClassTypeInfo);
if ClassTypeData.PropCount <> 0 then
begin
vSize := SizeOf(PPropInfo) * ClassTypeData.PropCount;
GetMem(PropList, vSize);
try
GetPropInfos(Component.ClassInfo, PropList);
for i := 0 to ClassTypeData.PropCount - 1 do
begin
if PropList[i]^.PropType^.Kind = tkClass then
begin
vPropName := PropList[i]^.Name;
vObject := GetObjectProp(Component, vPropName);
if vObject is TPersistent then
begin
result := TPersistent(vObject);
break;
end;
end;
end;
finally
FreeMem(PropList, vSize);
end;
end;
end;