Форум: "Основная";
Текущий архив: 2013.12.29;
Скачать: [xml.tar.bz2];
ВнизКак получить полный список опубликованных свойств класса? Найти похожие ветки
← →
goodveen © (2011-10-30 14:58) [0]Как программно получить полный список опубликованных свойств класса?
Почему я получаю информацию только о двух свойствах - 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;
...
← →
Юрий Зотов © (2011-10-30 17:39) [1]Для свойств типа record не строится RTTI. Разделите Position на 2 отдельных свойства - X и Y.
PS
Почему Width и Height имеют тип single? Так и должно быть, или все же это целые числа?
← →
MBo © (2011-10-30 17:50) [2]А новые возможности RTTI в 2009 уже есть, или в более поздних версиях появились?
← →
MBo © (2011-10-30 18:53) [3]Пардон, пошукал - новый rtti введён в 2010
← →
goodveen © (2011-10-30 20:49) [4]Это я для наглядности и простоты использовал тип TPoint.
На самом деле должно использоваться множество составных типов (например TFont). Если все раскладывать на простые типы - будет каша.
А каким образом встроенный редактор свойств работает с такими типами?
← →
jack128_ (2011-10-30 21:27) [5]
> А каким образом встроенный редактор свойств работает с такими
> типами?
а встроенный редактор и не работает со свойствами-record"ами. Со свойствами-наследниками TPersistent - другое дело.
← →
goodveen © (2011-10-30 22:13) [6]RTTI в Delphi 2010 (Delphi XE/DELPHI XE2) избавлена от этих ограничений или изменения не коснулись базовых возможностей?
← →
RTFM (2011-10-31 16:48) [7]TFont - это объект. TPoint - это запись.
Более того, TFont - это наследник TPersistent. Что означает, что у него RTTI включена автоматически.
Итого: юзайте классы, либо наследуемые от TPersistent, либо с явно включаемым RTTI через {$M+} (F1: http://docwiki.embarcadero.com/RADStudio/en/Run-Time_Type_Information_(Delphi) ). Не используйте записи и другие типы, информации для которых не генерируется.
← →
MBo © (2011-10-31 17:10) [8]
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)
← →
goodveen © (2011-10-31 18:41) [9]С TFont неудачный пример.
И все же, новый RTTI Delphi 2010 (XE/XE2) позволяет получить информацию о Recorod-типах без дополнительных телодвижений (директив компилятора {$TYPEINFO ON} {$METHODINFO ON} и т.п.)?
← →
MBo © (2011-11-01 07:13) [10]постом выше - пример дополнительных телодвижений в XE для получения части информации о типах потрохов объекта.
← →
goodveen © (2011-11-01 17:43) [11]Всем спасибо.
Тема закрыта.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2013.12.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c