Главная страница
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.026 c
1-96285
solo
2003-09-16 21:23
2003.09.29
Область отсечения канвы


9-96043
Yura
2003-03-25 22:57
2003.09.29
1Создание 2d карт(теория)


7-96462
Nevermind
2003-07-15 08:43
2003.09.29
Стили оформления (XP, Классический)


4-96491
Maks Realov
2003-07-25 17:43
2003.09.29
Win2k + дочернее окно + Stay On top = false ???


1-96250
kalliopiy
2003-09-17 14:55
2003.09.29
ListView+TreeView