Форум: "Основная";
Текущий архив: 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.092 c