Buon giorno
ho un problema con una listbox.
applicazione per raspberry linux
carico i dati da una tabella mysql tramite un ciclo, la row composta da 9 colonne di cui nella 5 devo posizionare un immagine salvata in blob nel database e ridurla
ora il problema che quando carico le row nella listbox alla colonna 5 trovo sempre %.png
dove sbaglio ?
allego codice
rs1 = profilalex.SQLSelect(“SELECT * FROM prioritaattrezzaggio”)
Listbox2.DeleteAllRows
If rs1 <> Nil then
while not rs1.eof
Listbox2.AddRow “”
for i = 1 to rs1.FieldCount
Listbox2.Cell( Listbox2.LastIndex, i-1 ) = rs1.IdxField(i).Value
next
rs1.MoveNext
wend
rs1.close
end if
Uno spunto su cui lavorare…
A livello superiore alla listbox, per esempio nella window o nel containerControl che contengono la listbox, creerei una propriet di nome “p” e tipo picture
Nell’evento “CellTextPaint” della listbox metterei un codice del tipo:
if column = 4 then g.DrawPicture(p, 0, 0)
Return True
Lavorando con i parametri del metodo DrawPicture puoi ottimizzare posizionamento e ridimensionamento dell’immagine
Nel ciclo che carica i campi del record, inserirei questo codice
if i = 5 then p = rs1.IdxField(i)
Cos facendo, ad ogni “riempimento” di cella, viene innescato l’evento CellTextPaint, il cui codice per prevede di essere eseguito solo per la quinta colonna. Nel caso della quinta colonna, la cella verr riempita con l’immagine di p, precedentemente riempita con il valore blob proveniente dal db. Non sono certo se la sintassi “p = rs1.IdxField(i)” funzioni o se vada eventualmente corretta/implementata.
Puoi anche utilizzare invece che la propriet p il cellTag della cella in modo da avere immagini diverse a seconda della riga.
Per il caricamento dell’immagine devi utilizzare FromData.
In pratica nel tuo loop:
while not rs1.eof
Listbox2.addRow ""
for i=1 to rs1.fieldCount
if i=5 then //o il tuo numero di campo dell'immagine
Listbox2.cellTag(Listbox2.LastIndex, i-1)=Picture.FromData(rs1.IdxField(i).NativeValue)
else
Listbox2.cell(Listbox2.LastIndex, i-1)=rs1.IdxField(i).StringValue
end if
next
rs1.moveNext
wend
Come suggerito da @PietroBeccegato poi nell’evento cellTextPaint:
if column=4 and me.cellTag(row, column)<>nil then
g.DrawPicture(me.cellTag(row, column), 0, 0
end if
Puoi anche leggere le dimensioni dell’immagine e ridimensionarla in base alla altezza della riga e la larghezza reale della colonna (non usare le dimensioni di g che sono relative alla porzione visibile della cella quindi fuorvianti in questo caso)
Riesco a vedere le immagini inserite .
Grazie a tutti e due.
Alessandro
ciao ho un altro problema ora non riesco a ricaricare l’immagine dal db per fare l’anteprima nel canvas
qualche consiglio grazie
Se gi valorizzi la propriet backdrop del canvas, ma non vedi l’immagine, forse sufficiente richiamare il metodo canvas.Refresh subito dopo la valorizzazione della propriet backdrop.
no il problema che non riesco a caricarlo mi da errore canvas1.backdrop nil
Vado a naso, ma forse questo pu essere un punto di partenza; nel caso, confidiamo in S. Antonio (Rinaldi).
dim mb As MemoryBlock
mb = rs1.Field("nomeCampoBlob").NativeValue
dim p as Picture
p = p.FromData(mb)
canvas.backdrop = p
good funziona
grazie per l’aiuto.