Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.12.29;
Скачать: CL | DM;

Вниз

Как получить полный список опубликованных свойств класса?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.005 c
15-1373488202
Юрий
2013-07-11 00:30
2013.12.29
С днем рождения ! 11 июля 2013 четверг


15-1373315402
Юрий
2013-07-09 00:30
2013.12.29
С днем рождения ! 9 июля 2013 вторник


15-1372134518
[ВладОшин]
2013-06-25 08:28
2013.12.29
PLSQL developer настроить на показ длиных number


2-1362606625
__meat__
2013-03-07 01:50
2013.12.29
Не работает отладка


15-1373574603
Юрий
2013-07-12 00:30
2013.12.29
С днем рождения ! 12 июля 2013 пятница