Главная страница
    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.067 c
3-1278415327
kyn66
2010-07-06 15:22
2013.03.22
Ошибка на одном из трех компов


3-1287641897
dmitry1208197320
2010-10-21 10:18
2013.03.22
Правильность ввода поля при переходе к другой записи


15-1330181581
Pcrepair
2012-02-25 18:53
2013.03.22
TWebBrowser портит ссылки в коде страницы


15-1330759602
wl
2012-03-03 11:26
2013.03.22
Хороший коньяк


15-1346255072
Artem
2012-08-29 19:44
2013.03.22
MessageDlg в Visual C++





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