2016-10-14 4 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 직접 폼 내부의 컨트롤을 반환하지만 형태로 용기 내부에 컨트롤을 반환하지 않습니다. 당신의 카드는 패널 내부에있는 경우, 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 

이유 문자열 참조 형식이더라도,이 값 유형을 사용한다는 의미이다. 따라서 함수에서 문자열을 반환 할 때 원래 메모리 위치를 다시 참조 할 수 없습니다. 실제로 문자열의 복사본을 만듭니다. 그래서 함수 의미를 사용하는 것은 작동하지 않습니다. 같은 배열에 갈 것입니다. 함수 나 배열에서 문자열을 수정하고 Label의 Text 속성을 수정하는 것은 어렵습니다 (불가능합니까?).

+0

아, 알겠습니다. 내가 생각했던 것보다 더 복잡한. – rsprodftw1

+0

더 짧게하는 방법이 있습니까? 그래서 매번 ". 텍스트"를 입력 할 필요가 없습니까? – rsprodftw1

+0

내 방법 http://stackoverflow.com/questions/40050468/blackjack-wont-add-dealers-hand를 사용했음을 확인했습니다. 대답으로 표시해주세요. – djv

관련 문제