excelvbavb6runtime-errorexcel-automation

VB6 Automation Error when calling Add on previously created MultiPage


I want to generate a bunch of MultiPages and create new Pages dynamically in my app, but i'm getting Run-time error '-2147417848 (80010108)': Automation error The object invoked has disconnected from its clients.

Steps to reproduce

In a Class Module named TestClass:

Public WithEvents TestMultiPage As MsForms.MultiPage

Sub createPage()
    TestMultiPage.Add
End Sub

In a UserForm named TestForm:

Dim TestInstances as New Collection

Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X as Single, ByVal Y as Single)
    If Button = fmButtonRight Then
        Dim TestInstance as New TestClass
        Set TestInstance.TestMultiPage = Me.Controls.Add("Forms.MultiPage.1")
        TestInstances.Add TestInstance
    End If
End Sub

Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim TestInstance As TestClass: Set TestInstance = TestInstances(1)
    TestInstance.createPage
End Sub

When i right-click the UserForm twice, i get two MultiPages. Then i double-click the UserForm, expecting the first MultiPage to have a new Page. But i hit the automation error at TestInstance.createPage -> TestMultiPage.Add, even though all the variables seem present from the Locals window.

What am i missing?

Conclusion

Following @GSerg's answer, i suppose there's no way to do this with MultiPage. Instead i have to use TabStrip instead and emulate the other behaviour of MultiPage.

Just to add some context, i was trying to create a browser-like UI with windows and tabs (a TabStrip at the bottom representing different windows, each window corresponding to a MultiPage with multiple tabs). I hit the obscure error when switching back to a previous MultiPage and creating a new tab.


Solution

  • There appears to be a problem in MSForms, where it cripples the existing MultiPage controls when a new one is added. To reproduce the problem, you don't need collections, arrays, classes, or even variables:

    Sub Reproduce()
      Me.Controls.Add "Forms.MultiPage.1", "TestInstance1"
      Me.Controls("TestInstance1").Add  ' That works
    
      Me.Controls.Add "Forms.MultiPage.1", "TestInstance2"
      Me.Controls("TestInstance1").Add  ' Now it does not
      Me.Controls("TestInstance2").Add  ' But the new shiny one does
    
      Me.Controls.Add "Forms.MultiPage.1", "TestInstance3"
      Me.Controls("TestInstance2").Add  ' Now the instance 2 is also defunct
      Me.Controls("TestInstance3").Add  ' Only the latest one works
    End Sub
    

    I do not know why that is so. It looks like a bug in MSForms.

    The controls work fine otherwise, and their properties are accessible, you just can't call Add anymore.