Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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? Так и должно быть, или все же это целые числа?


Наверх

Титульная страница Поиск, карта сайта Написать письмо