Query ed Immagini

Ho un Database dove ci sono dati dei miei pazienti compreso le immagini , ora quando voglio prenderei dati di questi con una query al DB risolvo tutto ma per l’Immagine ho problemi , l’immagine salvata in Blob viene presa dalla query ma non so come sciverla per il Listbox e non so come leggerla dal listbox …

potete AIUTARMI

grazie

la classe Picture ha un metodo condiviso fromData per cui puoi fare:
var laMiaImmagine as Picture=Picture.FromData(ilMioRowSet.column(“laColonnaDelBlob”).NativeValue

a questo punto laMiaImmagine sarà la picture letta dal DB o NIL se non è riuscita a leggerla (formato sconosciuto a Picture)

poi la gestisci come vuoi nella list box

per scriverla (??) dalla listbox o comunque per scrivere nel blob
db.execute(“update laTabella set laColonnaDelBlob=? where campoPrimario=?”,laMiaImmagine.ToData(Picture.Formats.PNG), ilMioValoreChiave)

guarda Picture.Formats per gli altri valori oltre PNG e ToData per valutare l’eventuale secondo parametro (inutile per le PNG)

Grazie Antonio , ma una delle tante cose che non so come faccio a passare dalla query l’immagine alla listbox ?? e poi prenderla dalla listbox ??

gtrazie

Se possibile mi fai un piccolo esempio ??

Grazie

Luigi

Beh dipende da come vuoi visualizzare il dato.
Ad esempio puoi farne una versione ridimensionata e mostrare questa immagine come rowPicture o metterla in qualche tag per poi visualizzarla nel cell paint in base alle dimensioni.

Ti sconsiglio vivamente di tenere in memoria le immagini originali se sono grandi (a livello di icone va bene, ma se sono grandi potresti avere problemi di memoria).

Fare un esempio generico è difficile perché dipende molto da quello che ti serve

voglio prendere l’immagine del paziente in questione e poi metterla in canvas

tutto qui

Luigi

Prendi l’id del paziente e carica l’immagine in una proprietà della finestra come ti ho detto prima
e chiami l’invalidate/refresh del canvas dove nel paint fai disegnare l’immagine

grazie , ma non so come fare ??

mi fai un esempio ??

Popoli la listbox con il dato (nomi dei pazienti ad esempio) e identificativo del paziente (rowtag)
quando selezioni qualcosa dalla listbox (change) assegni la proprietà immagine della window (as picture)
con
IMMAGINE=Picture.FromData(ilMioRowSet.column(“laColonnaDelBlob”).NativeValue
//e aggiorni il canvas
Canvas1.refresh

nel canvas.paint: g.drawPicture IMMAGINE, 0, 0

1 Like

Antonio, scusa ancora ma come faccio a fare il rowtag come identificativo del paziente

davvero non so come farlo

ai un piccolo demo per poter capire grazie

//Leggi i dati 
var rs as rowSet=mioDB.selectSql(....la tua query, ...eventuali parametri)
miaListbox.removeAll //elimino tutti i dati precedenti se esistono
while not rs.AfterLastRow
  miaListBox.addRow rs.column("campo del db da mostrare").stringValue
  
  //value che ti serve... integerValue, stringValue
  miaListBox.rowTagAt(miaListBox.lastAddedRow)=rs.column("campo identificativo").VALUECHETISERVE
  //…eventuali altre colonne…
  miaListBox.cellTextAt(miaListBox.lastAddedRow, numeroDiColonna)=rs.column("altro campo da mostrare").VALUECHETISERVE
  rs.MoveToNextRow 
wend

ps codice scritto sul forum, per cui verifica la sintassi

La mia query:
sql ="Select * "

rs = BookDB.sqlSelect( sql )

if rs.RecordCount = 0 then
'if inlingue = true then
'msgbox “No Record”
'else
msgbox “Nessun Record”

Lista1.visible= false
exit sub
end if
lista1.visible= true
ListBox1.visible = true
Listbox1.Columncount=19
ListBox1.ColumnWidths=“40%,20%,20%,20%”
Listbox1.HasHeading=True
if inlingue = true then
Listbox1.Heading(0)=“Surname”
Listbox1.Heading(1)=“Name”
Listbox1.Heading(2)=“City”
Listbox1.Heading(3)=“Code”
else
Listbox1.Heading(0)="Cognome "
Listbox1.Heading(1)=“Nome”
Listbox1.Heading(2)=“Città”
Listbox1.Heading(3)=“Codice”
end if

if rs.RecordCount > 0 then

while not rs.eof
ListBox1.addRow rs.Field(“Cognome”).StringValue
ListBox1.cell(Listbox1.LastIndex,1) = rs.Field(“Nome”).StringValue
ListBox1.cell(Listbox1.LastIndex,2) = rs.Field(“Citta”).StringValue
ListBox1.cell(Listbox1.LastIndex,3) = rs.Field(“Codice”).StringValue
ListBox1.cell(Listbox1.LastIndex,4) = rs.Field(“Nato”).StringValue
ListBox1.cell(Listbox1.LastIndex,5) = rs.Field(“Sex”).StringValue
ListBox1.cell(Listbox1.LastIndex,6) = rs.Field(“Via”).StringValue
ListBox1.cell(Listbox1.LastIndex,7) = rs.Field(“Sc”).StringValue
ListBox1.cell(Listbox1.LastIndex,8) = rs.Field(“Pr”).StringValue
ListBox1.cell(Listbox1.LastIndex,9) = rs.Field(“Cap”).StringValue
ListBox1.cell(Listbox1.LastIndex,10) = rs.Field(“Lavoro”).StringValue
ListBox1.cell(Listbox1.LastIndex,11) = rs.Field(“Email”).StringValue
ListBox1.cell(Listbox1.LastIndex,12) = rs.Field(“Tel1”).StringValue
ListBox1.cell(Listbox1.LastIndex,13) = rs.Field(“Tel2”).StringValue
ListBox1.cell(Listbox1.LastIndex,14) = rs.Field(“Tel3”).StringValue
ListBox1.cell(Listbox1.LastIndex,15) = rs.Field(“Tel4”).StringValue
ListBox1.cell(Listbox1.LastIndex,16) = rs.Field(“Note”).StringValue
ListBox1.cell(Listbox1.LastIndex,17) = rs.Field(“Id”).StringValue
ListBox1.cell(Listbox1.LastIndex,18) = rs.Field(“TipoL”).StringValue
ListBox1.cell(Listbox1.LastIndex,19) = rs.Field(“Attivo”).StringValue
ListBox1.cell(Listbox1.LastIndex,20) = rs.Field(“CodFis”).StringValue
ListBox1.cell(Listbox1.LastIndex,21) = rs.field(“PIC”).StringValue ’ Immagine

'Canvas1.Backdrop=ListBox1.Celltag(me. ListIndex,21) 

rs.moveNext
Listbox1.HasHeading=True

wend
end if
rs.close

grazie ma non va la… ecco la mia listbox

Cognome.text=listbox1.Cell(row,0)’ Cognome
nome.text=listbox1.Cell(row,1)’ Nome
citta.text=listbox1.Cell(row,2)’ Citta
nominativoS= Cognome.text + " " + Nome.text
codice.text=listbox1.Cell(row,3)’ codice
K=datasql(listbox1.Cell(row,4))’ Nato
nato.datevalue=K
nato.refresh
KD=left(listbox1.Cell(row,5),1)
if KD= “F” then
Sex.listindex= 0
else
Sex.listindex= 1
end if
KD=""
Via.text=listbox1.Cell(row,6)'Via
Sc.text =listbox1.Cell(row,7)'Stato Civile
Pr.text=listbox1.Cell(row,8)'pr
cap.text=listbox1.Cell(row,9)'Cap
lavoro.text=listbox1.Cell(row,10)'Lavoro
Email.text=listbox1.Cell(row,11)'Email
Telef1.text=listbox1.Cell(row,12)'Telef1
Telef2.text=listbox1.Cell(row,13)'Telef2
Telef3.text=listbox1.Cell(row,14)'Telef3
Telef4.text=listbox1.Cell(row,15)'Telef4
Note.text=listbox1.Cell(row,16)'Note
IDD.text=listbox1.Cell(row,17)'Id
HK=listbox1.Cell(row,18)'TipoL
Attivo.listIndex = val(listbox1.Cell(row,19)) ’ Attivo
codfis.text = listbox1.Cell(row,20)‘codiceFiscale
canvas1.Backdrop=listbox1.rowTagAt(listbox1.Cell(row,“21”) questa e’ la colonna in cui dovrebbe essere l ’ immagine

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.