evaporated 发表于 2005-5-18 16:22:00

[原创]初学者遇到的一些问题和bug

本帖最后由 作者 于 2005-5-19 8:54:46 编辑 <br /><br /> <B>[原创]初学者遇到的一些问题和bug<BR></B>       这些问题都是近来学用vba遇到的,不算什么新东西了。对自己这段时间的学习和应用做个总结吧。有些甚至不算bug,但是很容易弄错或忘掉。有些可能是因为不同的机器设置导致。因为我调试程序用过的电脑很多。<BR>总之给大家提个醒吧,出了问题有可能会是出现以下情况。<BR>小弟初发,欢迎大家指正!






1       关于选择集selectionset


1)               选择集只能选中目前视图中已有的东西。因此,如果用到<BR>select方法,且mode为 acSelectionSetWindow 或acSelectionSetCrossing <BR>最好先Zoom一下。比较准确。<BR>如: ThisDrawing.Application.ZoomWindow corner2, corner1<BR>                               ssetObj.Select acSelectionSetCrossing, corner1, corner2<BR>有人问为什么不Zoom All. 我试了很多次发现,Zoom all后对于很大的图上选很小的区域会出现偏差。选不中或者选错都有。当时真是大晕。


2)       上述selectionset的cor1,cor2. 仔细看帮助文档后发现,它用到的点<BR>一定要用 dim a(0 to 2 ) as double 的形式。<BR>但是,很多时候vba里面取得图形的某点是用 variant 变量的。这个转化就不可少。       


如:dim point1,point2 as variant<BR>                       dim p1(2) as double<BR>                       dim p2(2) as double <BR>                       Block1.GetBoundingBox point1, point2<BR>  p1(0)=point1(0)<BR>                       p1(1)=point1(1)<BR>                       p1(2)=point1(2)<BR>                       p2(0)=point2(0)<BR>                       p2(1)=point2(1)<BR>                       p2(2)=point2(2)<BR>                       ssetObj.Select acSelectionSetCrossing, p1, p2<BR>  <BR>2               常数 <BR>                       vba中有各种定义好的常数。如上例中的<BR>                       acSelectionSetCrossing。我们一般不关心它究竟等于多少,直接写成上述形式就可以了。<BR>                       但是,我就遇到过 跟踪器里显示acSelectionSetCrossing=0 的情况。<BR>                       不知道为什么,vba系统没有把该常数转换成对应数值,而是当作未定义的变量来处理。所以大家还是稳妥点直接写数字为好。<BR>                       类似情况见下文


3                              关键字


                                                       同上,也会被当作变量处理。<BR>例如 vb中有个语句 NAME 。对文件更改名称用的。<BR>有次我发现vba将其看作变量,并赋值       "ACAD"


<BR>----更正---- NAME在vba里是属性。与vb的NAME语句冲突。<BR>       <BR>4               顺便建议大家:<BR>                       vba里文件操作有两套手段。一套是用最早的basic的解决方法,全套语句。<BR>如 打开是open,关闭 close。写入write,读出input等。<BR>                       另一套是创建一个file的object.上述动作等转化为object对应的属性和方法。<BR>                       前者简单,后者麻烦一点点。<BR>                       但是还是建议用后者吧。出问题的可能性少很多。比如刚才的NAME......


5               Insertionpoint 问题<BR>                       无论是BlockRef,还是Text,MText,都有一个Insertionpoint属性。记录了它在图形中的插入点坐标。<BR>                       这个属性在编辑器里查看,都是 <BR>                       Insertionpoint-- <BR>                                                                                               Insertionpoint(0)=...<BR>                                                                                               Insertionpoint(1)=...<BR>                                                                                               Insertionpoint(2)=...<BR>                       的形式。但是,千万不要以为它是数组。<BR>                       试图用数组的形式调用它是无效的。必须定义一个variant变量。<BR>                       dim a as variant<BR>                       a=Block1.InsertionPoint<BR>                       顺便说下,vba里属性很多都要用variant类型的变量才能取得。而方法或者函数中的参数都要用double类型的数组。这个转换是必须进行的。


6               文档级事件<BR>                       Endplot事件,在打印对话框选择"确定"与"取消"的情况下,都会被触发<BR>                       而且,如果用命令行执行 "-plot",一路执行下去。<BR>                       即使最后选择 “不继续打印”,打印相关的各个事件       startplot endplot startcommand endcommand 均触发。<BR>                       请大家留意。


7       应用程序级事件<BR>               SysVarChanged 这个事件。在系统变量值改变时触发。<BR>               但是不是所有系统变量都触发该事件的。<BR>               只有人工改变系统变量值的行为才触发它。<BR>               同时,只要有“行为”,哪怕该值并没有真正改变,也会触发它。

triggerman 发表于 2005-5-18 16:24:00

good!雷锋同志啊!这么认真,必成正果

mccad 发表于 2005-5-18 21:53:00

1.做为参数传递的点可直接使用其它方法返回的variant变量值,而不需要转化成Double数组。<BR>2.VBA的常数应该没有问题,但在VB中则会有问题。

evaporated 发表于 2005-5-19 08:54:00

请问明总:


1 你的意思是       byref ?


可是 vb里默认是byref的。我是试了很多次不行才出此下策,进行转化的。


2 vba的常数问题也遇到过几次。


奇怪的是换了机器会好的。
页: [1]
查看完整版本: [原创]初学者遇到的一些问题和bug