Microsoft KB Archive/171972

From BetaArchive Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Article ID: 171972

Article Last Modified on 12/10/2003



APPLIES TO

  • Microsoft Visual Basic 5.0 Control Creation Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition



This article was previously published under Q171972

SYMPTOMS

A UserControl created in Visual Basic and placed on a form that is opened modally does not respond to attempts made to disable it. Setting the Enabled property of the control behaves as expected on a non-modal form, but setting Enabled = False on a modal form has no effect.

RESOLUTION

You can use the Windows API function EnableWindow to enable/disable the ActiveX control.

  1. In the General Declaration section of the module, place the following declaration: (This must be declared as Private if it is included in a form module.)

          Private Declare Function EnableWindow Lib "user32" Alias _
             "EnableWindow" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
                            
  2. The hWnd property, like all UserControl properties, requires a public property method to expose the property as part of the object's interface. Since you will not be setting a value, the Property Get is all that is needed.

          Public Property Get hWnd() as Long
             hWnd=UserControl.hWnd
          End Property
                            
  3. Next, you need to associate this method with the hWnd property of the control:

    1. From the Tools menu, select Procedure Attributes.
    2. Select "hWnd" from the Name drop-down list.
    3. Click the Advanced button.
    4. From the Procedure ID drop-down list, choose "hWnd." Click OK.
  4. The EnableWindow function can now be called to enable or disable the UserControl. To disable the UserControl:

          Dim result as Long
          result = EnableWindow(Me.UserControl1.hWnd, 0)
                            

    To enable the UserControl:

          Dim result as Long
          result = EnableWindow(Me.UserControl1.hWnd, 1)
                            


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug has been fixed in Visual Basic 6.0.

MORE INFORMATION

Steps to Reproduce Behavior

  1. Create a new "ActiveX Control" project.
  2. Add the following code to the UserControl:

          Public Property Get enabled() As Boolean
               enabled = UserControl.enabled
          End Property
    
          Public Property Let enabled(vNewValue As Boolean)
               UserControl.enabled = vNewValue
          End Property
    
          Private Sub UserControl_Click()
              MsgBox "Control is not Disabled."
          End Sub
                            
  3. From the Tools menu, select Procedure Attributes.
  4. Click the Advanced button.
  5. From the Procedure ID drop-down, chose "Enabled." Click OK.
  6. Add a "Standard EXE" project.
  7. Close the UserControl window, and add the UserControl to Form1.
  8. Add two CommandButtons to Form1. Set the following properties.

          Name: Command1    Caption: "Enable Control"
          Name: Command2    Caption: "Disable Control"
                            
  9. Add the following code to Form1.

          Private Sub Command1_Click()
             Me.UserControl11.Enabled = True
          End Sub
    
          Private Sub Command2_Click()
             Me.UserControl11.Enabled = False
          End Sub
                            
  10. Add a standard module to the project.
  11. Add the following code to Module1:

          Public Sub Main()
                 Form1.Show vbModal
               End Sub
                            
  12. Run the project.
  13. Note that clicking on the button labeled "Disable Control" does not prevent the message box from appearing when the UserControl is clicked.
  14. Stop the project and open Module1.
  15. In Sub Main(), change:

           Form1.Show vbModal
                            

    to:

           Form1.Show
                            
  16. Run the project again, and note that the "Disable Control" button now functions as expected and the message box does not appear.



Additional query words: kbComp kbCtrl kbVBp kbdsd kbVBp500bug kbVBp600fix kbDSupport kbCtrlCreate kbAPI

Keywords: kbbug kbfix KB171972