ListIcon et sqlite [RESOLU]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
MetalOS
Messages : 1510
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

ListIcon et sqlite [RESOLU]

Message par MetalOS »

Salut les gars, je suis toujours dans l'apprentissage de la gestion de base de données. J'utilise un code tuto de Progi1984 sur la gestion de contacts. Dans son code initial il utilise un ListView pour stocker le nom et le prénom des différente fiches enregistrer. Je voudrais faire la même chose mais avec un ListIcon mais à chaque fois le nom et le prénom sont dans la première colonne au lieu d'être dans leurs colonnes respective. Voici mon code d'exemple.

Code : Tout sélectionner

Enumeration
  #Window_0
  #ListIcon_0
  #Button_0
  #Button_1
  #Button_2
  #Button_3
  #Button_4
  #Image_0
  #Text_0
  #Text_1
  #Text_2
  #Text_4
  #Text_5
  #Text_6
  #Text_7
  #Text_8
  #Text_9
  #Text_10
  #Text_11
  #Text_12
  #String_0
  #String_1
  #String_2
  #String_3
  #String_4
  #String_5
  #String_6
  #String_7
  #String_8
  #String_9
  #String_10
EndEnumeration

Global glDBSQLite.l
Global glListviewItemSelected.l = -1
Global glImageMemory.l

UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()

