Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

is и classname


Страницы:   1 2

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 ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо