2016-10-28 18 views
-1

問題:プログラムでラベルを生成していますが、実行時にラベルが存在しないため、コードで参照するのに問題があります。ラベルの生成に関する問題

コンテキスト:ゲームのためには、私は、ラベルの10×10のグリッドを生成した次

Public lbl As Label() 
Dim tilefont As New Font("Sans Serif", 8, FontStyle.Regular) 

Private Sub Lucror_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim i As Integer = 0 
    Dim a As Integer = 0 
    Dim height As Integer 
    Dim width As Integer 

    height = 30 
    width = 30 

    ReDim lbl(99) 
    For i = 0 To 99 
     lbl(i) = New Label 
     lbl(i).Name = i 
     lbl(i).Size = New System.Drawing.Size(30, 30) 
     lbl(i).Location = New System.Drawing.Point((width), height) 
     lbl(i).Text = i 
     lbl(i).Font = tilefont 
     Me.Controls.Add(lbl(i)) 

     width = width + 30 
     a = a + 1 'starting new line if required 
     If (a = 10) Then 
      height = height + 30 
      width = 30 
      a = 0 
     End If 
    Next 
End Subenter code here 

これはうまくいきましたが、ゲームとゲームのタイルでタイルなどのラベル機能を行う必要がありそれぞれ2-3個の整数を格納し、イベントハンドラを介して参照できるようにします。私は、整数を格納する方法として、100個の配列を生成する方法があると考えました。ラベルの後にはそれぞれ名前が付けられ、2〜3個の整数がそれぞれ格納されていましたが、

は私が必要なもの:

  • すべてのラベル
  • アレイのクリックでとホバーイベントハンドラに
  • ラベルが持っているすべてのラベルのための2-3整数を格納するために(または辞書?)お互いの名前を参照する。名前(あなたの名前+ 1)でラベル付けする何かをしてください。

質問:私はラベルの生成(もしそうなら、どうやって?)、どのように他の私は、100枚のラベルを生成することができない場合とにするために、現在の方法でこれらの3つのことを達成するための簡単な方法がありますこれらのことを可能にするか?

ご迷惑をおかけして申し訳ありません。

+0

あなたのタグを修正されるだろう開始するには良い場所 - これは、非常に便利です、ありがとうVBA –

答えて

0

ラベルは実行時に存在しますが、コンパイル時には存在しません。イベントのアタッチは実行時に少し異なります。AddHandlerを使用する必要があります。

以下は、求めているすべての内容を説明するサンプルコードです。私は各タイルに関連するデータを保存する方法として継承を導入しました。 GameTileタイプはラベルとして正確に動作し、整数の格納やコントロールの名前付けにいくつかの機能を追加しました。

Public Class Form1 
    Dim tilefont As New Font("Sans Serif", 8, FontStyle.Regular) 
    Public Property GameTiles As List(Of GameTile) 

    Private Sub Lucror_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim a As Integer = 0 
    Dim xPosition As Integer = 30 
    Dim yPosition As Integer = 30 
    GameTiles = New List(Of GameTile) 
    For i = 0 To 99 
     Dim gt As New GameTile(i.ToString) 
     gt.Size = New System.Drawing.Size(30, 30) 
     gt.Location = New System.Drawing.Point((yPosition), xPosition) 
     gt.Font = tilefont 
     gt.Integer1 = i + 1000 
     gt.Integer2 = i + 2000 
     gt.Integer3 = i + 3000 
     Me.Controls.Add(gt) 
     AddHandler gt.Click, AddressOf TileClickHandler 
     GameTiles.Add(gt) 
     yPosition = yPosition + 30 
     a = a + 1 'starting new line if required 
     If (a = 10) Then 
     xPosition = xPosition + 30 
     yPosition = 30 
     a = 0 
     End If 
    Next 
    End Sub 
    Private Sub TileClickHandler(sender As Object, e As EventArgs) 
    Dim gt = CType(sender, GameTile) 
    MsgBox("This tile was clicked: " & gt.Text & 
      Environment.NewLine & gt.Integer1 & 
      Environment.NewLine & gt.Integer2 & 
      Environment.NewLine & gt.Integer3) 
    End Sub 
End Class 

Public Class GameTile 
    Inherits Label 
    'this class should be in a separate file, but it's all together for the sake of clarity 
    Public Property Integer1 As Integer 
    Public Property Integer2 As Integer 
    Public Property Integer3 As Integer 

    Public Sub New(NameText As String) 
    MyBase.New() 
    Name = NameText 
    Text = NameText 
    End Sub 
End Class 
+0

ではありませんが、どのように私は次のGT(gt.Name + 1にタイルのBackColourを変更するようなものを結びつけることができ)のTileClickHandler? –

+1

@JackMillard: 'GameTiles(GameTiles.IndexOf(gt)+1).BackColor = Color.Red'です。 –

関連する問題