1

VB Express 2010. PictureBox のチェッカーボードを作成しました - Dim Board(64) を PictureBox として 次に、各正方形に画像を割り当てます - 各行に対してこれと同様:

For x = 1 to 64
    If (x Mod 2 = 1) then 
        Board(x).Image = My.Resources.wsquare
    Else
        Board(x).Image = My.Resources.bsquare

次に、正方形を FormI に配置し、次のように .tag プロパティ = をインデックスに割り当てます。

For x = 1 to 64
    Board(x).Location = New Point(y,x1)
    Me.Controls.Add(Board(x))
    Board(x).tag = x
    .....parameters for location y, x1 incremented as necessary....
Next

これはすべてうまく機能し、チェッカーボードを生成しました。 ここで、正方形がクリックされたときのインデックスまたはタグを知る必要があります。コード内で EventHandler を作成する方法や場所、および後続のメソッドでインデックスまたはタグを参照する方法がわかりません。以下は間違っていますが、私は試しています。 Board.Click は配列のイベントではありません私のジレンマを解決するためのいくつかのコード例または指示をいただければ幸いです。これでかなり新しい。前もって感謝します

Private Sub Clicked()
    AddHandler Board.Click, New EventHandler(AddressOf Board_Click)
End Sub

Private Sub Board_Click()

End Sub
4

2 に答える 2

0

あなたはかなり近いと思います。あなたがハングアップしているように見えるビットは、イベントハンドラーがBoard配列自体ではなく、配列内の各要素にバインドされる必要があるということです (これはあなたがやろうとしていることのようです)。

開始するためのいくつかの手順を次に示します....まず、このループを変更します。

For x = 1 to 64
    If (x Mod 2 = 1) then 
       Board(x).Image = My.Resources.wsquare
Else
    Board(x).Image = My.Resources.bsquare

次のようになります。

For x = 1 to 64
    Board(x).Name = "Board_" + x.ToString()
    If (x Mod 2 = 1) then 
       Board(x).Image = My.Resources.wsquare
Else
    Board(x).Image = My.Resources.bsquare

そのため、PictureBox のNameプロパティを使用して、個々の PictureBox を識別します。これは、どのアイテムがクリックされたかを知るために必要です。

次に、次のようなクリック用のダミー ハンドラーを作成します。

Private Sub PictureBox1_Click(sender As Object, e As EventArgs)
    Dim clickedBox As PictureBox = CType(sender, PictureBox)

    MessageBox.Show(clickedBox.Name)
End Sub

ここでは、Clickイベントからクリックされた PictureBox を取得し、それを PictureBox にキャストしてから、その Name プロパティを発行しています (以前に設定したことを思い出してください)。

これで、For ループをもう一度見直して、ハンドラーを配列内の各要素のクリック イベントにバインドできます。次に例を示します。

For x = 1 to 64
    Board(x).Name = "Board_" + x.ToString()
    AddHandler Board(x).Click, New EventHandler(AddressOf Me.PictureBox1_Click)
    If (x Mod 2 = 1) then 
       Board(x).Image = My.Resources.wsquare
Else
    Board(x).Image = My.Resources.bsquare

これを実行すると、PictureBox をクリックしたときに、"Board_23" や "Board_1" などを表示するメッセージ ボックスが表示されます。

クリックされた要素の配列内のインデックスを把握するにはBoard、たとえばSubstringReplaceをConvertと組み合わせて名前の数値部分を取得します。前に名前を付けた方法のため、名前の数値コンポーネントは配列インデックスです。

PS。実際の VB.NET をやってからしばらく経ちましたが、配列はゼロベースであり、1 ベースではないと思います。よくわかりませんが、コードでそれを確認することをお勧めします (私が言ったように、私はしばらくの間、実際の VB.NET を行っていません)。

于 2013-03-24T05:20:30.587 に答える
0
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    For x = 0 To 16
        Board(x) = New PictureBox
        Board(x).Name = "Board_" + x.ToString()
        AddHandler Board(x).Click, New EventHandler(AddressOf Me.PictureBox1_Click)
        If (x Mod 2 = 1) Then
            Board(x).Image = My.Resources.green_bullet
        Else
            Board(x).Image = My.Resources.yellow_bullet
        End If
        Board(x).Location = New Point(Board(x).Width * x, 10)
        Me.Controls.Add(Board(x))
        Board(x).Tag = x
    Next x
End Sub
于 2014-08-28T09:35:28.057 に答える