VB - найти дочернюю форму от родителя

Я нахожусь в проекте с множественной формой.

Я создаю форму TicTacToe здесь:

 Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim page As Form = New TicTacToe
    page.Show(Me)
End Sub

Вот форма TicTacToe:

Public Class TicTacToe

    Public opponent as String
    'Some code where user set opponent

    Public Function Receive(S As String)
    if string = opponent
        'Some code
    End Function

End Class

Я хотел бы вызвать свою функцию Receive в моей основной форме Если я сделаю:

TicTactoe.Receive(S) Он вызывает экземпляр Receive, где оппонент не существует.

Я хотел бы найти открытую форму TicTacToe и вызвать Receive

Спасибо

можете ли вы быть более конкретным в вашем вопросе, пожалуйста? трудно сказать точно, что вы хотите. Спасибо

IAmNerd2000 29.01.2019 18:13

я улучшил вопрос

Foxhunt 29.01.2019 19:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
211
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Используйте это, чтобы показать форму

Dim page As TicTacToe
Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    page = New TicTacToe
    page.Show(Me)
End Sub

Затем вы можете использовать

page.Receive(S)

Редактировать

Использование нескольких форм

For Each f As TicTacToe in Application.OpenForms().OfType(Of TicTacToe)
        f.Receive (S)
Next

Спасибо Это работает по крайней мере для 1 формы. Но если я дважды вызываю MenuTicTacToe и создаю 2 формы, функция, похоже, не вызывается в 2 формах.

Foxhunt 29.01.2019 19:24

Теперь это идеально. Спасибо

Foxhunt 29.01.2019 21:52

На самом деле это не работает. Когда я вызываю свои формы, одна и та же форма (последняя) вызывается дважды, а другая ноль

Foxhunt 30.01.2019 00:30

Затем вам, возможно, придется создать разные формы и скопировать в них содержимое вашей формы Tictactoe, после чего вы сможете обращаться к ним по их индивидуальным именам.

preciousbetine 30.01.2019 02:45

Я не уверен. Цель состоит в том, чтобы создать онлайн TicTacToe и позволить пользователю запускать столько игр, сколько они хотят. Затем, когда я получаю удар, я должен проверить все игровые формы, если имя противника совпадает с именем полученного удара. Так что ответ, который вы дали, выглядит так. Потому что, если я создам другую форму, у меня будет ограниченное количество игр, верно?

Foxhunt 30.01.2019 03:10

К сожалению, на самом деле это работает, это была другая ошибка в более раннем коде, из-за которой он не работал. Большое спасибо за ваши ответы

Foxhunt 30.01.2019 03:33

@Phoenix В SO не очень хорошая практика изменять то, что вы спрашиваете в комментарии, а затем принимать другой ответ на основании этого комментария. Просто говорю.

Twometer 30.01.2019 08:31

В C# вам понадобится новый экземпляр, но поскольку вы работаете в VB, компилятор уже сделает это за вас.

Что вы сейчас делаете, так это создаете новый экземпляр формы TicTacToe и показываете его:

Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim page As Form = New TicTacToe
    page.Show(Me)
End Sub

Но вы нигде не сохраняете этот экземпляр. Затем в следующем фрагменте кода вы используете другой экземпляр, статический, созданный компилятором:

TicTacToe.Receive(S) // TicTacToe is the static instance

Таким образом, вы в конечном итоге вызываете два разных экземпляра, что объясняет отсутствие набора оппонентов.

Чтобы обойти эту проблему, не создавайте новый экземпляр. В вашем Private Sub MenuTicTacToe просто используйте экземпляр, созданный компилятором, и у вас не будет этой проблемы, вот так:

Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    TicTacToe.Show(Me)
End Sub

Надеюсь это поможет.

Спасибо, тогда это работает для 1 формы. Но если я дважды вызову MenuTicTacToe и создам 2 формы (или больше), как вызвать функцию в каждой форме?

Foxhunt 29.01.2019 19:40

@Phoenix Какую функцию вы хотите вызвать? Если вы хотите вызвать метод Receive, просто используйте его, как указано выше. Если я вас правильно понял, вы можете просто снова использовать приведенный выше код и заменить имена форм, просто не создавайте экземпляры форм самостоятельно. Да, и кстати, если ответ решил вашу проблему, вы можете пометить его как «принятый», используя зеленую галочку под кнопками голосования, чтобы он исчез из раздела «без ответа».

Twometer 29.01.2019 21:53

я хочу вызвать получить, но в нескольких формах. Ответ @preciousbetine похож на то, что я хочу сделать, но что-то не работает

Foxhunt 30.01.2019 00:35

Комментарии в очереди

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    page.Receive("Joe")
End Sub
'A form level variable to hold a reference to the instance of TicTacToe
'Although vb.net can use default instances, you have created an explicit
'instance of TicTacToe so you need to keep a reference if you want to
'refer to this instance.
Private page As TicTacToe
Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    page = New TicTacToe()
    page.Show(Me)
End Sub

Partial Public Class TicTacToe
    Inherits Form
    Public opponent As String
    'Functions must be declared as a Type
    'If you do not need a return value use a Sub
    Public Function Receive(S As String) As String
        Dim someString As String = ""
        If S = opponent Then
            'Do something
        End If
        'There must be a return Value
        Return someString
    End Function

End Class

ОП не ищет учебник по использованию функций! :)

preciousbetine 30.01.2019 07:58

@preciousbetine Когда я вижу неверный код в вопросе, я пытаюсь исправить его и добавить объяснение. Извините, если это беспокоит вас.

Mary 30.01.2019 18:58

Другие вопросы по теме