Dois-je utiliser un tableau ou une liste

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Dois-je utiliser un tableau ou une liste

Message par Micoute »

Bonjour à tous,

pour mes filles, je souhaite faire un logiciel de cuisine où elle pourront entrer leurs recettes qui seront sauvegardées dans une base de données *.JSON.

Le problème qui me fait venir vers vous pour solliciter votre aide, c'est que le nombre d'ingrédients n'est pas le même pour toutes les recettes, je les ai limités à 20, mais dois-je utiliser un tableau ou une liste ?

Pour le tableau, les entrées vides occupent la mémoire inutilement, mais je ne vois pas comment utiliser une liste dans mon cas, c'est pourquoi je vous propose de m'aider à trouver la solution et je vous en remercie par anticipation.

Voici mon code pour le moment:

Code : Tout sélectionner

;Recettes de cuisine

Enumeration Fenetres
  #Fenetre_principale
EndEnumeration

Enumeration Menus
  #Menu
EndEnumeration

Enumeration Elements_Menu
  #Menu_ApplePie
  #Menu_EntreeFraiche
  #Menu_BlanquetteDeVeau_Maison
  #Menu_BoeufBourguignon_Rapide
  #Menu_BoeufBourguignon
EndEnumeration

Enumeration Gadgets
  #Img
  #Str_Ingredients
  #Txt_Nbre_pers
  #Str_Nbre_pers
  #Txt_pers_recalculees
  #Str_pers_recalculees
  #Edt
  #Str_Nom_recette
  #Txt_Signature
EndEnumeration

Enumeration #PB_Compiler_EnumerationValue Step 20
  #Str_Ing_Qt
EndEnumeration

Enumeration #PB_Compiler_EnumerationValue Step 20
  #Str_Ing_Alim
EndEnumeration

Enumeration
  #ID_Img
EndEnumeration

Enumeration Polices
  #Police_1
  #Police_2
EndEnumeration

Structure Composant
  Quantite.f
  Aliment.s
EndStructure  

UseJPEGImageDecoder()

Global Evenement, Nb_Pers
Global.composant Dim Ing(19)
Global Titre$, Recette$, FichierImage$ = #PB_Compiler_FilePath + "Images\Cuisto.jpg"

