uses TypInfo; {获取类的信息, 需要这个单元}
//获取对象的 RTTI 属性与事件的函数function GetPropertyAndEventList(obj: TObject; pList,eList: TStringList): Boolean;var ClassTypeInfo: PTypeInfo; {类的信息结构指针} ClassDataInfo: PTypeData; {类的数据结构指针} propertyList : PPropList; {TPropInfo 是属性的数据结构; PPropList 是其指针; TPropList 是属性结构指针的列表数组; PPropList 是指向这个数组的指针}num : Integer; {记录属性的总数}
size: Integer; {记录属性结构的大小} i: Integer; begin ClassTypeInfo := obj.ClassInfo; {先获取: 类的信息结构指针} ClassDataInfo := GetTypeData(ClassTypeInfo); {再获取: 类的数据结构指针} num := ClassDataInfo.PropCount; {属性总数} size := SizeOf(TPropInfo); {属性结构大小}GetMem(propertyList, size*num); {给属性数组分配内存}
GetPropInfos(ClassTypeInfo, propertyList); {获取属性列表}
for i := 0 to num - 1 do
begin if propertyList[i].PropType^.Kind = tkMethod then {如果是事件; 事件也是属性吗, 给分出来} eList.Add(propertyList[i].Name) else pList.Add(propertyList[i].Name); end;pList.Sort; eList.Sort; {排序}
FreeMem(propertyList); {释放属性数组的内存}
Result := True;
end; //测试procedure TForm1.Button1Click(Sender: TObject);var PL,EL: TStringList;begin PL := TStringList.Create; EL := TStringList.Create;Memo1.Clear;
Memo2.Clear;GetPropertyAndEventList(Self, PL, EL); {调用函数, 第一个参数是对象名}
Memo1.Lines := PL; Memo2.Lines := EL;PL.Free;
EL.Free;end;end.