PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Lister tous les champs d'une fenêtre
Lister tous les champs d'une fenêtre
Started by Alain Blanc, Apr., 12 2006 1:28 PM - 16 replies
Posted on April, 12 2006 - 1:28 PM
Hello,

J'aimerais lister tous les champs d'une fenêtre, helas la fonction EnumèreChamp ne tiens pas compte des champs sur un onglet ou d'un superchamps.

J'ai bien tenté de créer une procédure récursive, mais pour cela je dois tester le "Type" des champs de ma fenêtre, malheureusement les SuperChamps ne possède pas la propriété "..Type" (étrange non ??).

Quelqu'un peut-il m'aider pour connaire tous les champs d'une fenêtre ?

BLANC BLANC
Posted on April, 12 2006 - 1:32 PM
Bonjour
C'est dans l'aide....mais bon je suis sympas alors
i est un entier = 1
ResChamp est une chaîne
ResChamp = EnumèreChamp(FenêtreSaisie, i)
WHILE ResChamp<>""
i++
trace(ResChamp)
ResChamp = EnumèreChamp(FenêtreSaisie, i)
END

"Alain Blanc" <ablanc@lasociete.com> a écrit dans le message de news:
443cc7b8$1@news.pcsoft.fr...

Hello,

J'aimerais lister tous les champs d'une fenêtre, helas la fonction
EnumèreChamp ne tiens pas compte des champs sur un onglet ou d'un
superchamps.

J'ai bien tenté de créer une procédure récursive, mais pour cela je dois
tester le "Type" des champs de ma fenêtre, malheureusement les SuperChamps
ne possède pas la propriété "..Type" (étrange non ??).

Quelqu'un peut-il m'aider pour connaire tous les champs d'une fenêtre ?

BLANC BLANC
Posted on April, 12 2006 - 2:41 PM
Aie Aie Aie,

Merci mais je ne suis quand même pas bête à ce point.

Si tu lis mon précédent poste jusqu'au bout et pas uniquement le sujet, tu comprendras que la procédure de l'aide est incomplète afin de lister tous les champs d'une fenêtre qui contiendraient un onglet ou bien super champ.

Le but de la manœuvre serait de pouvoir lister tous les champs y compris ceux de l’onglet, bien sûr sans connaître à l'avance le nom de cet l'onglet, tu verras que ce n'est pas si évident qu'il n'y parait, d'autant plus que la propriété "..Type" ne fonctionne pas pour les super champs. Bref si un expert à s’est déjà cassé la tête sur ce problème qu’il me fasse signe je lui en serait que très reconnaissant.

En tout cas merci d'avoir suggéré


A blanc n'entendeur CHALUT
Posted on April, 12 2006 - 3:27 PM
Peut-être en regroupant tous les champs dans un groupe, et en listant les
champs du groupe...

Eric

"Alain Blanc" <ablanc@lasociete.com> a écrit dans le message de news:
443cd6b2$1@news.pcsoft.fr...

Aie Aie Aie,

Merci mais je ne suis quand même pas bête à ce point.

Si tu lis mon précédent poste jusqu'au bout et pas uniquement le sujet, tu
comprendras que la procédure de l'aide est incomplète afin de lister tous
les champs d'une fenêtre qui contiendraient un onglet ou bien super champ.

Le but de la manouvre serait de pouvoir lister tous les champs y compris
ceux de l'onglet, bien sûr sans connaître à l'avance le nom de cet
l'onglet, tu verras que ce n'est pas si évident qu'il n'y parait, d'autant
plus que la propriété "..Type" ne fonctionne pas pour les super champs.
Bref si un expert à s'est déjà cassé la tête sur ce problème qu'il me
fasse signe je lui en serait que très reconnaissant.

En tout cas merci d'avoir suggéré


A blanc n'entendeur CHALUT

Posted on April, 12 2006 - 4:00 PM
Une idée simple et excellente, comme quoi ...

Merci A+

