Porque este olor similar a VB6, que VB.NET permite, en su lugar produce un error: WinFormType.InstanceProp = Value [DISABLE My.Forms]
He notado algo muy desagradable con el tratamiento de VB.Net de los objetos Winform.
Esto ha destrozado varias horas de nuestro tiempo. Solo empeorará a medida que tengamos más de nuestros programadores VB6 que están acostumbrados a hacer cosas como esta, y un código autoconvertido que lleva la construcción directamente desde vb6.
Aquí hay una forma aceptable de hacer las cosas:
Dim FormInstance as New FormClassName
If FormInstance.ShowDialog() = DialogResult.OK then
TheAnswer = FormInstance.TextBox1.Text
EndIf
Sin embargo, permite esto:
If FormClassName.ShowDialog() = DialogResult.OK then
TheAnswer = FormClassName.TextBox1.Text
EndIf
Tenga en cuenta que las propiedades y los métodos no son compartidos. El giro de Application Framework no importa. Parece que detrás de escena, VB crea una instancia de una copia global del formulario y redirige esta sintaxis a esa referencia global. ¡Puedes imaginar el caos que esto causa en un programa moderno! A menudo, un desarrollador lo lanzará o echaremos de menos limpiar algún código oscuro de la conversión (sí, estoy buscando esto ahora, así que eso ayuda).
Cualquier configuración que pueda hacer para que esto arroje un mensaje de error, por ejemplo,Reference to a non-shared, member requires an object reference
, como debería?
Elegí seleccionar la respuesta de jmoreno porque señaló el culpable para mí:My.Forms
. Arreglarlo fue tan fácil como poner esto en un módulo:
Namespace My.MyProject.MyForms
End Namespace
Entonces obtienes el error exacto que mencioné anteriormente. Justo como deberías. Si necesita eso para aplicaciones heredadas (algo bueno), ¡entonces no haga esto! Pensé que Gserg podría ser un golpe de VB (divertido pero no útil), pero mencionó todo esto de inmediato, y desde que encontré la respuesta, estamos bien de nuevo acerca de que vb no succione a menos que no esté familiarizado con él.
Nota: si utiliza el marco de la aplicación, obtendrá un error que no desea en application.designer. La solución
Protected Overrides Sub OnCreateMainForm()
''//was: Me.MainForm = Global.WindowsApplication2.Form1
Me.MainForm = New Form1
End Sub
Espero que sea por cualquier efecto secundario negativo!
Reflexión de JMoreno, etc.Lo anterior es tan simple que odiaría sugerir algo más, pero si tiene curiosidad, aquí hay mejoras en ese código para (1) agregar reflejo para omitir tener que codificar en cada forma que realice y (2) hacerlo aplicación automática (con solo una llamada a este sub al inicio del programa). Simplemente ponga esto en un módulo:
Public Sub FixMyForms()
For Each pi As System.Reflection.PropertyInfo In GetType(My.MyProject.MyForms).GetProperties
Dim obj As Object = pi.GetValue(My.Forms, Nothing)
If TypeOf obj Is Form Then
AddHandler CType(obj, Form).Load, AddressOf Complainer
End If
Next
End Sub
Private Sub Complainer(ByVal sender As Object, ByVal e As System.EventArgs)
MsgBox("WRONG!")
End Sub