Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Ottenere nome immagine in PictureBox
Forum - C# / VB.NET - Ottenere nome immagine in PictureBox

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 17:26
Giovedì, 08/04/2021
Buongiorno,
sono alle prime armi con vb 2019 e vorrei un aiuto per risolvere un problema:
premetto che sto preparando (ovviamente scopiazzando anche un pò in rete) un
gioco di semplice solitario con le carte napoletane caricate inizialmente in un
ImageList1.
Funziona già abbastanza bene ma, cliccando su una picturebox, vorrei ora ottenere
il nome dell'immagine visualizzata nella stessa picturebox.
Mi spiego meglio:
scopro una carta e vedo che è l'asso di denari; ora con il mouse la sposto nella
1^ posizione della 1^ riga (in cui andranno tutte le carte di denari).
Ecco io vorrei fare apparire in una label, posizionata sotto questa
posizione, proprio il nome dell'asso di denari.
Sperando di essere stato chiaro ringrazio per un eventuale aiuto.


Sal47 ha allegato un file: Solitario.jpg (314497 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 22:38
Venerdì, 09/04/2021
La proprietà Keys contiene il nome delle immagini, se non fai nulla il nome dell'immagine è uguale a quella del nome del file.
Detto questo o i file hanno il nome che ti piace dopo aver rimosso il nome dell'estensione o rinomini tutti i nomi nella imagelist.

La proprietà Keys di una imagelist si raggiunge:

Codice sorgente - presumibilmente VB.NET

  1. Dim indice As Integer = 1 ' l'indice dell'immagine di cui vuoi il nome
  2. Dim nome As String = System.IO.Path.GetFileNameWithoutExtension(ImageList1.Images.Keys(indice))


Ultima modifica effettuata da Carlo il 09/04/2021 alle 22:52


in programmazione tutto è permesso
PM Quote
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 19:02
Sabato, 10/04/2021
Buongiorno Carlo, ti ringrazio per la dritta sulla proprietà Keys che mi torna molto utile;
le label con il nome le ho già posizionate.
Quello che cercavo e che ho spiegato male è questo:
Ora agisco così:
- clicco su "Avvia" e mescolo le 40 carte (36 + le 4 da girare una per volta).
  Tutte restano nascoste.
- clicco sulla 1^ delle 4 carte, si scopre ad es. Asso di denari
- clicco sulla 1^ carta della 1^ fila in cui deve essere posizionato l'Asso di denari e
- appare ad es. il 7 di coppe.
- con il mouse sposto il 7 di coppe in posizione di attesa.
- sposto l'Asso di denari nella corretta posizione.
- clicco sul pulsante "Conferma..." in basso a destra e il numero di carte posizionate aumenta di 1, e così via...
--------------
Vorrei ottenere è un automatismo tipo:
"dopo che, rilasciando il mouse, ho posizionato l'Asso di denari vorrei
ottenere proprio il nome della Image nella Picturebox (Denari1, appunto),
in modo da confrontarlo con la label sottostante e se i due nomi
coincidono allora si aumenta in automatico di 1 il numero delle carte posizionate."
Ho provato con "if PictureBox.Image.Name = Label.text then ..."
ma non ottengo nulla.

Grazie per il tempo che vorrai dedicarmi e per l'eventuale ulteriore aiuto.


Sal47 ha allegato un file: Schermata.jpg (294316 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 20:23
Sabato, 10/04/2021
Dovrei sapere come ti sei organizzato per identificare le 40 picturebox.


in programmazione tutto è permesso
PM Quote
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 10:00
Domenica, 11/04/2021
Buongiorno, il mio "programma" è molto elementare e sopratutto poco ordinato.
Ogni istruzione mi costa parecchio lavoro e tante prove perchè non sempre so
come piazzarla e quindi non ho capito bene a cosa ti riferisci con
"come ti sei organizzato per identificare le 40 picturebox".
Quindi confidando nella tua pazienza allego il codice in cui trovi tanti omissis per
le istruzioni ripetitive e che forse potrei raggruppare in matrici ma ancora non mi riesce.
Codice...

Public Class Form1
     ' qualche Dim anche de dichiarata non è utilizzata
    Private currentX As Integer, currentY As Integer
    Private isDragging1 As Boolean = False
    '  ... omissis da isDragging2 a isDragging39
    Private isDragging40 As Boolean = False
  
    Dim MioNumero(41) As Integer
    ' queste 2 istruz. (di Carlo) non so ancora come utilizzarle
    '  Dim indice As Integer = 1
    '  Dim nome As String = System.IO.Path.GetFileName(ImageList1.Images.Keys(indice))
  
    Dim NumeroCarta(41) As Integer
    Dim Contatore As Integer
    Dim PercorsoImmagini As String
    Dim superficie As Graphics
    Dim NuovaCarta As Integer
    Dim CartaInAttesa As Integer
    Dim Sorteggio As New Random
    Dim n As Integer
    Dim Dieci As Integer
    Dim punteggio As Integer
  
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        ' questo ciclo For Each... Next passa in rassegna i controlli PictureBox presenti nel Form1
        ' e visualizza in ognuno di essi l'immagine che nella ImageList ha il n. 0
        ' ossia il retro di una carta:
    My.Computer.Audio.Play(My.Resources.Sottofondo_1, AudioPlayMode.BackgroundLoop)
    For Each Control In Me.Controls
            If TypeOf Control Is PictureBox Then Control.Image = ImageList1.Images(0) ' dorso carta
    Next
    For Contatore = 1 To 40
            NumeroCarta(Contatore) = Contatore
    Next
    lblPunteggio.Text = punteggio
    End Sub
  
   Private Sub MostraLeCarte()
        Contatore = 1
        For Each Control In Me.Controls
            If TypeOf Control Is PictureBox Then
                Control.Image = ImageList1.Images(NumeroCarta(Contatore))
                Control.refresh()
                Contatore += 1
            End If
        Next
      End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click ' Avvio
        Dim Contatore As Integer
        Dim NuovaCarta As Integer
        Dim CartaInAttesa As Integer
        Dim Sorteggio As New Random
        Randomize()      'istuz. seguenti prese da manuale VB2010EXpress online
        For Contatore = 1 To 40
            'Esamina una carta per volta, partendo dalla carta con il n. 1, sino alla carta con il n. 40:
            ' sorteggia il numero di una nuova carta, da 1 a 40:
            NuovaCarta = Sorteggio.Next(1, 40)
            ' memorizza nella CartaInAttesa il numero della nuova carta sorteggiata:
            CartaInAttesa = NumeroCarta(NuovaCarta)
            ' mette al posto della nuova carta sorteggiata la carta in esame
            NumeroCarta(NuovaCarta) = NumeroCarta(Contatore)
            ' infine, mette nella carta in esame la CartaInAttesa:
            NumeroCarta(Contatore) = CartaInAttesa
        Next
        ' dopo avere creato una nuova sequenza di carte, in modo casuale,
        ' passa alla procedura che visualizza le carte:
        Call MostraLeCarte() ' solo per vedere rapidam. se cambiate
        Button2.Visible = False
        Call CopriLeCarte() ' copro con altre Label con dorso carte
        '
    End Sub
    Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
        Label1.Visible = False
    End Sub
   ' ... omissis da Sub Label2_Click a Sub Label39_Click ' forse potrei raggrupparle in matrice
    Private Sub Label40_Click(sender As Object, e As EventArgs) Handles Label40.Click
        Label40.Visible = False
    End Sub

    Private Sub CopriLeCarte()
        Label1.Width = Label1.Width + 45 : Label1.Height = Label1.Height + 88
        ... omissis da Label2.Width ....a Label39.Width... ' forse potrei raggrupparle in matrice
        Label40.Width = Label40.Width + 45 : Label40.Height = Label40.Height + 88
    End Sub

   '**** forse Carlo si riferisce a questo gruppo di sub
    ' per la 1^ PictureBox
    Public Sub PictureBox1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        isDragging1 = True
    End Sub
    Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
        If isDragging1 Then
            PictureBox1.Top = PictureBox1.Top + (e.Y - currentY)
            PictureBox1.Left = PictureBox1.Left + (e.X - currentX)
        End If
    End Sub
    Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
        ' MsgBox("nome immagine è: " & PictureBox1.Image.ToString) Then
        isDragging1 = False
        If PictureBox1.Left + (e.Y - currentY) >= 758 Then
            Dieci = Dieci + 1
            Call Messaggio()
        End If
     End Sub

    ' ... omissis per i gruppi da PictureBox2_... a PictureBox39_... ' anche queste forse potrei raggrupparle in matrice

    ' per la 40^ PictureBox
    Private Sub PictureBox40_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox40.MouseDown
        isDragging40 = True
    End Sub
    Private Sub PictureBox40_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox40.MouseMove
        If isDragging40 Then
            PictureBox40.Top = PictureBox40.Top + (e.Y - currentY)
            PictureBox40.Left = PictureBox40.Left + (e.X - currentX)
        End If
    End Sub
    Private Sub PictureBox40_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox40.MouseUp
        isDragging40 = False
        n = n + 1
        If PictureBox40.Left + (e.Y - currentY) >= 758 Then
            Dieci = Dieci + 1
            Call Messaggio()
        End If
    End Sub
  '****
Private Sub Messaggio() ' questa è da sistemare
        Select Case Dieci
            Case 1
                MsgBox("Hai posizionato il 1° dieci." & vbCrLf & " omissis ")
            Case 2
                MsgBox("Hai posizionato il 2° dieci." & vbCrLf & " omissis")
            Case 3
                MsgBox("Hai posizionato il 3° dieci." & vbCrLf & " omissis")
            Case 4
                MsgBox("Hai posizionato il 4° dieci." & vbCrLf &
                       "Se hai altre carte coperte il solitario probabilmente non è riuscito" & vbCrLf & " omissis")
        End Select
    End Sub
  
  Private Sub HelpToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles HelpToolStripMenuItem.Click
        MsgBox("  Per iniziare clicca sul pulsante 'Avvia il solitario'." & vbCrLf &
        '... omissis
    End Sub
  
    Private Sub InfoToolStripMenuItem_Click_1(sender As Object, e As EventArgs) Handles InfoToolStripMenuItem.Click
        MsgBox("Autore - Marzo 2021")
    End Sub
  
    Private Sub btn_Conferma_Click(sender As Object, e As EventArgs) Handles btn_Conferma.Click
        punteggio = punteggio + 1
        lblPunteggio.Text = punteggio
        Call ControllaPunteggio()
    End Sub
  
  Private Sub ControllaPunteggio() ' questa è da sistemare
        If (n = 4 Or punteggio >= 36) Then
            Select Case punteggio
                Case 40...
                Case 39...
                Case 38...
                Case 36...
             End Select
        End If
    End Sub
End Class
Fine Codice
Saluti

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:19
Domenica, 11/04/2021
Il tuo approcio ti costa molto lavoro perché non sfrutti il computer, meglio far lavorare lui.

Il primo consiglio e quello di mettere le picturebox da runtime, i vantaggi sono: meno lavoro, facilmente ricollocabili e indicizzate.
Con l'indicizzazione, non devi ripetere 40 volte la stessa cosa e non le devi ciclare tutte per trovarne una.

Il progetto che ti allego dispone le carte e al click, nella barra del titolo, mostra tutte le info che ho ritenuto utili ma altre se ne possono aggiungere.
Le carte possono anche essere spostate e mentre le sposti sulla barra del titolo le info si aggiornano.

Il codice è ultracommentato e è solo un esempio, ma se hai dubbi chiedi.:k:



Carlo ha allegato un file: Carte.zip (623606 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 11/04/2021 alle 20:48


in programmazione tutto è permesso
PM Quote
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 20:31
Domenica, 11/04/2021
Ciao Carlo,
ti ringrazio molto della disponibilità. Ho scaricato ed estratto il file .zip trovando al momento una schermata superpulita delle carte
inserite nelle risorse con tutte le indicazioni nella barra del titolo.
Poi ho visto il codice presente nel file Form1: per assimilarlo mi occorrerà molto tempo!!
Ti farò certamente sapere se riesco a raccapezzarmici.
Ancora grazie.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 20:58
Domenica, 11/04/2021
Non ti fasciare la testa prima del tempo, se non ti sei raccapezzato è perché qualche istruzione ancora non la conosci, ma non è niente di più di quello che già hai fatto, le immagini delle carte in resource le ho inserite nella listimage da progettazione come hai fatto tu.
Posta il codice che ti ho inviato, e chiedi lumi dove non ti raccapezzi.

inserisci il codice tra [ code ] e [ /code ], non li devi scrivere vengono inseriti cliccando il tastino a sinistra della finestra del messaggio [ Code ]
:rofl:

Hai cambiato qualche parametro per vedere cosa succede?
per es:
Codice sorgente - presumibilmente VB.NET

  1. ' variabili globali modificabili all'occorrenza -----------
  2.     Dim setL As Integer = -60 ' partenza sinistra schema
  3.     Dim setT As Integer = -100 ' partenza top schema
  4.     Dim gapL As Integer = 0 ' distanza orizzontale tra le carte
  5.     Dim gapT As Integer = 0 ' distanza verticale tra le carte
  6.     Dim nColonne As Integer = 20
  7.     Dim nRighe As Integer = 2
  8.     Dim PB(nColonne * nRighe) As PictureBox ' se nColonne * nRighe eccede 40 non ci saranno sufficienti immagini in imagelist
  9.     '----------------------------------------------------------


Ultima modifica effettuata da Carlo il 11/04/2021 alle 21:20


in programmazione tutto è permesso
PM Quote
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 13:58
Lunedì, 12/04/2021
Buongiorno, ho iniziato a studiarmi il codice che mi hai postato.
Ti dico subito che prima che io scriva istruzioni simili ci vorranno secoli, forse.
Si, ho provato a modificare le variabili locali come indicato e ottengo non 4
ma 2 righe, le distanze tra carta e carta sono variate e in effetti non ci sono
immagini a sufficienza; ho anche visto le carte in ImageList1.

Non capisco cosa devo fare in merito a quanto mi indichi al 3° cpv. del tuo
ultimo  post:
... inserisci il codice tra
Codice sorgente - presumibilmente Plain Text

  1. e

, ...

Devo forse inserire tutto il codice che mi hai postato nel mio di codice ?

Da come interpreto, ora potrei inserire il tuo codice in quello fatto da me
in modo che risultino inizialmente tutte le carte, 36 nelle 4 righe e 4 in basso
da girare una per volta, opportunamente mischiate con le mie istruzioni e poi coperte
utilizzando per tutte l' ID = 0.
Poi, dopo averle girate una per volta (con ID +=1), dovrei movimentarle
con le Sub PB_OnMouseDown e  PB_OnMouseMove e infine utilizzando il
nome della carta che appare nella barra del titolo far aumentare automa-
ticamente di 1 il numero di carte posizionate.

Se è così (e non ne sono sicuro) ci provo ma dubito di riuscirci senza ulteriori aiuti.
In ogni caso ti ringrazio.

Ultima modifica effettuata da Sal47 il 12/04/2021 alle 14:02
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo