2 votes

Vérification de l'index d'une image picturebox

Je suis en train de créer un jeu de cartes où des images sont chargées à partir d'une liste d'images et affichées pendant un court laps de temps, puis "cachées" - l'image de la carte change. J'ai besoin d'aide lorsque je clique sur l'une de ces images pour qu'elle me dise quel est l'index de la carte et que je puisse changer l'image de cette carte. Ceci sera utilisé par le dernier sous dans le code posté ci-dessous ; "CARD THE USER CLICKED".

Public Class Form1
Private Cards As New List(Of PictureBox)
Private randomnumber As Integer
Private UserChoice As Integer
Private Timer As Integer

Private Sub SetupCards(numberofcards As Integer)
    ClearGame()
    For i As Integer = 0 To numberofcards
        Dim PicCard As PictureBox = New PictureBox()
        RandomCard()
        PicCard.Width = 100
        PicCard.Height = 200
        PicCard.Top = 50
        PicCard.Left = 50 + PicCard.Width * i
        Me.Controls.Add(PicCard)
        PicCard.Image = imglist1.Images(randomnumber)
        PicCard.Tag = randomnumber
        AddHandler PicCard.Click, AddressOf Me.cardflip_click
        Cards.Add(PicCard)
    Next i
End Sub

Private Sub ClearGame()
    If Cards.Count > 0 Then
        For i As Integer = 0 To Cards.Count - 1
            Me.Controls.Remove(Cards(i))
        Next
    End If
    ' Clear the cards if they were already setup from a previous game.
    Cards.Clear()
End Sub

Private Sub EndRound()
    'set all the images to back of card
    If Cards.Count > 0 Then
        For i As Integer = 0 To Cards.Count - 1
            Cards(i).Image = imglistBackOfCard.Images(2)
        Next
    End If

End Sub

Private Sub cardflip_click(sender As Object, e As EventArgs)
    Dim picture As PictureBox = CType(sender, PictureBox)
    Dim idTag As Integer = CType(picture.Tag, Integer)
    'MsgBox(idTag)
    UserChoice = idTag
End Sub

Private Sub btnstartGame_Click(sender As Object, e As EventArgs) Handles btnStartGame.Click
    Dim howmanycards As String
    howmanycards = InputBox("How Many Cards?", "Please Enter")
    SetupCards(Int(howmanycards - 1))
    ListBox1.Enabled = True
    ListBox1.Visible = True
    For Each imagesNames As String In imglist1.Images.Keys
        ListBox1.Items.Add(imagesNames)
    Next
    Timer1.Start()
End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    If UserChoice = ListBox1.SelectedIndex Then
        MsgBox("correct")
        Cards(CARDTHEUSERCLICKED).Image = imglist1.Images(UserChoice)
        ' Cards(idTag).Image = 
    Else
        MsgBox("WRONG :(")
        Cards(CARDTHEUSERCLICKED).Image = imglist1.Images(UserChoice)
    End If
End Sub
End Class

2voto

Visual Vincent Points 14736

Au lieu d'essayer de récupérer l'index de la carte cliquée, vous devriez simplement stocker la référence à la boîte à images elle-même. Ajoutez une autre variable :

Private Cards As New List(Of PictureBox)
Private randomnumber As Integer
Private UserChoice As Integer
Private Timer As Integer
Private ClickedCard As PictureBox 'This is new.

Alors dans votre Click le gestionnaire d'événement a fixé la valeur de ClickedCard à la boîte à images qui a déclenché l'événement (c'est-à-dire la boîte à images). sender de l'événement).

Private Sub cardflip_click(sender As Object, e As EventArgs)
    Dim picture As PictureBox = CType(sender, PictureBox)
    Dim idTag As Integer = CType(picture.Tag, Integer)

    UserChoice = idTag
    ClickedCard = picture
End Sub

Enfin, utilisez simplement cette référence au lieu d'essayer de l'obtenir à partir de votre liste :

If ClickedCard Is Nothing Then 'Make sure that a card has been clicked, otherwise the below code will fail.
    MsgBox("You must select a card.")
    Return 'Do not continue execution of this code.
End If

If UserChoice = ListBox1.SelectedIndex Then
    MsgBox("correct")
    ClickedCard.Image = imglist1.Images(UserChoice)
Else
    MsgBox("WRONG :(")
    ClickedCard.Image = imglist1.Images(UserChoice)
End If

Vous devez également mettre à jour votre ClearGame() de manière à ce qu'elle définisse ClickedCard à zéro :

Private Sub ClearGame()
    ...the rest of your code...

    ClickedCard = Nothing
End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X