Ciao Luigi,
una ListBox è costituita da celle (disposte in righe e colonne - come una tabella di Excel).
Ad ogni riga della ListBox è associato un “elemento nascosto” il RowTag nel quale puoi (come se fosse un’ulteriore cella) scrivere e/o leggere informazioni.
Sul come farlo, il posto migliore dove trovare informazioni, oltre alla documentazione, è il codice fornito con gli Esempi.
Per capire come usare questo “elemento nascosto” (RowTag) puoi analizzare l’esempio “EEDesktop.xojo_binary_project” che si trova nella cartella C:\Programmi\Xojo\Xojo 2021r3.1\Example Projects\Sample Applications\EddiesElectronics\Desktop.
Analizzando questo esempio, in maniera molto sintetica, osserviamo la presenza sulla sinistra di una ListBox (di nome CustomerList
) che ha una sola colonna, quindi vedremo un solo elemento (una sola cella) per riga.
In questa ListBox vengono inseriti (e quindi visualizzati) solo il cognome e nome del cliente e non tutti i dati presenti nella tabella Clienti. Inoltre, per ogni riga, nel RowTag associato viene memorizzato l’identificativo “id” del cliente corrispondente.
Il codice per farlo (preso dall’esempio) lo trovi nel metodo LoadCustomers
che viene chiamato all’apertura della ListBox, nel suo evento Opening.
Le linee che mostrano come scrivere il RowTag sono le seguenti:
For Each row As DatabaseRow In customerRS
CustomerList.AddRow(row.Column("lastname").StringValue + ", " + row.Column("firstname").StringValue)
CustomerList.RowTagAt(CustomerList.LastAddedRowIndex) = row.Column("ID").IntegerValue
Next
In beve è stata effettuata una interrogazione che ci ha fornito il RowSet di nome customerRS
.
Se questo RowSet non è vuoto (se ci sono elementi) allora iteriamo per ogni riga (row) in customerRS, leggendo la singola “riga di Database” (il singolo record);
alla Lista CustomerList aggiungiamo una riga (AddRow) composta dalla stringa che si ottiene concatenando il cognome, una virgola ed il nome del cliente;
Nel RowTag corrispondente alla riga appena inserita (RowTagAt(CustomerList.LastAddedRowIndex)) poniamo il valore integer dello “ID” corrispondente al cliente.
Quando andiamo a selezionare una riga della ListBox, attiviamo l’evento SelectionChanged all’interno del quale c’è il codice per leggere il valore del RowTag corrispondente alla riga selezionata:
mCurrentCustomerID = Me.RowTagAt(Me.SelectedRowIndex)
questo valore viene posto nella variabile mCurrentCustomerID
(definita tra le Proprietà della finestra).
Una volta che abbiamo recuperato il valore dell’ID dal RowTag viene chiamato il metodo LoadCustomerFields
che si occupa di leggere tutti i dati corrispondenti al cliente individuato da questo ID (foto compresa).
Nel codice del metodo LoadCustomerFields
troviamo:
FirstNameField.Text = customerRS.Column("FirstName").StringValue
LastNameField.Text = customerRS.Column("LastName").StringValue
AddressField.Text = customerRS.Column("Address").StringValue
// ... eccetera ... fino a leggere l'immagine ...
CustomerPhoto = customerRS.Column("Photo").PictureValue
La variabile CustomerPhoto
è stata anch’essa definita tra le Proprietà della finestra come
Var CustomerPhoto As Picture
Ora che abbiamo tutti i dati relativi al singolo cliente li visualizziamo in una sorta di “Scheda del Cliente”.
I dati di tipo testo e/o numerici possiamo visualizzarli in dei DesktopTextField, per visualizzare la foto, invece, abbiamo bisogno di un DesktopCanvas (un Canvas è un oggetto che dispone di metodi per visualizzare variabili di tipo Picture).
Nell’esempio considerato il canvas ha nome PhotoCanvas
.
La successiva istruzione:
PhotoCanvas.Refresh(False)
dice al canvas di ridisegnare il suo contenuto.
Questo “contenuto” è indicato nell’evento Paint del canvas, dove leggiamo:
If CustomerPhoto <> Nil Then
g.DrawPicture(CustomerPhoto, 0, 0, g.Width, g.Height, 0, 0, CustomerPhoto.Width, CustomerPhoto.Height)
End If
in pratica diciamo al canvas di disegnare il conteuto della variabile CustomerPhoto (di tipo Picture), gli altri parametri che seguono CustomerPhoto e cioè (0, 0, g.Width, eccetera …) servono ad adattare le dimensioni dell’immagine a quelle del canvas.
===========
Riguardo alla tua domanda (in un precedente post) sul come “leggere” da un canvas, ti faccio osservare che il canvas visualizza l’immagine che hai in una variabile di tipo Picture. Quindi la variabile contenente l’immagine ce l’hai già, non ha senso il doverla leggere dal canvas.
Spero di esserti stato di un qualche aiuto.
Buona serata e buon lavoro.