2009-10-29 49 views

回答

1

当你得到你的错误,然后单击调试,线上的错误设置控件的启用属性?

如果是这样,请添加一个写出控件名称的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属性确实是只读的,我很好奇会发生什么。

+0

的当试图访问该Ctrl键(如通过所有的控制循环,从而debug.print他们),一个弹出框说的“物业是只写”遇到这种特殊的控制时。 – tosa 2009-10-30 00:09:10

+0

您描述的错误是当您试图设置控件的Enabled属性给您带来问题时?它是什么样的控制?在设计器中查看表单时是否可以为控件设置Enabled属性?控件的Enabled属性可能是只读的 - 这就是您设置的错误消息所说的内容。看到我的编辑可能有效的另一个想法。 – 2009-10-30 05:31:13

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 
+0

它在SSTab上放弃了。我正在检查控件的容器是否为特定框架,然后启用/禁用它...“如果ctrl.Container = fraMovies Then ...”。但是,当程序循环并试图检查SSTab的容器时,它会引发异常。 – tosa 2009-10-30 00:23:00

+1

我猜测SSTab没有Enabled属性。 – AngryHacker 2009-10-30 02:17:26

+0

@AngryHacker:起初我还认为SSTab不能有Enabled属性:但'tosa'的问题代码行是**不使用Enabled属性**。看到我的答案,我对这个问题的看法(=不是)。你的答案是一个很好的答案,给出原始问题,这强烈暗示了在更改Enabled属性时发生问题,而不是尝试建立控件的Container。 – MarkJ 2009-10-30 15:02:51

0

土佐:从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 
+0

你好,我回过头来看这个问题。谢谢,“是”的作品。现在问题出在.container检查部分。有没有容器的控件(如commondialog),并检查他们的容器给出错误。我想要做的是循环遍历帧中的所有对象并禁用它们。原始帧(迭代循环)中的帧和对象也应该是这种情况。最好的办法是什么? – tosa 2010-03-04 00:44:03

+0

嗨,谢谢你的回应。而不是继续在下一行处理(通过On Error Resume Next,我该如何转到For Each循环中的下一个对象?问题是,即使某些控件没有容器,它们也有一个启用的属性,因此它们在简历部分被禁用/启用。更好的是,如何检查对象是否具有容器属性(不使用错误捕获器)? – tosa 2010-03-07 22:09:04

+0

嗨,在VB6中没有'Cycle'语句允许您直接进入下一个对象,我的建议是使用一个'If'块来包装Enabled属性,我会再次编辑我的答案来制作这个更简单的方法,我不认为有更简单的方法来检测是否一个对象有一个容器属性,而不是使用错误陷阱。 – MarkJ 2010-03-08 11:23:30

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 
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 
0

为了避免这样的问题,按照给定的规则而命名contols

  • 当你的名字在Visual Basic应用程序的元素,该名称的第一个字符必须是字母字符或下划线。

  • **在大写字母的名称中开始每个单独的单词,如在FindLastRecord和RedrawMyForm中。

  • 使用动词开始函数和方法名称,如在InitNameArray或CloseDialog中。 使用名词开始类,结构,模块和属性名称,如在EmployeeName或CarAccessory中。

  • 开始使用前缀“I”的接口名称,后跟名词或名词短语,如IComponent,或带有描述接口行为的形容词,如IPersistable。不要使用下划线,并谨慎使用缩写,因为缩写可能会导致混淆。

  • 使用描述事件类型的名词开始事件处理程序名称,后跟“EventHandler”后缀,如“MouseEventHandler”中所示。

  • 在事件参数类的名称中,包含“EventArgs”后缀。 如果事件的概念是“之前”或“之后”,则使用现在或过去式的后缀,如“ControlAdd”或“ControlAdded”中的后缀。

  • 对于长期或经常使用的术语,请使用缩写来保持名称长度合理,例如“HTML”,而不是“超文本标记语言”。一般来说,大于32个字符的变量名称在设置为低分辨率的监视器上很难读取。另外,请确保您的缩写在整个应用程序中保持一致。在“HTML”和“超文本标记语言”之间随意切换项目可能会导致混淆。

  • 避免在内部作用域中使用与外部作用域中的名称相同的名称。如果访问错误的变量,可能会导致错误。如果变量与同名关键字之间发生冲突,则必须通过在关键字前面加上相应的类型库来标识该关键字。 例如,如果你有一个名为日期变量,则只能通过调用DateTime.Date使用固有的日期功能。