|
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) :
NomChamp est une chaîne = EnumèreSousElément("Fen_1.Onglet1", enumPremier + enumVolet)
TANTQUE NomChamp <> "" Trace(NomChamp) Trace(Onglet1[NomChamp]..Libellé) NomChamp2 est une chaîne NomChamp2 = EnumèreSousElément("Fen1.Onglet1." + NomChamp, enumPremier) TANTQUE NomChamp2 <> "" Trace(NomChamp2) NomChamp2 = EnumèreSousElément("Fen1.Onglet1." + NomChamp) FIN NomChamp = EnumèreSousElément("Fen1.Onglet1", enumVolet) 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
CdltMensaje 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) /********************************************************************
sResVoletSuivant est une chaîne = CS_VIDE k,m sont des entiers
ChampsOnglet est une chaîne ChampOngletComplet est une chaîne TypeDuChamp est un entier NumOng est un entier
k = i
leTpe est un entier = {OngletDepart}..Type NBTest est un entier = {OngletDepart}..Occurrence
ChampsOnglet = EnumèreSousElément({OngletDepart},enumPremier+enumVolet)
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 NumOng = 1 EnumereRecursifOngletsVolet(LaTable,OngletDepart,ChampsOnglet,NumOng,LeGroupe,TypeDuChamp,k) FIN ChampsOnglet = EnumèreSousElément(OngletDepart) k++ FIN
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.Onglet2" 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 |
| |
| |
| | | |
|
| | |
| |
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)
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 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 SI ParcoursChamp(NomChampParcouru, ParamProcédureAExécuter) = Faux ALORS RENVOYER Faux FIN CAS typFenêtreInterne 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 |
| |
| |
| | | |
|
| | | | |
| | |
|