#vb.net #multidimensional-array
#vb.net #многомерный массив
Вопрос:
У меня есть массив PictureBox, который создает сетку из 10,10 изображений, как я могу пометить одно из этих pictureboxes?
Public Class Form1
Inherits System.Windows.Forms.Form
Dim active As Boolean = True
Dim images(8) As Image 'declares image array
Dim zonesY As Integer = 10
Dim zonesX As Integer = 100
Dim Guy As Object
Dim generator As New Random
' Dim x As Integer 'declares x as an integer variable
' Dim y As Integer 'declares y as an integer variable
Dim oGrid(zonesX, zonesY) As PictureBox
Private Sub SetupGrid()
images(0) = Image.FromFile("clear.png")
images(1) = Image.FromFile("1.png")
images(2) = Image.FromFile("2.png")
images(3) = Image.FromFile("3.png")
images(4) = Image.FromFile("4.png")
images(5) = Image.FromFile("5.png")
images(6) = Image.FromFile("blank.png")
images(7) = Image.FromFile("hit.png")
images(8) = Image.FromFile("mine.png")
For y As Integer = 1 To zonesY 'starts a For loop (1 to zonesY number of loops)
For x As Integer = 1 To zonesX 'starts a For loop (1 to zonesX number of loops)
Dim zonesize1 As Integer
Dim zonesize2 As Integer
Dim blockStatus As Integer
Dim allZones As Integer
allZones = zonesX * zonesY
blockStatus = generator.Next(0, allZones)
oGrid(x, y).Name = x amp; ", " amp; y
MsgBox(oGrid(x, y).Name)
If blockStatus < (allZones / 5) Then
oGrid(x, y).Tag = True
If oGrid(x, y).Tag = True Then
oGrid(x, y).Image = images(8)
End If
Else
oGrid(x, y).Tag = False
If oGrid(x, y).Tag = False Then
oGrid(x, y).Image = images(6)
End If
End If
oGrid(x, y).Height = 16
oGrid(x, y).Width = 16
zonesize1 = oGrid(x, y).Height 'sets out all of the boxes on the form.
zonesize2 = oGrid(x, y).Width
oGrid(x, y).Left = ((x - 1) * zonesize1 15)
oGrid(x, y).Top = ((y - 1) * zonesize2 15)
Me.Controls.Add(oGrid(x, y))
' Wire this control up to an appropriate event handler
AddHandler oGrid(x, y).Click, AddressOf pbxNewZoneClicked
Next
Next
Me.Height = 500 'sets the height of fmmGame
Me.Width = 500 'sets the width of frmGame
End Sub
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SetupGrid()
End Sub
Private Sub CheckHits()
Dim FicX1 As Integer = zonesX - 1
Dim FicY1 As Integer = zonesY - 1
Dim counter As Integer = 0
End Sub
Private Sub pbxNewZoneClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
If active = True Then
Dim pb As PictureBox = DirectCast(sender, PictureBox)
Dim splitName() As String = pb.Name.Split(",")
Dim x As Integer = Convert.ToInt32(splitName(0))
Dim y As Integer = Convert.ToInt32(splitName(1))
Dim Status As String = "Clear" ' Status - Testing Purposes Only
If pb.Tag = True Then ' Status - Testing Purposes Only
Status = "Mine" ' Status - Testing Purposes Only
End If
' MsgBox(pb.Name amp; vbCrLf amp; "Status: " amp; Status, , "Test") ' Post Statistics of box.
Dim counter As Integer = 0
If oGrid(x, y).Tag = True Then
pb.Image = images(7) ' Hit Image
active = False
' MsgBox("No Longer Active", , "Test") ' Testing Purposes Only
ElseIf oGrid(x, y).Tag = False Then
pb.Image = images(counter) ' Clear Image by default.
End If
End If
End Sub
End Class
Я пытаюсь проверить, поднялся ли picturebox на единицу, и оставил свой тег = True равным = 1 счетчику.
Комментарии:
1. Цель? Пожалуйста, объясните, что вы пытаетесь сделать? Это проблема взаимодействия с пользователем или проблема учета изображений?
Ответ №1:
Закомментируйте эти строки:
'Dim x As Integer 'declares x as an integer variable
'Dim y As Integer 'declares y as an integer variable
Измените эту строку:
Dim oGrid(zonesX, zonesY) As PictureBox
Измените свои циклы на это:
For y As Integer = 1 To zonesY 'starts a For loop (1 to zonesY number of loops)
For x As Integer = 1 To zonesX 'starts a For loop (1 to zonesX number of loops)
'// blah-blah
Next
Next
Добавьте это в свой pbxNewZoneClicked:
Dim splitName() As String = pb.Name.Split(",")
Dim x As Integer = Convert.ToInt32(splitName(0))
Dim y As Integer = Convert.ToInt32(splitName(1))
Это «должно» запустить вашу программу.
Это лучший способ сделать это? Вероятно, нет, но это гораздо более долгий разговор.
Комментарии:
1. Теперь, когда я прокручиваю oGrid (x, y).Name = x amp; «, » amp; y говорит, что oGrid (x, y) — это ничто. Код обновлен.
2. @RickBross Что случилось со строкой «oGrid (x, y) = New PictureBox»? Сейчас этого нет.
3. Не уверен, там говорилось о выходе за пределы массива, должен ли я это иметь?
Ответ №2:
Вы не так много дали для работы. Я просмотрел другие ваши вопросы, чтобы попытаться собрать их воедино.
Я «думаю», что вы хотите сделать что-то вроде этого:
Private Sub CheckHits(ByVal column As Integer, ByVal row As Integer)
'Above Left:
If column > 0 And row > 0 Then
If oGrid(column - 1, row - 1).Tag Then
counter = 1
End If
End If
'Above:
If row > 0 Then
If oGrid(column, row - 1).Tag Then
counter = 1
End If
End If
'// continue going around the cell
End Sub
В вашем опубликованном коде вы ссылаетесь на второй двухмерный массив Picturebox (,), где, похоже, у вас уже есть все в массиве oGrid (,). Я просто использую массив oGrid.
Кроме того, вы должны проверить границы. Если вы проверяете квадрат (0, 0), вам, очевидно, придется игнорировать левую и верхнюю координаты, поскольку они не существуют в сетке.
Комментарии:
1. не знал, что можно просто поместить .tag в конец массива. Думаю, это имеет смысл, поскольку это picturebox и все такое.
2. @RickBross Да, поскольку у вас есть массив PictureBoxes, вам доступны все свойства PictureBox.
3. теперь он просто говорит: «Ссылка на объект не установлена на экземпляр объекта».
4. @RickBross Тогда вы не связали массив с реальными pictureboxes. Вам нужно будет перебрать ваши pictureboxes и назначить их вашему массиву oGrid (,). Я предположил, что вы уже делали это, когда в вашем сообщении у вас был «ДРУГОЙ КОД …»
5. ОБНОВЛЕННЫЙ КОД, его копия и возможность вставки, все создано во время выполнения.