![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
is и classname
Val © (2005-09-07 17:34:00)есть код:
if Assigned(FMyObj) and (FMyObj is TMyClass) then
(FMyObj as TMyClass).DosomeThing;
при отладке условие (FMyObj is TMyClass) не выполняется, хотя я вижу, что FMyObj.ClassName = 'TMyClass'. Почему?
Defunct (2005-09-08 03:58:00) [21]> З.Ы. контструктор можно сделать и виртуальным, как у TComponent
и что это даст?
ЮЮ (2005-09-08 03:52:00) [22]>Сам объект создается как TParentMyClass(TMyClass).Create.
странное "приведение типов" для конструктора. Ты уж определись, какого класса нужен объект и напиши прямо, без извращений.
З.Ы. контструктор можно сделать и виртуальным, как у TComponent
Defunct (2005-09-08 01:28:00) [23]Val © (07.09.05 19:22) [11]
Либо Build with runtime packages (решит проблему сразу).
либо вместо isиспользовать прямую проверку:
if Obj.ClassName = TMyClass.ClassName then ...
> так работает но это не safe coding
> ...
> if Assigned(FMyObj) and FMyObjClassNameIs('TMyClass') then
Раз уж ты печешься о safe coding, почему допускаешь условие при котором возможно обращение к not Assigned объекту?
пиши уже так:
if Assigned( Obj ) then
if Obj is TMyClass then
...
или так:
if Assigned( Obj ) then
if Obj.ClassName = TMyClass.ClassName then
...
> но что же с is и as? - вылазит invalid class typecast при таком коде:
> if Assigned(FMyObj) then (FMyObj as TMyClass).DosomeThing;
используй конструкцию:
TMyClass( Obj ) вместо(Obj as TMyClass).
печатать меньше и вероятность возникновения invalid type cast гораздо меньше.
DiamondShark (2005-09-07 21:01:00) [24]
> нет, dll нет, есть bpl.
Не прошло и трёх часов, как появился хоть какой-то намёк на то, откуда берутся объекты.
Теперь бы ещё достаточное описание происходящего -- где описаны классы, как обращаешься с пакетом -- и будет совсем замечательно.
Val (2005-09-07 19:22:00) [25]>[3] Digitman © (07.09.05 17:49)
нет, dll нет, есть bpl.
кстати, забыл сказать из-за проблем с сервером:
и в то же время в том же Evaluate/Modify ..
FMyObj is TMyClass = False ?
этого нет, есть Expression illegal in evaluator.
Val (2005-09-07 19:13:00) [26]врядли битая. другие варианты обращения ведь работают.
что накопал:
дело в том что is равен true, если сравнивать с классом-предком.
TParentMyClass = class of TParentClass;
TMyClass = class(TParentClass)
..
Сам объект создается как TParentMyClass(TMyClass).Create.
и тогда (FMyObj is TMyClass) = false, но (FMyObj is TParentClass) = true, хотя FMyObj.ClassName = TMyClass.
так что же проверяет is, объясните?
Digitman (2005-09-07 18:08:00) [27]
> REA (07.09.05 18:05) [7]
вполне м.б. что и в длл .. разные RTTI...
Digitman (2005-09-07 18:06:00) [28]
> Val © (07.09.05 17:56) [5]
у тебя ссылка в FMyObj "битая" (неактуальная)
REA (2005-09-07 18:05:00) [29]А не в DLL ли тут дело?
Digitman (2005-09-07 17:56:00) [30]
> DesWind © (07.09.05 17:53) [4]
если Assigned(FMyObj)=False, то каким, спрашивается, макаром автор получил зн-е ClassName ?)
Val (2005-09-07 17:56:00) [31]дополню:
if Assigned(FMyObj) then
TMyClass(FMyObj).DosomeThing;
так работает но это не safe coding, насколько я понимаю и так работает:
if Assigned(FMyObj) and FMyObjClassNameIs('TMyClass') then
TMyClass(FMyObj).DosomeThing;
но что же с is и as? - вылазит invalid class typecast при таком коде:
if Assigned(FMyObj) then (FMyObj as TMyClass).DosomeThing;
нет. Assigned() = true.
чудес не бывает. но ситуация есть.
DesWind (2005-09-07 17:53:00) [32]Мож тут собака порылась - Assigned(FMyObj)?
Digitman (2005-09-07 17:49:00) [33]ну чудес-то не бывает)
хочешь сказать, что в Evaluate/Modify ..
FMyObj.ClassName = 'TMyClass'
и в то же время в том же Evaluate/Modify ..
FMyObj is TMyClass = False ?
Val (2005-09-07 17:45:00) [34]да.
Digitman (2005-09-07 17:39:00) [35]
> при отладке ..не выполняется, хотя я вижу ..
видишь где? в Evaluate/Modify ?