PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV (versiones precedentes) → WINDEV 25 : Lister tous les champs contenus dans une fenêtre
WINDEV 25 : Lister tous les champs contenus dans une fenêtre
Iniciado por Jean FOURNES, 11,ene. 2024 12:53 - 7 respuestas
Miembro registrado
8 mensajes
Publicado el 11,enero 2024 - 12:53
Bonjour à toutes et tous
bjectif :
Pouvoir modifier la police de caractères utilisée ainsi que sa taille
Effacer le contenu des champs de saisie
Modifier la taille des libellés
Augmenter à la volée la taille de la police utilisée (Pour Libellés et/ou contenu des champs

Pour cela j'ai une table située en dehors de la fenêtre qui enregistre
- Le nom du champ
- son type
- son groupe
J'effectue un traitement récursif sur les champs de type 'Onglet' qui peuvent contenir d'autres onglets
Mon problème
Mes procédures fonctionnent pour les onglets qui sont dans la fenêtre
Si l'onglet(Type 16), est dans un panneau dockable il ne reconnait pas l'onglet dans ma fonction 'enumereSousElement'
EnumereSousElement(FEN_test.ONG.DansleDocable,enumPremier+enumVolet) me répond "Inconnu"
Donc je ne peux pas récupérer les champs
Ma question :
Comment lister ce qui se trouve dans le panneau vocable (Type 131) en récursif

Merci pour votre aide

//*************************************************************************
PROCÉDURE EnumereChampsFenetre(LaFenetre est une chaîne,LaTable)
//***************************************************************************************
// Parcours des champs d'une fenêtre et enregistre leur nom et leur type dans une table
//=======================================================================================
i est un entier = 0
Num est une chaîne = " "
sNomChamp est une chaîne
sLibelle est une chaîne
LigneTrace est une chaîne
LeGroupe est une chaîne
sNomComplet est une chaîne
nType est un entier
TableSupprimeTout(LaTable)
Trace("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*")
Trace(" Liste des Champs de la Fen^tre : "+ LaFenetre)
Trace("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*")
sNomChamp = EnumèreSousElément(LaFenetre, enumPremier)
TANTQUE sNomChamp <> ""
i++
Num = i

sNomComplet = LaFenetre + "." + sNomChamp // Nom complet du champ

nType = {sNomComplet, indGPW}..Type // Récupération du type de l'élément
sLibelle = {sNomComplet}..Libellé
LeGroupe = {sNomComplet}..Groupe
Trace(Num," ",sLibelle, " Type : ",nType," Groupe : ",LeGroupe)
sNomChamp = EnumèreSousElément(LaFenetre) // Champ suivant
FIN



Trace("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*")
LigneTrace = " Champs de "+ LaFenetre + "Avec traitement récursif sur Onglets"
Trace(LigneTrace)
Trace("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*")
sNomChamp = EnumèreSousElément(LaFenetre, enumPremier)
TANTQUE sNomChamp <> ""
i++
Num = i

sNomComplet =LaFenetre + "." + sNomChamp // Nom complet du champ

nType = {sNomComplet, indGPW}..Type // Récupération du type de l'élément
sLibelle = {sNomComplet}..Libellé
SELON nType
CAS typTable,typBarreOutils,typBoîteAOutils,typSuperChamp,typFenêtreInterne
// Ici aussi faire comme onglets
LeGroupe = {sNomComplet, indGPW}..Groupe
LigneTrace = Num + " " + LaFenetre + " " + sNomChamp +" " + nType + " " + sLibelle + " " + LeGroupe // Enumération des champs qui sont à l'intérieur
Trace(LigneTrace)

TableAjouteLigne({LaTable,indChamp},i,sNomComplet,nType,{sNomComplet, indGPW}..Libellé, {sNomComplet, indGPW}..Groupe)
CAS 131
//i = EnumereChampsOnglet(sNomComplet,LaTable,i)

CAS typOnglet
//TableAjouteLigne({LaTable,IndChamp},i,sNomComplet,nType,{sNomComplet, indGPW}..Libellé, {sNomComplet, indGPW}..Groupe)
LeGroupe = {sNomComplet, indGPW}..Groupe
LigneTrace = Num + " " + LaFenetre + " NomChamp : " + sNomChamp +" Type : " + nType + " Libellé : " + sLibelle + " Groupe : " + LeGroupe // Enumération des champs qui sont à l'intérieur

Trace(LigneTrace)
i = EnumereChampsOnglet(sNomComplet,LeGroupe,LaTable,i)

CAS typOptionMenu
// Ne fait rien si c'est une option de menu


AUTRE CAS
// Ajout de l'élément dans la trace
LeGroupe = {sNomComplet, indGPW}..Groupe
LigneTrace = Num + " " + LaFenetre + " NomChamp ( Autre cas): " + sNomChamp +" Type : " + nType + " Libellé : " + sLibelle + " Groupe : " + LeGroupe // Enumération des champs qui sont à l'intérieur
Trace(LigneTrace)

TableAjouteLigne({LaTable,indChamp},i,sNomComplet,nType,{sNomComplet, indGPW}..Libellé, {sNomComplet, indGPW}..Groupe)
FIN

sNomChamp = EnumèreSousElément(LaFenetre) // Champ suivant
FIN

//*******************************************************************
PROCÉDURE EnumereChampsOnglet(OngletDepart,LeGroupe,LaTable,i)
/********************************************************************
// Parcours des volets d'un champ Onglet
//********************************************************************
// Le Principe
// 1 Onglet contient des Volets
// 1 Volet peut ontenir 1 Onglet -# qui contient des volets
// Pour parcourir un Onglet il faut effectuer un traitement récursif
// a) Lister les champs présents dans chaque volet
// b) Si le champ est un onglet
// - Traitement récursif pour lister les champs
// c) Passer au champ suivant
// Les champs sont ajoutés dans une table pour être utilisés globalement au niveau de la fene^tre appelante
// La fonction est lancée à l'ouverture de chaque fenêtre
// Elle est normalement suivie de l'appel de la fonction De changement de la police et de la taille des caractères
//---------------------------------------------------------------------


sResVoletSuivant est une chaîne = CS_VIDE
k sont des entiers

// Les Trace sont utiliser pour débuguer

//Trace(" ******************************************************************")
//Trace(" * " + OngletDepart + " ")
//Trace(" ******************************************************************")


//--------------------------------------------------------------------------
// Récupérer les champs du volet (Les Champs simples de tous les onglet)
//-------------------------------------------------------------------------
ChampsOnglet est une chaîne
ChampOngletComplet est une chaîne
TypeDuChamp est un entier
//ChampsOnglet = EnumèreSousElément(OngletDepart,enumPremier+enumVolet)
//SI LeGroupe <> "" ALORS
//aaaaa est une chaine = OngletDepart + "." + LeGroupe + "."+"ONG_DOMAINES"
//ChampsOnglet = EnumèreSousElément(aaaaa,enumPremier+enumVolet)
//SINON
ChampsOnglet = EnumèreSousElément(ChampsOnglet,enumPremier+enumVolet)
//FIN

k = i
TANTQUE ChampsOnglet <> CS_VIDE
ChampOngletComplet = OngletDepart + "." + ChampsOnglet
TypeDuChamp = {ChampOngletComplet,indGPW}..Type

SI TypeDuChamp <> typOnglet ALORS
Trace(" -",k," ",ChampsOnglet, " Type : ",TypeDuChamp)
TableAjouteLigne({LaTable,indChamp},k,ChampOngletComplet,TypeDuChamp,ChampsOnglet, "")
SINON
//EnumereRecursifOngletsVolet(LaTable,OngletDepart,ChampsOnglet,1,nType,k)
NumOng est un entier = 1
EnumereRecursifOngletsVolet(LaTable,OngletDepart,ChampsOnglet,NumOng,LeGroupe,TypeDuChamp,k)
//Trace("Appel fonction Recursive pou "," ",ChampsOnglet)
FIN
ChampsOnglet = EnumèreSousElément(OngletDepart)
k++
FIN
//Trace(" ===================================================================")



RENVOYER k

//*********************************************************************************
PROCÉDURE EnumereRecursifOngletsVolet(LaTable,VoletDepart,SousVolet,IndVolet,LeGroupe,TypeChamp,i)
//*********************************************************************************
// Traitement récursif d'un champ onglet contenant un autre champ Onglet

k est un entier = i

Volet1 est une chaîne = VoletDepart + "[" + IndVolet + "]"

LibelleSousVolet est une chaîne = {Volet1,indChamp}..Libellé

Volet1Nom est une chaîne = VoletDepart + "." + LibelleSousVolet
Volet1Numero est une chaîne = VoletDepart + "." + IndVolet
// Est-ce qu'il y a un volet ?
NbreVoletsEnCours est un entier = {VoletDepart, indGPW}..Occurrence

//NomSousElement = EnumèreSousElément(SousVolet, enumPremier+enumVolet)

//----------------------------------------------------------------------
// Récupérer les champs du volet
//----------------------------------------------------------------------
SousVoletComplet est une chaîne
ChampsVolet est une chaîne
ChampVoletComplet est une chaîne

TypeDuChamp est un entier
SousVoletComplet = VoletDepart + "." + IndVolet
Onglet_a_Lister est une chaîne = VoletDepart + "." + SousVolet

ChampsVolet = EnumèreSousElément(Onglet_a_Lister,enumPremier)

TANTQUE ChampsVolet <> CS_VIDE
ChampVoletComplet = VoletDepart + "." + ChampsVolet
TypeDuChamp = {ChampVoletComplet,indGPW}..Type
SI TypeDuChamp = typOnglet ALORS

//Trace(" *****************Appel Recursif Procedure -", ChampVoletComplet)
EnumereRecursifOngletsVolet(LaTable,VoletDepart,ChampVoletComplet,IndVolet,LeGroupe,TypeChamp,k)
FIN
k++
Trace(" -", k," ",ChampsVolet, " Type : ",TypeDuChamp)

TableAjouteLigne({LaTable,indChamp},k,ChampVoletComplet,TypeDuChamp,ChampsVolet, "")
ChampsVolet = EnumèreSousElément(Onglet_a_Lister)
FIN
Miembro registrado
546 mensajes
Publicado el 12,enero 2024 - 11:59
Bonjour
Je n'ai pas essayé votre code mais ceci fonctionne pour moi (renvoie bien les champs d'un onglet dans un panneau dockable) :

// Parcours des volets d'un champ Onglet
NomChamp est une chaîne = EnumèreSousElément("Fen_1.Onglet1", enumPremier + enumVolet) // Pas de point après Onglet1

// Parcours de tous les volets d'onglet
TANTQUE NomChamp <> ""
// Passage au volet suivant
Trace(NomChamp)
Trace(Onglet1[NomChamp]..Libellé)
// Parcours des champs du volet
NomChamp2 est une chaîne
NomChamp2 = EnumèreSousElément("Fen1.Onglet1." + NomChamp, enumPremier) // Attention au point après Onglet1
TANTQUE NomChamp2 <> ""
Trace(NomChamp2)
NomChamp2 = EnumèreSousElément("Fen1.Onglet1." + NomChamp) // Attention au point après Onglet1
FIN
NomChamp = EnumèreSousElément("Fen1.Onglet1", enumVolet) // Pas de point après Onglet1
FIN


Ce code vient de la page de Doc (sauf un problème de point), il y a un commentaire en bas de page :
https://doc.pcsoft.fr/?3064002

Cdlt
Mensaje modificado, 12,enero 2024 - 12:06
Miembro registrado
8 mensajes
Publicado el 12,enero 2024 - 18:17
Merci , J'avais déjà vu ça
Là c'est en "dur" dans la fenêtre et ça je sais faire. Mon problème n'est pas là. J'ai un nombre important de fenêtres dans mon projet et je ne veux pas mettre du code dans chaque fenêtre.
Je dois travailler avec des procédures en passant des paramètres Pour récupérer une table contenant les informations de chaque champ
Le Principe
1) Procédure principale appelée dans l'initialisation de la fenêtre
a) EnumereChampsFenetre(LaFenetre)
- Liste des champs 'Simples'
- Liste des Champs 'Panneau' (TypPanneau - 131)
- Appel d'une procédure DetailPanneau(NomDuPanneau)
- Liste des Champs Onglet(LaTable,LaFenetre,NomOnglet,NbVolets)
- Traitement Recursif Onglet ( Un onglet peut contenir des onglets)
- Ajout éventuellement des autres type

Donc je ne travaille jamais avec des noms de champs en "dur"
J'ai aucun souci avec les champs normaux

J'ai remarqué en fait que le cas "Panneau" n'avais pas d'importance , leur contenu est accessible depuis le niveau 'Fenetre' ce qui n'est pas le cas des Onglets, tiroirs, boites Outils

//*******************************************************************
Procedure EnumereChampsOnglet(OngletDepart,NbVolets,LeGroupe,LaTable,i)
/********************************************************************
// Parcours des volets d'un champ Onglet
//********************************************************************
// Le Principe
// 1 Onglet contient des Volets
// 1 Volet peut ontenir 1 Onglet -# qui contient des volets
// Pour parcourir un Onglet il faut effectuer un traitement récursif
// a) Lister les champs présents dans chaque volet
// b) Si le champ est un onglet
// - Traitement récursif pour lister les champs
// c) Passer au champ suivant
// Les champs sont ajoutés dans une table pour être utilisés globalement au niveau de la fene^tre appelante
// La fonction est lancée à l'ouverture de chaque fenêtre
// Elle est normalement suivie de l'appel de la fonction De changement de la police et de la taille des caractères
//---------------------------------------------------------------------


sResVoletSuivant est une chaîne = CS_VIDE
k,m sont des entiers

// Les Trace sont utiliser pour débuguer

//Trace(" ******************************************************************")
//Trace(" * " + OngletDepart + " ")
//Trace(" ******************************************************************")


//--------------------------------------------------------------------------
// Récupérer les champs du volet (Les Champs simples de tous les onglet)
//-------------------------------------------------------------------------
ChampsOnglet est une chaîne
ChampOngletComplet est une chaîne
TypeDuChamp est un entier
NumOng est un entier
//ChampsOnglet = EnumèreSousElément(OngletDepart,enumPremier+enumVolet)
//SI LeGroupe <> "" ALORS
//aaaaa est une chaine = OngletDepart + "." + LeGroupe + "."+"ONG_DOMAINES"
//ChampsOnglet = EnumèreSousElément(aaaaa,enumPremier+enumVolet)
//SINON

//FIN

k = i
//NbreVolets est une chaine = {FEN_test.ONG_DansVolet}..Occurence

// Ici utiliser le Nombre de volets pour analyser
leTpe est un entier = {OngletDepart}..Type // J'ai bien TypOnglet 16
NBTest est un entier = {OngletDepart}..Occurrence // J'ai bien le nombre d'onglets


//Volet est une chaine = EnumèreSousElément({OngletDepart},enumPremier+enumVolet)

// Normalement ici au premier énumeresousElement je dois récuperer le N° de Volet puifaire un TANTQUE pour
// Balayer tous les volets
// Ou alors faire directement le TANTQUE puisque j'ai le nombre de volets à lister

// Quelle est la bonne version de Enumere

ChampsOnglet = EnumèreSousElément({OngletDepart},enumPremier+enumVolet) // Test 1 Ici ChampOnglet est vide
//ChampsOnglet = EnumèreSousElément({OngletDepart},enumVolet) // Test 2 Ici ChampOnglet est vide
//ChampsOnglet = EnumèreSousElément({OngletDepart},enumPremier) // Test 3 Ici le champ est vide également
//ChampsOnglet = EnumèreSousElément({OngletDepart}) // Test 4 ici Aussi ChampOnglet est vide
//ChampsOnglet = EnumèreSousElément(OngletDepart) // Test 5 Reponse L'élément n'a pas été initialisé


TANTQUE ChampsOnglet <> CS_VIDE
ChampOngletComplet = OngletDepart + "." + ChampsOnglet
TypeDuChamp = {ChampOngletComplet,indGPW}..Type

SI TypeDuChamp <> typOnglet ALORS
Trace(" -",k," ",ChampsOnglet, " Type : ",TypeDuChamp)
TableAjouteLigne({LaTable,indChamp},k,ChampOngletComplet,TypeDuChamp,ChampsOnglet, "")
k++
SINON
//EnumereRecursifOngletsVolet(LaTable,OngletDepart,ChampsOnglet,1,nType,k)
NumOng = 1
EnumereRecursifOngletsVolet(LaTable,OngletDepart,ChampsOnglet,NumOng,LeGroupe,TypeDuChamp,k)
//Trace("Appel fonction Recursive pou "," ",ChampsOnglet)
FIN
ChampsOnglet = EnumèreSousElément(OngletDepart)
k++
FIN
//Trace(" ===================================================================")



RENVOYER k


Le Problème est dans cette procédure
(k me sert à numéroter les champs dans la table)
En entrée de procédure je récupère bien le Nom de l'onglet dans 'OngletDepart'
je peux récupérer le nombre de volets

et je souhaiterais faire
ordre EnumereSousElement
TANTQUE i = 1 _A_NbeVolet
SI PAS Onglet ALORS
Enregistrer le champ dans la table
SINON
Procédure Traitement Récursif Onglet(Nomde l'onglet)
FIN
Appeler le volet suivant: ordre EnumereSousElement
FIN

Merci d'avance à ceux qui peuvent m'aider
Miembro registrado
546 mensajes
Publicado el 13,enero 2024 - 11:47
Bonjour,
Votre demande a changé, je vous ai répondu pour cette question : "Si l'onglet(Type 16), est dans un panneau dockable il ne reconnait pas l'onglet dans ma fonction 'enumereSousElement'

Vous pouvez essayer de voir si vous pouvez retirer quelque chose de ceci :

NomElement est une chaîne
//NomElement = "Fenetre1" //Pour énumérer sur la fenêtre complète
NomElement = "Fenetre1.Onglet2" //Pour énumérer sur un onglet de la fenêtre
Enum_Recursif(NomElement)

PROCEDURE INTERNE Enum_Recursif(NomElementEnum)

Trace(NomElementEnum)

NomSousElement est une chaîne
NomSousElement = EnumèreSousElément(NomElementEnum, enumPremier)
TANTQUE NomSousElement <> ""
Trace(NomSousElement)
Enum_Recursif(NomElementEnum + "." + NomSousElement)
SI {NomSousElement,indChamp}..Groupe <> "" ALORS
Trace({NomSousElement,indChamp}..Groupe)
FIN
NomSousElement = EnumèreSousElément(NomElementEnum)
FIN
FIN


Ce code peut énumérer les éléments d'un onglet avec les volets et ce qu'ils contiennent (ainsi que les onglets dans les onglets), etc...
Peut fonctionner sur une fenêtre, avec boite à outils, barre d'outils, mais ne sortira pas tout pour autant (vous n'aurez pas les onglets d'une boîte à outils mais vous aurez les champs).
Donc à vous de voir si ça peut vous aider.
Cdlt
Miembro registrado
8 mensajes
Publicado el 15,enero 2024 - 17:49
Bonjour,
Merci pour l'intérêt que vous portez a mon PB

Je vais Essayer votre Code qui parrait simple . J'ai regardé aussi du côté EnumèreChamp qui peut faire la même chose (avec moins d'indigestions) plus simple.

Mais j'aime pas abandonner un problème sans l'avoir résolu. Donc il faut que mes 2 solutions fonctionnent.
Le problème suivant sera, a partir de ça de pouvoir modifier les polices de caractère et leur taille
En traitant séparément les 'Libellés' et le contenu des champs
Encore Merci
Miembro registrado
546 mensajes
Publicado el 15,enero 2024 - 19:29
Il y a ceci mais je ne sais pas si ça fonctionne (WD 12) :
https://www.wxforum.info/read.php…
Miembro registrado
8 mensajes
Publicado el 19,enero 2024 - 12:36
Bonjour,
Pour changer Les police de caractères dans une fenêtre,
-Police sur contenu des Champs
- Police des libellés
- Police pour Texte des boutons
- Modif temporaire dans une fenêtre

J'ai pris la solution de créer une police pour chaque type
PoliceChamps est une police
PoliceLibelle est une police
etc..
J'ai fait une procédure par action demandée
ChampsChangePolice(PoliceChamps
ChampsChangeLibellés(PoliceLibelle,TailleLibelles)
etc...
J'utilise la table créée plus haut pour balayer les champs de la fenetre
et ça fonctionne sans utiliser stylo puisque j'ai chargé les infos de la police avant l'appel

Merci pour votre aide
Miembro registrado
283 mensajes
Popularité : +80 (92 votes)
Publicado el 05,febrero 2024 - 15:31
Hello,
je te partage un code que j'ai implémenté il me permet d'énumérer tous les champs d'une fenêtre (les champs dans les champs inclus)

// ParamNomChampParent correspond au champ ou à la fenêtre à parcourir
// ParamProcédureAExécuter permet de manipuler les champs parcourrus dans une procédure pour faire un traitement au besoin (modifier le champ par exemple)
// ChampDisposition à renseigner si jamais ParamNomChampParent se trouver dans une disposition

Procedure ParcoursChamp(ParamNomChampParent, ParamProcédureAExécuter est une Procedure, ChampDisposition est un Champ = Null)

Indice est un entier = 1
NomChampParcouru est une chaîne = EnumèreChamp(ParamNomChampParent, Indice)

TANTQUE NomChampParcouru <> ""
VarChampParcouru est un Champ <- {ParamNomChampParent + "." + NomChampParcouru, indChamp}

SELON VarChampParcouru..Type
CAS typOnglet
i est un entier = 1
TANTQUE i <= VarChampParcouru..Occurrence // ..Occurrence = Nombre occurrence d'onglet
SI ParcoursChamp(VarChampParcouru[i]..Nom, ParamProcédureAExécuter) = Faux ALORS
RENVOYER Faux
FIN
i++
FIN

CAS typDisposition
SI ParcoursChamp(NomChampParcouru, ParamProcédureAExécuter, VarChampParcouru) = Faux ALORS
RENVOYER Faux
FIN

CAS typSuperChamp
// On parcours tous les champs contenus dans la disposition
SI ParcoursChamp(NomChampParcouru, ParamProcédureAExécuter) = Faux ALORS
RENVOYER Faux
FIN

CAS typFenêtreInterne
// Rien à faire, les champs de la fenêtre interne seront parcourus car renvoyés par EnumèreChamp(ParamNomParent, Indice)

CAS typTable, typTableHierarchique, typZoneRépétée, typListe

AUTRE CAS
SI ChampDisposition <> Null ALORS
POUR i = 1 _À_ ChampDisposition..Occurrence
SI ChampExiste(ChampDisposition..Nom + "[" + i + "]." + NomChampParcouru) = Vrai ALORS
SI ParamProcédureAExécuter(VarChampParcouru, ChampDisposition..Nom + "[" + i + "]") = Faux ALORS
RENVOYER Faux
FIN
FIN
FIN

SINON
SI ParamProcédureAExécuter(VarChampParcouru, ParamNomChampParent) = Faux ALORS
RENVOYER Faux
FIN
FIN
FIN

Indice++
NomChampParcouru = EnumèreChamp(ParamNomChampParent, Indice)
FIN

RENVOYER Vrai


exemple d'appelle de code

ParcoursChamp(MaFenêtre..Nom, ProcédureAExecuterPourChaqueChamp)


--
Maître de la POO