Page 1 sur 1

[Résolu] Comment envoyer une liste en paramètre

Publié : lun. 24/juin/2019 9:45
par Micoute
Bonjour à tous,

pour un programme et pour éviter de toujours retaper les mêmes paramètres pour toutes mes listes, j'ai besoin d'envoyer le nom de la liste à une procédure.

Je pense que j'ai sûrement fait ce genre de chose, mais là je cale lamentablement et je ne retrouve pas de programme pour m'inspirer, alors je viens vers vous pour solliciter votre aide bienveillante et je vous en remercie par anticipation.

Re: Comment envoyer une liste en paramètre

Publié : lun. 24/juin/2019 10:10
par Christophe
Bonjour Micoute,
je ne sais pas si c'est ce que tu veux...

Code : Tout sélectionner

Global NewList Liste()

Procedure Affiche(List Nom())
  ForEach Nom()
    Debug Nom()
  Next
EndProcedure

For x = 0 To 100
  AddElement(liste())
  liste() = x
Next

Affiche(Liste())

Re: Comment envoyer une liste en paramètre

Publié : lun. 24/juin/2019 10:42
par Micoute
Merci beaucoup Christophe, mais ma procédure étant plus élaborée, j'ai droit au message "La liste ne correspond pas au paramètre de la procédure", pourtant je pense ne rien avoir oublié.

Code : Tout sélectionner

Declare Mettre_a_jour_Liste(List Nom(), Id)

Procedure Alimentaire()
  Cacher_Liste()
  HideGadget(#Lst_Alimentaire, #False)
  
  ForEach Lst_Produits()
    If Lst_Produits()\Magasin = "Alimentaire"
      Mettre_a_jour_Liste(Lst_Alimentaire(), #Lst_Alimentaire)
    EndIf
  Next  
  
  ComboBoxGadget(#Cmb_Ali, 135, 340, 405, 20, #PB_ComboBox_Editable)
  AddGadgetItem(#Cmb_Ali, 0, "Basique")
  AddGadgetItem(#Cmb_Ali, 1, "Boissons")
  AddGadgetItem(#Cmb_Ali, 2, "Charcuterie")
  AddGadgetItem(#Cmb_Ali, 3, "Condiments")
  AddGadgetItem(#Cmb_Ali, 4, "Conserves")
  AddGadgetItem(#Cmb_Ali, 5, "Cuisine")
  AddGadgetItem(#Cmb_Ali, 6, "Desserts")
  AddGadgetItem(#Cmb_Ali, 7, "Fromages")
  AddGadgetItem(#Cmb_Ali, 8, "Fruits et légumes")
  AddGadgetItem(#Cmb_Ali, 9, "Grignotage")
  AddGadgetItem(#Cmb_Ali, 10, "Petit déjeuner")
  AddGadgetItem(#Cmb_Ali, 11, "Poissons")
  AddGadgetItem(#Cmb_Ali, 12, "(Surgelés) Glaces et desserts")
  AddGadgetItem(#Cmb_Ali, 13, "(Surgelés) Légumes et plats cuisinés")
  AddGadgetItem(#Cmb_Ali, 14, "(Surgelés) Poissons et viandes")
  AddGadgetItem(#Cmb_Ali, 15, "Traiteur")
  AddGadgetItem(#Cmb_Ali, 16, "Viandes")
  AddGadgetItem(#Cmb_Ali, 17, "Volailles")
  
  SetGadgetState(#Cmb_Ali, 0)
EndProcedure

;Ajuster la liste affichée selon le magasin choisi
Procedure Mettre_a_jour_Liste(List Nom(), Id)
  AddElement(Nom())
  With Nom()
    \Magasin = Lst_Produits()\Magasin
    \Rayon   = Lst_Produits()\Rayon
    \Produit = Lst_Produits()\Produit
    AddGadgetItem(Id, -1, \Magasin + #LF$ + \Rayon + #LF$ + \Produit)
    SetGadgetItemData(Id, CountGadgetItems(Id)-1, ListIndex(Nom()))
  EndWith
EndProcedure

Re: Comment envoyer une liste en paramètre

Publié : lun. 24/juin/2019 11:06
par G-Rom

Code : Tout sélectionner

Procedure AfficheListe(List param.s())
  ForEach param()
    Debug param()    
  Next
EndProcedure



NewList test.s()
AddElement(test()) : test() = "foo"
AfficheListe(test())


Structure MaStructure
  nom.s  
EndStructure

NewList test2.MaStructure()
AddElement(test2()) : test2()\nom = "foo"
AfficheListe(test())


Procedure AfficheListeStructure(List param.MaStructure())
  ForEach param()
    Debug param()\nom    
  Next
EndProcedure

Re: Comment envoyer une liste en paramètre

Publié : lun. 24/juin/2019 11:56
par Christophe
Re Micoute
Remplace :Declare Mettre_a_jour_Liste(List Nom(), Id) par Declare Mettre_a_jour_Liste(List Nom.NomDeTaStructure(), Id)

Mettre_a_jour_Liste(Lst_Alimentaire(), #Lst_Alimentaire) par Mettre_a_jour_Liste(Lst_Alimentaire.NomDeTaStructure(), #Lst_Alimentaire)

Procedure Mettre_a_jour_Liste(List Nom(), Id) par Procedure Mettre_a_jour_Liste(List Nom.NomDeTaStructure(), Id)

Re: Comment envoyer une liste en paramètre

Publié : lun. 24/juin/2019 14:24
par Micoute
Merci beaucoup pour cette aide qui m'a libéré d'un gros fardeau.

Re: [Résolu] Comment envoyer une liste en paramètre

Publié : mer. 26/juin/2019 9:30
par microdevweb
Bonjour Micoute,

Voici également une solution pour les flags (vrai ou faux) avec des masques logiques

Code : Tout sélectionner

EnumerationBinary 
  #P_1
  #P_2
  #P_3
  #P_4
  #P_5
  ; etc ... 32 possibilités au total
EndEnumeration

Procedure test(flags)
  If flags & #P_1
    Debug "Para 1 "
  EndIf
  If flags & #P_2
    Debug "Para 2 "
  EndIf
  If flags & #P_3
    Debug "Para 3 "
  EndIf
  If flags & #P_4
    Debug "Para 4 "
  EndIf
  If flags & #P_5
    Debug "Para 5 "
  EndIf
EndProcedure

test(#P_1|#P_3|#P_5)
Ici un exemple un peux plus difficile , avec une map pouvant contenir 32 chaînes de caractères et pour l’a quel on peux sélectionné les éléments que l'on veux

Code : Tout sélectionner

; exemple avec un map de maximum 32 éléments
; et des flags de sélection
EnumerationBinary 
  #P_1
  #P_2
  #P_3
  #P_4
  #P_5
  ; etc ... 32 possibilités au total
EndEnumeration

Global NewMap myFruts.s() ; map de fruits
; j'ajoute quelques fruits pour l'exercice
AddMapElement(myFruts(),Str(#P_1))
myFruts()= "Pomme"
AddMapElement(myFruts(),Str(#P_2))
myFruts()= "Bannane"
AddMapElement(myFruts(),Str(#P_3))
myFruts()= "Orange"
AddMapElement(myFruts(),Str(#P_4))
myFruts()= "Poire"
AddMapElement(myFruts(),Str(#P_5))
myFruts()= "Fraise"

Procedure test(Map mp.s(),flags)
  Protected i,mask=%00000000000000000000000000000001
  ; parcours des 32 possibités
  For i = 0 To 31
    If flags & mask
      If FindMapElement(mp(),Str(mask))
        Debug mp()
      EndIf
    EndIf
    mask = mask<<1
  Next
EndProcedure
test(myFruts(),#P_1|#P_3|#P_5)

Re: [Résolu] Comment envoyer une liste en paramètre

Publié : mer. 26/juin/2019 16:21
par Micoute
Un grand merci microdevweb pour ce partage qui va me servir