PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Zone répétée avec Fenêtre interne, appeler procédure de la fenêtre interne
Zone répétée avec Fenêtre interne, appeler procédure de la fenêtre interne
Débuté par Patrice FROELIGER, 28 sep. 2018 17:53 - 9 réponses
Membre enregistré
32 messages
Posté le 28 septembre 2018 - 17:53
Bonjour.
J'ai une fenêtre principale avec une zone répétée qui est complétée avec des fenêtres internes.
Pour enregistrer ma fiche principale et mes lignes de la zone répétée, j'ai besoin d'accéder à une procédure de la fenêtre principale.

Comment executer cette procédure de la fenêtre interne depuis le parcours de la zone répétée ?

Merci d'avance.

--
Patrice FROELIGER
KUCHLY SAS
Message modifié, 28 septembre 2018 - 17:53
Membre enregistré
120 messages
Posté le 28 septembre 2018 - 20:46
Voici ce que je viens d'utiliser pour le même cas que le votre

// Récupère l'alias de l'onglet dynamique
vFenInterne est un Champ <- Fen_Menu.OngletMenu[Fen_Menu.OngletMenu..Valeur]
// Récupère le nom de la fenêtre interne associée à cet onglet dynamique
vNomFenêtreInterne est une chaîne
vNomFenêtreInterne = EnumèreChamp(vFenInterne, 1, parOrdreDeCréation)
// Exécute la procédure locale de la fenêtre interne chargée dans l'onglet
ExécuteTraitement(vNomFenêtreInterne+".ProcRafraichir",trtProcedure)


Bon courage ;)
Membre enregistré
32 messages
Posté le 01 octobre 2018 - 09:39
Merci pour le retour.

Voilà ce que j'ai tenté, mais ça renvoie un champ vFenInterne vide, et donc pas de champ.
POUR TOUTE LIGNE de ZR_Detail
vFenInterne est un Champ <- ZR_Detail[ZR_Detail..Valeur]
// Récupère le nom de la fenêtre interne associée à cet onglet dynamique
vNomFenêtreInterne est une chaîne
//= EnumèreChamp (ZR_Detail,1,parOrdreDeCréation)
vNomFenêtreInterne = EnumèreChamp(vFenInterne, 1, parOrdreDeCréation)
// Exécute la procédure locale de la fenêtre interne chargée dans l'onglet
ExécuteTraitement("ZR_Detail."+vNomFenêtreInterne+".Enregistrer_Offre_TrL",trtProcedure, clErreurL)
FIN


Par contre, grace à EnumèreChamp, j'ai réussi à récupérer une fenêtre interne _FIBASE_
vNomFenêtreInterne = EnumèreChamp (ZR_Detail,1,parOrdreDeCréation)


Le pb, c'est qu'avec 2 lignes dans ma zone répétée, j'enregistre du coup 2 fois la dernière ligne...

C'est pas loin, mais il manque encore quelque chose...

--
Patrice FROELIGER
KUCHLY SAS
Membre enregistré
32 messages
Posté le 01 octobre 2018 - 11:28
Petit complément.

La méthode énoncée ci-dessus avec l'énumération sur ZR_Detail fonctionne bien.
vNomFenêtreInterne = EnumèreChamp (ZR_Detail,1,parOrdreDeCréation)
ExécuteTraitement("ZR_Detail."+vNomFenêtreInterne+".Enregistrer_Offre_TrL",trtProcedure, clErreurL)


J'avais une erreur dans la méthode d'enregistrement avec un EcranVersSource qui me faisait croire que la méthode n'était pas appelée correctement.

--
Patrice FROELIGER
KUCHLY SAS
Membre enregistré
32 messages
Posté le 03 octobre 2018 - 17:51
En complément, réponse du support tel que ça devrait être.

C’est effectivement une solution de contournement mais cela reste une anomalie. La syntaxe est normalement beaucoup plus simple :
ZR_Test[Indice].FentreInterneTest.pTest()

--
Patrice FROELIGER
KUCHLY SAS
Membre enregistré
120 messages
Posté le 03 octobre 2018 - 18:19
On attend avec impatience la correction de "l'anomalie"...
Membre enregistré
32 messages
Posté le 08 novembre 2018 - 16:00
Autre méthode trouvée sur le forum...
Mais dans les 2 méthodes, ça ne marche que pour les fenêtres internes visuellement affichées à l'écran.

Merci FLORIAN / Allsoftwar

https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/221751-erreur-doc-windev-zone-repetee-fenetre-interne-221805/read.awp

POUR TOUTE LIGNE nIndice de ZR_MaZoneRépétée
pChampCible est un Champ

sNomMaZoneRépétée est une chaîne = ZR_MaZoneRépétée[nIndice]..Nom
sNomMonChampDisposition est une chaîne = sNomMaZoneRépétée +".FI_MaFenetreInterne.DISP_MonChampDisposition"
sParamSaisi est une chaîne = ""

pChampCible<-{sNomMonChampDisposition +".SAI_MonChampDeSaisie"}
sParamSaisi = SansEspace(pChampCible..Valeur)
FIN


--
Patrice FROELIGER
KUCHLY SAS
Membre enregistré
5 messages
Posté le 11 novembre 2018 - 20:33
Bonjour,
Pour solutionner cela j'utilise une classe intermédiaire qui regroupe les procédures de toutes fenêtres internes, pouvant être appelées.
Prenons l'exemple suivant : je dispose d'une fenêtre qui contient une zone répétée de fenêtres internes dont chacune d'elles contient aussi une zone répétée d'éléments.





Problème. Lorsque je sélectionne un élément dans une des zones je dois supprimer la sélection précédente qui peut être située dans une autre fenêtre interne. Donc depuis la fenêtre interne je dois pouvoir intervenir sur la fenêtre principale ou sur les autres fenêtres internes qui la composent.

Pour commencer, ci-dessous la classe qui me permet de faire le lien entre les différents éléments.

IHMFenPrincipale est une Classe
PRIVÉ
//Liste des procédures de suppression de sélection des fenêtres internes
//[nom fenêtre interne] = [sa procédure]
m_taColProcDesselectionner est un tableau associatif de Procédures
FIN


// Résumé : Pour inscrire les procédures des fenêtres internes
// Syntaxe :
// inscrireProcDesselectionner (<sPNomFenInterne> est chaîne, <prcPProcedure> est procédure)
//
// Paramètres :
// sPNomFenInterne (chaîne ANSI) : Nom de la fenêtre interne
// prcPProcedure (procédure) : sa procédure
//
Procedure inscrireProcDesselectionner(LOCAL sPNomFenInterne est une chaîne, prcPProcedure est une Procedure)

m_taColProcDesselectionner[sPNomFenInterne] = prcPProcedure


// Résumé : Transmet la liste des procédures des fenêtres internes
//
Procedure getColProcDesselectionner():tableau associatif de Procédures

RENVOYER m_taColProcDesselectionner


Au niveau de la fenêtre principale, nous instancions l'objet "IHMFenPrincipale"

Procedure MaFenêtre()
gclObjIHMFenPrincipale est un objet IHMFenPrincipale

//Résumer : Nous chargeons la liste des fenêtres internes dans la zone répétée de la fenêtre principale
Procedure chargerZoneRepetee()

POUR TOUT clObjMaitreOperation de colObjMaitreOperation
//Création d'un nouvel enregistrement dans la zone
//ZR_OpOrchestrator => nom de ma zone répétée de ma fenêtre principale
//FI_MaitreOpGroupe => nom de la fenêtre interne
//clObjMaitreOperation => Pour cet exemple l'objet contenant la liste des éléments devant être
// affichée par la fenêtre interne dans sa propre zone répétée
//gclObjIHMFenPrincipale = > L'objet initialement instancié regroupant les procédures
ZoneRépétéeAjouteFI(ZR_OpOrchestrator, FI_MaitreOpGroupe ,clObjMaitreOperation,gclObjIHMFenPrincipale)
FIN


Au niveau de la fenêtre interne "FI_MaitreOpGroupe"
Ma fenêtre interne dispose de deux procédures :
- "selectionner" appelée lorsque je sélectionne un élément en cliquant sur l'icône
- "délectionner" qui supprime la sélection des tous ces éléments. C'est cette dernière qui sera inscrite dans l'objet nous servant d'intermédiaire.

Procedure MaFenêtre(LOCAL pObjMaitreOpGroupe est un objet clMaitreOpGroupe dynamique, gpclPObjIHMParent est un objet IHMFenPrincipale dynamique)

//Dans sa partie "fin d'initialisation"
//Nous récupérons le nom du groupe à afficher
LIB_NomGroupe = pObjMaitreOpGroupe:getNomGrpSelection()

//Nous inscrivons notre procédure "dessectionner" dans la liste des procédures
prcValProcedure est une Procedure
prcValProcedure = desselectionner
gpclPObjIHMParent:inscrireProcDesselectionner(LIB_NomGroupe,prcValProcedure)


//Procédure permettant la "déselection" des éléments contenus dans sa zone répétée
Procedure desselectionner()

SI ZoneRépétéeOccurrence(ZR_ZoneOperation) = 0 ALORS RETOUR

POUR X = 1 _À_ ZR_ZoneOperation..Occurrence
//Rend invisible la puce de sélection
ATT_Selection[X] = Faux
FIN


Procedure selectionner()
taColProcDesselection est un tableau associatif de Procédures
sNomFenInterne est une chaîne
prcProcDesselection est une Procedure

//Nous récupérons la procédure "desselectionner" de toutes les fenêtres internes
taColProcDesselection = gpclPObjIHMParent:getColProcDesselectionner()

POUR TOUT prcProcDesselection, sNomFenInterne de taColProcDesselection
//Pour l'exemple, si cette procédure appartient à celle en cours nous passons à la suivante.
//L'objectif est de monter que si vous connaissez le nom d'une fenêtre en particulier vous pouvez
//directement interagir avec celle-ci
//Je pouvais simplifier en mettant directement ce traitement dans une méthode de "IHMFenPrincipale"
SI sNomFenInterne = LIB_NomGroupe ALORS CONTINUER

prcProcDesselection()
FIN

//Ci-dessous nous sélectionnons simplement l'élément en affichant une puce
nIndiceZone est un entier
nIndiceZone = ZoneRépétéeSelect(ZR_ZoneOperation)
SI nIndiceZone <> Null ALORS ATT_Selection[nIndiceZone] = Vrai


Nous pouvons créer d'autres tableaux associatifs pour d'autres méthodes.

En résumé, l'objectif n'est pas d'essayer d'exécuter une procédure d'une fenêtre interne par ExécuteTraitement() [je n'ai pas réussi à correctement l'utiliser. Confronté à des erreurs] mais d'enregistrer celle-ci dans un tableau de procédure afin de l'appeler. Donc vous pouvez simplifier cette démarche en vous passant de cette classe intermédiaire. Il suffit de fixer ce tableau de procédure au niveau de la fenêtre principale et d'y accéder directement par ses procédures :
- FEN_Principale.inscrireProcDesselectionner()
- FEN_Principale.getColProcDesselectionner()
Personnellement je préfère l'objet, nous avons tous nos petites manies.

Cordialement.
Message modifié, 11 novembre 2018 - 21:36
Membre enregistré
146 messages
Posté le 06 juin 2020 - 15:55
Bonjour,

Je cherchais une solution pour accéder aux procédures des fenêtres internes dans une ZR..
Au cas ou le blog pc-soft proposer cette solution => https://blogs.pcsoft.fr/fr/acceder-champs-procedures-fenetre-interne-ajoutee-zone-repetee/281474976710818/read.awp

--
Dominique DAUSSY
http://www.serviceinfo76.com
Développeur de votre solution Windev, WebDev et Windev Mobile
Membre enregistré
1 173 messages
Posté le 07 juin 2020 - 16:04
Bonjour,

Je ne vais pas apporter de solution à la question, mais personnellement, je m'arrange pour ne jamais appeler de procédure "ascendante", comme dans la fenêtre principale. Toutes les fenêtres devraient être indépendantes de celles qui les appellent.
1 - parce que cela permet de réutiliser la fenêtre ailleurs
2 - parce que les adhérences entre les fenêtres augmenteront la difficultés en cas de maintenance.

Pensez au passage de paramètre dans les fenêtres (internes ou non), ainsi qu'aux valeurs de retour
Pensez aussi aux Triggers, si l'utilisation s'y prête.

Mais c'est vous qui codez, et les réponses ci-dessus sont de bonnes pistes.

--
Thierry TILLIER
Développeur Windev-Webdev
Formation Windev : https://coursdinfo.teachable.com/
Formation bureautique : https://coursdinfo.net