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

Вниз

Проблема с GetPropInfo   Найти похожие ветки 

 
Ridlypoot ©   (2011-03-20 22:15) [0]

Есть два класса

{$M+}
 TEditorTest = class (TTest)
   published
     property RA;
 end;
{$M-}

и

{$M+}
TTest= class(TParentTest)
  private
    FRA: String;
  public
    property RA: String read FRA write FRA;
end;
{$M-}

...
...
var
 Test: TTest;
...
...
GetPropInfo(TEditorTest(Test), "RA");


Проблема в том, что GetPropInfo возвращает nil. Но если просто обратиться к свойству RA, TEditorTest(Test).RA, то всё вполне удачно. Подскажите, как можно решить эту проблему?


 
Игорь Шевченко ©   (2011-03-20 23:57) [1]

GetPropInfo(Test as TEditorTest, "RA"); ?


 
Ridlypoot ©   (2011-03-21 01:37) [2]

Invalid typecast


 
Игорь Шевченко ©   (2011-03-21 10:48) [3]

Invalid typecast

значит, оно не того типа


 
ridlypoot ©   (2011-03-21 11:33) [4]

Но ведь такой тайпкаст вполне работает TEditorTest(Test), и даже TEditorTest(Test).RA работает.


 
Юрий Зотов ©   (2011-03-21 12:33) [5]

1. В классе TEditorTest уберите директиву $M.

2. Если объект создавался так:
Test := TTest.Create;
то приведение к потомку с проверкой
Test as TEditorTest
даст Invalid typecast
а приведение к потомку БЕЗ проверки
TEditorTest(Test)
ошибки не даст, но GetPropInfo вернет nil (поскольку RTTI для него реально нет).


 
Игорь Шевченко ©   (2011-03-21 13:40) [6]


> Но ведь такой тайпкаст вполне работает TEditorTest(Test)


Это не тайпкаст


 
ridlypoot ©   (2011-03-21 14:46) [7]

То есть нет варианта, как получить GetPropInfo для свойства RA от TEditorTestб но объекта типа TTest? Даже при учёте, что TEditorTest не создаёт в памяти новых полей?


 
Игорь Шевченко ©   (2011-03-21 15:43) [8]


> но объекта типа TTest


у него нет PropInfo


 
Юрий Зотов ©   (2011-03-21 16:18) [9]


> ridlypoot ©   (21.03.11 14:46) [7]
> То есть нет варианта, как получить GetPropInfo для свойства
> RA от TEditorTestб но объекта типа TTest?

У объекта TTest свойство RA - public, поэтому оно не имеет RTTI и получить для него PropInfo нельзя.

У объекта TEditorTest свойство RA - published, поэтому оно имеет RTTI и получить для него PropInfo можно. Но для этого надо создавать объект именно класса TEditorTest, а не TTest:

var
 Test: TTest;
===
Test := TEditorTest.Create;

Теперь можно получать PropInfo, причем приведение типа даже и не потребуется. Только директиву $M для класса TEditorTest надо убрать, а для TTest - оставить.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.097 c
15-1349728205
Юрий
2012-10-09 00:30
2013.03.22
С днем рождения ! 9 октября 2012 вторник


2-1338127419
Глеб
2012-05-27 18:03
2013.03.22
Перенос данных из дельфи в хмл


3-1282803008
Nurjanov
2010-08-26 10:10
2013.03.22
[Error] Need imported data reference ($G) to access GUID_NULL f


15-1330461002
Юрий
2012-02-29 00:30
2013.03.22
С днем рождения ! 29 февраля 2012 среда


8-1230540711
inviz
2008-12-29 11:51
2013.03.22
Длинна avi файла (некоректно определяет)