Что нового в сгенерированном коде по сравнению с написанным разработчиком, в чем разница? - PullRequest
1 голос
/ 09 июня 2011

Я изучаю компоненты в vb, выполнив http://msdn.microsoft.com/en-us/library/151w6x12(v=VS.100).aspx

Все работает точно так же, как учебное пособие, до добавления кода для конструктора.В моем добавленном компоненте в CDemo.vb нет Sub New.Я нашел Sub New в CDemo.Designer.vb (который, я думаю, генерируется системой).

<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
    MyBase.New()

    'This call is required by the Component Designer.
    InitializeComponent()

End Sub

Если я добавлю sub New в CDemo.vb следующим образом, появится ошибка BC30269: «Public Sub New ()» имеет несколько определений с одинаковыми сигнатурами.

Public Class CDemo

    Public ReadOnly InstanceID As Integer
    Private Shared NextInstanceID As Integer = 0
    Private Shared ClassInstanceCount As Long = 0

  Sub New()
    InstanceID = NextInstanceID
    NextInstanceID += 1
    ClassInstanceCount += 1

  End Sub

End Class

Но если я не добавлю sub New в CDemo.vb, вместо этого добавлю код в CDemo.Designer.vb, он скажет, что проект не может быть запущен напрямую.

<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
    MyBase.New()
    InstanceID = NextInstanceID
    NextInstanceID += 1
    ClassInstanceCount += 1
    'This call is required by the Component Designer.
    InitializeComponent()

End Sub

Я не понимаю, что такое CDemo.Designer.vb и где я должен добавить свой собственный код?Для новичка мне трудно различить сгенерированный системой код и мой код.

Ответы [ 4 ]

3 голосов
/ 10 июня 2011

Помните, что страница, на которую вы ссылаетесь, устарела, выберите ту, которая соответствует вашей версии Visual Studio.Вы имеете дело с двумя проблемами здесь.По одному:

Среда IDE автоматически генерировала код в файле Designer.vb при добавлении компонента в проект.Существует общее правило: никогда редактировать код в файле Designer, поскольку он обычно поддерживается конструктором.Если вам не нужно, и это один из таких случаев.Вырежьте и вставьте конструкторы из файла Designer в файл исходного кода CDemo.vb.Остерегайтесь, что есть два , не забудьте переместить их обоих.Перемещение их вместо повторного ввода конструктора решает первую проблему.

Остерегайтесь того, что вы написали конструктор неправильно.Вы должны добавить строки, а не заменять те, которые уже есть.Лучшее место - после вызова InitializeComponent ().

Вторая проблема - сообщение об ошибке «Проект не может быть запущен напрямую».Вы не можете запустить компонент, вы должны создать программу, которая использует компонент.Это очень хорошо описано в статье MSDN, на которую вы ссылаетесь в разделе «Тестирование компонента».

0 голосов
/ 06 апреля 2017
  • Просто измените функцию New () на New1 () и прокомментируйте 'MyBase.New
  • Изменить также функцию OnCreateMainForm () на OnCreateMainForm1 ()

и будет работать всегда!

См. Папку ... \ YourApllicationFolder \ My Project, чтобы попасть в файл

0 голосов
/ 10 июня 2011

Ааа .. вы используете VS2003? Это делило вещи немного по-другому. Вы можете попробовать Public Overrides sub New ()

Или просто не помещайте код в sub new, вставляйте его в событие LOAD (обычно это нормально, хотя есть несколько вещей, которые вам, возможно, придется сделать в sub new).

Начиная с 2008 и 2010 годов, по крайней мере для пользовательских контроллеров, вы + можете + напрямую вводить публичную подпрограмму new в частичном классе кода, и это не будет конфликтовать с файлом designer.vb.

0 голосов
/ 09 июня 2011

Таким образом, ваше предположение, что код CDemo.Designer.vb генерируется конструктором, является правильным. На этой заметке вы обычно не хотите вносить изменения в этот код, поскольку он может неожиданно измениться с помощью генерации кода, выполняемой Visual Studio. Причина, по которой он здесь, заключается в том, что вам не нужно об этом беспокоиться, и вам не следует.

Он в частичном классе, поэтому вы его обычно не видите.

На вопрос о том, куда вы должны поместить ваш Public Sub New, он должен быть в файле CDemo.vb. Я думаю, что причина того, что вы получаете ошибку для нескольких определений, заключается в том, что вы не объявляете ее общедоступной.

Это должно выглядеть так в вашем коде.

Public Sub New()
    InstanceID = NextInstanceID
    NextInstanceID += 1
    ClassInstanceCount += 1

  End Sub
...