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
  • 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
WINDEVWINDEV MobileUniversal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
WINDEV MobileApple Watch Cette fonctionnalité est disponible en mode Apple Watch.
WINDEV MobileAndroid Cette fonctionnalité est disponible pour les applications Android.
WINDEV MobileWidget Android Cette fonctionnalité est disponible en mode Widget Android.
WINDEVJava Cette fonctionnalité est disponible pour les applications Java.
Nouveauté 21
WINDEVWINDEV MobileUniversal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
WINDEV MobileApple Watch Cette fonctionnalité est disponible en mode Apple Watch.
WINDEV MobileAndroid Cette fonctionnalité est disponible pour les applications Android.
WINDEV MobileWidget Android Cette fonctionnalité est disponible en mode Widget Android.
WINDEVJava Cette fonctionnalité est disponible pour les applications Java.
WINDEVWINDEV MobileUniversal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
WINDEV MobileApple Watch Cette fonctionnalité est disponible en mode Apple Watch.
WINDEV MobileAndroid Cette fonctionnalité est disponible pour les applications Android.
WINDEV MobileWidget Android Cette fonctionnalité est disponible en mode Widget Android.
WINDEVJava 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.
  • 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
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, ...).
  • 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.
  • 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.
Version minimum requise
  • Version 20
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire