我正在尝试遍历表单中的所有控件: 对于Me.Controls中的每个ctrl 为了根据某些条件启用/禁用控件。 但是当我尝试访问它时,表单上有一个控件会出错。这是什么样的控制,我如何找到它?
答案 0 :(得分:1)
当您收到错误并单击Debug时,行上的错误是否设置了控件的Enabled属性?
如果是这样,添加一个Debug.Print语句写出控件的名称。在设置Enabled属性之前,请在该行上执行此操作。
这就是我的意思:
Dim ctrl As Control
For Each ctrl In Me.Controls
Debug.Print ctrl.Name
ctrl.Enabled = True
Next
Debug.Print语句将向立即窗口写出上次在循环中处理的控件的名称,可能是导致错误的控件的名称。
修改强>
此可能有效。将此控件放在Panel控件中,并将Panel的Enabled属性设置为False。如果我没记错的话,在VB6中将容器控件的Enabled属性设置为False也会将容器的子控件Enabled设置为False。如果你的控件的Enabled属性真的是只读的,我很好奇会发生什么。
答案 1 :(得分:1)
试试这个:
Dim ctr As Control Dim CtrStatus Boolean CtrStatus = False For Each ctr In Me.Controls If (SSTab.hwnd = GetParent(ctr.hwnd)) Then Call CallByName(ctr, "Enabled", VbLet, CtrStatus) else ctr.Enabled = CtrStatus End If Next
答案 2 :(得分:0)
另一种方法如下,它也可以在运行时工作(而不仅仅是在IDE中):
private sub SetEnabled()
on error goto errHandle
Dim ctrl As Control
For Each ctrl In Me.Controls
ctrl.Enabled = True
Next
exitPoint:
exit sub
errHandle:
MsgBox "Error " & err.Description & " with Control " & ctrl.Name
resume exitPoint
end sub
答案 3 :(得分:0)
Tosa:根据您对AngryHacker's answer的评论,我认为您正在错误地检查容器。
您的代码就像这样
' BAD CODE '
If ctrl.Container = fraMovies Then
对我来说,错误450 Wrong number of arguments or invalid property assignment
。你得到同样的错误吗?
代码应该使用Is
而不是=
,就像这样
' GOOD CODE '
If ctrl.Container Is fraMovies Then
解释。您想检查两个变量是否“指向”同一个控件。控件是对象:you must use Is
not =
,用于检查两个对象变量是否“指向”同一对象。这是VB6中的经典陷阱。
最后一句话。下次,您是否可以尝试发布10行或更少的实际代码,重现错误,并提供确切的错误编号和消息以及发生的确切行?它确实让我们更容易解决您的问题 - 我知道缩短代码对您来说很有用,但是您可以通过这种方式获得更好的答案。
编辑欢迎回来! :)你说有些控件没有Container属性。您可以尝试在On Error Resume Next
中包装测试,类似这样。
' GOOD CODE '
Dim bMatch As Boolean
Dim ctrl As Control
For Each ctrl In Me.Controls
bMatch = False
On Error Resume Next
bMatch = (ctrl.Container Is fraMovies)
On Error Goto 0
If bMatch Then
ctrl.Enabled = True
End If
Next
答案 4 :(得分:0)
在循环之前取消错误报告,然后将其设置回标准错误处理:
On Error Resume Next
For Each ctrl In Me.Controls
ctrl.Enabled = lIsEnabled
Next
On Error GoTo 0
或者使用标准前缀/后缀命名控件,您可以按名称检查并跳过循环。
For Each ctrl In Me.Controls
If Left(ctrl.Name, 3) = "sst" Then
ctrl.Enabled = lIsEnabled
End If
Next
答案 5 :(得分:0)
为了避免此类问题,请在命名contols时遵循给定的规则
在Visual Basic应用程序中命名元素时,该名称的第一个字符必须是字母字符或下划线。
**使用大写字母开头名称中的每个单独的单词,如FindLastRecord和RedrawMyForm。
使用动词开始函数和方法名称,如InitNameArray或CloseDialog。 使用名词开始类,结构,模块和属性名称,如EmployeeName或CarAccessory。
使用前缀“I”开始接口名称,后跟名词或名词短语,如IComponent,或者使用描述接口行为的形容词,如IPersistable。不要使用下划线,并谨慎使用缩写,因为缩写可能会引起混淆。
使用描述事件类型的名词开始事件处理程序名称,后跟“EventHandler”后缀,如“MouseEventHandler”。
在事件参数类的名称中,包含“EventArgs”后缀。 如果事件具有“之前”或“之后”的概念,则使用现在或过去时的后缀,如“ControlAdd”或“ControlAdded”。
对于长期或经常使用的术语,请使用缩写来保持名称长度合理,例如“HTML”,而不是“超文本标记语言”。通常,在设置为低分辨率的监视器上难以读取大于32个字符的变量名。此外,确保您的缩写在整个应用程序中保持一致。在“HTML”和“超文本标记语言”之间随机切换项目可能会导致混淆。
避免在内部作用域中使用与外部作用域中的名称相同的名称。如果访问了错误的变量,可能会导致错误。如果变量与同名关键字之间发生冲突,则必须通过在关键字前面添加相应的类型库来标识该关键字。 例如,如果您有一个名为Date的变量,则只能通过调用DateTime.Date来使用内在Date函数。