tosa
tosa

Reputation: 421

VB6 control iteration: one control gives me an error; which one?

I am trying to loop through all controls in a form: For Each ctrl in Me.Controls in order enable/disable the control based on some conditions. But there is a control on the form that gives an error when I try to access it. What kind of control does that, and how do I find it?

Upvotes: 2

Views: 2533

Answers (6)

user3818752
user3818752

Reputation:

To avoid such problems follow the given rules while naming contols

  • When you name an element in your Visual Basic application, the first character of that name must be an alphabetic character or an underscore.

  • **Begin each separate word in a name with a capital letter, as in FindLastRecord and RedrawMyForm.

  • Begin function and method names with a verb, as in InitNameArray or CloseDialog. Begin class, structure, module, and property names with a noun, as in EmployeeName or CarAccessory.

  • Begin interface names with the prefix "I", followed by a noun or a noun phrase, like IComponent, or with an adjective describing the interface's behavior, like IPersistable. Do not use the underscore, and use abbreviations sparingly, because abbreviations can cause confusion.

  • Begin event handler names with a noun describing the type of event followed by the "EventHandler" suffix, as in "MouseEventHandler".

  • In names of event argument classes, include the "EventArgs" suffix. If an event has a concept of "before" or "after," use a suffix in present or past tense, as in "ControlAdd" or "ControlAdded".

  • For long or frequently used terms, use abbreviations to keep name lengths reasonable, for example, "HTML", instead of "Hypertext Markup Language". In general, variable names greater than 32 characters are difficult to read on a monitor set to a low resolution. Also, make sure your abbreviations are consistent throughout the entire application. Randomly switching in a project between "HTML" and "Hypertext Markup Language" can lead to confusion.

  • Avoid using names in an inner scope that are the same as names in an outer scope. Errors can result if the wrong variable is accessed. If a conflict occurs between a variable and the keyword of the same name, you must identify the keyword by preceding it with the appropriate type library. For example, if you have a variable called Date, you can use the intrinsic Date function only by calling DateTime.Date.

Upvotes: 0

MarkJ
MarkJ

Reputation: 30398

Tosa: from your comment on AngryHacker's answer, I think you are checking the container incorrectly.

Your code is like this

 ' BAD CODE '
 If ctrl.Container = fraMovies Then

For me that gives error 450 Wrong number of arguments or invalid property assignment. Do you get the same error?

The code should use Is rather than =, like this

 ' GOOD CODE '
 If ctrl.Container Is fraMovies Then

Explanation. You want to check whether two variables "point" to the same control. Controls are objects: you must use Is not = to check whether two object variables "point" to the same object. This is a classic pitfall in VB6.

One last word. Next time, could you try to post 10 lines or less of actual code, reproducing the error, and give the exact error number and message and the exact line on which it occurs? It really does make it much easier for us to solve your problem - I know it's work for you to shorten the code, but you'll get better answers that way.

EDIT Welcome back! :) You said some controls don't have a Container property. You could try wrapping the test in On Error Resume Next, something like this.

 ' 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 

Upvotes: 0

jasonk
jasonk

Reputation: 1570

Suppress the error reports before the loop and then set it back to standard error handling:

On Error Resume Next
 For Each ctrl In Me.Controls
      ctrl.Enabled = lIsEnabled
 Next
 On Error GoTo 0

OR name your controls with a standard prefix/suffix that you can check by name and skip in the loop.

For Each ctrl In Me.Controls
      If Left(ctrl.Name, 3) = "sst" Then
           ctrl.Enabled = lIsEnabled
      End If
 Next

Upvotes: 0

Dan S
Dan S

Reputation: 1206

Try this:

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

Upvotes: 1

Jay Riggs
Jay Riggs

Reputation: 53593

When you get your error and click Debug, is the error on the line setting a control's Enabled property?

If so, add a Debug.Print statement writing out the control's name. Do so on the line before setting the Enabled property.

Here's what I mean:

Dim ctrl As Control
For Each ctrl In Me.Controls
    Debug.Print ctrl.Name
    ctrl.Enabled = True      
Next

The Debug.Print statement will write out to the Immediate Window the name of the control that was last processed in the loop, presumably the one that caused your error.

EDIT

This might work. Put this control in a Panel control and set the Panel's Enabled property to False. If I recall correctly, in VB6 setting a container control's Enabled property to False will also set the container's child controls Enabled to False. If your control's Enabled property really is read-only, I'm curious what would happen.

Upvotes: 1

AngryHacker
AngryHacker

Reputation: 61606

Another approach is as follows, that also works at runtime (as opposed to just in the 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

Upvotes: 0

Related Questions