Я нахожусь в проекте с множественной формой.
Я создаю форму 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
Спасибо
я улучшил вопрос





Используйте это, чтобы показать форму
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 формах.
Теперь это идеально. Спасибо
На самом деле это не работает. Когда я вызываю свои формы, одна и та же форма (последняя) вызывается дважды, а другая ноль
Затем вам, возможно, придется создать разные формы и скопировать в них содержимое вашей формы Tictactoe, после чего вы сможете обращаться к ним по их индивидуальным именам.
Я не уверен. Цель состоит в том, чтобы создать онлайн TicTacToe и позволить пользователю запускать столько игр, сколько они хотят. Затем, когда я получаю удар, я должен проверить все игровые формы, если имя противника совпадает с именем полученного удара. Так что ответ, который вы дали, выглядит так. Потому что, если я создам другую форму, у меня будет ограниченное количество игр, верно?
К сожалению, на самом деле это работает, это была другая ошибка в более раннем коде, из-за которой он не работал. Большое спасибо за ваши ответы
@Phoenix В SO не очень хорошая практика изменять то, что вы спрашиваете в комментарии, а затем принимать другой ответ на основании этого комментария. Просто говорю.
В 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 формы (или больше), как вызвать функцию в каждой форме?
@Phoenix Какую функцию вы хотите вызвать? Если вы хотите вызвать метод Receive, просто используйте его, как указано выше. Если я вас правильно понял, вы можете просто снова использовать приведенный выше код и заменить имена форм, просто не создавайте экземпляры форм самостоятельно. Да, и кстати, если ответ решил вашу проблему, вы можете пометить его как «принятый», используя зеленую галочку под кнопками голосования, чтобы он исчез из раздела «без ответа».
я хочу вызвать получить, но в нескольких формах. Ответ @preciousbetine похож на то, что я хочу сделать, но что-то не работает
Комментарии в очереди
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 Когда я вижу неверный код в вопросе, я пытаюсь исправить его и добавить объяснение. Извините, если это беспокоит вас.
можете ли вы быть более конкретным в вашем вопросе, пожалуйста? трудно сказать точно, что вы хотите. Спасибо