0

基本的に、私は 2 つの int 変数を持っています。x と yi は、ピクチャボックスのグリッドを作成するために使用しています。

これはすべて流動的で、実行時に構築されます。

私が= 2の場合、クリック時にピクチャボックスを具体的に変更しようとしています。

特に変更することはできません。いずれかをクリックすると、すべてが変更されます。

助けてください!!

私のコードは次のとおりです。

  Public Class Form1
    Inherits System.Windows.Forms.Form

    Dim images(8) As Image 'declares image array

    Dim zonesY As Integer = 50
    Dim zonesX As Integer = 50

    Dim Guy As Object
    Dim pbxNewZone As PictureBox = DirectCast(Guy, PictureBox)  'declares pbxNewZone as a picturebox variable

    Dim generator As New Random

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        images(0) = Image.FromFile("blank.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("clear.png")
        images(7) = Image.FromFile("hit.png")
        images(8) = Image.FromFile("mine.png")

        Dim x As Integer  'declares x as an integer variable
        Dim y As Integer  'declares y as an integer variable
        Me.SuspendLayout()  'suspends creation of layout

        For y = 1 To zonesY 'starts a For loop (1 to zonesY number of loops)
            For x = 1 To zonesX  'starts a For loop (1 to zonesX number of loops)
                Dim zonesize1 As Integer
                Dim zonesize2 As Integer
                Dim mine As Integer

                pbxNewZone = New PictureBox

                Dim blockStatus As Integer
                Dim allZones As Integer
                allZones = zonesX * zonesY
                blockStatus = generator.Next(0, allZones)

                pbxNewZone.Name = (zonesX * (y - 1)) + x
                If blockStatus < (allZones / 10) Then
                    mine = 1
                    If mine = 1 Then
                        pbxNewZone.Image = images(8)
                    End If
                Else
                    mine = 2
                    If mine = 2 Then
                        pbxNewZone.Image = images(0)
                    End If
                End If
                pbxNewZone.Height = 16
                pbxNewZone.Width = 16
                pbxNewZone.Tag = 0
                zonesize1 = pbxNewZone.Height 'sets out all of the boxes on the form.
                zonesize2 = pbxNewZone.Width
                pbxNewZone.Left = ((x - 1) * zonesize1 + 15)
                pbxNewZone.Top = ((y - 1) * zonesize2 + 15)
                Me.Controls.Add(pbxNewZone)
                '  Wire this control up to an appropriate event handler
                AddHandler pbxNewZone.Click, AddressOf pbxNewZoneClicked

            Next
        Next
        Me.Height = (pbxNewZone.Height * zonesY + 63)  'sets the height of fmmGame
        Me.Width = (pbxNewZone.Width * zonesX + 40)  'sets the width of frmGame

        checkBlank()

    End Sub

    Public Sub checkBlank()

    End Sub

    Private Sub pbxNewZoneClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
        ReDim x
        Do While y = 1 'starts a For loop (1 to zonesY number of loops)
            Do While x = 1  'starts a For loop (1 to zonesX number of loops)
                MsgBox("you have clicked " & x & ", " & y)
            Loop
        Loop
    End Sub

End Class
4

2 に答える 2

4

すべての PictureBoxes に同じハンドラーを追加していますが、クリックされた特定の PictureBox (Sender パラメーター) には何もしていません。Name プロパティまたは Tag プロパティを使用して、クリックをどう処理するかを決定できます。標準の PictureBox を拡張して、これを容易にする追加のパラメーター (x および y プロパティなど) を含めることができます。

余談ですが、より多くの個別のメソッドを呼び出すように、form_load をリファクタリングすることを検討してください。

于 2011-10-17T15:53:20.773 に答える
1

Clickイベントでsenderは、クリックされたオブジェクトになります...

Dim pbx as PictureBox = DirectCast(sender,PictureBox)

...クリックされたPictureBoxへの参照を(としてpbx)提供します-次に、それを使用して必要なことを実行できます。

pbx.Image簡単にするために、PictureBoxのカスタム属性がないため、チェックして特定のPictureBoxの状態を確認することをお勧めします。

于 2011-10-17T15:48:17.143 に答える