Oppure

Loading
08/04/21 15:26
Sal47
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.
aaa
09/04/21 20:38
Carlo
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:

Dim indice As Integer = 1 ' l'indice dell'immagine di cui vuoi il nome
Dim nome As String = System.IO.Path.GetFileNameWithoutExtension(ImageList1.Images.Keys(indice))
Ultima modifica effettuata da Carlo 09/04/21 20:52
in programmazione tutto è permesso
10/04/21 17:02
Sal47
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.
aaa
10/04/21 18:23
Carlo
Dovrei sapere come ti sei organizzato per identificare le 40 picturebox.
in programmazione tutto è permesso
11/04/21 8:00
Sal47
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
aaa
11/04/21 15:19
Carlo
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:

Ultima modifica effettuata da Carlo 11/04/21 18:48
in programmazione tutto è permesso
11/04/21 18:31
Sal47
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.
aaa
11/04/21 18:58
Carlo
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:
    ' variabili globali modificabili all'occorrenza -----------
    Dim setL As Integer = -60 ' partenza sinistra schema
    Dim setT As Integer = -100 ' partenza top schema
    Dim gapL As Integer = 0 ' distanza orizzontale tra le carte
    Dim gapT As Integer = 0 ' distanza verticale tra le carte
    Dim nColonne As Integer = 20
    Dim nRighe As Integer = 2
    Dim PB(nColonne * nRighe) As PictureBox ' se nColonne * nRighe eccede 40 non ci saranno sufficienti immagini in imagelist
    '----------------------------------------------------------
Ultima modifica effettuata da Carlo 11/04/21 19:20
in programmazione tutto è permesso