Причина этого VB6-подобного запаха, который допускает VB.NET, вместо этого выдавать ошибку: WinFormType.InstanceProp = Value [DISABLE My.Forms] - PullRequest
6 голосов
/ 18 мая 2011

Я заметил нечто очень неприятное с обработкой объектов Winform в VB.Net.

Это разрушило несколько часов нашего времени.Это будет только хуже, так как у нас будет больше наших программистов на VB6, которые привыкли делать такие вещи, и автоконвертированный код, который переносит конструкцию прямо из vb6.

Вот приемлемый способ сделать что-то:

Dim FormInstance as New FormClassName
If FormInstance.ShowDialog() = DialogResult.OK then
    TheAnswer = FormInstance.TextBox1.Text
EndIf

Однако это позволяет:

If FormClassName.ShowDialog() = DialogResult.OK then
    TheAnswer = FormClassName.TextBox1.Text
EndIf

Помните, что свойства и методы не являются общими.Превращение Application Framework не имеет значения.Кажется, что за кулисами VB создает глобальную копию формы и перенаправляет этот синтаксис в эту глобальную ссылку.Вы можете вообразить хаос, который это наносит современной программе!Часто разработчик добавит его, или мы пропустим очистку неясного кода от преобразования (да, я сейчас ищу это, так что это помогает).

Любая настройка, которую я могу сделать, чтобы вызвать этосообщение об ошибке, например, Reference to a non-shared member requires an object reference, как это должно быть?

Вот решение:

Я выбрал ответ jmoreno, потому что он указал мне на виновника: My.Forms.Исправить это было так же просто, как поместить это в модуль:

Namespace My.MyProject.MyForms
End Namespace

Тогда вы получите точную ошибку, о которой я упоминал выше.Так же, как вы должны.Если вам это нужно для устаревших приложений (что хорошо), не делайте этого!Я подумал, что Gserg может быть просто бить VB (забавно, но не полезно), но он сразу все это упомянул, и, поскольку я нашел ответ, мы снова хорошо понимаем, что vb не сосет, если вы просто не знакомы с ним.

Обратите внимание, что если вы используете каркас приложения, вы получите ошибку, которую вы не хотите в application.designer.Исправление:

    Protected Overrides Sub OnCreateMainForm()
        ''//was: Me.MainForm = Global.WindowsApplication2.Form1
        Me.MainForm = New Form1
    End Sub

Надеюсь, так будет и при любых плохих побочных эффектах!

Рефлексия Дж. Морено и т. Д.

Вышесказанное настолько просто, что я ненавижупредложить что-то еще, но если вам интересно, здесь есть улучшения в этом коде, чтобы (1) добавить отражение, чтобы исключить необходимость жесткого кода в каждой создаваемой вами форме, и (2) сделать его автоматически принудительным (всего один вызов этого подпрограммы взапуск программы).Просто поместите это в модуль:

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

Ответы [ 2 ]

6 голосов
/ 18 мая 2011

Нет. Это запутанное поведение является намеренным.

В VB стало возможным использовать один экземпляр формы, не создавая его, и такое поведение с радостью добралось до VB.NET. Для меня это один из худших вариантов дизайна.
Но это облегчает преобразование устаревших проектов. И это делает одолжение тем, кто даже не знал, что форма может быть явно создана.

Но вы не обязаны использовать этот трюк, как вы никогда не были в VB6. На обоих языках вы можете использовать явно созданные экземпляры, в этом случае экземпляр по умолчанию не будет создан. Просто забудьте, что эта «особенность» существует, и пусть она возвращается к вам только при просвещении других.

3 голосов
/ 19 мая 2011

Сорт.Вы можете создать функцию или переопределить ShowDialog, который проверяет коллекцию My.Forms, чтобы увидеть, находится ли в ней текущий экземпляр и генерируется ли исключение.Не существует параметра, который можно использовать для предотвращения его использования.

РЕДАКТИРОВАТЬ: добавление примера кода, иллюстрирующего концепцию (с использованием звукового сигнала вместо исключения).то же самое с помощью размышления оставлено читателю в качестве упражнения ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...