Форум: "Основная";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
ВнизПриведение типов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c