PS : Finalement la propriété "..Type" fonctionne pour un super champs seulement avec les opérateurs d'indirection. Cette propriété utilisé directement on obtient l'erreur => Erreur :La propriété 'Type' n'existe pas sur ce type de champ. C'est quand même étrange tu me diras ???!!! NON ?

PS: J'ai quand même écris une procédure pour obtenir tous les champs d'une fenêtre, je l'a poste d'ici 10min, ça éviteras à de créer des groupes fictifs.
Posted on April, 12 2006 - 4:35 PM
Bonjour,

J'imagine que tu es bien en WD10 ?
Dans ce cas (même en WD9) la proprieté '..type' donne bien un code différent pour un super champ, c'est le "typeSuperChamp"

J'avais fait un bout de code en WD9 pour lister tous les champ d'une fenêtre (y compris les superChamp, les volets leurt contenu, les tables et les colonnes).
Je ne garantis pas que ca marche dans 100% des cas mais dans ce cas je suis prêt a tenter de compléter.

En fait il faut aussi utiliser les fonctions
EnumèreSousElément() et TableEnumèreColonne() pour tout récupérer

Si il y a des interressés, je pourrais mettre le source de la classe en question sur un ftp dès ce soir.

A+

--
Francis MOREL
Posted on April, 12 2006 - 4:36 PM
Prenons cela comme une contribution poétique à ce problème.
Si d'autres personnes peuvent completer cela, ce serait chouette.

J'ai une fenêtre avec un onglet, des boutons , un champ texte.
l'onglet a deux pages, un sur chaque page un bouton.
C'est vrai que ce n'est pas simple, et l'aide WIndev n'est pas claire du tout...
N.B. Probleme aussi, je cable le nom de l'onglet, et je n'ai pas trouvé de propriétés indiquant que l'objet est un onglet.

i est un entier = 1
LngNbrePages est un entier
ResChamp est une chaîne
StrnomPage est une chaîne
ResChamp = EnumèreChamp(FrmTest, i)
Trace("Liste des objets de la fenêtres")
WHILE ResChamp<>""
i++
Trace(ResChamp)
ResChamp = EnumèreChamp(FrmTest, i)
END
Trace("Liste des nombre de pages de l'onglet")

//Ce code permet de récupérer le nombre d'onglets
sNomChamp est une chaîne = EnumèreSousElément("FrmTest.Onglet1", enumPremier + enumVolet)
// Parcours tous les champs
TANTQUE sNomChamp <> ""
// Passage au champ suivant
Trace(sNomChamp)
sNomChamp = EnumèreSousElément ("FrmTest.Onglet1", enumVolet)
LngNbrePages=LngNbrePages+1
FIN
Trace("Liste des objet des onglets")

POUR i=1 A LngNbrePages
StrnomPage="FrmTest.Onglet1." + i
Trace(TAB +StrnomPage)
sNomChamp= EnumèreSousElément(StrnomPage, enumPremier + enumVolet)
// Parcours tous les champs
TANTQUE sNomChamp <> ""
// Passage au champ suivant
Trace(sNomChamp)
sNomChamp = EnumèreSousElément (StrnomPage, enumVolet)
FIN
FIN

ON obtient:

Liste des objets de la fenêtres
Onglet1
Bouton3
Saisie1
Bouton4
Liste des nombre de pages de l'onglet
1
2
Liste des objet des onglets
<TAB>zaza2.Onglet1.1
Bouton1
<TAB>zaza2.Onglet1.2
Bouton2


Michel, Montréal
Posted on April, 12 2006 - 5:06 PM
Dans son message précédent, Alain Blanc a écrit :
Une idée simple et excellente, comme quoi ...

Merci A+

PS : Finalement la propriété "..Type" fonctionne pour un super champs seulement avec les opérateurs d'indirection. Cette
propriété utilisé directement on obtient l'erreur => Erreur :La propriété 'Type' n'existe pas sur ce type de champ. C'est quand
même étrange tu me diras ???!!! NON ?

PS: J'ai quand même écris une procédure pour obtenir tous les champs d'une fenêtre, je l'a poste d'ici 10min, ça éviteras à de
créer des groupes fictifs.


Question indiscrète? s'il y a une fentre interne, les champs de celle ci sont-ils listés? et si la fenetre interne provient d'un
composant?
Non pas taper sur la tête SVP :oÞ

--
Pascal
N0.pascal.SPAM@efpe.biz
Ne garder que le prénom pour me joindre
Posted on April, 12 2006 - 5:08 PM
PROCEDURE ListeChamps(sParentAdresse est une chaîne)

nIndiceChamp est un entier = 1
sChampNom est une chaîne
sChampAdresse est une chaîne
nIndiceVoletMax est un entier
nIndiceVolet est un entier

SI {sParentAdresse,indChamp}..Type = typOnglet ALORS
//- L'objet parent est un onglet
nIndiceVoletMax = {sParentAdresse,indChamp}..Occurrence
POUR nIndiceVolet = 1 A nIndiceVoletMax
sChampNom = EnumèreChamp({sParentAdresse,indChamp}[nIndiceVolet], nIndiceChamp)
TANTQUE sChampNom <> ""
nIndiceChamp ++
sChampAdresse = sParentAdresse + "." + sChampNom
Trace(sChampAdresse)
SI {sChampAdresse,indChamp}..Type _DANS_(typOnglet,typSuperChamp) ALORS ListeChamps(sChampAdresse)
sChampNom = EnumèreChamp({sParentAdresse,indChamp}[nIndiceVolet], nIndiceChamp)
FIN
FIN
SINON
//- L'objet parent n'est pas un onglet
sChampNom = EnumèreChamp(sParentAdresse, nIndiceChamp)
TANTQUE sChampNom <> ""
nIndiceChamp ++
sChampAdresse = sParentAdresse + "." + sChampNom
Trace(sChampAdresse)
SI {sChampAdresse,indChamp}..Type _DANS_(typOnglet,typSuperChamp) ALORS ListeChamps(sChampAdresse)
sChampNom = EnumèreChamp(sParentAdresse, nIndiceChamp)
FIN
FIN





///- PS : SI j'ai différencié l'objet parent étant un onglet ou pas, c'est parce que pour les onglet il faut encore indiquer les volets entre []


A+ en espérant que ça puisse servir

BLANC BLANC
Posted on April, 12 2006 - 5:08 PM
Salut,

Oui ça m'intéresse. Mais tu peux aussi regarder la procédure que j'ai écrite, mise à part qu'elle n'énumère pas le colonne d'une table, elle énumère tous les champs contenu dans le formulaire, sur chaque volet des évenutelles onglet, et les encapsulations infinies de super champs.

Mise à part ça, la propriété "..Type" fonctionne pour un super champs s'il est entre { } . Il est a noté aussi qu'il existe une constante "typSuperchamp" donc .... à mon humble avis c'est un léger bug du déboggeur :-).


A+
Posted on April, 12 2006 - 5:12 PM
Une version permettant d'utiliser la propriété Type de l'onglet.
i est un entier = 1
LngTypeChamp est un entier
LngNbrePages est un entier
ResChamp est une chaîne
StrnomPage est une chaîne
sNomChamp est une chaîne
ResChamp = EnumèreChamp(FrmEnumeTest, i)
Trace("Liste des objets de la fenêtres")
WHILE ResChamp<>""
i++
Trace(ResChamp+ " " + {{ResChamp}..NomComplet}..Type)
LngTypeChamp= {{ResChamp}..NomComplet}..Type
SI LngTypeChamp ALORS
//Traitement des onglets
sNomChamp = EnumèreSousElément({ResChamp}..NomComplet, enumPremier + enumVolet)
//Je compte le nombre de pages dans les onglets
TANTQUE sNomChamp <> ""
sNomChamp = EnumèreSousElément ({ResChamp}..NomComplet, enumVolet)
LngNbrePages=LngNbrePages+1
FIN
POUR i=1 A LngNbrePages
StrnomPage={ResChamp}..NomComplet + "." + i
Trace("Objets de la page " + i + " de l'onglet "+{ResChamp}..NomComplet)
//trace(tab +StrnomPage)
sNomChamp= EnumèreSousElément(StrnomPage, enumPremier + enumVolet)
// Parcours tous les champs
TANTQUE sNomChamp <> ""
// Passage au champ suivant
Trace(sNomChamp)
sNomChamp = EnumèreSousElément (StrnomPage, enumVolet)
FIN
FIN

