myjyueqvhk 发表于 2015-6-4 15:59:07

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

在明经通道 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"应修改为"用户输入的是关键字"。
  不知道是我理解错误还是软件或例程本身有错,求高手指点一下,多谢!

zzyong00 发表于 2015-6-4 22:19:18

Err.Description是vba的返回的错误描述,这与autocad的定义的错误描述不是一回事儿
一般如果根据错误做一事情,最好用err.number,这样比较也快一点,而且不会因为语言不同而不同

myjyueqvhk 发表于 2015-6-5 17:35:25

  多谢zzyong00的热情指导,但因我是初学AutoCAD VBA,看了您的解释还是无法解决上述问题。请求您手把手指导一下,最好能把程序源码改写一下,使其能够达到用户输入了关键字、非关键字时有相应的提示的目的。
  我在If Err Then后面插入一句:MsgBox Err.Number,程序运行后输入关键字或非关键字,提示的错误代码都是-2145320928,可知其同样也不能区别关键字和非关键字,还是无法实现程序中If语句的预期功能,非常困惑。

zzyong00 发表于 2015-6-6 15:07:41


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, arrKL() As String, i As Long, flag As Boolean

    keywordList = "Keyword1 Keyword2"
    arrKL = Split(keywordList, " ")
    ' 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
    Debug.Print Err.Number
         If Err.Number = -2145320928 Then
         ' One of the keywords was entered
             Dim inputString As String
             Err.Clear
             inputString = ThisDrawing.Utility.GetInput
             For i = LBound(arrKL) To UBound(arrKL)
                If InStr(arrKL(i), inputString) > 0 Then
                  flag = True
                  Exit For
                End If
             Next i
         
             If flag Then
                MsgBox "You entered the keyword: " & inputString
   
             Else
               MsgBox "Error selecting the point: " & Err.Description
               Err.Clear
             End If
         End If
    Else
      ' Display point coordinates
      MsgBox "The WCS of the point is: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "GetInput 示例"
    End If
   
End Sub

myjyueqvhk 发表于 2015-6-8 15:28:26

能得到这样高水平的指导,我非常感动,多谢!

myjyueqvhk 发表于 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,感到太幸运了!

zzyong00 发表于 2015-6-9 22:05:59

想请教一下:错误代码及其含义从什么文档中可以查到?
从微软的MSDN帮助文档能看到,网上也能查到,还有一个微软的小软件叫lookup也能查到!

If Err.Number = -2145320928 Then 是保证出错的就是“用户输入的是关键字”
而不是其它错误,程序代码各种错误,很难完全预料

myjyueqvhk 发表于 2015-6-10 10:00:01

多谢老师zzyong00的指导,对于“If Err.Number = -2145320928 Then 是保证出错的就是“用户输入的是关键字”而不是其它错误",我无法理解,因为当出错的不是“用户输入的是关键字”,而是相反:“用户输入的是非关键字”时,该条件语句包含的内容仍会被执行,可能我现在是走进了牛角尖,希望老师能把我带出来。

zzyong00 发表于 2015-6-10 19:31:16

错误处理,就是出现相应错误号的错误,对应去处理,而对于未知错误,可以给出提示,不做任何处理退出,或继续执行下面代码(resume next)

myjyueqvhk 发表于 2015-6-11 16:10:23

作为初学者,我现在还没有能力准确理解,等学多了再慢慢领会吧,谢谢!
页: [1]
查看完整版本: 求助:关于GetInput返回值的问题