2016-10-14 99 views
1

全部!我正在开发一款BlackJack游戏,但我遇到了一些问题。在计算分数时,我必须输入YourCard1.Text,YourCard2.Text,YourCard3.Text等。 我可以在每次调用时都创建一个正确标签的函数吗?我想这样做,所以我不必输入太多...通过函数获取标签

例如,而不是输入“YourCard1.Text”,我希望能够键入“卡(1)”是这样的可能?我已经尝试了多种方式来做到这一点,但无济于事。我无法弄清楚如何使它工作。

+1

如果'card'是一组标签,'card(n).Text'可以工作 – Plutonix

+0

正确的做法是创建一个名为Card的类并拥有一张卡片列表。然后每次更换卡时,都会提醒用户界面更新相应的标签。在UI上实际存储信息通常不是一个好主意。 – djv

回答

0

假设你的表单上有这些标签,YourCard1.Text,YourCard2.Text,YourCard3.Text等,这个函数应该适合你。它返回标签本身,而不是Text属性。

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返回直接控制的形式里面,但形式不返回容器内部控件。如果您的卡是在面板内部,Panel1例如,你会做Return Panel1.Controls.OfType(Of Label)...

用法:

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

编辑处理意见。

你只是在那些语义中拼凑而成。所以还有另一种我能想到的方式。但我不会亲自做这件事。

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

会有一种方法可以进一步缩短它吗?所以我不必每次输入“.Text”? – rsprodftw1

+0

我看到你用过我的方法http://stackoverflow.com/questions/40050468/blackjack-wont-add-dealers-手,请将此标记为答案 – djv