FIN
ResChamp = EnumèreChamp(FrmEnumeTest, i)
END

Michel, Montréal
Posted on April, 12 2006 - 5:18 PM
Hello,

Regarde la procédure que je propose, à mon avis elle est complète. Avec elle tu n’as pas besoin de câbler le nom de l’onglet et tu peux avoir autant d’onglet encapsuler l’un dans l’autre puisque c’est une procédure récursive.

Il te suffit de la copier coller dans une collection de procédure globale, et de l’appeler avec le nom du formulaire comme paramètre.

A+

Alain Blanc
Posted on April, 12 2006 - 5:38 PM
Hello,

hehehe, je viens de modifier ma procédure pour qu'il tienne en compte les fenêtres internes. Par contre je viens de m'appercevoir que plusieurs volets encapsuler ça ne marche pas :-(. Eh oui il faut indiquer l'indice pour chaque volet enpasulé et là les opérateurs d'indirection ne peuvent pas venir à l'aide :-(((((.

Bref .....


en ce qui concerne les composants j'ai pas essayé ...

A+
Posted on April, 12 2006 - 5:53 PM
Bravo Alain !!

Mon code fait au moins le double du tien.

P.S. : si tu peux encore intégrer le code pour les colonnes d'une table...alors c'est le nirvana :-).

Jean-Pierre
Posted on April, 12 2006 - 6:33 PM
Merci,

ça fait plaisir. Tu l'as testé ? Pour les colonnes d'une table je le ferais plus tard :-) si tu me le rappelle hihihi

A+
Posted on April, 13 2006 - 1:59 PM
Bonjour,

Désolé pour le retard de ma réponse, j'étais très pris ce matin.
Concernant la classe et le module de test j'ai tous mis sur

http://home.tele2.fr/morel/download/enumfen200.zip
et aussi
http://wdmlist.free.fr/download/enumfen200.zip

Ca fait à peut près pareil que ta procédure, le principe est équivalent, j'ai juste traiter en plus les
- les typBarreOutils, typBoîteAOutils, typFen ,typGrp
- traiter les colonnes des tables
Par contre je n'ai pas traiter non plus les composants.
J'ai mis tout ca sous dans une classe avec une zone mémoire pour être réutilisable partout.

Bon dev.
A+

--
Francis MOREL
Posted on April, 13 2006 - 2:44 PM
Francis MOREL a formulé ce jeudi :
Bonjour,

Désolé pour le retard de ma réponse, j'étais très pris ce matin.
Concernant la classe et le module de test j'ai tous mis sur

http://home.tele2.fr/morel/download/enumfen200.zip
et aussi
http://wdmlist.free.fr/download/enumfen200.zip

Ca fait à peut près pareil que ta procédure, le principe est équivalent, j'ai juste traiter en plus les
- les typBarreOutils, typBoîteAOutils, typFen ,typGrp
- traiter les colonnes des tables
Par contre je n'ai pas traiter non plus les composants.
J'ai mis tout ca sous dans une classe avec une zone mémoire pour être réutilisable partout.

Bon dev.
A+


Merci de la contribution.

--
Pascal
N0.pascal.SPAM@efpe.biz
Ne garder que le prénom pour me joindre