mjfarrell 发表于 2007-8-8 12:30:38

不允许 null 或 esc 或 enterkey 的最佳方法

看起来如此简单的问题导致了一些有趣的错误陷阱。如果在没有有效输入的情况下按下enter键,我总是得到与以下内容不匹配的类型代码0]
我想的是尝试使用类似InitializeUserInput的东西来防止esc或空白输入键
有什么想法吗
**** Hidden Message *****

Bryco 发表于 2007-8-8 12:39:53

我没有任何输入;但是我想知道这个小函数的功能是什么?

Bryco 发表于 2007-8-8 13:53:06

从帮助文件中。

Bryco 发表于 2007-8-8 15:25:11

马特,谢谢,但这些不是用于初始化输入的位吗?我正在尝试使用输入框,但找不到任何关于设置其使用位的文档
MJF该框的功能是放置在具有标高的块中的更大功能的一部分。我写了一个程序,用3d绘制一个变电站
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Sub AddPT()
      Const VK_ESCAPE = &H1B
      Const VK_LBUTTON = &H1
      Const VK_SPACE = &H20
      Const VK_RETURN = &HD
      Const VK_LEFT = &H25
      Dim inspt As Variant
      Dim intOSMode As Integer
      Dim dblRotation As Double
      Dim objBlockRef As AcadBlockReference, dblTOC As Double
      Dim varCancel As Variant, oCurrLayeR As AcadLayer
      On Error GoTo Err_Control
      Set oCurrLayeR = ThisDrawing.ActiveLayer
      IsSetup
Start:
      dblTOC = CDbl(InputBox("What is T.O.C. elevation? ie 12 or 0 or -12"))
      ThisDrawing.SetVariable "ORTHOMODE", 1
      
      intOSMode = ThisDrawing.GetVariable("OSMODE")
      ThisDrawing.SetVariable "OSMODE", 32
      inspt = ThisDrawing.Utility.GetPoint(, "Pick Insertion Point: ")
      inspt(2) = inspt(2) + dblTOC
      ThisDrawing.SetVariable "OSMODE", intOSMode
      dblRotation = ThisDrawing.Utility.GetAngle(inspt, "Pick Front Side of PT: ")
      Set objBlockRef = ThisDrawing.ModelSpace.InsertBlock(inspt, Path & "138kv-PT-ASSEMBLY.dwg", 1, 1, 1, dblRotation)
      ThisDrawing.Regen acActiveViewport
Exit_Here:
      ThisDrawing.ActiveLayer = oCurrLayeR
      ThisDrawing.SetVariable "OSMODE", intOSMode
      ThisDrawing.SetVariable "INSUNITS", 1
      Exit Sub
Err_Control:
      Select Case Err.Number
      Case -2147352567
      'Debug.Print Err.Number, Err.Description
            varCancel = ThisDrawing.GetVariable("LASTPROMPT")
            If InStr(1, varCancel, "*Cancel*")0 Then
                  If GetAsyncKeyState(VK_ESCAPE) And 8000 > 0 Then
                        Err.Clear
                        Resume Exit_Here
                  ElseIf GetAsyncKeyState(VK_LBUTTON) > 0 Then
                        Err.Clear
                        Resume
                  End If
            Else
                  If GetAsyncKeyState(VK_SPACE) Then
                        Resume Exit_Here
                  End If
      'Missed the pick, send them back!
                  Err.Clear
                  Resume
            End If
            Case 13
            GoTo Start
      Case Else
            MsgBox Err.Description
            Resume Exit_Here
      End Select
End Sub
如您所见,这是一个基本功能,但我从未计划让我的用户不输入值。

Bryco 发表于 2007-8-8 15:45:58

在快速搜索时,我发现了这些…也许其中一个会有帮助
http://www.dailydoseofexcel.com/archives/2005/05/04/1118/
这是一个很好的例子http://www.dicks-blog.com/archives/2004/05/26/validating-an-inputbox/
这是一个很好的例子http://www.vba-programmer.com/Snippets/Code_VB/InputBox_Cancel_vs_No_Input.html

Bryco 发表于 2007-8-8 15:48:55

最后一个看起来不错,但我有一个问题,我是否必须去掉我的on-error语句才能使其工作?

Bryco 发表于 2007-8-8 15:53:24

我想不出任何理由你需要保留它。 如果按取消按钮或 esc,则会收到一条消息。 如果输入框为空,您将收到一条消息。 看起来所有的基地都被覆盖了。 除非我错过了什么??!?

Bryco 发表于 2007-8-8 16:10:38

嗯,(我并不想成为一个PITA)但是如果我去掉err控件,如果用户在选择一个插入点时按ESC会发生什么?

Bryco 发表于 2007-8-8 16:11:36

Nevermind ^ 我可以使用 InitializeUserInput 让他们选择一个点

Bryco 发表于 2007-8-8 16:20:56

是的...你肯定需要某种错误控制来挑选点。我只是专注于输入框——抱歉。
页: [1] 2
查看完整版本: 不允许 null 或 esc 或 enterkey 的最佳方法