Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.174 c
15-1343243336
%%%
2012-07-25 23:08
2013.03.22
WinAPI


15-1332455404
Юрий
2012-03-23 02:30
2013.03.22
С днем рождения ! 22 марта 2012 четверг


2-1339697624
vasa777
2012-06-14 22:13
2013.03.22
ico с несколькими ico


6-1261579139
ZV
2009-12-23 17:38
2013.03.22
Client и Server. Как сделать надежно и просто ?


15-1353292991
MonoLife
2012-11-19 06:43
2013.03.22
Принтер Canon LBP-1120, HP LaserJet 1005 в Win 7 64 bit.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский