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

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

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

Message 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.
Dernière modification par Micoute le lun. 24/juin/2019 14:25, modifié 1 fois.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Comment envoyer une liste en paramètre

Message 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())
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment envoyer une liste en paramètre

Message 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
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Comment envoyer une liste en paramètre

Message 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
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Comment envoyer une liste en paramètre

Message 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)
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment envoyer une liste en paramètre

Message par Micoute »

Merci beaucoup pour cette aide qui m'a libéré d'un gros fardeau.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message par Micoute »

Un grand merci microdevweb pour ce partage qui va me servir
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre