Porque esse cheiro semelhante ao VB6, que o VB.NET permite, ao invés disso, erro: WinFormType.InstanceProp = Value [DISABLE My.Forms]
Tenho notado algo muito desagradável com o tratamento do VB.Net sobre objetos Winfor
Isso destruiu várias horas do nosso tempo. Isso só vai piorar, pois temos mais de nossos programadores VB6 acostumados a fazer coisas como essa e código autoconvertido que traz a construção diretamente da vb
qui está uma maneira aceitável de fazer as coisa
Dim FormInstance as New FormClassName
If FormInstance.ShowDialog() = DialogResult.OK then
TheAnswer = FormInstance.TextBox1.Text
EndIf
No entanto, permite:
If FormClassName.ShowDialog() = DialogResult.OK then
TheAnswer = FormClassName.TextBox1.Text
EndIf
Lembre-se de que as propriedades e métodos não são compartilhados. A mudança do Application Framework não importa. Parece que nos bastidores, o VB instancia uma cópia global do formulário e redireciona essa sintaxe para essa referência global. Você pode imaginar o estrago que isso causa em um programa moderno! Muitas vezes, um desenvolvedor o lança ou perderemos a limpeza de algum código obscuro da conversão (sim, estou procurando isso agora, o que ajuda).
Qualquer configuração que eu possa fazer para gerar uma mensagem de erro, por exemplo,Reference to a non-shared, member requires an object reference
, como deveria?
Escolhi selecionar a resposta de jmoreno porque ele apontou o culpado por mim:My.Forms
. A correção foi tão fácil quanto colocar isso em um módulo:
Namespace My.MyProject.MyForms
End Namespace
Então você recebe o erro exato que eu mencionei acima. Assim como você deveria. Se você precisar disso para aplicativos herdados (uma coisa boa), não faça isso! Eu pensei que Gserg poderia ser apenas um VB bashing (divertido, mas não útil), mas ele mencionou tudo isso imediatamente, e desde que eu encontrei a resposta, somos bons novamente em vb não sugar, a menos que você não esteja familiarizado com iss
Observe que, se você usar a estrutura do aplicativo, receberá um erro que não deseja no application.designer. O conserto
Protected Overrides Sub OnCreateMainForm()
''//was: Me.MainForm = Global.WindowsApplication2.Form1
Me.MainForm = New Form1
End Sub
Felizmente isso seria por quaisquer efeitos colaterais ruins!
Reflexão de JMoreno, etc.O acima é tão simples que eu odiaria sugerir qualquer outra coisa, mas se você estiver curioso, aqui estão as melhorias nesse código para (1) adicionar reflexão para não ter que codificar em cada formulário que você faz e (2) fazê-lo imposição automática (com apenas uma chamada para este sub na inicialização do programa). Basta colocar isso em um 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