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'. Почему?


Val   (2005-09-09 10:10:00) [1]

Всем участникам ветки большое спасибо за дискуссию.
Отдельное спасибо Игорю Шевченко.


Игорь Шевченко   (2005-09-09 10:06:00) [2]

Val ©   (08.09.05 18:57) [33]


> То есть, если бы был третий пакет bpl3, в котором объявлен
> этот самый TDealHousePaymAggr, в bpl1 он создавался, а в
> bpl2 использовался, то все было бы в порядке?


Да, безусловно. Этот факт легко проверить :)


> p.s. если можно - где о таких вещах можно почитать?


На Королевстве Delphi были две неплохие статьи об использовании run-time пакетов:

http://www.delphikingdom.com/asp/viewitem.asp?UrlItem=/mastering/plugins.htm
и
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468


Val   (2005-09-08 18:57:00) [3]

То есть, если бы был третий пакет bpl3, в котором объявлен этот самый TDealHousePaymAggr, в bpl1 он создавался, а в bpl2 использовался, то все было бы в порядке?
p.s. если можно - где о таких вещах можно почитать?


Игорь Шевченко   (2005-09-08 18:44:00) [4]

Val ©   (08.09.05 18:37) [31]

Известен в данном контексте означает то, что объявлен в одном пакете с точки зрения создающей объект функции и использующей его. Например, если создающая и использующая функции находятся в одном пакете, то копия VMT для данного класса одна. А если эти функции разнесены по разным пакетам, то объявление класса должно быть вынесено в отдельный пакет.


Val   (2005-09-08 18:37:00) [5]

а что означает "известен" в данном контексте?


Игорь Шевченко   (2005-09-08 18:31:00) [6]

Val ©   (08.09.05 18:21) [29]

if FDeal is TDealHousePaymAggr then
 TDealHousePaymAggr(FDeal).FillSchedule;

Будет работать при условии, если класс TDealHousePaymAggr известен как создающему объект пакету, так и использующему, то есть, его VMT находит в единственном пакете. В ином случае возможны ошибки. Кстати, is позволяет убрать проверку на Assigned, так как is от nil вернет false.


Val   (2005-09-08 18:21:00) [7]

вот реальный работающий метод. но только уже с проверкой на имя класса.

procedure TDealHousePaymAggrView.BtnAutoFillScheduleClick(Sender: TObject);
begin
if Assigned(FDeal) and FDeal.ClassNameIs('TDealHousePaymAggr') then
  TDealHousePaymAggr(FDeal).FillSchedule;
end;


Игорь Шевченко   (2005-09-08 18:11:00) [8]

Val ©   (08.09.05 18:08) [27]


> В одном из методов TMyClass сабжевый код, дающий ошибку.


Вот с этого момента поподробнее.


Val   (2005-09-08 18:08:00) [9]

Честно говоря, я не знаю даже, что уже показывать, поскольку ошибка в приведенных в теме ветки двух строках, в которых лишь заменены на абстрактные имена класса, объекта и метода. Скажите, какой именно участок/ки кода интересует, где происходит что? Я же не могу сюда юниты постить :(


Игорь Шевченко   (2005-09-08 17:54:00) [10]

А если не трудно, все-таки, неработающий код в студию


Val   (2005-09-08 14:56:00) [11]

>[24] Digitman ©   (08.09.05 14:22)
Я не устраиваю бардака и не даю никому подачек.
Я просто попытался дать абстрагированные от конкретного проекта/задачи куски кода и задал вопрос - из-за чего такое может быть в принципе(потому как место имеет) и что конкретно проверяет is. Пусть первая часть вопроса является недостаточно подкрепленной с моей стороны отрывками кода и фидбеком к уважаемым участникам ветки, я ее опущу, дабы не отнимать время, разберусь(или не разберусь) сам, но что же со второй частью?
>Бурундук ©   (08.09.05 14:18)
есть 2 пакета:
в bpl1 определен TParent,
в bpl2 TDescedant(TParent). В bpl2 есть еще один класс TMyClass у которого есть поле FMyObj: TParent.В одном из методов TMyClass сабжевый код, дающий ошибку.
В Bpl1 есть процедура создания объекта:

procedure MkObj(AClassName: string; var AObj: TParent);
var
 AClass: TPersistentClass;
begin
 AClass := GetClass(AClassName);
 if AClass <> nil then
     aObj := TParentClass(AClass).Create(..);
end;


Digitman   (2005-09-08 14:22:00) [12]


> Val ©   (08.09.05 14:04) [22]


не устраивай бардак.
помощь нужна ТЕБЕ ? да, тебе.

приводи сюда весь код, касаемый что, где, как и  для чего ты делаешь.

с подробнейшими комментариями.

приводи ИМЕННО это, а не не тот "шматок"-подачку, что мы тут "имели счастье лицезреть"


Бурундук   (2005-09-08 14:18:00) [13]

Такое может быть в такой ситуации:
Есть три пакета - bpl1, bpl2, bpl3.
В bpl1 определён класс TParent, а
в bpl2 и bpl3 TDescendant = class(TParent).
Для bpl2 и bpl3 класс TParent один, а TDescendant
у каждого свой, хотя оба идентичны (если версии совпадают).


Val   (2005-09-08 14:04:00) [14]

Без какой проверки? В посте 20 написаны слова именно на основании проведенной ранее проверки. Если бы я все прекрасно знал, я бы не спрашивал, не так ли?


Erik1   (2005-09-08 13:54:00) [15]

Хозяин барин, но зачемже тогда людей спрашивать если ты и так все прекрастно знаеш без проверки?


Val   (2005-09-08 13:23:00) [16]

>Erik1 ©   (08.09.05 12:52)
я говорил уже - не причем это. он и после создания(код в одной bpl) и в момент выполнения приведенного кода(код в другой bpl) обладает теми же, интересующими меня свойствами - дает true при проверке на родительский класс через is но classname у него TMyClass. Понятно почему true - потому что при создании объекта использовалось приведение к классу-предку, но почему тогда остался classname TMyClass?


Erik1   (2005-09-08 12:52:00) [17]

Тебе тут дали один намек, например в dll есть известная проблема если создаются два класса один в dll а другой в основной программе, то при сравнении у них окажутся разные типы. А bpl это расширеная dll вроде при использовании bpl эту проблему можно обойти, но тут есть нуансы.
 Если хочеш решить проблему кординально, приведи как создовался объект и где! Как он передовался, сделай контроль сразу после создания объекта и получиш все ответы.


DesWind   (2005-09-08 11:50:00) [18]

Digitman ©   (07.09.05 17:56) [6]

ClassName если я не ошибаюсь это - class function, можно вызывать и без создания объекта.


Val   (2005-09-08 11:27:00) [19]

>DiamondShark ©   (07.09.05 21:01)
? это код из самого пакета. не стоит язвить - спросили бы я бы сказал сразу. я не знал, что это имеет принципиальное значение для данного вопроса. и сейчас так не думаю, если честно.
>[13] Defunct ©   (08.09.05 01:28)
Либо Build with runtime packages (решит проблему сразу)
нет, поскольку так и компилится.
Раз уж ты печешься ..
Больше никто кроме меня не печется?
По сути - это понятно. но...это отлаживаемый код, в котором я точно знаю, что ссылка существует и валидна. Кроме того у меня не выставлена "complete boolean eval", что означает, насколько я понимаю, что второе условие не будет вычисляться при первом = false для and.
используй конструкцию:...
совет не вреден в свете safe coding?
>ЮЮ ©   (08.09.05 03:52)
нет, не странное.
класс получается динамически, по имени из бд. метод для создания и инициализации общий для ряда классов имеющих одного предка.
определиться не могу - это корпоративный код, который я раскопал, пока ковырял ошибку.
>All
коллеги, я понимаю, что ошибку я могу обойти простым приведением, могу поставить проверку на имя класса - все будет работать.
Но я хочу понять и за этим обратился к вам - что(какое свойство?) проверяет оператор is, раз может возникать подобная ситуация?


ЮЮ   (2005-09-08 07:34:00) [20]

>и что это даст?

Возможность создавать экземпляр класса по заданному типу (имени).
Зачем-то же автору потребовалось "приведение типов"


Страницы:   1 2

Наверх

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