Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.024 c
14-96426
VID
2003-09-10 15:49
2003.09.29
Siemens SL45i: Ваши мнения.


1-96230
BillyJeans
2003-09-16 14:05
2003.09.29
Временные интервалы...


14-96379
Mr@MsGuns
2003-09-11 11:35
2003.09.29
Все. Бросаем заниматься сексом. Прямо сейчас. Ни одной девочки.


1-96170
MakNik
2003-09-16 13:09
2003.09.29
QReport


4-96483
Prov
2003-07-24 10:23
2003.09.29
Файл больше 136 КБ




   Наверх