![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить полный список опубликованных свойств класса?
goodveen © (2011-10-30 14:58:00)Как программно получить полный список опубликованных свойств класса?
Почему я получаю информацию только о двух свойствах - Width и Height?
Пользую Delphi 2009 Update 3.
...
uses
TypInfo;
...
Type
TFirstObject = class(TPersistent)
Private
FPosition : TPoint;
FWidth : Single;
FHeight : Single;
Public
Constructor Create; Virtual;
Function Load (Stream : TStream): Boolean; Virtual; Abstract;
Function Save (Stream : TStream): Boolean; Virtual; Abstract;
Published
Property Width : Single Read FWidth Write FWidth;
Property Height : Single Read FHeight Write FHeight;
Property Position : TPoint Read FPosition Write FPosition;
End;
...
Procedure GetComponentProperties (Instance: TPersistent);
var
I, Count : Integer;
PropInfo : PPropInfo;
PropList : PPropList;
begin
Count := GetTypeData(Instance.ClassInfo)^.PropCount;
if Count > 0 then
begin
GetMem(PropList, Count * SizeOf(Pointer));
try
GetPropInfos(Instance.ClassInfo, PropList);
for I := 0 to Count - 1 do
begin
...
end;
finally
FreeMem(PropList);
end;
end;
end;
...
Procedure Test;
var
Obj : TFirstObject;
Begin
Obj:=TFirstObject.Create;
GetComponentProperties(Obj);
...
End;
...
goodveen (2011-11-01 17:43:00) [1]Всем спасибо.
Тема закрыта.
MBo (2011-11-01 07:13:00) [2]постом выше - пример дополнительных телодвижений в XE для получения части информации о типах потрохов объекта.
goodveen (2011-10-31 18:41:00) [3]С TFont неудачный пример.
И все же, новый RTTI Delphi 2010 (XE/XE2) позволяет получить информацию о Recorod-типах без дополнительных телодвижений (директив компилятора {$TYPEINFO ON} {$METHODINFO ON} и т.п.)?
MBo (2011-10-31 17:10:00) [4]
i: Integer;
rttiContext: TRttiContext;
rttiType: TRttiType;
fields: TArray<TRttiField>;
properties: TArray<TRttiProperty>;
fo: TFirstObject;
begin
fo := TFirstObject.Create;
fo.Width := Pi;
rttiType := rttiContext.GetType(TypeInfo(TFirstObject));
fields := rttiType.GetFields;
for i := low(fields) to high(fields) do
Memo1.Lines.Add(fields[i].Name + ':' + fields[i].FieldType.ToString);
properties := rttiType.GetProperties;
for i := low(properties) to high(properties) do
begin
Memo1.Lines.Add(properties[i].Name + ':' +
properties[i].PropertyType.QualifiedName + ':::' +
properties[i].GetValue(fo).ToString);
end;
вывод:
FPosition:TPoint
FWidth:Single
FHeight:Single
Width:System.Single:::3,14159274101257
Height:System.Single:::0
Position:Types.TPoint:::(record)
RTFM (2011-10-31 16:48:00) [5]TFont - это объект. TPoint - это запись.
Более того, TFont - это наследник TPersistent. Что означает, что у него RTTI включена автоматически.
Итого: юзайте классы, либо наследуемые от TPersistent, либо с явно включаемым RTTI через {$M+} (F1: http://docwiki.embarcadero.com/RADStudio/en/Run-Time_Type_Information_(Delphi) ). Не используйте записи и другие типы, информации для которых не генерируется.
goodveen (2011-10-30 22:13:00) [6]RTTI в Delphi 2010 (Delphi XE/DELPHI XE2) избавлена от этих ограничений или изменения не коснулись базовых возможностей?
jack128_ (2011-10-30 21:27:00) [7]
> А каким образом встроенный редактор свойств работает с такими
> типами?
а встроенный редактор и не работает со свойствами-record'ами. Со свойствами-наследниками TPersistent - другое дело.
goodveen (2011-10-30 20:49:00) [8]Это я для наглядности и простоты использовал тип TPoint.
На самом деле должно использоваться множество составных типов (например TFont). Если все раскладывать на простые типы - будет каша.
А каким образом встроенный редактор свойств работает с такими типами?
MBo (2011-10-30 18:53:00) [9]Пардон, пошукал - новый rtti введён в 2010
MBo (2011-10-30 17:50:00) [10]А новые возможности RTTI в 2009 уже есть, или в более поздних версиях появились?
Юрий Зотов (2011-10-30 17:39:00) [11]Для свойств типа record не строится RTTI. Разделите Position на 2 отдельных свойства - X и Y.
PS
Почему Width и Height имеют тип single? Так и должно быть, или все же это целые числа?