Dopo la Gridview ci voleva anche la PictureBox... >:(
C'è una PictureBox vuota sul form, perchè questo semplice codice non mi fa vedere nulla?
' Gambas class file
Private imm As New Image
Private pic As New Picture
Public Sub FMain()
imm = Image.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")
pic = imm.Picture
With foto
.W = imm.W
.H = imm.H
.Picture = pic
End With
End
Eppure è tutta roba che ho preso dalla Wiki...
Notare che anche facendo
.Picture = Picture.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")
Non cambia nulla. :-\
Ho fatto qualche prova ed ho notato che l'istruzione di caricamento della picture, inserita nella Sub FMain non produce effetti, mentre, se la inserisci nella Sub _new, oppure nella Sub Mouse_down produce effetti diversi. Infatti, se posta nella Sub _new, l'immagine compare subito con l'apertura della Form. Se invece la inserisci nella Sub Mouse_down l'immagine viene mostrata non appena clicchi sul mouse, quando il cursore è posizionato sulla pictureBox.
Le mie istruzioni di prova sono semplicemente le seguenti:
Public Sub foto_MouseDown()
With foto
.Picture = Picture.Load(user.home & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/che-faccio_64.png")
End With
End
Un'altra cosa che ho notato è che l'immagine, posta fuori dalla directory che contiene il programma utente, non viene caricata. Ho anche provato a richiamarla dentro la pictureBox, in fase di creazione e mi veniva prodotto un errore sulla proprietà picture, ponendola invece, come ho detto prima nella directory di residenza del programma, veniva caricata ancora una volta senza intoppi.
Spero di essersi stato utile.
:ciao:
A mio avviso, la riga
stando così posta, non mi pare nient'altro che l'inizio di una sub-routine/procedura, che nel codice da te mostrato non viene invocata da nessuna funzione chiamante.
Otterrai il risultato cercato se imposti come suggerito da Picavbg, oppure ovviamente così:
Private imm As Image
Private pic As Picture
Public Sub Form_Open()
FMain()
End
Public Sub FMain()
imm = Image.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")
pic = imm.Picture
With foto
.W = imm.W
.H = imm.H
.Picture = pic
End With
End
o, meglio:
Private imm As Image
Private pic As Picture
Public Sub Form_Open()
imm = Image.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")
pic = imm.Picture
With foto
.W = imm.W
.H = imm.H
.Picture = pic
End With
End
Eppure è tutta roba che ho preso dalla Wiki...
Puoi indicare l'indirizzo della pagina ?
Continuo questa discussione per spiegare a cosa servivano quelle linee di codice la sopra.
E' un piccolo esperimento che stavo facendo usando i puntatori e gli stream in memoria che Vuott aveva spiegato a Gianluigi.
Cioè questo:
' Gambas class file
Private imm As Image
Private pic As Picture
Public Sub Form_Open()
Dim punta As Pointer, flusso As Stream
Dim i, dato As Byte, grandezza, j As Integer
imm = Image.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")
pic = imm.Picture
With foto
.W = imm.W
.H = imm.H
.Picture = pic
End With
punta = Object.Address(imm)
Print punta
grandezza = Object.SizeOf(imm)
Print grandezza
flusso = Memory punta For Read Write
Do
For j = 0 To grandezza - 1
Read #flusso, dato
For i = 1 To 8
dato = Ror(dato, 1)
Seek #flusso, j
Write #flusso, dato As Byte
Next
Next
pic = imm.Picture
foto.Picture = pic
Sleep 0.2
Loop
End
Volevo manipolare byte per byte una Image per vedere se si riusciva a ottenere qualche effettino particolare (Ror è solo un esempio) ma ci sono 2 problemi: il primo è che pur essendo l'immagine che uso grande 291 kb Object.SizeOf mi restituisce solo 64 byte, ma la cosa peggiore è che il programma va immediatamente in Errore 11...
Capita anche a voi?
....ma ci sono 2 problemi:...
Capita anche a voi?
Suggerirei, innanzitutto, di prendere bene visione del 2° paragrafo di questa pagina che ho scritto nella WIKI:
http://www.gambas-it.org/wiki/index.php?title=Individuare_i_colori_dei_pixel_di_una_immagine
punta = Object.Address(imm)
Per ottenere il Puntatore ai dati caricati in una variabile di tipo Image, è necessario, e ben più agevole, utilizzare la proprietà .Data della Classe Image .
grandezza = Object.SizeOf(imm)
Per poter maneggiare i pixel devi operare sui byte che compongono i pixel medesimi.
Un file immagine, anche se non compresso, non contiene i soli byte puri dei pixel. Se, poi, è compresso, non puoi ricavare la dimensione dell'immagine dal suo file immagine. Sei costretto ad utilizzare, anche questa volta, le risorse della Classe Image di Gambas.
Pertanto, la dimensione in byte effettiva di un'immagine si ottiene moltiplicando i pixel per la quantità di byte che compongono un singolo pixel:
grandezza = imm.Width * imm.Height * len(imm.Format)
L'istruzione len(imm.Format) è semplicemente un mio stratagemma per impostare il formato dei pixel (la quantità di byte che compongono un singolo pixel).
Ho modificato il programma ed in effetti ora funziona, ha un effetto "caleidoscopico" sull'immagine:
' Gambas class file
Private imm As Image
Public Sub Form_Open()
Dim i As Byte
imm = Image.Load("/usr/share/icons/hicolor/128x128/apps/vlc.png")
With foto
.W = imm.W
.H = imm.H
.Picture = imm.Picture
End With
Sleep 1
shifta
foto.Picture = imm.Picture
Sleep 2
shifta
foto.Picture = imm.Picture
End
Public Sub shifta()
Dim flusso As Stream
Dim fo, dato As Byte, j, grandezza As Integer
fo = Len(imm.Format)
flusso = Memory imm.Data For Read Write
grandezza = (imm.H * imm.W * fo) - 1
For j = 0 To grandezza
Read #flusso, dato
dato = Rol(dato, 1)
Seek #flusso, j
Write #flusso, dato As Byte
Next
End
Ma a parte una certa lentezza di calcolo, sopratutto se l'immagine è grande, nell'esempio qui sopra avrebbe dovuto farmi vedere prima l'immagine originale, poi 2 immagini modificate. Invece mi fa vedere solo l'ultima. Devo capire perchè... :-\
Devi istruire l'apertura immediata della finestra del Form, ponendo subito un
Public Sub Form_Open()
Dim i As Byte
Me.Show
......
Inoltre devi sostituire le funzioni Sleep con Wait .
Ora funziona, e pure velocemente. :D
Versione riveduta e corretta:
' Gambas class file
Private imm As Image
Public Sub Form_Open()
Dim i As Byte
Me.Show
imm = Image.Load("/usr/share/icons/hicolor/128x128/apps/vlc.png")
With foto
.W = imm.W
.H = imm.H
.Picture = imm.Picture
End With
Wait 1
For i = 1 To 8
shifta
foto.Picture = imm.Picture
Wait 0.01
Next
End
Public Sub shifta()
Dim flusso As Stream
Dim fo, dato As Byte, j, grandezza As Integer
fo = Len(imm.Format)
flusso = Memory imm.Data For Read Write
grandezza = (imm.H * imm.W * fo) - 1
For j = 0 To grandezza
Read #flusso, dato
dato = Rol(dato, 1)
Seek #flusso, j
Write #flusso, dato As Byte
Next
End
Ma ci si può ancora lavorare su... ;)