Рейтинг:
8
Richard Deeming
Попробуйте использовать общий метод:
Private Sub CreateChild(Of TForm As {Form, New})()
Dim frmChild As New TForm()
...
End Sub
Чтобы вызвать его, вам нужно указать тип формы, которую вы хотите создать:
CreateChild(Of YourCustomForm)()
Тип должен наследовать от
Form
, и должен иметь открытый конструктор без параметров.
Универсальные типы в Visual Basic (Visual Basic) | Microsoft Docs[
^]
BeginnerCoderPete
Я, кажется ,получаю ошибку on, New), говоря, что это не действительный идентификатор. В настоящее время я читаю по ссылке, которую вы предоставили. Спасибо
Richard Deeming
Извините, я неправильно прочитал ссылку. Вам нужны фигурные скобки вокруг ограничений, когда у вас есть несколько ограничений:
(Of TForm As {Form, New})
BeginnerCoderPete
У меня есть публичная переменная в форме, которую я открываю как ребенок, можно ли также передать ее в этот суб, чтобы передать в созданную дочернюю форму?
Richard Deeming
Вам нужно будет объявить свойство в базовом классе или интерфейсе, а ваши формы унаследовать от базового класса или реализовать интерфейс.
Затем вы добавите базовый класс / интерфейс в качестве ограничения на метод:
(Of TForm As {BaseClass, New})
(Of TForm As {Form, IInterface, New})
Затем у вас будет доступ к членам этого базового класса / интерфейса внутри метода.
BeginnerCoderPete
Спасибо за ваш ответ, в данный момент мне трудно собраться с мыслями, так что мне придется потратить некоторое время на чтение этой книги. Очень ценю вашу помощь.
BeginnerCoderPete
Я пробежал это мимо своего ИТ-менеджера, когда вернулся на работу, и он придумал вот это
Private Sub CreateChild1(Of TForm As {Form, New})(intVariableName As String, intVariableValue As Integer)
Dim frmChild As New TForm()
frmChild.MdiParent = My.Forms.frmNavigation
CallByName(frmChild, intVariableName, CallType.Set, intVariableValue)
frmChild.Show()
frmChild.Tag = My.Forms.frmNavigation.intTabCounter
frmChild.FormBorderStyle = FormBorderStyle.None
frmChild.ControlBox = False
frmChild.MaximizeBox = False
frmChild.MinimizeBox = False
frmChild.ShowIcon = False
frmChild.Text = ""
frmChild.Dock = DockStyle.Fill
End Sub
Часть CallByName () - это то, что он использовал для передачи значения. Я просто подумал, Хорошо ли это на самом деле, так как это отличается от вашего предложения.
Richard Deeming
CallByName[^]- это специфичный для VB вызов с поздней привязкой.
Если это работает для того, что вам нужно, тогда все в порядке.
Это будет немного медленнее, чем использование базового класса или интерфейса, но если вы не вызываете его в узком цикле, вы, вероятно, не заметите разницы. :)
BeginnerCoderPete
Хорошо :) спасибо за ваш ответ
BeginnerCoderPete
Отлично, большое вам спасибо.