VB 选择案例未按预期工作
Posted
技术标签:
【中文标题】VB 选择案例未按预期工作【英文标题】:VB select case not working as expected 【发布时间】:2015-02-03 12:52:31 【问题描述】:我是一个完全了解 Visual Basic 并自学的新手。我正在 Studio 2008 中构建一个 VB(我必须使用这个版本),它登录到设备,传输登录名和密码,然后传输使用反射从 .txt 文件读取的命令。所有这些工作正常。设备执行命令并输出 28 个可能响应中的 1 个。
我正在使用选择案例来评估响应并采取相应措施。当在会话窗口中看到 EXECUTED 时,设备会话按预期停止,我的测试数据经过设计,所以我得到的第一个响应是“EXECUTED”,奇怪的是我的 VB “看到”了 EXECUTED 消息(案例 1)但选择案例响应好像它已经看到 FAILED(案例 2),测试数据的后续行非法不同的案例(5 和 6)但响应始终是下一个案例。我试过 Case n, case is = n, case "string value" 但我得到了错误。
这是我的代码 - 请注意,我尚未定义所有 28 种情况,但未定义的情况在我的活动版本中已被 REM 删除。任何想法或建议将不胜感激!
Option Explicit On
Public Class modCaseSelect
Shared Sub Dev_Responses(ByVal refl)
Dim Result As String
Dim CR = vbCr
Dim Resp As Integer
Dim Dev_Resp(28) As String
Dev_Resp(0) = "RUNNING"
Dev_Resp(1) = "EXECUTED"
Dev_Resp(2) = "FAILED"
Dev_Resp(3) = "SEMANTICS ERROR"
Dev_Resp(4) = "NONEXISTENT"
Dev_Resp(5) = "NOT FOUND"
Dev_Resp(6) = "SPECIAL"
Dev_Resp(7) = "CONFIRM: Y/N"
Dev_Resp(8) = "CONFIRM (Y/N)"
Dev_Resp(9) = "CONFIRM EXECUTION: Y/N"
Dev_Resp(10) = "ALREADY EXECUTED"
Dev_Resp(11) = ""
Dev_Resp(12) = ""
Dev_Resp(13) = ""
Dev_Resp(14) = ""
Dev_Resp(15) = ""
Dev_Resp(16) = ""
Dev_Resp(17) = ""
Dev_Resp(18) = ""
Dev_Resp(19) = ""
Dev_Resp(20) = ""
Dev_Resp(21) = ""
Dev_Resp(23) = ""
Dev_Resp(23) = ""
Dev_Resp(24) = ""
Dev_Resp(25) = ""
Dev_Resp(26) = ""
Dev_Resp(27) = ""
Dev_Resp(28) = "IN PROGRESS"
With refl
Select Case .WaitForStrings(Dev_Resp, "0:4:30") 'checkDev_Resp
Case 0 ' "RUNNING"
Result = Dev_Resp(0)
Resp = MsgBox((Dev_Resp(0) & CR & CR & Continue?"), 17, "Case 0 error")
Case 1 ' "EXECUTED"
Result = Dev_Resp(1)
Resp = MsgBox((Dev_Resp(1) & CR & CR & "Continue?"), 17, "Case 1")
Case 2 ' "FAILED"
Result = Dev_Resp(2)
Resp = MsgBox((Dev_Resp(2) & CR & CR & "Continue?"), 17, "Case 2 error")
Case 3 ' "SEMANTICS ERROR"
Result = Dev_Resp(3)
Resp = MsgBox((Dev_Resp(3) & CR & CR & "Continue?"), 17, "Case 3 error")
Case 4 ' "NONEXISTENT"
Result = Dev_Resp(4)
Resp = MsgBox((Dev_Resp(4) & CR & CR & "Continue?"), 17, "Case 4 error")
Case 5 ' "NOT FOUND"
Result = Dev_Resp(5)
Resp = MsgBox((Dev_Resp(5) & CR & CR & "Continue?"), 17, "Case 5 error")
Case 6 ' "SPECIAL"
Result = Dev_Resp(6)
Resp = MsgBox((Dev_Resp(6) & CR & CR & "Continue?"), 17, "Case 6 error")
Case 7 ' "CONFIRM: Y/N"
Result = Dev_Resp(7)
.Transmit("Y" & CR)
Case 8 ' "CONFIRM (Y/N)"
Result = Dev_Resp(8)
.Transmit("Y" & CR)
Case 9 ' "CONFIRM EXECUTION: Y/N"
Result = Dev_Resp(9)
.Transmit("Y" & CR)
Case 10 ' "ALREADY EXECUTED"
Result = Dev_Resp(10)
Resp = MsgBox((Dev_Resp(10) & CR & CR & "Continue?"), 17, "Case 10 error")
Case 11 ' ""
Result = Dev_Resp(11)
Case 12 ' ""
Result = Dev_Resp(12)
Case 13 ' ""
Result = Dev_Resp(13)
Case 14 ' ""
Result = Dev_Resp(14)
Case 15 ' ""
Result = Dev_Resp(15)
Case 16 ' ""
Result = Dev_Resp(16)
Case 17 ' ""
Result = Dev_Resp(17)
Case 18 ' ""
Result = Dev_Resp(18)
Case 19 ' ""
Result = Dev_Resp(19)
Case 20 ' ""
Result = Dev_Resp(20)
Case 21 ' ""
Result = Dev_Resp(21)
Case 22 ' ""
Result = Dev_Resp(22)
Case 23 ' ""
Result = Dev_Resp(23)
Case 24 ' ""
Result = Dev_Resp(24)
Case 25 ' ""
Result = Dev_Resp(25)
Case 26 ' ""
Result = Dev_Resp(26)
Case 27 ' ""
Result = Dev_Resp(27)
Case 28 ' "IN PROGRESS"
Result = Dev_Resp(28)
Resp = MsgBox((Dev_Resp(28) & CR & CR & "Continue?"), 17, "Case 28 error")
Case Else
End Select
End With
End Sub
End Class
【问题讨论】:
【参考方案1】:您在第一个 Case
中缺少双引号 "
。尝试将其更改为:
Case 0 ' "RUNNING"
Result = Dev_Resp(0)
Resp = MsgBox((Dev_Resp(0) & CR & CR & "Continue?"), 17, "Case 0 error")
请注意,我在 "Continue?"
之前添加了双引号。
【讨论】:
看得很清楚,我怕我的胖手指!我已将消息框从“您要继续”更改为“继续”以使其更易于阅读。调试时发现但不幸的是它没有解决我的问题:-(【参考方案2】:去掉With
语句。创建并分配一个持有者变量并将其与 select 语句一起使用。这样做可以让您通过在调试器中设置停止点来查看实际传递到 select 语句中的内容。
Dim temp_resp as integer = refl.WaitForStrings(Dev_Resp, "0:4:30")
Select Case temp_resp
'the case statements here.
End Select
【讨论】:
谢谢布兰登。我尝试了这个并弹出了一个 msgbox 和一个断点,这样我就可以查看这些值。主机会话看到 EXECUTED 并停止(即对其做出反应),但 temp_resp 的值为 2,因此它的反应就像在会话窗口中看到 FAILED 一样。我的测试数据还包含不同的案例响应(5 和 6),但它们也会进入下一个案例。 如果持有者变量temp_resp
的值为2,那么这就是refl.WaitForStrings(Dev_Resp, "0:4:30")
返回的值。问题不在于 select 语句,而在于 refl 对象的 WaitForStrings
方法。
布兰登让我朝着正确的方向前进。做了一些谷歌搜索,并在 Attachmate 站点上找到了这个:-“WaitForStrings 需要一个从零开始的数组参数,但它返回一个从 1 开始的字符串索引。使用具有 1 基值的 Select Case 语句来确定主机响应。”我在其他地方使用存储在数组中的消息,所以我从我的 .waitforstrings 响应中减去 1,使其与数组对齐,这意味着代码仍然清晰可见。【参考方案3】:
Reflections WaitForStrings 使用从零开始的数组参数,但它返回从 1 开始的字符串索引。 Waitforstrings 将数组条目 0 视为第一个有效条目,因此第一个选择案例 (Case = 1) 对应于数组条目 0。
【讨论】:
以上是关于VB 选择案例未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章