Hola,
He intentado replicar el ambiente que tienes y he esto es lo que he modificado:
Código:
Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
Dim frmSeleccion As Form4
Select Case ToolBar1.Buttons.IndexOf(e.Button)
Case 0
frmSeleccion = AbrirVentana(GetType(Form4), 0)
frmSeleccion.sql = "select idejercicio,nombre,finalidad from Ejercicios"
frmSeleccion.tabla = "Ejercicios"
Case 1
frmSeleccion = AbrirVentana(GetType(Form4), 1)
frmSeleccion.sql = "select idproveedor,nombre,telefono1,telefono2 from Proveedores"
frmSeleccion.tabla = "Proveedores"
End Select
frmSeleccion.Show()
End Sub
Private Shared formInstances As New SortedList ' Para guardar las referencias de las instancias de los formularios
Public Shared Function AbrirVentana(ByVal type As Type, Optional ByVal index As Integer = 0) As Form
Dim Formulario As Form = formInstances(type.ToString() & index) ' No compila con "Option Strict", usar el de abajo
' Dim Formulario as Form = CType(formInstances(type.ToString()), Form)
If Formulario Is Nothing OrElse Formulario.IsDisposed Then
Formulario = Activator.CreateInstance(type) ' No compila con "Option Strict", usar el de abajo
' formulario = Ctype(Activator.CreateInstance(type), Form)
formInstances(type.ToString() & index) = Formulario
End If
Formulario.Activate()
Formulario.WindowState = FormWindowState.Normal
Return Formulario
End Function
Como ves, ahora le paso como parámetro opcional el índice del botón que llama a dicha función, el cual se concatena con el tipo del formulario para controlar el número de instancias, si bien es una _solución_ que funciona, personalmente no me gusta...
Saludos