LoadFont(#Police_1, "Arial", 12, #PB_Font_Bold)
LoadFont(#Police_2, "Arial", 25, #PB_Font_Bold)

SetGadgetFont(#PB_Default, FontID(#Police_1))

Procedure.f CalculerProportion(NbRef.f, QteRef.f, NbChoisi.f)
    Proportion.f = (NbChoisi * QteRef) / NbRef
    ProcedureReturn Proportion
  EndProcedure

Procedure Calculs()
  Protected Resultat
  ;CalculerProportionEntiere(NbRef.f, QteRef.f, NbChoisi.f)
  If Val(GetGadgetText(#Str_pers_recalculees)) > 0
    For i = 0 To ArraySize(Ing())
      SetGadgetText(#Str_Ing_Qt + i, StrF(CalculerProportion(Val(GetGadgetText(#Str_Nbre_pers)), Ing(i)\Quantite,  Val(GetGadgetText(#Str_pers_recalculees)))))
    Next i  
  EndIf
EndProcedure 

Procedure Mise_a_jour_Gadgets()
  
  SetGadgetText(#Str_Nom_recette, Titre$)
  SetGadgetText(#Str_Nbre_pers, Str(Nb_Pers))
  For i = 0 To ArraySize(Ing())
  SetGadgetText(#Str_Ing_Qt + i, StrF(Ing(i)\Quantite))
  SetGadgetText(#Str_Ing_Alim + i, Ing(i)\Aliment)
  Next i
  SetGadgetText(#Edt, Recette$)
  
  For i = #Str_Ing_Qt To #Str_Ing_Qt + 19
    If ValF(GetGadgetText(i)) < 0.1
      HideGadget(i, 1)
    EndIf
  Next i
  
  For i = #Str_Ing_Alim To #Str_Ing_Alim + 19
    If GetGadgetText(i) = ""
      HideGadget(i, 1)
    EndIf
  Next i
  
  SetGadgetFont(#Str_Nom_recette, FontID(#Police_2))
  
EndProcedure

Procedure Programme_principal()
  If OpenWindow(#Fenetre_principale, 0, 0, 1380, 810, "Recettes de cuisine par Micoute", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
    ;{ Menu
    If CreateMenu(#Menu, WindowID(#Fenetre_principale))      
      MenuTitle("Recettes")
      OpenSubMenu("Entrées")
      MenuItem(#Menu_EntreeFraiche, "Entrée fraîche")
      CloseSubMenu()
      OpenSubMenu("Cocotte")
      CloseSubMenu()
      OpenSubMenu("Poisson")
      CloseSubMenu()
      OpenSubMenu("Plat traditionnel")
      MenuItem(#Menu_BlanquetteDeVeau_Maison, "Blanquette de veau maison")
      MenuItem(#Menu_BoeufBourguignon_Rapide, "Boeuf bourguignon rapide")
      MenuItem(#Menu_BoeufBourguignon, "Boeuf bourguignon")
      CloseSubMenu()
      OpenSubMenu("Légumes")
      CloseSubMenu()
      OpenSubMenu("Cakes salés")
      CloseSubMenu()
      OpenSubMenu("Papillottes")
      CloseSubMenu()
      OpenSubMenu("Lapin")
      CloseSubMenu()
      OpenSubMenu("Gratins")
      CloseSubMenu()
      OpenSubMenu("Champignons")
      CloseSubMenu()
      OpenSubMenu("Poulet")
      CloseSubMenu()
      OpenSubMenu("Fromage")
      CloseSubMenu()
      OpenSubMenu("Pomme de terre")
      CloseSubMenu()
      OpenSubMenu("Cuisine à pas cher")
      CloseSubMenu()
      OpenSubMenu("Tartes et tartelettes")
      MenuItem(#Menu_ApplePie, "American pie pomme cannelle")
      CloseSubMenu()
      MenuBar()
      OpenSubMenu("Recettes sucrées")
      CloseSubMenu()
      OpenSubMenu("Desserts chocolatés")
      CloseSubMenu()
      OpenSubMenu("Cakes sucrés")
      CloseSubMenu()
      OpenSubMenu("Crèmes dessert")
      CloseSubMenu()
      OpenSubMenu("Desserts fruités")
      CloseSubMenu()
      OpenSubMenu("Pomme")
      CloseSubMenu()
      OpenSubMenu("Gâteaux")
      CloseSubMenu()
      OpenSubMenu("Petites faims")
      CloseSubMenu()
      OpenSubMenu("avec de la chicorée")
      CloseSubMenu()
      OpenSubMenu("Goûter")
      CloseSubMenu()
      OpenSubMenu("Dessetrs traditionnels")
      CloseSubMenu()
      OpenSubMenu("Moelleux")
      CloseSubMenu()
      OpenSubMenu("Clafoutis et gratins sucrés")
      CloseSubMenu()
    EndIf
    ;}
    TextGadget(#Txt_Nbre_pers, 10, 10, 170, 20, "Nombre de personnes", #PB_Text_Right|#SS_CENTERIMAGE)
    StringGadget(#Str_Nbre_pers, 190, 10, 30, 20, "") ;la recette est prévue pour X personnes
    TextGadget(#Txt_pers_recalculees, 10, 35, 170, 20, "Nombre recalculé", #PB_Text_Right|#SS_CENTERIMAGE)
    StringGadget(#Str_pers_recalculees, 190, 35, 30, 20, "") ;Je veux faire la recette pour Y personnes
    
    ;Partie à commenter s'il n'y a pas d'image
    
    ;LoadImage(#Img, FichierImage$)
    ;ResizeImage(#img, 345, 345)
    ;ImageGadget(#Img, 10, 60, 345, 345, ImageID(#ID_Img), #PB_Image_Raised)
    ;StringGadget(#Str_Nom_recette, ImageWidth(#img) + 20, 10, 935, 45, "", #PB_String_ReadOnly|#ES_CENTER)
    ;EditorGadget(#Edt, ImageWidth(#img) + 20, 60, 935, 350) 
    
    StringGadget(#Str_Nom_recette, 370, 10, 1000, 45, "", #ES_CENTER)
    EditorGadget(#Edt, 370, 60, 1000, 350)
    
       
    
    ;ResizeWindow(#Fenetre_principale, #PB_Ignore, #PB_Ignore, ImageWidth(#img) + 20 + GadgetWidth(#Edt) + 10, #PB_Ignore) 
    
    ;{ Ingrédients
    StringGadget(#Str_Ingredients, 10, 420, 100, 25, "Ingrédients", #SS_CENTERIMAGE)
    StringGadget(#Str_Ing_Qt, 10, 450, 70, 25, "")
    StringGadget(#Str_Ing_Qt+ 1, 10, 480, 70, 25, "")
    StringGadget(#Str_Ing_Qt+ 2, 10, 510, 70, 25, "")
    StringGadget(#Str_Ing_Qt+ 3, 10, 540, 70, 25, "")
    StringGadget(#Str_Ing_Qt+ 4, 10, 570, 70, 25, "")
    StringGadget(#Str_Ing_Qt+ 5, 10, 600, 70, 25, "")
    StringGadget(#Str_Ing_Qt+ 6, 10, 630, 70, 25, "")
    StringGadget(#Str_Ing_Qt+ 7, 10, 660, 70, 25, "")
    StringGadget(#Str_Ing_Qt+ 8, 10, 690, 70, 25, "")
    StringGadget(#Str_Ing_Qt+ 9, 10, 720, 70, 25, "")
    StringGadget(#Str_Ing_Qt+10, 660, 450, 70, 25, "")
    StringGadget(#Str_Ing_Qt+11, 660, 480, 70, 25, "")
    StringGadget(#Str_Ing_Qt+12, 660, 510, 70, 25, "")
    StringGadget(#Str_Ing_Qt+13, 660, 540, 70, 25, "")
    StringGadget(#Str_Ing_Qt+14, 660, 570, 70, 25, "")
    StringGadget(#Str_Ing_Qt+15, 660, 600, 70, 25, "")
    StringGadget(#Str_Ing_Qt+16, 660, 630, 70, 25, "")
    StringGadget(#Str_Ing_Qt+17, 660, 660, 70, 25, "")
    StringGadget(#Str_Ing_Qt+18, 660, 690, 70, 25, "")
    StringGadget(#Str_Ing_Qt+19, 660, 720, 70, 25, "")
    StringGadget(#Str_Ing_Alim, 90, 450, 560, 25, "")
    StringGadget(#Str_Ing_Alim+1, 90, 480, 560, 25, "")
    StringGadget(#Str_Ing_Alim+2, 90, 510, 560, 25, "")
    StringGadget(#Str_Ing_Alim+3, 90, 540, 560, 25, "")
    StringGadget(#Str_Ing_Alim+4, 90, 570, 560, 25, "")
    StringGadget(#Str_Ing_Alim+5, 90, 600, 560, 25, "")
    StringGadget(#Str_Ing_Alim+6, 90, 630, 560, 25, "")
    StringGadget(#Str_Ing_Alim+7, 90, 660, 560, 25, "")
    StringGadget(#Str_Ing_Alim+8, 90, 690, 560, 25, "")
    StringGadget(#Str_Ing_Alim+9, 90, 720, 560, 25, "")
    StringGadget(#Str_Ing_Alim+10, 740, 450, 560, 25, "")
    StringGadget(#Str_Ing_Alim+11, 740, 480, 560, 25, "")
    StringGadget(#Str_Ing_Alim+12, 740, 510, 560, 25, "")
    StringGadget(#Str_Ing_Alim+13, 740, 540, 560, 25, "")
    StringGadget(#Str_Ing_Alim+14, 740, 570, 560, 25, "")
    StringGadget(#Str_Ing_Alim+15, 740, 600, 560, 25, "")
    StringGadget(#Str_Ing_Alim+16, 740, 630, 560, 25, "")
    StringGadget(#Str_Ing_Alim+17, 740, 660, 560, 25, "")
    StringGadget(#Str_Ing_Alim+18, 740, 690, 560, 25, "")
    StringGadget(#Str_Ing_Alim+19, 740, 720, 560, 25, "")
    ;}
    TextGadget(#Txt_Signature, 10, 750, WindowWidth(#Fenetre_principale) - 20, 40, "Recettes de cuisines par Micoute © 2017", #PB_Text_Center|#SS_CENTERIMAGE)
    
    ;{ Polices et couleurs
    SetGadgetFont(#Str_Nom_recette, FontID(#Police_2))
    SetGadgetFont(#Txt_Signature, FontID(#Police_2))
    
    SetWindowColor(#Fenetre_principale, $79F689)
    SetGadgetColor(#Txt_Signature, #PB_Gadget_BackColor, $79F689)
    ;}
    
  EndIf
EndProcedure


Programme_principal()

;- Boucle
Repeat
  Evenement = WaitWindowEvent()
  Select Evenement
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Str_Nbre_pers
          Mise_a_jour_Gadgets()
        Case #Str_pers_recalculees
          Calculs()
      EndSelect
      
    Case #PB_Event_Menu
      Select EventMenu()
          ;- American pie
        Case #Menu_ApplePie
          Titre$ = "American pie pomme cannelle"
          Nb_Pers = 4
          Ing(0)\Quantite = 2 : ing(0)\Aliment = "pâtes feuilletées"
          ing(1)\Quantite = 4 : ing(1)\Aliment = "pommes golden"
          ing(2)\Quantite = 1 : ing(2)\Aliment = "c. à café de canelle en poudre"
          ing(3)\Quantite = 120 : ing(3)\Aliment = "grammes de sucre"
          ing(4)\Quantite = 1 : Ing(4)\Aliment = "jaune d'oeuf"
          Recette$ = "Déroulez la pâte dans un moule à tarte en gardant le papier."+#CRLF$+
                     "Piquez-la avec une fourchette. Puis lavez, épluchez, coupez et épépinez les pommes. Râpez-les dans un saladier."+#CRLF$+#CRLF$+
                     "Ajoutez 120 grammes de sucre et une cuillère a café de cannelle et mélangez délicatement pour ne pas abimer les pommes."+#CRLF$+
                     "Laissez poser 5 à 10 mn jusqu'a ce qu'un sirop se forme au fond du saladier."+#CRLF$+#CRLF$+
                     "Pendant ce temps préchauffez le four thermostat 7"+#CRLF$+
                     "Répartissez le mélange sur la pâte avant de recouvrir le tout de la deuxième. N'oubliez pas de tracer des traits avec"+#CRLF$+
                     "la pointe du couteau sur le dessus. Le jaune d'œuf donnera un aspect plus doré. Enfournez une demi-heure."+#CRLF$+
                     "Sitôt la tarte sortie du four retirez le papier et laissez refroidir avant de ...déguster!"
          ;FichierImage$ = #PB_Compiler_FilePath + "Images\apple-pie.jpg"
          Mise_a_jour_Gadgets()
          ;- Entrée fraiche
        Case #Menu_EntreeFraiche
          Titre$ = "Entrée fraîcheur"
          Nb_Pers = 6
          Ing(0)\Quantite = 3:Ing(0)\Aliment = "tomates"
          Ing(1)\Quantite = 200:Ing(1)\Aliment = "g de fromage frais"
          Ing(2)\Quantite = 4:Ing(2)\Aliment = "cuillères à soupe de crème fraîche épaisse"
          Ing(3)\Quantite = 3:Ing(3)\Aliment = "tranches de jambon"
          Ing(4)\Quantite = 6:Ing(4)\Aliment = "feuilles de basilic frais"
          Recette$ = "Préparation :"+#CRLF$+#CRLF$+
                     "Disposez un morceau de jambon au fond de la tomate."+#CRLF$+#CRLF$+
                     "Mélangez la crème fraîche et le fromage dans un bol."+#CRLF$+#CRLF$+
                     "Mettez-en environ une cuiller à soupe dans chaque moitié de tomate."+#CRLF$+#CRLF$+
                     "Ajoutez un deuxième morceau de jambon au-dessus de la crème de fromage. Puis déposez une feuille de basilic."+#CRLF$+#CRLF$+
                     "Assaisonnez, puis dégustez !"
          ;FichierImage$ = #PB_Compiler_FilePath + "Images\Entrée fraicheur.jpg"
          Mise_a_jour_Gadgets()
          
          ;- Blanquette de veau
        Case #Menu_BlanquetteDeVeau_Maison
          
          Titre$ = "Blanquette de veau maison"
          
          Nb_Pers =  6 ;Ingrédients (pour 6 ou 7 personnes) :
          Ing(0)\Quantite = 1.2 : Ing(0)\Aliment = "Kg d'épaule ou de tendron de veau coupé en morceaux"
          Ing(1)\Quantite = 1 : Ing(1)\Aliment = "carotte"
          Ing(2)\Quantite = 2 : Ing(2)\Aliment = "blancs de poireaux"
          Ing(3)\Quantite = 1 : Ing(3)\Aliment = "gros oignon"
          Ing(4)\Quantite = 1 : Ing(4)\Aliment = "gousse d'ail"
          Ing(5)\Quantite = 2 : Ing(5)\Aliment = "échalotes"
          Ing(6)\Quantite = 1 : Ing(6)\Aliment = "brin de céleri"
          Ing(7)\Quantite = 1 : Ing(7)\Aliment = "bouquet garni"
          Ing(8)\Quantite = 1 : Ing(8)\Aliment = "bouquet de persil"
          Ing(9)\Quantite = 1 : Ing(9)\Aliment = "citron"
          Ing(10)\Quantite = 300 : Ing(10)\Aliment = "g de champignons de Paris"
          Ing(11)\Quantite = 3 : Ing(11)\Aliment = "cuillères à soupe de vin blanc sec"
          Ing(12)\Quantite = 2 : Ing(12)\Aliment = "jaunes d'oeufs"
          Ing(13)\Quantite = 1 : Ing(13)\Aliment = "dl de crème fraîche"
          Ing(14)\Quantite = 1 : Ing(14)\Aliment = "cuillère à soupe de farine"
          Ing(15)\Quantite = 70 :  Ing(15)\Aliment = "g de beurre"
          
          Recette$ = "Préparation :"+#CRLF$+#CRLF$+
                     "Pelez carotte, ail, échalotes et oignon."+#CRLF$+#CRLF$+
                     "Hachez ce dernier ainsi que les blancs de poireaux."+#CRLF$+#CRLF$+
                     "Coupez les échalotes et la carotte en deux."+#CRLF$+#CRLF$+
                     "Portez à ébullition 2 litres d'eau dans un grand faitout, plongez-y les morceaux de viande pendant environ une minute"+#CRLF$+
                     "pour les blanchir (blanchir la viande permet d'éliminer les éventuelles impuretés tout en la rendant plus ferme)."+#CRLF$+#CRLF$+
                     "Égouttez la viande, rincez-la sous l'eau froide et jetez l'eau de cuisson."+#CRLF$+#CRLF$+
                     "Replacez la viande dans le faitout rincé."+#CRLF$+#CRLF$+
                     "Ajoutez oignon et poireaux hachés, carottes, échalotes, ail, céleri et bouquet garni."+#CRLF$+#CRLF$+
                     "Salez, poivrez et mouillez avec le vin."+#CRLF$+#CRLF$+
                     "Ajoutez de l'eau pour que la viande et les légumes soient immergés."+#CRLF$+#CRLF$+
                     "Couvrez. Portez à ébullition et laissez cuire 1 h 30. Faites cuire dans une poêle, avec 30 g de beurre, les champignons"+#CRLF$+
                     "coupés et citronnés 10 min."+#CRLF$+#CRLF$+
                     "Préparez un roux blond : faites fondre le reste de beurre dans une casserole, saupoudrez-le avec la farine, mélangez"+#CRLF$+
                     "vivement au fouet, puis laissez refroidir."+#CRLF$+#CRLF$+
                     "Quand la viande est cuite, mettez-la dans une passoire avec les légumes et récupérez le bouillon de cuisson."+#CRLF$+#CRLF$+
                     "Délayez le roux avec ce bouillon et amenez à ébullition en fouettant."+#CRLF$+#CRLF$+
                     "Remettez la viande et tous les légumes dans le faitout après avoir retiré bouquet garni, ail, céleri et carotte."+#CRLF$+#CRLF$+
                     "Ajoutez les champignons,"+#CRLF$+
                     "versez la sauce et réchauffez le tout 10 à 15 min."+#CRLF$+#CRLF$+
                     "Juste avant de servir mélangez la crème et les jaunes d'œufs, incorporez-les à la sauce en tournant sans laisser bouillir."+#CRLF$+#CRLF$+
                     "Ajoutez quelques gouttes de jus de citron."+#CRLF$+#CRLF$+"Servez dans un plat creux avec du persil."
          
          ;FichierImage$ =  #PB_Compiler_FilePath + "Images\Blanquette de veau.jpg"
          
          Mise_a_jour_Gadgets()
          ;- Boeuf bourguignon rapide
        Case #Menu_BoeufBourguignon_Rapide
          Titre$ = "Boeuf bourguignon rapide"
          Nb_Pers = 6
          Ing(0)\Quantite = 800 : Ing(0)\Aliment = "g de boeuf"
          Ing(1)\Quantite = 100 : Ing(1)\Aliment = "g de lardons"
          Ing(2)\Quantite = 50 : Ing(2)\Aliment = "g de beurre"
          Ing(3)\Quantite = 0.67 : Ing(3)\Aliment = "l de vin"
          Ing(4)\Quantite = 2 : Ing(4)\Aliment = "oignons"
          Ing(5)\Quantite = 1 : Ing(5)\Aliment = "gousse d'ail"
          Ing(6)\Quantite = 2 : Ing(6)\Aliment = "c. à soupe de farine"
          Ing(7)\Quantite = 1 : Ing(7)\Aliment = "bouquet garni"
          Ing(8)\Quantite = 250 : Ing(8)\Aliment = "g de champignons"
          Ing(9)\Aliment = "Set et poivre"
          Recette$ = "Hacher les oignons. Peler l'ail"+#CRLF$+#CRLF$+
                     "Dans une cocotte minute, faire roussir la viande et les lardons dans le beurre"+#CRLF$+#CRLF$+
                     "Ajouter les oignons, les champignons égouttés et saupoudrer de farine"+#CRLF$+"Mélanger et laisser dorer un instant."+#CRLF$+#CRLF$+
                     "Mouiller avec le vin rouge qui doit recouvrir la viande."+#CRLF$+#CRLF$+
                     "Saler et poivrer."+#CRLF$+#CRLF$+
                     "Ajouter l'ail et le bouquet garni."+#CRLF$+#CRLF$+
                     "Fermer la cocotte minute."+#CRLF$+#CRLF$+
                     "Laisser cuire doucement 1 heure à partir de la mise en rotation de la soupape."+#CRLF$+#CRLF$+
                     "C'est encore meilleur réchauffé."
          ;FichierImage$ = #PB_Compiler_FilePath + "Images\Boeuf bourguignon.jpg"
          
          Mise_a_jour_Gadgets()
          
          ;- Boeuf bourguignon
        Case #Menu_BoeufBourguignon
          Titre$ = "Boeuf bourguignon"
          Nb_Pers = 4
          Ing(0)\Quantite = 600 : Ing(0)\Aliment = "g de boeuf"
          Ing(1)\Quantite = 200 : Ing(1)\Aliment = "g de lardons"
          Ing(2)\Quantite = 0.5 : Ing(2)\Aliment = "l de vin"
          Ing(3)\Quantite = 1   : Ing(3)\Aliment = "oignon"
          Ing(4)\Quantite = 4   : Ing(4)\Aliment = "carottes"
          Ing(5)\Quantite = 1   : Ing(5)\Aliment = "c. à soupe de farine"
          
          Recette$ = "Peler et émincer l'oignon."+#CRLF$+#CRLF$+
                     "Fariner les morceaux de viandes et les faire dorer dans la cocotte avec un filet d'huile d'olive, puis les retirer."+#CRLF$+#CRLF$+
                     "Faire revenir l'oignon, puis ajouter les lardons, les débarrasser de la cocotte et remettre les morceaux de viande à la"+#CRLF$+
                     "place."+#CRLF$+#CRLF$+
                     "Verser le vin rouge. Porter à ébullition. Ajouter de l'eau pour couvrir la viande et fermer la cocotte de son couvercle"+#CRLF$+
                     "et laisser cuire 1 heure."+#CRLF$+#CRLF$+
                     "Éplucher et couper les carottes en rondelles."+#CRLF$+#CRLF$+
                     "Mélanger la viande, ajouter les carottes, l'oignon et les lardons, et recouvrir la cocotte et laisser cuire 1h à 1h30 en"+#CRLF$+
                     "mélangeant et en ajoutant en peu d'eau"+#CRLF$+"de temps en temps."+#CRLF$+#CRLF$+
                     "Quand la viande est cuite, laisser réduire le jus, prélever un peu de sauce et ajouter une c à s de farine, et délayer,"+#CRLF$+
                     "avant de l'ajouter dans la cocotte."+#CRLF$+
                     "Cela va épaissir la sauce pour qu'elle soit onctueuse."+#CRLF$+#CRLF$+
                     "Saler et poivrer."+#CRLF$+#CRLF$+
                     "Accompagner de frites par exemple !"
          ;FichierImage$ = #PB_Compiler_FilePath + "Images\Boeuf bourguignon.jpg"
          
          Mise_a_jour_Gadgets()
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Fenetre_principale
          CloseWindow(#Fenetre_principale)
          Break
      EndSelect
  EndSelect
ForEver



Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Dois-je utiliser un tableau ou une liste

Message par TazNormand »

Salut Micoute,

Tu peux utiliser une liste dans une liste, ainsi pour un élément de la liste "mère", tu pourras ressortir un nombre différent d'ingrédient dans ta seconde liste. Tu utilises une structure dynamique, comme dans cet exemple :

Code : Tout sélectionner

Structure recette
  titre.s
  List ingredients.s()
EndStructure

NewList recettes.recette()

For i=1 To 10
  AddElement(recettes())
  recettes()\titre="Recette n."+Str(i)
  NewList recettes()\ingredients()
  For j=1 To Random(20)
    AddElement(recettes()\ingredients())
    recettes()\ingredients()="ingrédient n."+Str(j)
  Next j
Next i

ForEach(recettes())
  Debug recettes()\titre
  ForEach(recettes()\ingredients())
    Debug "==>"+recettes()\ingredients()
  Next  
Next
Image
Image
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Dois-je utiliser un tableau ou une liste

Message par MLD »

Griller par Taz
Bonjour Micoute
Perso j’utiliserai un tableau. Les ordis ont suffisamment de mémoire, et ton tableau n'est pas énorme. De plus plus je trouve l'utilisation des tableaux plus souple que les listes.
A voir ce que j'ai vu de ton logiciel, tu peux m'inviter a manger chez toi quand tu veux. :oops: Je salive comme un chien 8O Merde j'ai noyé mon clavier :lol: :lol: :wink:
PS au lieu d'utiliser des placards de string. Utilise des for next ton code sera plus court. :wink:
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Dois-je utiliser un tableau ou une liste

Message par TazNormand »

Allez histoire de "complexifier" un peu, une liste d'une certaine structure, contenant une liste d'une autre structure :

Code : Tout sélectionner

Structure ingredient
  ingNom.s
  ingQte.f
EndStructure

Structure recette
  titre.s
  List ingredients.ingredient()
EndStructure

NewList recettes.recette()

For i=1 To 10
  AddElement(recettes())
  recettes()\titre="Recette n."+Str(i)
  NewList recettes()\ingredients()
  For j=1 To Random(20)
    AddElement(recettes()\ingredients())
    recettes()\ingredients()\ingNom="ingrédient n."+Str(j)
    recettes()\ingredients()\ingQte=Random(99,1)
  Next j
Next i

ForEach(recettes())
  Debug recettes()\titre
  ForEach(recettes()\ingredients())
    Debug "==>"+recettes()\ingredients()\ingNom
    Debug "====>"+recettes()\ingredients()\ingQte
  Next  
Next
Image
Image
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Dois-je utiliser un tableau ou une liste

Message par Micoute »

Merci beaucoup TazNormand, je suis bluffé par tes deux exemples je les mets en pratique immédiatement.

@MLD, oui je sais que les ordis actuels ont beaucoup de mémoire, mais il y a tellement d'applis en route qu'il vaut mieux ne pas trop les déranger. De toutes manières, je vais faire les deux types de programmes un avec les tableaux et un avec les listes et je verrai quel exécutable sera le plus court.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Dois-je utiliser un tableau ou une liste

Message par falsam »

Micoute a écrit :je vais faire les deux types de programmes un avec les tableaux et un avec les listes et je verrai quel exécutable sera le plus court.
Bien sur que les plus courtes sont souvent les meilleurs, mais dans ton cas c'est les fonctionnalités des listes qui sont les plus importantes.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Dois-je utiliser un tableau ou une liste

Message par Ar-S »

Je rejoins les amis de la liste.
En simplifiant avec quelques Macros.

Code : Tout sélectionner

Structure ingredient
  ingNom.s
  ingQte.s
EndStructure

Macro AddRecette(nom_recette)
  Global NewList nom_recette.ingredient()
EndMacro

Macro AddIngred(nom_recette,nom_ingredient,qte)
  AddElement(nom_recette.ingredient())
  nom_recette.ingredient()\ingNom = nom_ingredient
  nom_recette.ingredient()\ingQte = qte
EndMacro

Macro AfficheRecette(nomrecette)
  ForEach nomrecette()
    Debug nomrecette.ingredient()\ingNom + " : " + Crepe.ingredient()\ingQte
  Next
EndMacro


;// LE PROGRAMME

;Nouvelle recette
AddRecette(crepe)
; les ingredients
AddIngred (crepe,"oeuf","3")
AddIngred (crepe,"farine","250g")
AddIngred (crepe,"lait","1/2L")
;etc

; Affichage
AfficheRecette(crepe)

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Dois-je utiliser un tableau ou une liste

Message par MLD »

Mon prof d'informatique m'avais pourtant bien dit qu'il ne fallais pas mélanger les choux et les chats, mais.. tout fou le camp :roll:
Si tu limite les ingrédiens a 20 ton tableau sera toujours plein , et pareil pour les légumes viandes ect. Ala fin il te reste a faire un choix dans les tableaux et tu ajoute les quantités,
ensuite tu fait ta sauce :lol:
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Dois-je utiliser un tableau ou une liste

Message par MLD »

@Ar-S
Pour moi le Breton des crèpes sans rhum, ce n'est pas des crèpes. 8O :lol:
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Dois-je utiliser un tableau ou une liste

Message par TazNormand »

L'avantage des listes par rapport au tableaux, c'est justement d'outrepasser les limites du tableau. Si tu veux mettre plus de 20 ingrédients, pas de soucis, et si tu ne veux en mettre que 5, et bien on économise de la place.

@MLD : ce n'est pas du mélange choux-chat-carottes, il faut le voir comme les tiroirs d'une commode (= recettes), dans un premier tiroir, rien ne t'empêche d'avoir des chaussettes, des slips, et une boite avec des ceintures (= ingrédients), et dans un second tiroir, tu as des t-shirts et une boite à bijoux contenant donc les bijoux.

On peut même pousser le "vice" en ajoutant une liste dans la structure ingrédients dans le cas où l'ingrédient est lui aussi une recette, genre une crème pâtissière pour une recette de charlotte aux fruits.

Recette : Charlotte à l'ananas
==> Ingrédients
====> Ananas
====> Biscuit Cuiller
====> Crème pâtissière
=======> Oeufs
=======> etc...

Le plus simple étant de mettre un "lien/pointeur" vers la recette de la crème pâtissière, et pas de remettre à chaque fois les ingrédients pour x recette de charlotte aux fruits.

Le tout est de bien penser l'architecture des données à stocker ===> Base de données obligatoire à mon avis, et donc Diagramme Conceptuel des Données

bon, pour un projet comme celui de Micoute, le diagramme c'est peut-être un peu beaucoup, mais si la structure des données et les différents liens entre les éléments sont bien réfléchis, après ça roule tout seul.
Image
Image
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Dois-je utiliser un tableau ou une liste

Message par Ar-S »

MLD a écrit :@Ar-S
Pour moi le Breton des crèpes sans rhum, ce n'est pas des crèpes. 8O :lol:
Le Rhum pour moi jamais en pâtisserie, je trouve ça dégueulasse :D
Par contre en ti'punch ou un "BigBoss (à gauche)" comme j'en ai bu à Maurice, je crache pas dessus :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Dois-je utiliser un tableau ou une liste

Message par MLD »

@Ar-S
je suis un peu d’accord avec toi, mais cela dépend de la qualité du rhum. Un petit rhum des iles humm.
@Taz
Pour remplir la liste ou le tableau, il faut bien partir des éléments (ingrédients) stoker sur le disque donc le Dim sera fonction du nombre d'éléments stoker.
A moins que Micoute veuille coder en dur dans le programme une fois pour toute les ingrédients,et les recettes. :?:
Ceci fait un programme long et limite le nombre d'ingrédients et de recettes
c'est a lui de voir. Je suppose que ses filles ont un ordi avec un disque dur :roll: :D
Quant a la différence de choix liste/tableau. Perso je trouve plus souple les tableaux, mais avant choisir l'un ou l'autre il faut faire une bonne analyse du résultat final que l'on souhaite obtenir.Il ne faut oublier avec les tableaux que Redim existe, et que les tableaux peuvent être a plusieurs dimensions
Pour entrer les recettes ou pour les lires ,il existe la possibilité d'utiliser un String multi ligne.

Code : Tout sélectionner

;  StringGadget Multiligne... 
; 
Procedure OpenWindow_Window_0() 
  If OpenWindow(0, 458, 203, 230, 175, "#Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)  
      Const=#ES_MULTILINE|#ESB_DISABLE_LEFT|#ESB_DISABLE_RIGHT |#ES_AUTOVSCROLL|#WS_VSCROLL|#WS_HSCROLL ;ou sans le scroll
      ;Const=#ES_MULTILINE|#ESB_DISABLE_LEFT|#ESB_DISABLE_RIGHT
      StringGadget(1, 5, 5, 200, 150,"",Const) 
    EndIf  
EndProcedure 

OpenWindow_Window_0() 

Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
Courage Micoute Amuse toi bien :D :D
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Dois-je utiliser un tableau ou une liste

Message par Zorro »

Perso j'utilise sans problemes les deux
tableaux ou liste chainée Structurées :)

pour classer des elements identifiable, faut reconnaitre que les Structures c'est
vraiment un super confort

apres qu'elles soient "tableautisée" ou "listisée" c'est une question de choix
effectivement, Redim permet d'agrandir un tableau... mais pour moi ça reste quand meme de la bidouille
ça marche, certes, mais seulement sur tableau a une dimension ...
sinon on peut aussi detruire le tableau et le refaire a partir de zero ...

les listes chainée elles sont carrement faites pour ça !

dans ma tete, je me trompe peut etre mais un tableau c'est une table de multiplication
alors qu'une liste chainée, c'est une liste des courses a faire (ou un pile...ref a l'assembleur )

bref un element a ajouter? on le colle dans la liste , et c'est sans limite (hormis la Ram bien sur, ou le bord du papier...(sauf rouleau de PQ ) )
ensuite parcourir la list oblige a "lire" tous les elements précedent la donnée qu'on veux
mais il parait que c'est quand meme tres tres rapide (et c'est vrais ) :)

le tableau lui permet un saut direct a la case , a condition qu'on sache que la donnée cherché est dans cette case ... :roll: là cest deja moins evident

bref, j'adore les tableaux , mais pour ce genre de code, j'emploierai aussi, les listes+Structure ... :)

pour la base de données, le seul intérêt , et je dis bien le Seul interet d'une base de données pour un prg
c'est de pouvoir effectuer une recherche par critères ....

sinon l'ecriture dans un fichier "CreatePreferences()" permet un certains classement

ou mieux le Json, est étudié pour la sauvegarde de Tableaux ou listes.... ça tombe bien
c'est je pense plus léger a mettre en oeuvre qu'une base de données ...
mais je me trompe peut etre :)
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Dois-je utiliser un tableau ou une liste

Message par Micoute »

Merci à tous pour vos conseils attentionnés.

Voici le mode que j'ai choisi, on peut taper soi-même les recettes qui son sont sauvegardées dans un fichier JSON.

Le seul problème, parce qu'il y en a, ce sont les entrées prévues pour 20 ingrédients qui ne sont pas utilisée, car leur valeur est sauvegardées comme une chaîne vide et une valeur égale à 0.

Peut être il y a-t-il une solution ?

Code : Tout sélectionner

;Formulaire recettes de cuisine

Enumeration
  #Fenetre_principale
EndEnumeration

Enumeration
  #FichierJSON
EndEnumeration  

Enumeration
  #Txt_Recette_pour
  #Str_Recette_pour
  #Txt_Signature
  #Liste
  #Str_Titre
  #Edt
  #Ctn_Ingredients
  #Str_Qt_0
  #Str_Al_0
  #Str_Qt_1
  #Str_Al_1
  #Str_Qt_2
  #Str_Al_2
  #Str_Qt_3
  #Str_Al_3
  #Str_Qt_4
  #Str_Al_4
  #Str_Qt_5
  #Str_Al_5
  #Str_Qt_6
  #Str_Al_6
  #Str_Qt_7
  #Str_Al_7
  #Str_Qt_8
  #Str_Al_8
  #Str_Qt_9
  #Str_Al_9
  #Str_Qt_10
  #Str_Al_10
  #Str_Qt_11
  #Str_Al_11
  #Str_Qt_12
  #Str_Al_12
  #Str_Qt_13
  #Str_Al_13
  #Str_Qt_14
  #Str_Al_14
  #Str_Qt_15
  #Str_Al_15
  #Str_Qt_16
  #Str_Al_16
  #Str_Qt_17
  #Str_Al_17
  #Str_Qt_18
  #Str_Al_18
  #Str_Qt_19
  #Str_Al_19
  
  #Btn_Nouveau
  #Btn_Maj
  #Btn_Supprimer
EndEnumeration

Enumeration Polices
  #Police_1
  #Police_2
EndEnumeration

Structure Recette
  Nom.s
  Quantite.f[20]
  Aliment.s[20]
  Preparation.s
  Nb_Pers.i
EndStructure

Global NewList Recette.Recette(), Evenement, Nb_Pers, Fichier_Recettes.s = #PB_Compiler_FilePath + "Donnees\Recettes.JSON"

LoadFont(#Police_1, "Arial", 12, #PB_Font_Bold)
LoadFont(#Police_2, "Arial", 25, #PB_Font_Bold)

SetGadgetFont(#PB_Default, FontID(#Police_1))

Declare Ouvrir_Fenetre_principale()
Declare Charger_Recettes()
Declare GestionEvenements()
Declare NouvelleRecette()
Declare SelectionRecette()
Declare SupprimerRecette()
Declare MajRecettes()
Declare SauvegarderRecette()

Ouvrir_Fenetre_principale()

Procedure Ouvrir_Fenetre_principale()
  If OpenWindow(#Fenetre_principale, 375, 0, 1390, 820, "Recette de cuisine par Micoute", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    SetWindowColor(#Fenetre_principale, $78F688)
    StringGadget(#Str_Recette_pour, 10, 10, 170, 30, "Recette pour ", #ES_RIGHT)
    StringGadget(#Txt_Recette_pour, 190, 10, 30, 30, "", #PB_Text_Center|#SS_CENTERIMAGE)
    
    ButtonGadget(#Btn_Nouveau, 10, 50, 170, 30, "Nouveau")
    ButtonGadget(#Btn_Maj, 10, 85, 170, 30, "Maj")
    ButtonGadget(#Btn_Supprimer, 10, 120, 170, 30, "Supprimer")
    
    ListIconGadget(#Liste, 230, 10, 1150, 140, "Titre", 575, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    SendMessage_(GadgetID(#Liste), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
    StringGadget(#Str_Titre, 700, 160, 680, 30, "", #ES_CENTER)
    EditorGadget(#Edt, 10, 200, 1370, 215)
    ContainerGadget(#Ctn_Ingredients, 50, 420, 1290, 350)
    StringGadget(#Str_Qt_0, 0, 0, 70, 30, "")
    StringGadget(#Str_Al_0, 80, 0, 560, 30, "")
    StringGadget(#Str_Qt_1, 0, 35, 70, 30, "")
    StringGadget(#Str_Al_1, 80, 35, 560, 30, "")
    StringGadget(#Str_Qt_2, 0, 70, 70, 30, "")
    StringGadget(#Str_Al_2, 80, 70, 560, 30, "")
    StringGadget(#Str_Qt_3, 0, 105, 70, 30, "")
    StringGadget(#Str_Al_3, 80, 105, 560, 30, "")
    StringGadget(#Str_Qt_4, 0, 140, 70, 30, "")
    StringGadget(#Str_Al_4, 80, 140, 560, 30, "")
    StringGadget(#Str_Qt_5, 0, 175, 70, 30, "")
    StringGadget(#Str_Al_5, 80, 175, 560, 30, "")
    StringGadget(#Str_Qt_6, 0, 210, 70, 30, "")
    StringGadget(#Str_Al_6, 80, 210, 560, 30, "")
    StringGadget(#Str_Qt_7, 0, 245, 70, 30, "")
    StringGadget(#Str_Al_7, 80, 245, 560, 30, "")
    StringGadget(#Str_Qt_8, 0, 280, 70, 30, "")
    StringGadget(#Str_Al_8, 80, 280, 560, 30, "")
    StringGadget(#Str_Qt_9, 0, 315, 70, 30, "")
    StringGadget(#Str_Al_9, 80, 315, 560, 30, "")
    StringGadget(#Str_Qt_10, 650, 0, 70, 30, "")
    StringGadget(#Str_Al_10, 730, 0, 560, 30, "")
    StringGadget(#Str_Qt_11, 650, 35, 70, 30, "")
    StringGadget(#Str_Al_11, 730, 35, 560, 30, "")
    StringGadget(#Str_Qt_12, 650, 70, 70, 30, "")
    StringGadget(#Str_Al_12, 730, 70, 560, 30, "")
    StringGadget(#Str_Qt_13, 650, 105, 70, 30, "")
    StringGadget(#Str_Al_13, 730, 105, 560, 30, "")
    StringGadget(#Str_Qt_14, 650, 140, 70, 30, "")
    StringGadget(#Str_Al_14, 730, 140, 560, 30, "")
    StringGadget(#Str_Qt_15, 650, 175, 70, 30, "")
    StringGadget(#Str_Al_15, 730, 175, 560, 30, "")
    StringGadget(#Str_Qt_16, 650, 210, 70, 30, "")
    StringGadget(#Str_Al_16, 730, 210, 560, 30, "")
    StringGadget(#Str_Qt_17, 650, 245, 70, 30, "")
    StringGadget(#Str_Al_17, 730, 245, 560, 30, "")
    StringGadget(#Str_Qt_18, 650, 280, 70, 30, "")
    StringGadget(#Str_Al_18, 730, 280, 560, 30, "")
    StringGadget(#Str_Qt_19, 650, 315, 70, 30, "")
    StringGadget(#Str_Al_19, 730, 315, 560, 30, "")
    CloseGadgetList()
    
    SetGadgetColor(#Ctn_Ingredients, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_principale))
    
    TextGadget(#Txt_Signature, 10, 780, 1370, 30, "Recettes de cuisines par Micoute © 2017", #PB_Text_Center|#SS_CENTERIMAGE)
    
    ;Contrôle de la saisie (le titre de la recette est obligatoire)
    BindGadgetEvent(#Str_Titre, @GestionEvenements())
    
    ;Nouvelle recette
    BindGadgetEvent(#Btn_Nouveau, @NouvelleRecette())
    
    ;Une recette est sélectionnée dans la liste
    BindGadgetEvent(#Liste, @SelectionRecette())
    
    ;Ajout ou modification d'une recette
    BindGadgetEvent(#Btn_Maj, @MajRecettes())
    
    ;Suppression d'une recette
    BindGadgetEvent(#Btn_Supprimer, @SupprimerRecette())
    
    ;Fermeture de l'appliocation et sauvegarde automatique des recettes
    BindEvent(#PB_Event_CloseWindow, @SauvegarderRecette())
    
    ;Chargement des recettes
    Charger_Recettes()
    
    ;L'application est prête pour la saisie d'une recette
    NouvelleRecette()
    
    Repeat
    Until WaitWindowEvent(10) = #PB_Event_CloseWindow  
  EndIf
EndProcedure

Procedure Charger_Recettes()
  If ReadFile(#FichierJSON, Fichier_Recettes)
    CloseFile(#FichierJSON)
    
    LoadJSON(#FichierJSON, Fichier_Recettes, #PB_JSON_NoCase)
    
    ExtractJSONList(JSONValue(#FichierJSON), Recette())
    
    ForEach Recette()
      With Recette()
        AddGadgetItem(#Liste, -1, \Nom)
        SetGadgetItemData(#Liste, CountGadgetItems(#Liste) - 1, ListIndex(Recette()))
      EndWith
    Next
  EndIf  
EndProcedure

Procedure GestionEvenements()
  Protected Evenement = EventType()
  
  Select Evenement
    Case #PB_EventType_Change
      If Trim(GetGadgetText(#Str_Titre)) <> ""
        DisableGadget(#Btn_Nouveau, #False)
        DisableGadget(#Btn_Maj, #False)
      Else
        DisableGadget(#Btn_Nouveau, #True)
        DisableGadget(#Btn_Maj, #True)
      EndIf
  EndSelect    
EndProcedure

Procedure NouvelleRecette()
  SetWindowData(#Fenetre_principale, 0) ; Création d'une recette
  
  SetGadgetText(#Str_Titre, "")
  SetGadgetText(#Edt, "")
  SetGadgetText(#Txt_Recette_pour, "")
  SetGadgetText(#Str_Qt_0, "")
  SetGadgetText(#Str_Qt_1, "")
  SetGadgetText(#Str_Qt_2, "")
  SetGadgetText(#Str_Qt_3, "")
  SetGadgetText(#Str_Qt_4, "")
  SetGadgetText(#Str_Qt_5, "")
  SetGadgetText(#Str_Qt_6, "")
  SetGadgetText(#Str_Qt_7, "")
  SetGadgetText(#Str_Qt_8, "")
  SetGadgetText(#Str_Qt_9, "")
  SetGadgetText(#Str_Qt_10, "")
  SetGadgetText(#Str_Qt_11, "")
  SetGadgetText(#Str_Qt_12, "")
  SetGadgetText(#Str_Qt_13, "")
  SetGadgetText(#Str_Qt_14, "")
  SetGadgetText(#Str_Qt_15, "")
  SetGadgetText(#Str_Qt_16, "")
  SetGadgetText(#Str_Qt_17, "")
  SetGadgetText(#Str_Qt_18, "")
  SetGadgetText(#Str_Qt_19, "")
  SetGadgetText(#Str_Al_0, "")
  SetGadgetText(#Str_Al_1, "")
  SetGadgetText(#Str_Al_2, "")
  SetGadgetText(#Str_Al_3, "")
  SetGadgetText(#Str_Al_4, "")
  SetGadgetText(#Str_Al_5, "")
  SetGadgetText(#Str_Al_6, "")
  SetGadgetText(#Str_Al_7, "")
  SetGadgetText(#Str_Al_8, "")
  SetGadgetText(#Str_Al_9, "")
  SetGadgetText(#Str_Al_10, "")
  SetGadgetText(#Str_Al_11, "")
  SetGadgetText(#Str_Al_12, "")
  SetGadgetText(#Str_Al_13, "")
  SetGadgetText(#Str_Al_14, "")
  SetGadgetText(#Str_Al_15, "")
  SetGadgetText(#Str_Al_16, "")
  SetGadgetText(#Str_Al_17, "")
  SetGadgetText(#Str_Al_18, "")
  SetGadgetText(#Str_Al_19, "")
  
  DisableGadget(#Btn_Nouveau, #True)
  DisableGadget(#Btn_Maj, #True)
  DisableGadget(#Btn_Supprimer, #True)
  
  SetGadgetText(#Btn_Maj, "Ajouter")
  SetActiveGadget(#Str_Titre)
EndProcedure

Procedure SelectionRecette()
  Protected item = GetGadgetState(#Liste)
  
  If item <> -1
    SelectElement(Recette(), GetGadgetItemData(#Liste, item))
    With Recette()
      SetGadgetText(#Str_Titre, \Nom)
      SetGadgetText(#Edt, \Preparation)
      SetGadgetText(#Txt_Recette_pour, Str(\Nb_Pers))
      SetGadgetText(#Str_Qt_0, StrF(\Quantite[0]))
      SetGadgetText(#Str_Qt_1,StrF( \Quantite[1]))
      SetGadgetText(#Str_Qt_2, StrF(\Quantite[2]))
      SetGadgetText(#Str_Qt_3, StrF(\Quantite[3]))
      SetGadgetText(#Str_Qt_4, StrF(\Quantite[4]))
      SetGadgetText(#Str_Qt_5, StrF(\Quantite[5]))
      SetGadgetText(#Str_Qt_6, StrF(\Quantite[6]))
      SetGadgetText(#Str_Qt_7, StrF(\Quantite[7]))
      SetGadgetText(#Str_Qt_8, StrF(\Quantite[8]))
      SetGadgetText(#Str_Qt_9, StrF(\Quantite[9]))
      SetGadgetText(#Str_Qt_10, StrF(\Quantite[10]))
      SetGadgetText(#Str_Qt_11, StrF(\Quantite[11]))
      SetGadgetText(#Str_Qt_12, StrF(\Quantite[12]))
      SetGadgetText(#Str_Qt_13, StrF(\Quantite[13]))
      SetGadgetText(#Str_Qt_14, StrF(\Quantite[14]))
      SetGadgetText(#Str_Qt_15, StrF(\Quantite[15]))
      SetGadgetText(#Str_Qt_16, StrF(\Quantite[16]))
      SetGadgetText(#Str_Qt_17, StrF(\Quantite[17]))
      SetGadgetText(#Str_Qt_18, StrF(\Quantite[18]))
      SetGadgetText(#Str_Qt_19, StrF(\Quantite[19]))
      SetGadgetText(#Str_Al_0, \Aliment[0])
      SetGadgetText(#Str_Al_1, \Aliment[1])
      SetGadgetText(#Str_Al_2, \Aliment[2])
      SetGadgetText(#Str_Al_3, \Aliment[3])
      SetGadgetText(#Str_Al_4, \Aliment[4])
      SetGadgetText(#Str_Al_5, \Aliment[5])
      SetGadgetText(#Str_Al_6, \Aliment[6])
      SetGadgetText(#Str_Al_7, \Aliment[7])
      SetGadgetText(#Str_Al_8, \Aliment[8])
      SetGadgetText(#Str_Al_9, \Aliment[9])
      SetGadgetText(#Str_Al_10, \Aliment[10])
      SetGadgetText(#Str_Al_11, \Aliment[11])
      SetGadgetText(#Str_Al_12, \Aliment[12])
      SetGadgetText(#Str_Al_13, \Aliment[13])
      SetGadgetText(#Str_Al_14, \Aliment[14])
      SetGadgetText(#Str_Al_15, \Aliment[15])
      SetGadgetText(#Str_Al_16, \Aliment[16])
      SetGadgetText(#Str_Al_17, \Aliment[17])
      SetGadgetText(#Str_Al_18, \Aliment[18])
      SetGadgetText(#Str_Al_19, \Aliment[19])
    EndWith
  EndIf
  
  SetWindowData(#Fenetre_principale, 1) ; modification d'une recette
  
  DisableGadget(#Btn_Nouveau, #False)
  DisableGadget(#Btn_Maj, #False)
  DisableGadget(#Btn_Supprimer, #False)
  
  SetGadgetText(#Btn_Maj, "Modifier")
  SetActiveGadget(#Str_Titre)
EndProcedure

Procedure SupprimerRecette()
  If MessageRequester("Information", "Êtes-vous sûr de vouloir supprimer cette recette ?" + #CRLF$ +
                                     "Cette action est irrémédiable !", #PB_MessageRequester_Yes|#PB_MessageRequester_Warning) = #PB_MessageRequester_Yes
    SetWindowData(#Fenetre_principale, 3) ; Suppression d'une recette
    MajRecettes()
  EndIf  
EndProcedure

Procedure MajRecettes()
  Protected Nom.s = GetGadgetText(#Str_Titre)
  Protected Preparation.s = GetGadgetText(#Edt)
  Protected Nb_Pers = Val(GetGadgetText(#Txt_Recette_pour))
  Protected Qt_0.f = ValF(GetGadgetText(#Str_Qt_0))
  Protected Qt_1.f = ValF(GetGadgetText(#Str_Qt_1))
  Protected Qt_2.f = ValF(GetGadgetText(#Str_Qt_2))
  Protected Qt_3.f = ValF(GetGadgetText(#Str_Qt_3))
  Protected Qt_4.f = ValF(GetGadgetText(#Str_Qt_4))
  Protected Qt_5.f = ValF(GetGadgetText(#Str_Qt_5))
  Protected Qt_6.f = ValF(GetGadgetText(#Str_Qt_6))
  Protected Qt_7.f = ValF(GetGadgetText(#Str_Qt_7))
  Protected Qt_8.f = ValF(GetGadgetText(#Str_Qt_8))
  Protected Qt_9.f = ValF(GetGadgetText(#Str_Qt_8))
  Protected Qt_10.f = ValF(GetGadgetText(#Str_Qt_10))
  Protected Qt_11.f = ValF(GetGadgetText(#Str_Qt_11))
  Protected Qt_12.f = ValF(GetGadgetText(#Str_Qt_12))
  Protected Qt_13.f = ValF(GetGadgetText(#Str_Qt_13))
  Protected Qt_14.f = ValF(GetGadgetText(#Str_Qt_14))
  Protected Qt_15.f = ValF(GetGadgetText(#Str_Qt_15))
  Protected Qt_16.f = ValF(GetGadgetText(#Str_Qt_16))
  Protected Qt_17.f = ValF(GetGadgetText(#Str_Qt_17))
  Protected Qt_18.f = ValF(GetGadgetText(#Str_Qt_18))
  Protected Qt_19.f = ValF(GetGadgetText(#Str_Qt_19))
  Protected Al_0.s = GetGadgetText(#Str_Al_0)
  Protected Al_1.s = GetGadgetText(#Str_Al_1)
  Protected Al_2.s = GetGadgetText(#Str_Al_2)
  Protected Al_3.s = GetGadgetText(#Str_Al_3)
  Protected Al_4.s = GetGadgetText(#Str_Al_4)
  Protected Al_5.s = GetGadgetText(#Str_Al_5)
  Protected Al_6.s = GetGadgetText(#Str_Al_6)
  Protected Al_7.s = GetGadgetText(#Str_Al_7)
  Protected Al_8.s = GetGadgetText(#Str_Al_8)
  Protected Al_9.s = GetGadgetText(#Str_Al_9)
  Protected Al_10.s = GetGadgetText(#Str_Al_10)
  Protected Al_11.s = GetGadgetText(#Str_Al_11)
  Protected Al_12.s = GetGadgetText(#Str_Al_12)
  Protected Al_13.s = GetGadgetText(#Str_Al_13)
  Protected Al_14.s = GetGadgetText(#Str_Al_14)
  Protected Al_15.s = GetGadgetText(#Str_Al_15)
  Protected Al_16.s = GetGadgetText(#Str_Al_16)
  Protected Al_17.s = GetGadgetText(#Str_Al_17)
  Protected Al_18.s = GetGadgetText(#Str_Al_18)
  Protected Al_19.s = GetGadgetText(#Str_Al_19)
  
  Select GetWindowData(#Fenetre_principale)
    Case 0 ; Création d'une recette
      AddElement(Recette())
      With Recette()
        \Nom = Nom
        \Preparation = Preparation
        \Nb_Pers = Nb_Pers
        \Quantite[0] = Qt_0
        \Quantite[1] = Qt_1
        \Quantite[2] = Qt_2
        \Quantite[3] = Qt_3
        \Quantite[4] = Qt_4
        \Quantite[5] = Qt_5
        \Quantite[6] = Qt_6
        \Quantite[7] = Qt_7
        \Quantite[8] = Qt_8
        \Quantite[9] = Qt_9
        \Quantite[10] = Qt_10
        \Quantite[11] = Qt_11
        \Quantite[12] = Qt_12
        \Quantite[13] = Qt_13
        \Quantite[14] = Qt_14
        \Quantite[15] = Qt_15
        \Quantite[16] = Qt_16
        \Quantite[17] = Qt_17
        \Quantite[18] = Qt_18
        \Quantite[19] = Qt_19
        \Aliment[0] = Al_0
        \Aliment[1] = Al_1
        \Aliment[2] = Al_2
        \Aliment[3] = Al_3
        \Aliment[4] = Al_4
        \Aliment[5] = Al_5
        \Aliment[6] = Al_6
        \Aliment[7] = Al_7
        \Aliment[8] = Al_8
        \Aliment[9] = Al_9
        \Aliment[10] = Al_10
        \Aliment[11] = Al_11
        \Aliment[12] = Al_12
        \Aliment[13] = Al_13
        \Aliment[14] = Al_14
        \Aliment[15] = Al_15
        \Aliment[16] = Al_16
        \Aliment[17] = Al_17
        \Aliment[18] = Al_18
        \Aliment[19] = Al_19
        
        AddGadgetItem(#Liste, -1, \Nom)
        SetGadgetItemData(#Liste, CountGadgetItems(#Liste) - 1, ListIndex(Recette()))
      EndWith
      
    Case 1 ; Modification d'une recette
      With Recette()
        \Nom = Nom
        \Preparation = Preparation
        \Nb_Pers = Nb_Pers
        \Quantite[0] = Qt_0
        \Quantite[1] = Qt_1
        \Quantite[2] = Qt_2
        \Quantite[3] = Qt_3
        \Quantite[4] = Qt_4
        \Quantite[5] = Qt_5
        \Quantite[6] = Qt_6
        \Quantite[7] = Qt_7
        \Quantite[8] = Qt_8
        \Quantite[9] = Qt_9
        \Quantite[10] = Qt_10
        \Quantite[11] = Qt_11
        \Quantite[12] = Qt_12
        \Quantite[13] = Qt_13
        \Quantite[14] = Qt_14
        \Quantite[15] = Qt_15
        \Quantite[16] = Qt_16
        \Quantite[17] = Qt_17
        \Quantite[18] = Qt_18
        \Quantite[19] = Qt_19
        \Aliment[0] = Al_0
        \Aliment[1] = Al_1
        \Aliment[2] = Al_2
        \Aliment[3] = Al_3
        \Aliment[4] = Al_4
        \Aliment[5] = Al_5
        \Aliment[6] = Al_6
        \Aliment[7] = Al_7
        \Aliment[8] = Al_8
        \Aliment[9] = Al_9
        \Aliment[10] = Al_10
        \Aliment[11] = Al_11
        \Aliment[12] = Al_12
        \Aliment[13] = Al_13
        \Aliment[14] = Al_14
        \Aliment[15] = Al_15
        \Aliment[16] = Al_16
        \Aliment[17] = Al_17
        \Aliment[18] = Al_18
        \Aliment[19] = Al_19
        SetGadgetItemText(#Liste, ListIndex(Recette()), \Nom, 0)
      EndWith
      NouvelleRecette()
      
    Case 3 ; Suppression d'une recette
      RemoveGadgetItem(#Liste, ListIndex(Recette()))
      DeleteElement(Recette())
      
      ;Mise à jour des index de liaison entre le listicon et la liste de recettes
      ForEach Recette()
        SetGadgetItemData(#Liste, ListIndex(Recette()), ListIndex(Recette()))
      Next
  EndSelect  
EndProcedure

Procedure SauvegarderRecette()
  CreateJSON(#FichierJSON)
  
  InsertJSONList(JSONValue(#FichierJSON), Recette())
  SaveJSON(#FichierJSON, Fichier_Recettes, #PB_JSON_PrettyPrint)
EndProcedure
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Dois-je utiliser un tableau ou une liste

Message par falsam »

Le seul problème, parce qu'il y en a, ce sont les entrées prévues pour 20 ingrédients qui ne sont pas utilisée, car leur valeur est sauvegardées comme une chaîne vide et une valeur égale à 0.

Peut être il y a-t-il une solution ?
Oui ne pas les sauvegarder. !

Comment on sauvegarde une recette ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre