Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.29;
Скачать: CL | DM;

Вниз

Приведение типов   Найти похожие ветки 

 
k2 ©   (2003-09-16 10:21) [0]

Подскажите плиз, почему во втором примере нельзя привести типы подобным образом?


var ...
attrs: OleVariant;
atref: IAcadAttributeReference;
obj: IDispatch;
begin
...
showmessage(IntToHex(VarType(attrs),4));//$2009 varDispatch=$0009;varArray=$2000;

for i:=VarArrayLowBound(attrs) to VarArrayHighBound(attrs,1) do
begin
obj:=attrs[i];
atref:=obj as IAcadAttributeReference;
showmessage(attr.TagString);
end;
...
end;

var ...
attrs: OleVariant;
atref: IAcadAttributeReference;
begin
...
showmessage(IntToHex(VarType(attrs),4));//$2009
for i:=VarArrayLowBound(attrs) to VarArrayHighBound(attrs,1) do
begin
atref:=IAcadAttributeReference(IDispatch(attrs[i]));
showmessage(attr.TagString);// ERROR: "External error 6E6"
end;
...
end;


 
k2 ©   (2003-09-16 10:25) [1]

сорри,поправка

var ...
attrs: OleVariant;
atref: IAcadAttributeReference;
obj: IDispatch;
begin
...
showmessage(IntToHex(VarType(attrs),4));//$2009 varDispatch=$0009;varArray=$2000;

for i:=VarArrayLowBound(attrs,1) to VarArrayHighBound(attrs,1) do
begin
obj:=attrs[i];
atref:=obj as IAcadAttributeReference;
showmessage(atref.TagString);
end;
...
end;

var ...
attrs: OleVariant;
atref: IAcadAttributeReference;
begin
...
showmessage(IntToHex(VarType(attrs),4));//$2009
for i:=VarArrayLowBound(attrs,1) to VarArrayHighBound(attrs,1) do
begin
atref:=IAcadAttributeReference(IDispatch(attrs[i]));
showmessage(atref.TagString);// ERROR: "External error 6E6"
end;
...
end;



 
Skier ©   (2003-09-16 10:53) [2]

Сдаётся мне что всё дело в подсчёте ссылок
:= attrs[i]; и
as IAcadAttributeReference "считает" ссылки , а
IAcadAttributeReference(IDispatch(...)); - нет


 
k2 ©   (2003-09-16 11:10) [3]

>to Skier


...
showmessage(IntToStr(TInterfacedObject(atref).RefCount));//=1
showmessage(atref.TagString);

=1 в обоих случаев
или так нельзя проверить подсчет ссылок и меня не в ту степь понесло :(?


 
icWasya ©   (2003-09-16 14:03) [4]

помоему так:
var
V:OleVariant;
Obj:IDispatch;
A:IAcadAttributeReference;

если используется вариант

Obj:=V As IDispatch;
A:=Obj As IAcadAttributeReference;

то за оператором As стоит вызов процедур GetIntegface и QueryInterface

а если используется вариант

Obj:=IDispatch(V);
A:=IAcadAttributeReference(Obj);

то просто обманывается компилятор, заставляется рассматривать значение одного типа как другого, что не есть правильно



Страницы: 1 вся ветка

Текущий архив: 2003.09.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
14-96352
Igor_thief
2003-09-12 12:36
2003.09.29
PopupMenu


14-96380
Digitman
2003-09-05 10:44
2003.09.29
OFF: Тяпница ж сегодня) ...


1-96263
den777
2003-09-17 10:39
2003.09.29
Использование классов в разных BPL


7-96467
АлеКо
2003-07-18 09:36
2003.09.29
Определить ОС


4-96474
Gimer
2003-07-27 23:11
2003.09.29
Выпадающий список в Эксплоере