PC SOFT

DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

  • Quand utiliser l'indirection ?
  • Désigner l'objet en cours
  • Indirection sur une structure
  • Utiliser l'indirection sur les chemins dans un document XML
  • Limitations
  • Indirections en Java
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadApple WatchUniversal Windows 10 AppWindows Mobile
Autres
Procédures stockées
Les opérateurs { et } permettent d'accéder à un champ, une variable, un membre d'une classe ou une rubrique de fichier en construisant dynamiquement le nom du champ, de la variable, du membre de la classe ou de la rubrique.
L'intérêt des opérateurs { et } est multiple :
  • Passer en paramètre un nom de champ, de variable, de membre d'une classe ou de rubrique.
  • Construire le nom d'un champ, de la variable, d'un membre d'une classe ou d'une rubrique par programme.
WEBDEV - Code Serveur Pour effectuer une indirection sur un champ d'une page, il est nécessaire que ce champ soit de type "Dynamique".Pour effectuer une indirection sur un champ d'une page, l'option "Support des indirections (ralentit l'exécution)" doit être cochée (onglet "Détail" de la fenêtre de description du champ).
AndroidWidget AndroidJava Les indirections ne sont pas gérées sur les variables locales. Les indirections sont gérées uniquement sur les variables globales. Une indirection sur une variable locale d'un traitement provoquera l'erreur "élément inconnu".
Versions 16 et supérieures
Universal Windows 10 App Cette fonctionnalité est disponible pour les applications Windows Phone.
Nouveauté 16
Universal Windows 10 App Cette fonctionnalité est disponible pour les applications Windows Phone.
Universal Windows 10 App Cette fonctionnalité est disponible pour les applications Windows Phone.
Versions 17 et supérieures
iPhone/iPad Cette fonctionnalité est disponible pour les applications iPhone/iPad.
Nouveauté 17
iPhone/iPad Cette fonctionnalité est disponible pour les applications iPhone/iPad.
iPhone/iPad Cette fonctionnalité est disponible pour les applications iPhone/iPad.
Versions 18 et supérieures
Universal Windows 10 App Cette fonctionnalité est disponible en mode Windows Store apps.
Widget Android Cette fonctionnalité est disponible en mode Widget Android.
Nouveauté 18
Universal Windows 10 App Cette fonctionnalité est disponible en mode Windows Store apps.
Widget Android Cette fonctionnalité est disponible en mode Widget Android.
Universal Windows 10 App Cette fonctionnalité est disponible en mode Windows Store apps.
Widget Android Cette fonctionnalité est disponible en mode Widget Android.
Versions 21 et supérieures
Universal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
Apple Watch Cette fonctionnalité est disponible en mode Apple Watch.
Nouveauté 21
Universal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
Apple Watch Cette fonctionnalité est disponible en mode Apple Watch.
Universal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
Apple Watch Cette fonctionnalité est disponible en mode Apple Watch.
Exemple
// Indirection simple
{"NOM"} = NomCli                // Est équivalent à NOM=NomCli
{"NOM"} = {"CL.NOMCLI"}        // Est équivalent à NOM=CL.NOMCLI
{"FENCLI.NOM"} = NomCli        // Est équivalent à FENCLI.NOM=NomCli
{"FENCLI"+".NOM"} = NomCli        // Est équivalent à FENCLI.NOM=NomCli

// Indirection typée
{"Nom",indChamp} = NomCli

// Indirection avec un nom de fichier dans une variable
nNomFic est une chaîne = "Client"
{nNomFic + ".Nom"} = "Durand"
HAjoute({nNomFic})
// Indirection dans une procédure
NomChamp est une chaîne
NomChamp = "SAI_SAISIE1"                        // SAI_SAISIE1 est le nom du champ
// Appel d'une procédure rendant un champ invisible
Rend_Invisible(NomChamp)

PROCEDURE Rend_Invisible(NChamp)
{NChamp}..Etat = Invisible
// Indirection avec variable
NomAlias est une chaîne
NomAlias = FenPrécédente()
// NOM est le nom du champ
// NomCli est la valeur à affecter
{NomAlias+".NOM"} = NomCli
Abrev est une chaîne
NomRub est une chaîne
{Abrev+"."+NomRub} = NomCli
{Abrev+"."+NomRub} = {NomChamp}
// Déclaration d'une classe avec deux membres
Maclasse est une Classe
Membre1 est une chaîne
Membre2 est une chaîne
// Affichage de la valeur d'un membre
PROCEDURE GLOBALE AfficheMembre(Numéro)
// Récupération de la valeur du membre global choisi
Valeur est une chaîne = {"::Membre"+Numéro}
Info(Valeur)
Versions 16 et supérieures
c est un cWord
var est une Description de Variable
Def est une Définition

Def = RécupèreDéfinition(c)
// Récupère la 2ème variable de la classe : version de Word
var = Def..Variable[2]

Trace(var..Nom) // Affiche le nom de la variable
Trace("Version de Word: ",{c, var}) // Affiche la version de Word
Nouveauté 16
c est un cWord
var est une Description de Variable
Def est une Définition

Def = RécupèreDéfinition(c)
// Récupère la 2ème variable de la classe : version de Word
var = Def..Variable[2]

Trace(var..Nom) // Affiche le nom de la variable
Trace("Version de Word: ",{c, var}) // Affiche la version de Word
c est un cWord
var est une Description de Variable
Def est une Définition

Def = RécupèreDéfinition(c)
// Récupère la 2ème variable de la classe : version de Word
var = Def..Variable[2]

Trace(var..Nom) // Affiche le nom de la variable
Trace("Version de Word: ",{c, var}) // Affiche la version de Word
Syntaxe

Indirection simple Masquer les détails

{ <Expression> }
<Expression> : Chaîne de caractères
Expression permettant d'identifier le champ, la variable ou la rubrique à manipuler. L'élément est tout d'abord recherché :
  • parmi les variables,
  • selon le nombre de points dans le nom :
    • 0 point : recherche parmi les champs, puis les rubriques HFSQL.
    • 1 point : recherche parmi les rubriques HFSQL, les champs, puis les paramètres de requête.
    • supérieur à 1 point : recherche parmi les champs.
  • parmi les éléments spéciaux conservés par compatibilité (par exemple _Ongletx, ...).
Si cette expression correspond à une chaîne vide (""), une erreur du WLangage est générée.

Indirection sur un membre de classe Masquer les détails

{ <Expression> }
<Expression> : Chaîne de caractères
Expression permettant d'identifier le membre de la classe.
Si le membre est :
  • global, utilisez la syntaxe suivante : {" :: NomDuMembre"}
  • n'est pas global, utilisez la syntaxe suivante : {" : NomDuMembre"}
Si cette expression correspond à une chaîne vide (""), une erreur du WLangage est générée.
Versions 16 et supérieures

Indirection sur un membre de classe Masquer les détails

{ <Classe> , <Membre> }
<Classe> : Chaîne de caractères
Instance de la classe
<Membre> : Chaîne de caractères ou variable de type Description de variable
Correspond :
Nouveauté 16

Indirection sur un membre de classe Masquer les détails

{ <Classe> , <Membre> }
<Classe> : Chaîne de caractères
Instance de la classe
<Membre> : Chaîne de caractères ou variable de type Description de variable
Correspond :

Indirection sur un membre de classe Masquer les détails

{ <Classe> , <Membre> }
<Classe> : Chaîne de caractères
Instance de la classe
<Membre> : Chaîne de caractères ou variable de type Description de variable
Correspond :

Indirection en spécifiant le type de l'élément (optimise la vitesse d'exécution) Masquer les détails

{ <Expression>, <Type> }
<Expression> : Chaîne de caractères
Expression permettant d'identifier le champ, la variable ou la rubrique à manipuler. Si cette expression correspond à une chaîne vide (""), une erreur du WLangage est générée.
<Type> : Constante
Constante permettant de préciser le type de l'élément recherché :
indChampÉlément recherché parmi les champs et les groupes.
indConnexionÉlément recherché parmi les connexions.
indEtatÉlément recherché parmi les états.
PHP Cette constante n'est pas disponible en PHP.
indFenêtreÉlément recherché parmi les fenêtres.
PHP Cette constante n'est pas disponible en PHP.
indFichierÉlément recherché parmi les fichiers.
indGPWÉlément recherché parmi les éléments du groupware utilisateur (permet de récupérer l'état initial des champs).
PHP Cette constante n'est pas disponible en PHP.
indLiaisonÉlément recherché parmi les liaisons.
PHP Cette constante n'est pas disponible en PHP.
indParamètreRequête Élément recherché parmi les paramètres des requêtes.
indRubriqueÉlément recherché parmi les rubriques.
indVariableÉlément recherché parmi les variables.
PHP L'élément est recherché uniquement parmi les variables globales.
indPageÉlément recherché parmi les pages.
PHP Seule la page courante est accessible.
Remarques

Quand utiliser l'indirection ?

L'indirection peut être utilisée par exemple :
  • Pour accéder à la valeur d'un élément (champ, variable, rubrique, ...) :
    {s_NomChamp} = 10
    ValeurChamp = {s_NomChamp}
  • Pour utiliser une propriété :
    {s_NomChamp}..Hauteur = 10
  • Pour manipuler une colonne d'une table mémoire :
    {s_NomColonne, indChamp}[Numéro_Ligne] = 10
  • Pour manipuler une colonne d'une table :
    {s_NomTable + "." +s_NomColonne, indChamp}[Numéro_Ligne] = 10
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsAndroidWidget AndroidiPhone/iPadWindows MobileUniversal Windows 10 AppJavaCode Utilisateur (MCU)

Désigner l'objet en cours

Pour désigner l'objet en cours, utilisez les mots-clés suivants :
  • MoiMême : le champ en cours
  • MaFenêtre : la fenêtre en cours
  • MaPage : la page en cours
    AndroidWidget AndroidiPhone/iPadUniversal Windows 10 AppJava Ce mot-clé n'est pas disponible.
  • MonEtat : l'état en cours
    AndroidWidget AndroidJava Ce mot-clé n'est pas disponible.
  • MaSource : la source de données courante.
  • MonFichier : le fichier qui a déclenché le trigger en cours.
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsiPhone/iPadWindows MobileUniversal Windows 10 AppJavaCode Utilisateur (MCU)

Indirection sur une structure

Une indirection ne peut pas contenir un accès à une structure ou à une instance de classe. Cependant, il est possible d'utiliser la syntaxe suivante :
{<Variable structure>} : membre
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsiPhone/iPadWindows MobileUniversal Windows 10 AppJavaCode Utilisateur (MCU)

Utiliser l'indirection sur les chemins dans un document XML

Il est possible d'utiliser les opérateurs d'indirection pour construire le chemin d'un élément dans un document XML.
Exemple :
sDocXML est une chaîne = [
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<InfoVersion>
<Version>21</Version>
<Millesime>2016</Millesime>
</InfoVersion>
</Document>
]

xmlExemple est un xmlDocument = XMLOuvre(sDocXML, depuisChaîne)

sParam est une chaîne = "WinDev_Param"

// Lecture directe d'une information ...
Trace(xmlExemple.Document.InfoVersion.Version)

// Lecture avec une partie du chemin XML contenu dans une variable
// (idem si rubrique d'un fichier, paramètre d'une fenêtre, méthode, ...)
sParamètre est une chaîne = "InfoVersion"
Trace ({"xmlExemple.Document." + sParamètre + ".Version"})
WINDEVWEBDEV - Code ServeurEtats et RequêtesWindowsiPhone/iPadWindows MobileUniversal Windows 10 AppJavaCode Utilisateur (MCU)

Limitations

L'opérateur d'indirection permet de retrouver un élément par son nom.
Les opérations suivantes ne sont donc pas autorisées dans une indirection :
  • accès à un membre d'une instance de classe ou de structure autre que l'instance de classe courante (opérateurs : et :: ).
  • accès à un sous-élément de champ ou de tableau (opérateur [] ).
  • accès à une sous-partie de chaîne (opérateur [[]] ).
  • accès à une propriété (opérateur ..).
  • indirection (opérateur { } ).
  • appel de procédure ou de méthode d'objet Automation.
  • déclaration de variable.
Remarques :
  • Les opérateurs d'accès sur un élément (opérateurs : et [] et [[]] et .. ) peuvent être utilisés sur l'élément obtenu par indirection. Quelques exemples :
    { <indirection> } : membre

    { <indirection> } [ indice ]

    { <indirection> } [[ indice ]]

    { <indirection> }..propriété
  • Pour appeler une procédure connue par son nom, utilisez les fonctions Exécute ou ExécuteTraitement.
  • Pour combiner ces opérations de manière dynamique, il est possible d'utiliser la compilation dynamique (voir la fonction Compile).
Java

Indirections en Java

Les indirections ne sont pas gérées sur les variables locales.
Liste des exemples associés :
Les indirections Exemples unitaires (WINDEV) : Les indirections
[ + ] Manipulation des indirections à l'aide des opérateurs { et }.
Les opérateurs { et } permettent d'accéder à un champ ou une rubrique de fichier en construisant dynamiquement le nom du champ ou le nom de la rubrique.
Ce programme réalisé avec WINDEV met en œuvre le mécanisme d'indirection sur les champs des fenêtres pour gérer le "Undo-Redo" et le "couper-copier-coller" de manière générique.
Les indirections Exemples unitaires (WEBDEV) : Les indirections
[ + ] Utilisation des indirections sur une variable.

Il est à noter que les indirections sont possibles sur les champs, les rubriques, les liaisons, etc. Le principe est identique à celui présenté dans cet exemple.
Les indirections Exemples unitaires (WINDEV Mobile) : Les indirections
[ + ] Utilisation des opérateurs d'indirection { et }.
Les opérateurs { et } permettent d'accéder à un champ ou une rubrique de fichier en construisant dynamiquement le nom du champ ou le nom de la rubrique.
Cet exemple met en œuvre le mécanisme d'indirection sur les champs des fenêtres pour gérer le "Undo-Redo" et le "couper-copier-coller" de manière générique.
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
indirection pour déterminer la page courante
Voici un autre exemple :

{PageCourante()+".BTN_Début"}..visible = Vrai

Cela peut être utile lorsqu'il y a un bouton BTN_Début dans toutes les pages (webdev), et qu'on souhaite avoir une procédure globale pour gérer la visibilité ou toute autre propriété.
CV
09 nov. 2017
Webdev : indirections dans le code d'initialisation de la page
Pour que les indirections fonctionnent dans le code d'initialisation d'une page, il faut que les champs soient mis en type "Dynamique".

En effet, il semble que si les champs sont mis en Type "Automatique", Webdev ne peut détecter qu'ils sont dynamiques qu'après des utilisations directes de leur propriété (une indirection ne suffit donc pas pour que Webdev comprenne qu'ils sont dynamiques, ce qui est somme toute assez logique).

Arnaud BENHAMDINE (
23 juin 2013