明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 954|回复: 9

求助:关于GetInput返回值的问题

[复制链接]
发表于 2015-6-4 15:59:07 | 显示全部楼层 |阅读模式
在明经通道 AutoCAD ActiveX和VBA参考中,关于GetInput的示例如下:

Sub Example_GetInput()
    ' This example prompts for user input of a point. By using the
    ' InitializeUserInput method to define a keyword list, the example can also
    ' return keywords entered by the user.
   
    On Error Resume Next
   
    ' Define the valid keywords
    Dim keywordList As String
    keywordList = "Keyword1 Keyword2"
   
    ' Call InitializeUserInput to set up the keywords
    ThisDrawing.Utility.InitializeUserInput 128, keywordList
   
    ' Get the user input
    Dim returnPnt As Variant
    returnPnt = ThisDrawing.Utility.GetPoint(, "Enter a point(Keyword1, Keyword2): ")
    If Err Then
         If StrComp(Err.Description, "User input is a keyword", 1) = 0 Then
         ' One of the keywords was entered
             Dim inputString As String
             Err.Clear
             inputString = ThisDrawing.Utility.GetInput
             MsgBox "You entered the keyword: " & inputString
         Else
             MsgBox "Error selecting the point: " & Err.Description
             Err.Clear
         End If
    Else
        ' Display point coordinates
        MsgBox "The WCS of the point is: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "GetInput 示例"
    End If
   
End Sub

  这段程序的原意应该是当用户正确地输入了点坐标,将显示点坐标,若输入了非坐标数据但属于关键字的字符串则显示 "You entered the keyword:*"的消息(*代表用户输入的字符串,下同),若输入了非坐标的非关键字的字符串,则提示"Error selecting the point: " & Err.Description的消息。可是,程序实际运行时,若输入了非坐标的字符串时,无论是否为关键字,都将弹出: "You entered the keyword: *"的消息,与输入的内容是否为关键字无关。程序运行后若直接输入一个非关键字,Err.Description的返回值还是"用户输入的是关键字",GetInput的返回值是用户输入的非关键字,这和该方法的定义即:“将用户输入的字符串转换为关键词索引”不符。
  曾经怀疑是否是因为软件中文化造成的问题,试安装的英文版,问题依旧。
  注:当运行中本版时,上面的"User input is a keyword"应修改为"用户输入的是关键字"。
  不知道是我理解错误还是软件或例程本身有错,求高手指点一下,多谢!
发表于 2015-6-4 22:19:18 | 显示全部楼层
Err.Description是vba的返回的错误描述,这与autocad的定义的错误描述不是一回事儿
一般如果根据错误做一事情,最好用err.number,这样比较也快一点,而且不会因为语言不同而不同
 楼主| 发表于 2015-6-5 17:35:25 | 显示全部楼层
  多谢zzyong00的热情指导,但因我是初学AutoCAD VBA,看了您的解释还是无法解决上述问题。请求您手把手指导一下,最好能把程序源码改写一下,使其能够达到用户输入了关键字、非关键字时有相应的提示的目的。
  我在If Err Then后面插入一句:MsgBox Err.Number,程序运行后输入关键字或非关键字,提示的错误代码都是-2145320928,可知其同样也不能区别关键字和非关键字,还是无法实现程序中If语句的预期功能,非常困惑。
发表于 2015-6-6 15:07:41 | 显示全部楼层
  1. Sub Example_GetInput()
  2.     ' This example prompts for user input of a point. By using the
  3.     ' InitializeUserInput method to define a keyword list, the example can also
  4.     ' return keywords entered by the user.
  5.    
  6.     On Error Resume Next
  7.    
  8.     ' Define the valid keywords
  9.     Dim keywordList As String, arrKL() As String, i As Long, flag As Boolean

  10.     keywordList = "Keyword1 Keyword2"
  11.     arrKL = Split(keywordList, " ")
  12.     ' Call InitializeUserInput to set up the keywords
  13.     ThisDrawing.Utility.InitializeUserInput 128, keywordList
  14.    
  15.     ' Get the user input
  16.     Dim returnPnt As Variant
  17.     returnPnt = ThisDrawing.Utility.GetPoint(, "Enter a point(Keyword1, Keyword2): ")
  18.    
  19.     If Err Then
  20.     Debug.Print Err.Number
  21.          If Err.Number = -2145320928 Then
  22.          ' One of the keywords was entered
  23.              Dim inputString As String
  24.              Err.Clear
  25.              inputString = ThisDrawing.Utility.GetInput
  26.              For i = LBound(arrKL) To UBound(arrKL)
  27.                 If InStr(arrKL(i), inputString) > 0 Then
  28.                     flag = True
  29.                     Exit For
  30.                 End If
  31.              Next i
  32.          
  33.              If flag Then
  34.                 MsgBox "You entered the keyword: " & inputString
  35.    
  36.              Else
  37.                  MsgBox "Error selecting the point: " & Err.Description
  38.                  Err.Clear
  39.              End If
  40.          End If
  41.     Else
  42.         ' Display point coordinates
  43.         MsgBox "The WCS of the point is: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "GetInput 示例"
  44.     End If
  45.    
  46. End Sub
 楼主| 发表于 2015-6-8 15:28:26 | 显示全部楼层
