BeginnerCoderPete Ответов: 1

Как передать форму субподрядчику, чтобы создать из нее дочернюю форму?


Я хотел, чтобы субподрядчик создавал дочерние формы, но у меня возникли проблемы
Private Sub CreateChild(frm As Form)

    Dim frmChild As New frm
    frmChild.MdiParent = My.Forms.frmNavigation
    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


Интересно, может ли кто-нибудь подтолкнуть меня в правильном направлении?

Я чувствую, что это потому, что я пытаюсь тускнеть как новый, но я передаю ему форму, в которой я хочу тускнеть как новый.

Что я уже пробовал:

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

1 Ответов

Рейтинг:
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

Отлично, большое вам спасибо.