Procedure Main_WindowOpen()
  If OpenWindow(#Window_0, 200, 200, 800, 390, "DVP - Gestion de Contacts",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    ListIconGadget(#ListIcon_0, 10, 10, 300, 370, "Nom", 100)
    AddGadgetColumn(#ListIcon_0, 1, "Prénom", 100)
    ButtonGadget(#Button_0, 320, 350, 080, 30, "Reset")
    ButtonGadget(#Button_1, 400, 350, 100, 30, "Ajouter")
    ButtonGadget(#Button_2, 500, 350, 100, 30, "Mettre à jour")
    ButtonGadget(#Button_3, 600, 350, 100, 30, "Supprimer")
    ButtonGadget(#Button_4, 700, 350, 100, 30, "Parcourir")
    TextGadget(#Text_0, 320, 20, 110, 20, "Nom :")
    TextGadget(#Text_1, 320, 50, 110, 20, "Prénom : ")
    TextGadget(#Text_2, 320, 80, 110, 20, "Profession : ")
    TextGadget(#Text_4, 320, 110, 110, 20, "Société :")
    TextGadget(#Text_5, 320, 140, 110, 20, "Adresse :")
    TextGadget(#Text_6, 320, 170, 110, 20, "Code Postal :")
    TextGadget(#Text_7, 320, 200, 110, 20, "Ville :")
    TextGadget(#Text_8, 320, 230, 110, 20, "Pays :")
    TextGadget(#Text_9, 320, 260, 110, 20, "Téléphone :")
    TextGadget(#Text_10, 320, 290, 110, 20, "Fax : ")
    TextGadget(#Text_11, 320, 320, 110, 20, "Mail :")
    TextGadget(#Text_12, 620, 20, 110, 20, "Photo :")
    StringGadget(#String_0, 450, 20, 150, 20, "")
    StringGadget(#String_1, 450, 50, 150, 20, "")
    StringGadget(#String_2, 450, 80, 150, 20, "")
    StringGadget(#String_3, 450, 110, 150, 20, "")
    StringGadget(#String_4, 450, 140, 150, 20, "")
    StringGadget(#String_5, 450, 170, 150, 20, "")
    StringGadget(#String_6, 450, 200, 150, 20, "")
    StringGadget(#String_7, 450, 230, 150, 20, "")
    StringGadget(#String_8, 450, 260, 150, 20, "")
    StringGadget(#String_9, 450, 290, 150, 20, "")
    StringGadget(#String_10, 450, 320, 150, 20, "")
    ImageGadget(#Image_0, 620, 50, 160, 240, 0, #PB_Image_Border)
  EndIf
EndProcedure
Procedure DB_Init()
  Protected plFile.l
  Protected psSQLRequest.s
  UseSQLiteDatabase()
  If FileSize(#PB_Compiler_FilePath+"GestionContacts.sqlite") < 0
    plFile = CreateFile(#PB_Any, #PB_Compiler_FilePath+"GestionContacts.sqlite")
    If plFile
      CloseFile(plFile)
    EndIf
  EndIf
  
  glDBSQLite = OpenDatabase(#PB_Any, #PB_Compiler_FilePath+"GestionContacts.sqlite", "", "", #PB_Database_SQLite)
  If glDBSQLite = 0
    MessageRequester("DVP - Gestion de Contacts", DatabaseError())
    End
  ElseIf plFile
    psSQLRequest = "CREATE TABLE IF NOT EXISTS contacts ("
    psSQLRequest + "id_contact INTEGER PRIMARY KEY AUTOINCREMENT Not NULL, "
    psSQLRequest + "contact_nom TEXT Not NULL, "
    psSQLRequest + "contact_prenom TEXT Not NULL, "
    psSQLRequest + "contact_job TEXT, "
    psSQLRequest + "contact_company TEXT, "
    psSQLRequest + "contact_address TEXT, "
    psSQLRequest + "contact_postalcode TEXT, "
    psSQLRequest + "contact_city TEXT, "
    psSQLRequest + "contact_country TEXT, "
    psSQLRequest + "contact_phone TEXT, "
    psSQLRequest + "contact_fax TEXT, "
    psSQLRequest + "contact_mail TEXT, "
    psSQLRequest + "contact_photo BLOB, "
    psSQLRequest + "contact_photo_size INTEGER"
    psSQLRequest + ")"
    ; Debug psSQLRequest
    If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
      MessageRequester("DVP - Gestion de Contacts - DB_Init()", DatabaseError())
    EndIf
  EndIf
  
  If DatabaseQuery(glDBSQLite, "SELECT * FROM contacts") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#ListIcon_0, CountGadgetItems(#ListIcon_0), GetDatabaseString(glDBSQLite, 1) + " " + GetDatabaseString(glDBSQLite, 2))
      SetGadgetItemData(#ListIcon_0, CountGadgetItems(#ListIcon_0)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  EndIf
EndProcedure
Procedure DB_InsertContact()
  Protected psSQLRequest.s
  psSQLRequest = "INSERT INTO contacts"
  psSQLRequest + "(contact_nom, contact_prenom, contact_job, contact_company, contact_address, "
  psSQLRequest + "contact_postalcode, contact_city, contact_country, contact_phone, contact_fax, contact_mail, contact_photo, contact_photo_size)"
  psSQLRequest + "VALUES ("
  psSQLRequest + "'"+GetGadgetText(#String_0)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_1)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_2)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_3)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_4)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_5)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_6)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_7)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_8)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_9)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_10)+"',"
  psSQLRequest + "?,"
  If glImageMemory
    psSQLRequest + Str(MemorySize(glImageMemory))
  Else
    psSQLRequest + "0"
  EndIf
  psSQLRequest + ")"
  ;Debug psSQLRequest
  If glImageMemory
    SetDatabaseBlob(glDBSQLite, 0, glImageMemory, MemorySize(glImageMemory))
  Else
    ReplaceString(psSQLRequest, "?", "'0'")
  EndIf
  If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
    MessageRequester("DVP - Gestion de Contacts - DB_InsertContact()", DatabaseError())
  EndIf
  
  ; Ajoute le dernier element ajouté à la base
  If DatabaseQuery(glDBSQLite, "SELECT max(id_contact), contact_nom, contact_prenom FROM contacts") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#ListIcon_0, CountGadgetItems(#ListIcon_0), GetDatabaseString(glDBSQLite, 1) + " " + GetDatabaseString(glDBSQLite, 2))
      SetGadgetItemData(#ListIcon_0, CountGadgetItems(#ListIcon_0)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  Else
    MessageRequester("DVP - Gestion de Contacts - DB_InsertContact", DatabaseError())
  EndIf
EndProcedure
Procedure DB_SelectContact(GadgetItem.l)
  Protected psSQLRequest.s
  Protected plFileImageSize.l
  Protected plFileImage.l
  psSQLRequest = "SELECT * FROM contacts WHERE id_contact="+Str(GetGadgetItemData(#ListIcon_0, GadgetItem))
  ;Debug psSQLRequest
  If DatabaseQuery(glDBSQLite, psSQLRequest) <> 0
    While NextDatabaseRow(glDBSQLite)
      SetGadgetText(#String_0, GetDatabaseString(glDBSQLite, 1))
      SetGadgetText(#String_1, GetDatabaseString(glDBSQLite, 2))
      SetGadgetText(#String_2, GetDatabaseString(glDBSQLite, 3))
      SetGadgetText(#String_3, GetDatabaseString(glDBSQLite, 4))
      SetGadgetText(#String_4, GetDatabaseString(glDBSQLite, 5))
      SetGadgetText(#String_5, GetDatabaseString(glDBSQLite, 6))
      SetGadgetText(#String_6, GetDatabaseString(glDBSQLite, 7))
      SetGadgetText(#String_7, GetDatabaseString(glDBSQLite, 8))
      SetGadgetText(#String_8, GetDatabaseString(glDBSQLite, 9))
      SetGadgetText(#String_9, GetDatabaseString(glDBSQLite, 10))
      SetGadgetText(#String_10, GetDatabaseString(glDBSQLite, 11))
      plFileImageSize = GetDatabaseLong(glDBSQLite, 13)
      If plFileImageSize > 0
        glImageMemory = AllocateMemory(plFileImageSize)
        GetDatabaseBlob(glDBSQLite, 12, glImageMemory, plFileImageSize)
        plFileImage = CatchImage(#PB_Any, glImageMemory, plFileImageSize)
        If plFileImage
          ResizeImage(plFileImage, 160, 240)
          SetGadgetState(#Image_0, ImageID(plFileImage))
          FreeImage(plFileImage) 
        EndIf
      Else
        SetGadgetState(#Image_0, 0)
      EndIf
    Wend
    FinishDatabaseQuery(glDBSQLite)
  Else
    MessageRequester("DVP - Gestion de Contacts - DB_SelectContact", DatabaseError())
  EndIf
EndProcedure
Procedure DB_UpdateContact(GadgetItem.l)
  Protected psSQLRequest.s
  psSQLRequest = "UPDATE contacts SET "
  psSQLRequest + "contact_nom='"+GetGadgetText(#String_0)+"', "
  psSQLRequest + "contact_prenom='"+GetGadgetText(#String_1)+"', "
  psSQLRequest + "contact_job='"+GetGadgetText(#String_2)+"', "
  psSQLRequest + "contact_company='"+GetGadgetText(#String_3)+"', "
  psSQLRequest + "contact_address='"+GetGadgetText(#String_4)+"', "
  psSQLRequest + "contact_postalcode='"+GetGadgetText(#String_5)+"', "
  psSQLRequest + "contact_city='"+GetGadgetText(#String_6)+"', "
  psSQLRequest + "contact_country='"+GetGadgetText(#String_7)+"', "
  psSQLRequest + "contact_phone='"+GetGadgetText(#String_8)+"', "
  psSQLRequest + "contact_fax='"+GetGadgetText(#String_9)+"', "
  psSQLRequest + "contact_mail='"+GetGadgetText(#String_10)+"', "
  psSQLRequest + "contact_photo = ?,"
  If glImageMemory
    psSQLRequest + "contact_photo_size = " + Str(MemorySize(glImageMemory))
  Else
    psSQLRequest + "contact_photo_size = 0"
  EndIf
  psSQLRequest + " WHERE id_contact="+Str(GetGadgetItemData(#ListIcon_0, GadgetItem))
  ;Debug psSQLRequest
  If glImageMemory
    SetDatabaseBlob(glDBSQLite, 0, glImageMemory, MemorySize(glImageMemory))
  Else
    ReplaceString(psSQLRequest, "?", "'0'")
  EndIf
  If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
    MessageRequester("DVP - Gestion de Contacts - DB_UpdateContact()", DatabaseError())
  Else
    SetGadgetItemText(#ListIcon_0, GadgetItem, GetGadgetText(#String_0)+" "+GetGadgetText(#String_1))
  EndIf
EndProcedure
Procedure DB_DeleteContact(GadgetItem.l)
  Protected psSQLRequest.s
  psSQLRequest = "DELETE FROM contacts WHERE id_contact="+Str(GetGadgetItemData(#ListIcon_0, GadgetItem))
  ;Debug psSQLRequest
  If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
    MessageRequester("DVP - Gestion de Contacts - DB_DeleteContact()", DatabaseError())
  Else
    RemoveGadgetItem(#ListIcon_0, GadgetItem)
  EndIf
EndProcedure

Main_WindowOpen()
DB_Init()

Repeat
  glEvent = WaitWindowEvent()
  glGadget= EventGadget()
  glType = EventType()
  If glEvent = #PB_Event_Gadget
    Select glGadget
      Case #ListIcon_0 ;{
        If GetGadgetState(#ListIcon_0) >= 0 And GetGadgetState(#ListIcon_0) <= CountGadgetItems(#ListIcon_0)
          If GetGadgetState(#ListIcon_0) <> glListviewItemSelected
            glListviewItemSelected = GetGadgetState(#ListIcon_0)
            DB_SelectContact(GetGadgetState(#ListIcon_0))
          EndIf
        EndIf
      ;}
      Case #Button_0 ;{ Reset
        If glType = #PB_EventType_LeftClick
          Define.l dlInc
          For dlInc = #String_0 To #String_10
            SetGadgetText(dlInc, "")
          Next
          SetGadgetState(#Image_0, 0)
          If glImageMemory
            FreeMemory(glImageMemory)
            glImageMemory = 0
          EndIf
          glListviewItemSelected = -1
        EndIf
      ;}
      Case #Button_1 ;{ Ajouter
        If GetGadgetText(#String_0) <> "" And GetGadgetText(#String_1) <> ""
          If glType = #PB_EventType_LeftClick
            DB_InsertContact()
          EndIf
        EndIf
      ;}
      Case #Button_2 ;{ Mettre à jour
        If GetGadgetState(#ListIcon_0) >= 0 And GetGadgetState(#ListIcon_0) <= CountGadgetItems(#ListIcon_0)-1
          If glType = #PB_EventType_LeftClick
            DB_UpdateContact(GetGadgetState(#ListIcon_0))
          EndIf
        EndIf
      ;}
      Case #Button_3 ;{ Supprimer
        If GetGadgetState(#ListIcon_0) >= 0 And GetGadgetState(#ListIcon_0) <= CountGadgetItems(#ListIcon_0)-1
          If glType = #PB_EventType_LeftClick
            If MessageRequester("DVP - Gestion de Contacts", "Voulez vous vraiment supprimer le contact courant "+Chr(34)+GetGadgetItemText(#ListIcon_0, GetGadgetState(#ListIcon_0))+Chr(34)+" ?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
              DB_DeleteContact(GetGadgetState(#ListIcon_0))
            EndIf
          EndIf
        EndIf
      ;}
      Case #Button_4 ;{ Parcourir
        Define.s psFileImage
        Define.l plFileImage
        ; Ouvre une boîte de dialogue standard pour choisir une image
        psFileImage = OpenFileRequester("Choisissez une image à charger", "", "Fichiers Images|*.png;*.bmp;*.jpg;*.jpeg|Tous les fichiers (*.*)|*.*", 0)
        If psFileImage
          ; Charge une image
          plFileImage = LoadImage(#PB_Any, psFileImage)
          If plFileImage
            ; Redimensionne l'image à la taille de l'ImageGadget
            ResizeImage(plFileImage, 160, 240)
            ; Change l'image affichée par l' ImageGadget
            SetGadgetState(#Image_0, ImageID(plFileImage))
            ; Libère l'image
            FreeImage(plFileImage)
            ; Charge l'image dans la zone mémoire globale dédiée 'glImageMemory'
            plFileImage = OpenFile(#PB_Any, psFileImage)
            If plFileImage
              glImageMemory = AllocateMemory(Lof(plFileImage))
              If glImageMemory 
                ReadData(plFileImage, glImageMemory, Lof(plFileImage))
              EndIf
              CloseFile(plFileImage)
            EndIf
          EndIf
        EndIf
      ;}
    EndSelect
  EndIf
Until glEvent = #PB_Event_CloseWindow
End 

Merci pour votre aide.
Dernière modification par MetalOS le lun. 25/mai/2020 19:09, modifié 3 fois.
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: ListIcon et sqlite

Message par Marc56 »

Pour mettre les éléments dans des colonnes différentes, il faut utiliser Chr(10)

Remplacer:

Code : Tout sélectionner

          AddGadgetItem(#ListIcon_0, CountGadgetItems(#ListIcon_0), GetDatabaseString(glDBSQLite, 1) + 
                                                                    " " + 
                                                                    GetDatabaseString(glDBSQLite, 2))
Par ça:

Code : Tout sélectionner

          AddGadgetItem(#ListIcon_0, CountGadgetItems(#ListIcon_0), GetDatabaseString(glDBSQLite, 1) + 
                                                                    Chr(10) + 
                                                                    GetDatabaseString(glDBSQLite, 2))
:wink:
Avatar de l’utilisateur
MetalOS
Messages : 1510
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: ListIcon et sqlite

Message par MetalOS »

Je vais essayer, merci Marc.
Avatar de l’utilisateur
MetalOS
Messages : 1510
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: ListIcon et sqlite

Message par MetalOS »

J'y pense jamais à ce Chr(). Merci infiniment Marc.

Par contre je viens de me rendre compte que si je charge une image et que je bouge la fenêtre dérriere la barre de tache windows, l'image disparait. Tu aurais une idée ?
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: ListIcon et sqlite

Message par Marc56 »

MetalOS a écrit : Par contre je viens de me rendre compte que si je charge une image et que je bouge la fenêtre derrière la barre de tache windows, l'image disparait.
Parce que tu as libéré l'image alors que le programme en a besoin en cas de déplacement de l'interface hors écran (elle disparait aussi si tu pousse ton programme hors écran)

Mets en commentaire la ligne 199 (FreeImage(plFileImage))

Code : Tout sélectionner

        If plFileImage
          ResizeImage(plFileImage, 160, 240)
          SetGadgetState(#Image_0, ImageID(plFileImage))
          ;FreeImage(plFileImage)
        EndIf
:wink:
Avatar de l’utilisateur
MetalOS
Messages : 1510
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: ListIcon et sqlite

Message par MetalOS »

Encore une fois milles merci, il y a des moments ou l'évidence et sous nos yeux.
Répondre