能得到这样高水平的指导,我非常感动,多谢!

点评

过奖,不用客气  发表于 2015-6-8 20:15
 楼主| 发表于 2015-6-9 17:34:21 | 显示全部楼层
  认真学习了zzyong00给出的程序,获益匪浅,这段程序可以有效地区分关键字和非关键字,达到了预期的效果。有几个问题想讨论一下:
  对于关键字和非关键字判别的操作,在条件语句:
If Err.Number = -2145320928 Then之内,但该语句没有相应的else,没有起到分支的作用,如果把这句和相应的End If删除,经试运行说明程序的功能没有变化,该语句在本程序中似乎未起到作用。
  我猜想,官方的示例程序之所以不能够正确运行,原因可能是编程员认为Err.Description可以分辨错误是否为关键字,因为返回的内容"User input is a keyword"的字面含义就是:“用户输入的是关键字”,在上面给出的程序中,对If Err.Number = -2145320928 Then的解释是:' One of the keywords was entered,也是同样的意思。但是这个解释明显是不符合实际的,因为无论输入的是否为关键字,只要输入的不是坐标值,结果都是Err.Number = -2145320928,即Err.Description的值为"User input is a keyword"。示例程序的编程员被字面含义误导了,所以采用了If StrComp(Err.Description, "User input is a keyword", 1)来区分是否为关键字。不知道zzyong00老师是否也是这样认为的?
  还有,GetInput的定义:将用户输入的字符串转换为关键词索引,根据运行的结果,显然也是错误的,因为执行该语句时,无论是否为关键字都同样会返回。如果将:
MsgBox "Error selecting the point: " & Err.Description
改为:
MsgBox "You entered the non-keyword: " & inputString
  程序运行时输入一个非关键词就可以验证。
  想请教一下:错误代码及其含义从什么文档中可以查到?多谢!
  能在明经通道遇到这么好的指导老师zzyong00,感到太幸运了!
发表于 2015-6-9 22:05:59 | 显示全部楼层
想请教一下:错误代码及其含义从什么文档中可以查到?
从微软的MSDN帮助文档能看到,网上也能查到,还有一个微软的小软件叫lookup也能查到!

If Err.Number = -2145320928 Then 是保证出错的就是“用户输入的是关键字”
而不是其它错误,程序代码各种错误,很难完全预料
 楼主| 发表于 2015-6-10 10:00:01 | 显示全部楼层
多谢老师zzyong00的指导,对于“If Err.Number = -2145320928 Then 是保证出错的就是“用户输入的是关键字”而不是其它错误",我无法理解,因为当出错的不是“用户输入的是关键字”,而是相反:“用户输入的是非关键字”时,该条件语句包含的内容仍会被执行,可能我现在是走进了牛角尖,希望老师能把我带出来。

点评

才理解你的意思,只好用户输入字符,都会出现-2145320928这个错误!因为我们用的是ThisDrawing.Utility.GetPoint,这个方法只能取得点(point),而对于其它任何输入都会报错!而且错误号都是哪个(猜想,没测试)!  发表于 2015-6-10 19:33
笔误,“If Err.Number = -2145320928 Then 是保证出错的就是“用户输入的是非关键字”而不是其它错误",  发表于 2015-6-10 19:27
发表于 2015-6-10 19:31:16 | 显示全部楼层
错误处理,就是出现相应错误号的错误,对应去处理,而对于未知错误,可以给出提示,不做任何处理退出,或继续执行下面代码(resume next)
 楼主| 发表于 2015-6-11 16:10:23 | 显示全部楼层
作为初学者,我现在还没有能力准确理解,等学多了再慢慢领会吧,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 11:28 , Processed in 0.146612 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表