Idispatch and Olevariant(60分)

  • 主题发起人 主题发起人 johnpan
  • 开始时间 开始时间
J

johnpan

Unregistered / Unconfirmed
GUEST, unregistred user!
各位专家,请教一个问题:
在ACAD_TLB里有以下两个函数,

{ AutoCAD ModelSpace Object }
IAcadModelSpace = interface(IDispatch)
['{511C3840-60ED-11CF-93EC-0800099EB3B7}']

function AddRegion(pCvs: OleVariant): OleVariant; safecall;

function AddRevolvedSolid(pProfile: IDispatch; axisPt, axisDir: OleVariant; angleRevolve: Double): IDispatch; safecall;

现在我要调用ADDREVOLVEDSOLID,其中的pProfile应该指向调用addregion
的结果,我的问题是:
1)idispatch和Olevariant之间是什么关系,还是什么关系都没有?
2)我怎么实现这一过程?两个如何转换?
3)为什么autocad带的例子(使用vb)实现都很简单,delphi这么麻烦?
delphi有优势吗?
谢谢!


 
idispatch是COM object的接口, 在Delphi中通常指一个OleObject.
OleVariant是一种COM object兼容的Variant类型, 可以通用任何Ole Automation
类型, 他与CreateOleObject创建的idispatch兼容.

我的机器因为重装98后cd有点毛病不能装配autocad故无法测试这个AddRegion函数,
不过你的做法大致应该如下:

var
ACAD, Doc, ARegion, RevSolid, apt, adir: OleViant;
begin
Acad := GetActiveOleObject('AutoCAD.Application.14');
Acad.visible:= True;
Doc := Acad.ActiveDocument;
Mspace := Doc.ModelSpace;

//create region parameters
...
ARegion := MSpace.AddRegion(...);

aPt := VarArrayCreate([0, 2], VT_R8);
aDir := VarArrayCreate([0, 2], VT_R8);
aPt[0] := 0; aPt[1] := 0; aPt[2] :=0;
aDir[0] := 1; aDir[1] := 0; aDir[2] := 0;

RevSold := MSpace.AddRevolvedSolid(ARegion, aPt, aDir, pi / 8);
end;

如果运行时AddRevolvedSolid报ARegion类型错, 可以用下面的语句试之:
RevSold := MSpace.AddRevolvedSolid(IUnKnown(ARegion), aPt, aDir, pi / 8);
 
Hi Pan,

不好意思, 拖了几天才回答你, 这几天我的笔记本出了一点毛病, AutoCAD装不上,
今天用了别人的一台机器试了一下, 基本能够画出这个旋转实体。

AutoCAD的说明里面的例子对于非VB用户帮助太小。看了Acad_TLB.pas才解决。
那个 AddRegion返回的是一个 variant array of dispatch,而这个
AddRevolvedSolid的Profile需要的是一个IDispatch,如果直接引用Region结果,
肯定会出现“类型不匹配“的错误,解决办法是引用Region数组的第一个元素:

RevSold := MSpace.AddRevolvedSolid(ARegion[0], aPt, aDir, pi / 8);

看了一下你的源程序,在AddRegion之前不需要先创建结果类,Region:=VarArrayCreate([0,0],12);
此外,Region应该是一个一维数组。
 
接受答案了.
 

Similar threads

I
回复
0
查看
706
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部