1

私の VB ソリューションでは、多数のボタンがグリッドに配置されています。プログラムが読み込まれると、ボタンの 1 つがランダムに正しいものに設定されます (勝つにはそのボタンをクリックする必要があります)。誰かが私を正しい方向に向けることができますか? すべてのボタンを手動でコーディングし、すべてのボタンのイベント ハンドラーを作成するよりも優れた方法があるはずです。

実際の例を示す必要はありません。これがどのように行われるかについての全体的なアイデアだけです。

ありがとう。

4

2 に答える 2

1

ボタンをグリッドに配置する場合は、TableLayoutPanel を使用するか、ボタンをフォームに直接追加して位置を計算します。フォームのTableLayoutPanelサイズが変更されたときにボタンを自動的に配置したい場合に便利です。それ以外の場合は、ボタンを直接追加する方が簡単に思えます。

簡単にアクセスできるように、フォーム レベルで定義された配列にボタンを追加します。

Public Const NColumns As Integer = 5, NRows As Integer = 4

Private buttons As Button(,) = New Button(NColumns - 1, NRows - 1) {}

ループで簡単にボタンを追加できます

For ix As Integer = 0 To NColumns - 1
    For iy As Integer = 0 To NRows - 1
        Dim btn = New Button()
        btn.Text = String.Format("{0:d2}{1:d2}", ix, iy)
        btn.Location = New Point(leftMargin + ix * xDistance,
                                 topMargin + iy * yDistance)
        btn.Size = New Size(buttonWidth, buttonHeight)
        AddHandler btn.Click, Addressof Button_Clicked
        buttons(ix, iy) = btn
        Controls.Add(btn)   
    Next
Next

ランダムジェネレーターで勝利ボタンを決定できます。ローカル変数としてではなく、フォームメンバーとして定義してください。

Private randomGenrator As System.Random = New System.Random()

座標を決定する

Dim xWins = randomGenrator.Next(NColumns) 'Returns a number between 0 and NColumns-1
Dim yWins = randomGenrator.Next(NRows)

クリックハンドラは次のようになります

Private Sub Button Button_Clicked(sender As Object, e As EventArgs)
    If sender = buttons(xWins, yWins) Then
       'You win
    Else
       'You loose
    End
End Sub
于 2012-12-24T15:24:19.847 に答える
1

最初に、ボタンのグリッドが必要だと言ったので、FlowLayoutPanel追加するボタンを自動的に配置できるようにするために、フォームにコントロールが必要です。次に、前に追加した 'FlowLayoutPanel' に追加するボタンを追加するために、for ループ、r あらゆる種類の外観を使用する必要があります。class Answers Dim strAnswerText as string Dim AnswerFlag as Boolean End Class

Sub LoadForm(byval a_Answers as Answer())        
    Dim i as Integer = 0
    Dim b as Button 
    For(i=0;i<NUM_OF_BUTTONS;i++)
       b = New Button()
       b.Text = "Choice -" & i & "- " & a_Answers(i).strAnswerText 
       b.Tag = a_Answers(i).AnswerFlag

       'Supposing that the FlowLayoutPanel control name is fl
       AddHandler b.Click, Addressof Clicked
       fl.controls.Add(b)   
    End For 
End Sub

Sub Button Clicked(sender as object, e as EventArgs)
    if sender.Tag = True
       'True answer
    else
       'Wrong answer
    end if

End Sub
于 2012-12-24T12:54:05.907 に答える