PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Recherche dans un tableau d'intance d'interface
Recherche dans un tableau d'intance d'interface
Débuté par AZIZ AIT ZAGHAR, 26 juil. 2025 13:33 - 4 réponses
Membre enregistré
29 messages
Posté le 26 juillet 2025 - 13:33
Bonjour à tous,

Est-ce que quelqu'un a déjà manipulé des tableaux d'interfaces ?

J'ai des classes qui implémente l'interface I_Composite et d'autres qui Implémentent l'interface I_Composant dans le cadre du design pattern Composite.

Je manipule donc des composites et des composants :

CProduit_configuré est une Classe

implémente I_Produit
implémente I_Produit_simple
implémente I_Produit_Configuré

implémente I_Composant

hérite de MProduit

PROTÉGÉ
m_i_Tableau_de_paramètre est un I_Composite <note="I_Composite:MParamètre">


MTableau_de_paramètre est une Classe

implémente I_Composite
hérite de CComposite

PROTÉGÉ
m_tab_i_Paramètre est un tableau de I_Composant <note="I_Composant:MParamètre">

FIN


Mon problème est que quand je tente de faire une recherche dans un tableau inclus dans Composite ça ne marche pas :

n_PositionComposant est un entier = Cherche(i_Composite_paramètre:p_tab_i_Composant,tcLinéaire,"p_na8_ID_Paramètre",n8_IDParamètre)


J'ai la solution qui fonctionne mais je ne trouve pas ça très élegant :

n_PositionParamètre est un entier = 1

POUR TOUT Item de i_Composite_paramètre:p_tab_i_Composant
SI {Item,"p_na8_ID_Paramètre"} = n8_IDParamètre ALORS
SORTIR
FIN
n_PositionParamètre ++
FIN


Quelqu'un aurait une explication / solution ou dois-je me résoudre à rester sur la solution de la boucle ?

Par avance merci

Azie
Message modifié, 26 juillet 2025 - 13:33
Posté le 28 juillet 2025 - 10:44
Tu éffectues ta recherche dans une méthode de ta classe ou en dehors ?

Ton Tableau a une portée "protégée"

Il n'est accessible qu'à partir du code de ta classe et ses enfants (petit rappel au cas où)
Membre enregistré
4 318 messages
Posté le 30 juillet 2025 - 05:48
Bonjour,
"ça ne marche pas" ça ne veut rien dire.
Il y a une erreur ?
Le résultat obtenu n'est pas celui escompté?
....
Par ailleurs, il nous manque une grosse partie de tes déclarations, MProduit, I_Composite, I_Composant, CComposite, i_Composite_paramètre ......

A priori, étant donné le préfixe (p_,) p_tab_i_Composant est un getter (proprité lecture,) est elle bien déclarée ou n'existe-t-elle que dans une de tes interfaces ?

--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Membre enregistré
29 messages
Posté le 07 août 2025 - 09:37
Bonjour et merci pour vos réponses,

Pour commencer, désolé pour le délai pour continuer cette discutions ! c'était ma semaine de vacances de l'année 8)

Pour codeur : Je fait les choses en dehors de la classe et le composite et bien accessible tout comme les composants pour peut que je passe par une instance d'Interface I_Composant ou I_Composite.

Pour Voroltinquo :
Effectivement tu as raison "ça ne marche pas", ça ne veux rien dire. J'entends par là, la valeur recherchée existe bien dans dans un composant du tableau d'interface mais la fonction Recherche() ne la trouve pas et retourne -1 pas d'erreur.

J'ai une interface composite :
i_Composite qui est l'interface dans laquelle je peux mettre n'importe quel instance de type tableau de classe avec tous les comportements (ajout, suppression, totalisation ...)

J'ai une interface composant :
I_Composant qui est l'interface dans laquelle je peux mettre n'importe quel classe Modèle ou classe non mappée (CProduit_configuré par ex.)

Au lieu de manipuler les classe concrètes, MTableau_de_paramètre, MTableau_de_nom_paramètre, ... ce qui d'après ce que j'ai compris des principes SOLID créerait une dépendance forte. J'utilise donc une instance d'interface (i_Composite_paramètre dans l'exemple qui va suivre) dans laquelle je pourrai avoir, MTableau_de_paramètre, MTableau_de_nom_paramètre, MTableau_de_option , MTableau_de_nom_option ...

Idem pour I_Composant qui accueillera CProduit_configuré, MParamètre, MOption ...

Vous l'aurez compris les classes concrètes implément I_Composite ou I_Composant.

J'ai mis en place un test avec une série de trace pour expliquer, j'espère que cela sera plus clair :



Je crée mon Produit configuré dont l'ID est 1 (je ne vais pas m'attarder sur ce point :
//-- Construction du produit
i_monModèle est un I_Modèle <- allouer un (g_e_MonModèle.Valeur)
i_Composant_Produit_configuré est un I_Composant <- i_monModèle:Charger(1,su_monModèleParent)

A ce stade j'ai un produit configuré (un composant) qui contient plusieur membres de type simple, Composant et Composite, ci-dessous la déclaration :
CProduit_configuré est une Classe

implémente I_Produit
implémente I_Produit_simple
implémente I_Produit_Configuré

implémente I_Composant
implémente I_Composant_produit

hérite de MProduit

PROTÉGÉ
m_i_Tableau_de_paramètre est un I_Composite <note="Instance tableau de modèle:MParamètre">

PRIVÉE
m_su_Code_vide est une chaîne UNICODE <note="Ignorer">= "Ø"
m_su_Séparateur_option est une chaîne UNICODE <note="Ignorer">= "-"

FIN

Déclaration du la classe modèle MTableau_de_paramètre :
MTableau_de_paramètre est une Classe

implémente I_Composite

hérite de CComposite

PRIVÉ
m_tab_i_Paramètre est un tableau de I_Composant <note="Tableau de modèle:MParamètre">

FIN

Dans notre cas la porté publique, protégé ou privé ne change rien car nous passons par les interfaces qui utilisent les propriété générées depuis les membres des classes.

Explication du test :

je récupère le membre le membre composite par une méthode qui se trouve dans la classe concrète (CComposite ) commune à tous les composites :

i_Composite_paramètre est un I_Composit <- i_Composant_Produit_configuré:get_Composite("Paramètre")

"Paramètre" étant une chaine de caractère portant le nom des instances contenues dans le Composite (même que le fichier de données). Si je veux un autre membre composite, je change la chaine en conséquence.

Je teste que le tableau n'est pas vide, j'ai bien 17 Instance d'interface I_Composant portant des instances de MParamètre

Je sais que le Composant qui a "M" pour valeur du membre m_c_Lettre_paramètre est le N°13 dans le tableau, je récupère ce dernier
Je met sa valeur dans une variable chaine, on a bien "M" c'est donc que que ce dernier existe et accessible.

Je fait la recherche avec la fonction WL Cherche() et là elle ne trouve rien et me retourne -1

Je me demande donc s'il est simplement possible de faire une recherche sur un tableau d'interface, car il y à quelque temps j'ai tenté de faire une file d'interface (Enfile/Défile) est il semble que cela ne soit pas possible avec une erreur très explicite ou je ne sais pas comment faire, car je ne vois pas ou mettre l'opérateur d'affectation <-



Plus j'avance avec les Interface en WL et plus je tombe sur des limitations ...

Cordialement.

Aziz
Membre enregistré
4 318 messages
Posté le 08 août 2025 - 14:40
J'utilise donc une instance d'interface (i_Composite_paramètre dans l'exemple qui va suivre) dans laquelle je pourrai avoir, MTableau_de_paramètre, MTableau_de_nom_paramètre, MTableau_de_option , MTableau_de_nom_option ...


Je me demande donc s'il est simplement possible de faire une recherche sur un tableau d'interface


Dans la mesure où une interface est une liste de fonction, de procédures, de getters/setters (propriétés) elle ne comporte aucun membres, elle ne peut donc pas être instanciée, et, à fortiori, on ne peut pas faire de recherche sur une interface.

--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM