2016-10-14 6 views
1

すべて!私はBlackJackゲームを開発していますが、少し問題があります。スコアを計算する際に、YourCard1.Text、YourCard2.Text、YourCard3.Textなどを入力する必要があります。 呼び出されるたびに適切なラベルを取得する関数を作成できますか?私はこれをやりたいので、あまり入力する必要はありません。関数からラベルを取得

たとえば、「YourCard1.Text」と入力する代わりに、「card(1)」と入力したいと思います可能?私はこれをやるために複数の方法を試みたが、役に立たなかった。私はそれを働かせる方法を考え出すのに困っている。

+1

'card'がラベルの配列だった場合、' card(n).Text'は動作します – Plutonix

+0

これを行う正しい方法は、Cardというクラスを作り、カードのリストを作ることです。その後、カードが変更されるたびに、適切なラベルを更新するようUIに警告します。 UIに実際に情報を格納することは、通常はお勧めできません。 – djv

答えて

0

あなたのフォームにYourCard1.Text、YourCard2.Text、YourCard3.Textなどのラベルがあると仮定すると、この関数はうまくいくはずです。 Textプロパティではなく、Label自体を返します。

Private Function card(index As Integer) As Label 
    Try 
     Return Me.Controls. 
      OfType(Of Label). 
      Where(Function(l) l.Name = "YourCard" & index.ToString()). 
      Single() 
    Catch 
     Return Nothing 
    End Try 
End Function 

注:Me.Controlsは直接フォーム内のコントロールを返しますが、フォームでコンテナ内のコントロールを返しません。アドレスコメントに

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    card(1).Text = "Hello" 
    card(2).Text = "World" 
End Sub 

enter image description here

編集:あなたのカードは、パネルの内側にある場合は、例えばPanel1は、あなたがReturn Panel1.Controls.OfType(Of Label)...

使い方をするでしょう。

あなたはそれらのセマンティクスだけに注意しています。だから私が考えることができる別の方法があります。しかし私は個人的にはこれをしません。

Public Class Form1 

    Private Class cardClass 
     Private myContainer As Control 
     Sub New(container As Control) 
      myContainer = container 
     End Sub 

     Default Public WriteOnly Property Item(ByVal index As Long) As String 
      Set(value As String) 
       card(index).Text = value 
      End Set 
     End Property 

     Private Function card(index As Integer) As Label 
      Try 
       Return myContainer.Controls. 
        OfType(Of Label). 
        Where(Function(l) l.Name = "YourCard" & index.ToString()). 
        Single() 
      Catch 
       Return Nothing 
      End Try 
     End Function 
    End Class 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim card As New cardClass(Me) 
     card(1) = "Hello" 
     card(2) = "World" 
    End Sub 

End Class 

理由は複雑ですが、Stringは参照型ですが、値型セマンティクスを使用しています。したがって、関数から文字列を返すとき、元のメモリ位置を参照することはできません。文字列のコピーが実際に作成されます。したがって、関数のセマンティクスを使用することはできません。同じ配列に行くだろう。関数や配列から文字列を変更し、LabelのTextプロパティを変更することは難しいでしょう(不可能です)。

+0

ああ、そうです。私が思ったより少し複雑です。 – rsprodftw1

+0

これをさらに短縮する方法はありますか?だから私は毎回 "。テキスト"を入力する必要はありませんか? – rsprodftw1

+0

私はあなたが私のメソッドhttp://stackoverflow.com/questions/40050468/blackjack-wont-add-dealers-handを使用しているのを見て、答えとしてマークしてください – djv

関連する問題