(d'après les explication du PB survival guide, chapitre 13.6 http://www.ninelizards.com/purebasic/purebasic%2013.htm)
On se sert de DatabaseColumnSize() pour définir la quantité de mémoire à allouer lors de la lecture.
Je ne suis pas assez doué pour avoir imaginé toutes ces modifications
Code : Tout sélectionner
; PureBasic 5.70 LTS (x64)
; By Falsam 2015
; Code rechapé by Marc56 2019
; Remplacement encodage64 par requêtes préparées pour déversement direct des données images en binaire dans le champs blob
; Nécessite PB >= 5.40 LTS
EnableExplicit
Enumeration
#DataBase
#ImageFile
#Buffer
EndEnumeration
Enumeration Window
#MainForm
EndEnumeration
Enumeration Gadget
#Selector
EndEnumeration
;Plan du code
Declare Start() ;Début
Declare ShowMedia(LastSequence = #False) ;Affichage d'une ou des images
Declare OnSelectMedia() ;Sélection d'une image
Declare OnDeleteMedia() ;Suppression d'une image
Declare OnClose() ;Fin
Start()
Procedure Start()
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseSQLiteDatabase()
OpenDatabase(#DataBase, "assets.sqlite", "","", #PB_Database_SQLite)
OpenWindow(#MainForm, 0, 0, 800, 600, "SQLite et les champs de type BLOB", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
ButtonGadget(#Selector, 10, 10, 180, 32, "Sélectionner une image")
ShowMedia() ;Affichage de toutes les images
;Evenements
BindEvent(#PB_Event_CloseWindow, @OnClose())
BindGadgetEvent(#Selector, @OnSelectMedia())
Repeat : WaitWindowEvent(10) : ForEver
EndProcedure
;Affichage de la derniere image ou toutes les images
Procedure ShowMedia(LastSequence = #False)
Protected Window, IdMedia, FileName.s, *Buffer, Result, Gadget
Protected PictureSize, i
If LastSequence = #True
;Selection de la derniere image
DatabaseQuery(#DataBase, "SELECT IdMedia, image, filename FROM Medias ORDER BY IdMedia DESC LIMIT 1")
Else
;Selection de toutes les images
DatabaseQuery(#DataBase, "SELECT IdMedia, image, filename FROM Medias")
EndIf
;Affichage du resultat : Chaque image est affichée dans une fenetre
While NextDatabaseRow(#Database)
i + 1
Debug "Image #" + i
IdMedia = GetDatabaseLong(#Database, 0)
PictureSize = DatabaseColumnSize(#Database, 1)
If PictureSize = 0 : Break : EndIf
*Buffer = AllocateMemory (PictureSize)
PictureSize = GetDatabaseBlob (#Database, 1, *Buffer, MemorySize(*Buffer))
FileName = GetDatabaseString (#DataBase, 2)
CatchImage(#Buffer, *Buffer)
Window = OpenWindow(#PB_Any, 0, 0, ImageWidth(#Buffer), ImageHeight(#Buffer) + 50, FileName, #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
ImageGadget(#PB_Any, 0, 0, 0, 0, ImageID(#Buffer))
;Ajout du bouton de suppression
;Mémorisatio de l'index d'enregistrement
;Initialisation du Callback de suppression
Gadget = ButtonGadget(#PB_Any, 10, ImageHeight(#Buffer) + 10, 80, 22, "Supprimer")
SetGadgetData(Gadget, IdMedia)
BindGadgetEvent(Gadget, @OnDeleteMedia())
StickyWindow(Window, #True)
Wend
EndProcedure
;Selection d'une image
Procedure OnSelectMedia()
Protected Pattern.s = "Image Files (*.bmp, *.jpg, *.png)|*.bmp;*.jpg;*.png"
Protected FileName.s = OpenFileRequester("Sélectionner une image", "", Pattern, 0)
Protected *Buffer
If FileName <> ""
;Lecture et encodage de l'image
If ReadFile(#ImageFile, FileName)
*Buffer = AllocateMemory(Lof(#ImageFile))
ReadData(#ImageFile, *Buffer, Lof(#ImageFile))
CloseFile(#ImageFile)
SetDatabaseBlob (#DataBase, 0, *Buffer, MemorySize(*Buffer))
SetDatabaseString (#DataBase, 1, GetFilePart(FileName))
EndIf
DatabaseUpdate(#DataBase, "INSERT INTO medias (Image, FileName) VALUES (?, ?)")
;Affichage de la DERNIERE image insérée
ShowMedia(#True)
EndIf
EndProcedure
;Suppression d'une image
Procedure OnDeleteMedia()
Protected IdMedia = GetGadgetData(EventGadget())
DatabaseUpdate(#DataBase, "DELETE FROM Medias WHERE IdMedia=" + IdMedia)
If DatabaseError() <> ""
MessageRequester("Information", "Erreur lors de la suppression" + #CRLF$ + DatabaseError())
Else
CloseWindow(EventWindow())
EndIf
EndProcedure
Procedure OnClose()
Protected Window = EventWindow()
Select Window
Case #MainForm
CloseDatabase(#DataBase)
End
Default
CloseWindow(Window)
EndSelect
EndProcedure
J'ai surement mal fait des trucs car je manipule encore mal les pointeurs (seulement 10 ans que je pratique PB)