Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1373315402
Юрий
2013-07-09 00:30
2013.12.29
С днем рождения ! 9 июля 2013 вторник


15-1373574372
Rouse_
2013-07-12 00:26
2013.12.29
А давайте померяемся :)


1-1319975920
goodveen
2011-10-30 14:58
2013.12.29
Как получить полный список опубликованных свойств класса?


15-1373211313
maxfox123
2013-07-07 19:35
2013.12.29
Кодирование плат


15-1373129195
Германн
2013-07-06 20:46
2013.12.29
Хреновина с опцией компилятора





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский