Главная страница
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.016 c
3-96156
rosl
2003-09-08 03:40
2003.09.29
сотрировка


3-96110
Astrov
2003-09-09 11:38
2003.09.29
SQL - INSERT - VALUES (Logical)


14-96349
Сатир
2003-09-09 17:55
2003.09.29
Помогите найти файлик


1-96270
Layner
2003-09-17 10:46
2003.09.29
Как готовую bmp влодить в res файл?


3-96052
P0tia
2003-09-10 17:20
2003.09.29
Люди добрые, помогите с Excel