1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

Les procédures internes

Discussion dans 'Windev' créé par gapplicat, Avr 15, 2018.

  1. gapplicat

    gapplicat Well-Known Member
    MEMBRE WX

    Inscrit:
    Mar 8, 2018
    Messages:
    399
    J'aime reçus:
    707
    Souvent, le WLangage profite d'améliorations conséquentes qui lui redonne un petit goût de nouveauté.

    Les

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    fait partie de ces évolutions qui changent la donne.

    Avant d'expliquer plus en détail, rappelons que dans windev, on a plusieurs types de procédures :

    • Les

      Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

      . Elles sont stockées dans une collection de procédures (fichier *.wdg) et elles peuvent être appelées de n'importe où dans le projet.
    • Les

      Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

      . Stockées dans les fenêtres (fichier *.wdw) et elles peuvent être appelées de n'importe où dans le code de la fenêtre. Elles ne peuvent pas être utilisées ailleurs.
    • Les méthodes. Ce sont des procédures associées à une classe (fichier *.wdc). Elles peuvent être locales ou globales, publique, protégée ou privée. Mais là, on rentre dans le domaine de la

      Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

      (Programmation Orientée Objet) et ce n'est pas le sujet de l'article et je suis pas superfort de ce coté...
    • Les procédures compilées dynamiquement. On utilise la fonction

      Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

      .
    • Les procédures appelées à la suite d'un événement sur un champ de l'application.
    Et maintenant, nous avons les procédures internes qui peuvent être définie et utilisée dans les autres types de procédures citées précédemment. Mais elle peut aussi être définie dans une autre procédure interne.

    Comment ça marche ?
    Un petit exemple étant plus efficace qu'une longue présentation, voici un exemple de procédure interne :

    Code (Text):

    PROCEDURE ProLoc()
       PROCEDURE INTERNE ProInt()
           RENVOYER "Hello world"
       FIN

       Trace(ProInt())
     
    On définit ici une procédure locale qui s'appelle ProLoc et dans celle-ci, on définit la procédure interne ProInt.

    Dans quel cas s'en sert-on ?
    On s'en sert dans plusieurs cas.

    Tout d'abord, on peut s'en servir pour avoir un joli code bien écrit, autodocumenté (si vous ne connaissez pas ce terme, il faudra que je fasse un article dessus) et qui respecte la convention DRY (Don't Repeat Yourself, un autre article à prévoir).

    Le code suivant :
    Code (Text):

    PROCEDURE ProcédureLocale()
       POUR i = 1 _A_ 10
           Trace(i)
           Trace(i * i)
           Trace(Racine(i + 1))
       FIN

       POUR i = 30 _A_ 40
           Trace(i)
           Trace(i * i)
           Trace(Racine(i + 1))
       FIN

       POUR i = 80 _A_ 100
           Trace(i)
           Trace(i * i)
           Trace(Racine(i + 1))
       FIN
     
    devient

    Code (Text):

    PROCEDURE ProcédureLocale()
       PROCEDURE INTERNE TracerEntierSousToutesCesFormes(pEntier est entier)
           Trace(pEntier)
           Trace(pEntier * pEntier)
           Trace(Racine(pEntier + 1))
       FIN

       POUR i = 1 _A_ 10
           TracerEntierSousToutesCesFormes(i)
       FIN

       POUR i = 30 _A_ 40
           TracerEntierSousToutesCesFormes(i)
       FIN

       POUR i = 80 _A_ 100
           TracerEntierSousToutesCesFormes(i)
       FIN
     
    Le code devient ainsi plus clair, et on évite les répétitions...

    Plusieurs pièges vous attendent lors de l'utilisation des procédures internes. Voici le premier.

    Une procédure interne ne peut pas appeler une autre procédure interne définie au même niveau qu'elle (mais elle peut s'auto-appeler)
    Code (Text):

    PROCEDURE ProcédureLocale()
       PROCEDURE INTERNE PasLeDroit()
           Trace("Hello world")
       FIN

       PROCEDURE INTERNE Test()
           PasLeDroit()  // Cela ne fonctionne pas
       FIN

       Test()
     
    Mais on peut s'en sortir en utilisant une variable de type

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    . En effet, une procédure interne est une procédure avant tout.

    Notez que je préfixe le nom des procédures internes par un i dans mon exemple pour les distinguer des variables de type procédure.

    Code (Text):


    PROCEDURE ProcédureLocale()
       PasLeDroit est une procédure

       PROCEDURE INTERNE iPasLeDroit()
           Trace("Hello world")
       FIN
       PasLeDroit = iPasLeDroit

       PROCEDURE INTERNE iTest()
           PasLeDroit()  // Cela fonctionne
       FIN

       iTest()
     
     
  2. commun

    commun Active Member
    MEMBRE WX

    Inscrit:
    Jan 1, 2018
    Messages:
    225
    J'aime reçus:
    110
    depuis la version 23 on peut appeler une procédure interne a partir d'une autre de même niveau
     
    joker apprécie ceci.
  3. Deft54

    Deft54 Active Member
    MEMBRE WX

    Inscrit:
    Avr 3, 2018
    Messages:
    63
    J'aime reçus:
    56

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Souvent, le WLangage profite d'améliorations conséquentes qui lui redonne un petit goût de nouveauté.

    Les

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    fait partie de ces évolutions qui changent la donne.

    Avant d'expliquer plus en détail, rappelons que dans windev, on a plusieurs types de procédures :

    • Les

      Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

      . Elles sont stockées dans une collection de procédures (fichier *.wdg) et elles peuvent être appelées de n'importe où dans le projet.
    • Les

      Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

      . Stockées dans les fenêtres (fichier *.wdw) et elles peuvent être appelées de n'importe où dans le code de la fenêtre. Elles ne peuvent pas être utilisées ailleurs.
    • Les méthodes. Ce sont des procédures associées à une classe (fichier *.wdc). Elles peuvent être locales ou globales, publique, protégée ou privée. Mais là, on rentre dans le domaine de la

      Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

      (Programmation Orientée Objet) et ce n'est pas le sujet de l'article et je suis pas superfort de ce coté...
    • Les procédures compilées dynamiquement. On utilise la fonction

      Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

      .
    • Les procédures appelées à la suite d'un événement sur un champ de l'application.
    Et maintenant, nous avons les procédures internes qui peuvent être définie et utilisée dans les autres types de procédures citées précédemment. Mais elle peut aussi être définie dans une autre procédure interne.

    Comment ça marche ?
    Un petit exemple étant plus efficace qu'une longue présentation, voici un exemple de procédure interne :

    Code (Text):

    PROCEDURE ProLoc()
       PROCEDURE INTERNE ProInt()
           RENVOYER "Hello world"
       FIN

       Trace(ProInt())
     
    On définit ici une procédure locale qui s'appelle ProLoc et dans celle-ci, on définit la procédure interne ProInt.

    Dans quel cas s'en sert-on ?
    On s'en sert dans plusieurs cas.

    Tout d'abord, on peut s'en servir pour avoir un joli code bien écrit, autodocumenté (si vous ne connaissez pas ce terme, il faudra que je fasse un article dessus) et qui respecte la convention DRY (Don't Repeat Yourself, un autre article à prévoir).

    Le code suivant :
    Code (Text):

    PROCEDURE ProcédureLocale()
       POUR i = 1 _A_ 10
           Trace(i)
           Trace(i * i)
           Trace(Racine(i + 1))
       FIN

       POUR i = 30 _A_ 40
           Trace(i)
           Trace(i * i)
           Trace(Racine(i + 1))
       FIN

       POUR i = 80 _A_ 100
           Trace(i)
           Trace(i * i)
           Trace(Racine(i + 1))
       FIN
     
    devient

    Code (Text):

    PROCEDURE ProcédureLocale()
       PROCEDURE INTERNE TracerEntierSousToutesCesFormes(pEntier est entier)
           Trace(pEntier)
           Trace(pEntier * pEntier)
           Trace(Racine(pEntier + 1))
       FIN

       POUR i = 1 _A_ 10
           TracerEntierSousToutesCesFormes(i)
       FIN

       POUR i = 30 _A_ 40
           TracerEntierSousToutesCesFormes(i)
       FIN

       POUR i = 80 _A_ 100
           TracerEntierSousToutesCesFormes(i)
       FIN
     
    Le code devient ainsi plus clair, et on évite les répétitions...

    Plusieurs pièges vous attendent lors de l'utilisation des procédures internes. Voici le premier.

    Une procédure interne ne peut pas appeler une autre procédure interne définie au même niveau qu'elle (mais elle peut s'auto-appeler)
    Code (Text):

    PROCEDURE ProcédureLocale()
       PROCEDURE INTERNE PasLeDroit()
           Trace("Hello world")
       FIN

       PROCEDURE INTERNE Test()
           PasLeDroit()  // Cela ne fonctionne pas
       FIN

       Test()
     
    Mais on peut s'en sortir en utilisant une variable de type

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    . En effet, une procédure interne est une procédure avant tout.

    Notez que je préfixe le nom des procédures internes par un i dans mon exemple pour les distinguer des variables de type procédure.

    Code (Text):


    PROCEDURE ProcédureLocale()
       PasLeDroit est une procédure

       PROCEDURE INTERNE iPasLeDroit()
           Trace("Hello world")
       FIN
       PasLeDroit = iPasLeDroit

       PROCEDURE INTERNE iTest()
           PasLeDroit()  // Cela fonctionne
       FIN

       iTest()
     
    Cliquez pour agrandir...
    Très bonnes explications très détaillées
    Merci

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    ;-)
     
  • joker

    joker New Member
    MEMBRE WX

    Inscrit:
    Jan 30, 2018
    Messages:
    0
    J'aime reçus:
    13

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    depuis la version 23 on peut appeler une procédure interne a partir d'une autre de même niveau
    Cliquez pour agrandir...
    Oui :
    C'est à partir de la 6ième minute concernant les nouveautés sur les procédures :

     
  • Partager cette page

    Chargement...