![]() |
| ||
|
|
Новости |
Поиск |
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'. Почему?
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]>и что это даст?
Возможность создавать экземпляр класса по заданному типу (имени).
Зачем-то же автору потребовалось "приведение типов"