PureBasic

Forums PureBasic
Nous sommes le Mer 19/Juin/2019 6:05

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 18 messages ]  Aller à la page Précédente  1, 2
Auteur Message
 Sujet du message: Re: SQlite et champs BLOB
MessagePosté: Lun 04/Mar/2019 17:06 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1559
Et voila la version complète, avec la version de ShowMedia() modifiée pour lire les blobs
(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 :wink:
Code:
; 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

Désolé d'avoir un peu abîmé le code initial :oops:
J'ai surement mal fait des trucs car je manipule encore mal les pointeurs (seulement 10 ans que je pratique PB)

:wink:

_________________
HP de 2012 - Intel i3-3220 @3.30 GHz, 2 coeurs, 4 threads - RAM 16 Go - Nvidia GT 620 1920x1080 DPI 100%
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SQlite et champs BLOB
MessagePosté: Mar 16/Avr/2019 21:58 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3413
@Marc56

Désolé de ne pas avoir répondu si tôt. Sans réseau DSL, je reporte indéfiniment. Pourtant tu y as passé du temps. Je t'indique juste que je n'oublie pas.

@falsam

Est-ce que le problème se résoud, ou bien es-tu toujours contraint de faire une mise à jour des tutoriels ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: SQlite et champs BLOB
MessagePosté: Mer 17/Avr/2019 9:01 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1559
Ollivier a écrit:
@Marc56
Désolé de ne pas avoir répondu si tôt. Sans réseau DSL, je reporte indéfiniment. Pourtant tu y as passé du temps. Je t'indique juste que je n'oublie pas.
Tu as de la chance, moi qui depuis quelques jours ai l'age du numéro de mon pseudo, ai totalement oublié de quoi je parlais il y a un mois et demi :mrgreen:

_________________
HP de 2012 - Intel i3-3220 @3.30 GHz, 2 coeurs, 4 threads - RAM 16 Go - Nvidia GT 620 1920x1080 DPI 100%
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 18 messages ]  Aller à la page Précédente  1, 2

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Majestic-12 [Bot] et 4 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye