我试图通过窗体中的所有控件循环: 对于Me.Controls中的每个ctrl控制 以便根据某些条件启用/禁用控件。 但是,当我尝试访问它时,窗体上会出现一个控制错误。什么样的控制,我怎么找到它?VB6控制迭代:一个控件给我一个错误;哪一个?
回答
当你得到你的错误,然后单击调试,线上的错误设置控件的启用属性?
如果是这样,请添加一个写出控件名称的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属性确实是只读的,我很好奇会发生什么。
另一种方法是如下,这也工作在运行时(而不是仅仅在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
它在SSTab上放弃了。我正在检查控件的容器是否为特定框架,然后启用/禁用它...“如果ctrl.Container = fraMovies Then ...”。但是,当程序循环并试图检查SSTab的容器时,它会引发异常。 – tosa 2009-10-30 00:23:00
我猜测SSTab没有Enabled属性。 – AngryHacker 2009-10-30 02:17:26
@AngryHacker:起初我还认为SSTab不能有Enabled属性:但'tosa'的问题代码行是**不使用Enabled属性**。看到我的答案,我对这个问题的看法(=不是)。你的答案是一个很好的答案,给出原始问题,这强烈暗示了在更改Enabled属性时发生问题,而不是尝试建立控件的Container。 – MarkJ 2009-10-30 15:02:51
土佐:从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
你好,我回过头来看这个问题。谢谢,“是”的作品。现在问题出在.container检查部分。有没有容器的控件(如commondialog),并检查他们的容器给出错误。我想要做的是循环遍历帧中的所有对象并禁用它们。原始帧(迭代循环)中的帧和对象也应该是这种情况。最好的办法是什么? – tosa 2010-03-04 00:44:03
嗨,谢谢你的回应。而不是继续在下一行处理(通过On Error Resume Next,我该如何转到For Each循环中的下一个对象?问题是,即使某些控件没有容器,它们也有一个启用的属性,因此它们在简历部分被禁用/启用。更好的是,如何检查对象是否具有容器属性(不使用错误捕获器)? – tosa 2010-03-07 22:09:04
嗨,在VB6中没有'Cycle'语句允许您直接进入下一个对象,我的建议是使用一个'If'块来包装Enabled属性,我会再次编辑我的答案来制作这个更简单的方法,我不认为有更简单的方法来检测是否一个对象有一个容器属性,而不是使用错误陷阱。 – MarkJ 2010-03-08 11:23:30
试试这个:
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
禁止循环之前的错误报告,然后将其设置回标准的错误处理:
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
为了避免这样的问题,按照给定的规则而命名contols
当你的名字在Visual Basic应用程序的元素,该名称的第一个字符必须是字母字符或下划线。
**在大写字母的名称中开始每个单独的单词,如在FindLastRecord和RedrawMyForm中。
使用动词开始函数和方法名称,如在InitNameArray或CloseDialog中。 使用名词开始类,结构,模块和属性名称,如在EmployeeName或CarAccessory中。
开始使用前缀“I”的接口名称,后跟名词或名词短语,如IComponent,或带有描述接口行为的形容词,如IPersistable。不要使用下划线,并谨慎使用缩写,因为缩写可能会导致混淆。
使用描述事件类型的名词开始事件处理程序名称,后跟“EventHandler”后缀,如“MouseEventHandler”中所示。
在事件参数类的名称中,包含“EventArgs”后缀。 如果事件的概念是“之前”或“之后”,则使用现在或过去式的后缀,如“ControlAdd”或“ControlAdded”中的后缀。
对于长期或经常使用的术语,请使用缩写来保持名称长度合理,例如“HTML”,而不是“超文本标记语言”。一般来说,大于32个字符的变量名称在设置为低分辨率的监视器上很难读取。另外,请确保您的缩写在整个应用程序中保持一致。在“HTML”和“超文本标记语言”之间随意切换项目可能会导致混淆。
避免在内部作用域中使用与外部作用域中的名称相同的名称。如果访问错误的变量,可能会导致错误。如果变量与同名关键字之间发生冲突,则必须通过在关键字前面加上相应的类型库来标识该关键字。 例如,如果你有一个名为日期变量,则只能通过调用DateTime.Date使用固有的日期功能。
- 1. 我的控制台给我一个错误?
- 2. 重温一个视图控制器给我错误
- 3. 将错误消息从一个控制器传递到另一个控制器
- 4. Thread.join()给我一个错误?
- 5. FactoryGirl给我一个错误
- 6. TFS-控制板 - 添加一个放大按钮一个控件
- 7. 另一个控制
- 8. 另一个控制
- 9. 我试图摧毁一个控制器时得到一个pg错误
- 10. jquery一个滑块控制另一个
- 11. 一个迭代
- 12. 一个迭代
- 13. 从一个控制器向另一个控制器传递值
- 14. 如何一个控制器值更改为另一个控制
- 15. 如何获得一个控制是另一个控制内部
- 16. 段错误迭代一个的QList
- 17. java.util.NoSuchElementException错误而迭代一个JSON
- 18. 当我尝试添加一个新的视图控制器时,Xcode给了我一个错误
- 19. 将控制权从一个控制器重定向到另一个控制器
- 20. 我想打电话从一个控制器的功能,另一个控制器
- 21. C#控制一个控制台进程
- 22. 当我尝试添加一个动态创建的控件到一个asp我得到一个错误
- 23. 一个控制器文件添加到angularjs中的另一个控制器
- 24. 我得到一个访问控制错误
- 25. 我想用迭代的方式,使一个循环,但有一个错误
- 26. 在另一个控件中禁用一个控件的按钮
- 27. 通过从一个控件到另一个控件的索引
- 28. 获取控件从一个窗体中的一个tabbar控件
- 29. C#灰掉一个控件,然后再画一个控件
- 30. 如何将一个控件绑定到另一个控件?
的当试图访问该Ctrl键(如通过所有的控制循环,从而debug.print他们),一个弹出框说的“物业是只写”遇到这种特殊的控制时。 – tosa 2009-10-30 00:09:10
您描述的错误是当您试图设置控件的Enabled属性给您带来问题时?它是什么样的控制?在设计器中查看表单时是否可以为控件设置Enabled属性?控件的Enabled属性可能是只读的 - 这就是您设置的错误消息所说的内容。看到我的编辑可能有效的另一个想法。 – 2009-10-30 05:31:13