PC SOFT

DOCUMENTATION EN LIGNE
DE WINDEV, WEBDEV ET WINDEV MOBILE

  • Principe
  • Déclaration et appel des procédures internes
  • Exemple
  • Caractéristiques des procédures internes
  • Utilisation en callback
  • Paramètre de type Procédure interne
  • Accès aux variables depuis une procédure interne
  • Imbrication de procédures internes
  • Procédures internes soeurs
  • Appels récursifs
  • Paramètres nommés
  • Cas particulier : Utilisation de procédures internes avec des fonctions asynchrones
  • Limitations
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
Principe
De nombreuses fonctionnalités nécessitent une procédure appelée une ou plusieurs fois au travers d'une fonction du WLangage (également appelée "Callback"). Par exemple, les fonctions suivantes sont dans ce cas : fListeFichier, ArbreListeFils, AlbumSélecteur en iOS, ...
Il est nécessaire de créer une procédure pour ces fonctions, mais de nombreux inconvénients apparaissent :
  • Perte de la localité du code : Il n'est pas possible de voir l'algorithme final dans son ensemble. Il est nécessaire de faire des aller-retour entre le code appelant et la procédure WLangage.
  • Difficulté de partage d'informations avec la procédure WLangage : Il est en général nécessaire d'utiliser des variables globales (pour passer des paramètres à la callback ou récupérer les résultats).
Dans ce cas, les procédures internes permettent de simplifier l'écriture des fonctionnalités à callback et de simplifier les problèmes posés par l'utilisation d'une procédure classique.
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.
Android Cette fonctionnalité est disponible pour les applications Android.
Widget Android Cette fonctionnalité est disponible en mode Widget Android.
Java Cette fonctionnalité est disponible pour les applications Java.
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.
Android Cette fonctionnalité est disponible pour les applications Android.
Widget Android Cette fonctionnalité est disponible en mode Widget Android.
Java Cette fonctionnalité est disponible pour les applications Java.
Universal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
Apple Watch Cette fonctionnalité est disponible en mode Apple Watch.
Android Cette fonctionnalité est disponible pour les applications Android.
Widget Android Cette fonctionnalité est disponible en mode Widget Android.
Java Cette fonctionnalité est disponible pour les applications Java.
Déclaration et appel des procédures internes
La déclaration d'une procédure interne se fait directement dans le code d'un traitement existant (traitement associé à un champ, procédure de fenêtre, procédure globale ou méthode de classe, ...).
La syntaxe est la suivante :
PROCEDURE INTERNE <Nom de la procédure>()
<Code de la procédure>
FIN
Remarques :
  • Les procédures internes doivent être déclarées dans le traitement dans lequel elles sont utilisées.
  • Versions 23 et supérieures
    L'assistance à la saisie des paramètres est activée : une bulle d'aide précisant le type du paramètre attendu est affichée lors de la saisie de l'appel de la procédure interne.
    Nouveauté 23
    L'assistance à la saisie des paramètres est activée : une bulle d'aide précisant le type du paramètre attendu est affichée lors de la saisie de l'appel de la procédure interne.
    L'assistance à la saisie des paramètres est activée : une bulle d'aide précisant le type du paramètre attendu est affichée lors de la saisie de l'appel de la procédure interne.
  • Le code du traitement situé avant et après le code de déclaration de la procédure interne est exécuté en séquence : le code de la procédure interne n'est pas exécuté.
    Exemple :
    // Code avant la procédure Interne : Ce code est exécuté.
    PROCEDURE INTERNE MaProcédureInterne()
    // Code de la procédure interne.
    // Ce code n'est pas exécuté.
    FIN
    // Code après la procédure interne : Ce code est exécuté.
  • Il est possible d'appeler directement une procédure interne par son nom, comme pour une procédure classique. Cet appel peut être placé avant ou après la déclaration de la procédure interne.
    Exemple :
    // Appel placé avant
    MaProcédureInterne()

    // Déclaration de la procédure interne
    PROCEDURE INTERNE MaProcédureInterne()
    // Code de la procédure interne exécuté lors de l'appel à MaProcédureInterne()
    FIN

    // Appel placé après
    MaProcédureInterne()

    Il est ainsi possible d'obtenir un code plus simple à lire.
  • Les exceptions provoquées par les procédures internes peuvent être traitées à l'extérieur de la procédure interne.
WINDEVWEBDEV - Code ServeurWindows Mobile

Exemple

Le code suivant permet de lister tous les éléments fils d'un noeud d'un champ Arbre :
// Liste les "fils" du noeud "Desserts" dans l'arbre "ARBRE_RecetteTV"
// La procédure "DérouleTout" est appelée
// pour chaque "fils" trouvé du noeud "Desserts"
Res = ArbreListeFils(ARBRE_RecetteTV, "Recettes" + TAB + "Desserts", DérouleTout)


PROCEDURE INTERNE DérouleTout(ARBRE_RecetteTV, CheminFils, FilsTrouvé, Niveau, Pointeur)
// L'élément trouvé est-il une feuille ?
SI ArbreTypeElément(ARBRE_RecetteTV, CheminFils + FilsTrouvé) = aFeuille ALORS
RETOUR // Retour à la fonction ArbreListeFils
SINON
// L'élément trouvé est-il enroulé ?
SI ArbreEtat(ARBRE_RecetteTV, CheminFils + FilsTrouvé) = aEnroule ALORS
ArbreDéroule(ARBRE_RecetteTV, CheminFils + FilsTrouvé)
FIN
FIN
// Enroule l'arbre
ArbreEnroule(ARBRE_RecetteTV, "Recettes")
FIN
Caractéristiques des procédures internes

Utilisation en callback

La procédure interne peut être utilisée dans une fonction du WLangage qui attend une procédure WLangage en paramètre (comme fListeFichier, ArbreListeFils, ...).
Attention : Dans ce cas, le paramètre correspondant au nom de la procédure interne doit correspondre directement au nom de la procédure interne (le nom de la procédure ne doit pas être entre guillemets).
Ne pas faire :
// Liste les "fils" du noeud "Desserts" dans l'arbre "ARBRE_RecetteTV"
Res = ArbreListeFils(ARBRE_RecetteTV, "Recettes" + TAB + "Desserts", "DérouleTout")

PROCEDURE INTERNE DérouleTout(ARBRE_RecetteTV, CheminFils, FilsTrouvé, Niveau, Pointeur)
...
FIN
Faire :
// Liste les "fils" du noeud "Desserts" dans l'arbre "ARBRE_RecetteTV"
Res = ArbreListeFils(ARBRE_RecetteTV, "Recettes" + TAB + "Desserts", DérouleTout)

PROCEDURE INTERNE DérouleTout(ARBRE_RecetteTV, CheminFils, FilsTrouvé, Niveau, Pointeur)
...
FIN

Paramètre de type Procédure interne

La procédure interne peut être utilisée comme paramètre dans une procédure. Dans ce cas le type du paramètre sera de type "Procédure".
Exemple :
// Déclaration de la procédure interne
PROCEDURE INTERNE MaProcédureInterne()
// code exécuté lors de l'appel de la procédure passée en paramètre
FIN

MonAutreProcédure(MaProcédureInterne)
PROCEDURE MonAutreProcédure(p est une Procédure)

p()
AndroidWidget AndroidJava Cette fonctionnalité n'est pas disponible.

Accès aux variables depuis une procédure interne

Les variables déclarées dans le même traitement que la déclaration de la procédure interne peuvent être appelées dans la procédure interne. Il n'est plus nécessaire d'utiliser des variables globales. Ce concept est appelé "Closure".
Exemple :
sListeElément est une chaîne
sSéparateur est une chaîne = RC
ArbreListeFils(ARBRE_ChampArbre, "", MaProcédureInterne)

PROCEDURE INTERNE MaProcédureInterne(NomArbre, Branche)
sListeElément += [sSéparateur] + Branche
FIN

Imbrication de procédures internes

Les procédures internes peuvent être imbriquées. Chaque procédure interne peut accéder aux variables des procédures qui l'incluent.
Exemple :
VariableExterne est un entier
Trace(VariableExterne)
MaProcédureInterne1()
PROCEDURE INTERNE MaProcédureInterne1()
VariableInterne1 est un entier
Trace(VariableExterne + VariableInterne1)
MaProcédureInterne2()
PROCEDURE INTERNE MaProcédureInterne2()
VariableInterne2 est un entier
Trace(VariableExterne + VariableInterne1 + VariableInterne2)
FIN
FIN
Versions 23 et supérieures

Procédures internes soeurs

Deux procédures internes présentes dans la même procédure peuvent s'appeler entre elles (procédures internes soeurs).
Exemple :
PROCÉDURE INTERNE MaProcédurePrincipale()

PROCÉDURE INTERNE MaProcédureInterne1()
...
FIN

PROCÉDURE INTERNE MaProcédureInterne2()
...
// Appel de la procédure soeur
MaProcédureInterne1()
FIN
FIN
Nouveauté 23

Procédures internes soeurs

Deux procédures internes présentes dans la même procédure peuvent s'appeler entre elles (procédures internes soeurs).
Exemple :
PROCÉDURE INTERNE MaProcédurePrincipale()

PROCÉDURE INTERNE MaProcédureInterne1()
...
FIN

PROCÉDURE INTERNE MaProcédureInterne2()
...
// Appel de la procédure soeur
MaProcédureInterne1()
FIN
FIN

Procédures internes soeurs

Deux procédures internes présentes dans la même procédure peuvent s'appeler entre elles (procédures internes soeurs).
Exemple :
PROCÉDURE INTERNE MaProcédurePrincipale()

PROCÉDURE INTERNE MaProcédureInterne1()
...
FIN

PROCÉDURE INTERNE MaProcédureInterne2()
...
// Appel de la procédure soeur
MaProcédureInterne1()
FIN
FIN
Versions 23 et supérieures

Appels récursifs

Une procédure interne peut s'appeler elle-même de façon récursive.
Nouveauté 23

Appels récursifs

Une procédure interne peut s'appeler elle-même de façon récursive.

Appels récursifs

Une procédure interne peut s'appeler elle-même de façon récursive.
Versions 23 et supérieures

Paramètres nommés

Si une procédure interne possède des paramètres avec des valeurs par défaut, il est possible d'appeler la procédure interne en nommant ses paramètres. Deux syntaxes sont possibles :
  • Paramètres nommés monolignes,
  • Paramètres nommés multilignes.
Pour plus de détails, consultez Paramètres nommés dans une procédure.
Nouveauté 23

Paramètres nommés

Si une procédure interne possède des paramètres avec des valeurs par défaut, il est possible d'appeler la procédure interne en nommant ses paramètres. Deux syntaxes sont possibles :
  • Paramètres nommés monolignes,
  • Paramètres nommés multilignes.
Pour plus de détails, consultez Paramètres nommés dans une procédure.

Paramètres nommés

Si une procédure interne possède des paramètres avec des valeurs par défaut, il est possible d'appeler la procédure interne en nommant ses paramètres. Deux syntaxes sont possibles :
  • Paramètres nommés monolignes,
  • Paramètres nommés multilignes.
Pour plus de détails, consultez Paramètres nommés dans une procédure.
Cas particulier : Utilisation de procédures internes avec des fonctions asynchrones
Les procédures internes peuvent être utilisées comme "Callback" pour des fonctions asynchrones.
ATTENTION : Dans ce cas, le code situé après l'appel de la fonction utilisant une procédure WLangage asynchrone sera exécuté AVANT le code de la procédure Interne.
Exemple : Dans cet exemple pour Windows Mobile, le code situé après la fonction AlbumSélecteur sera exécuté AVANT la procédure interne. La procédure interne sera appelée lorsque l'utilisateur aura validé le sélecteur.
AlbumSélecteur(albumImage, SélectionPhoto)
PROCEDURE INTERNE SélectionPhoto(sCheminImage)
IMG_ChampImage = sCheminImage
FIN
// Code exécuté après la fonction AlbumSélecteur mais
// AVANT le code de la procédure interne.
Limitations
  • Une procédure interne ne peut pas avoir le même nom que la ou les procédures qui la contiennent.
  • Deux procédures internes de même niveau ne peuvent pas avoir le même nom, même si elles sont déclarées dans des blocs de code différents (SI ALORS SINON, ...).
  • Les procédures internes ne sont pas disponibles en compilation dynamique.
  • Il n'est pas possible d'automatiser l'exécution d'une procédure interne.
  • La gestion automatique des erreurs n'est pas disponible sur les procédures internes.
  • Un traitement ou une procédure interne ne peut appeler que ses procédures internes directes. En particulier, une procédure interne ne peut pas appeler une procédure interne de même niveau.
Version minimum requise
  • Version 20
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire