Depuis la version 20, les traitements d'une fenêtre, d'un bouton, d'une procédure, peuvent inclure une procédure interne. Très pratique, elles facilitent considérablement les traitements notamment lorsqu'une call-back est nécessaire. Elles évitent de multiplier les créations de procédures globales ou locales à l'élément en cours.


Une caractéristique majeure de ces procédures internes, est d'avoir une mémorisation automatique des variables locales du traitement qui contient et appelle la procédure interne. Lorsque le code est exécuté, au passage sur l'appel de la procédure interne, toutes les variables sont mémorisées. Si l'appel de la procédure interne est immédiat, cela a peu d'incidence. Mais si l'appel de la procédure interne est différé :

  • appel par un timer,
  • ou call-back d'une API,
  • ou fonction Wlangage attendant une procédure,

là en revanche cette mémorisation du contexte (l'environnement lexical) sera primordiale : les traitements de la procédure interne qui accèdent aux variables locales auront les valeurs qu'elles avaient dans le traitement hôte au passage sur la ligne de l'appel. C'est le principe de "closure'".


Pas évident à appréhender si l'on est pas familiarisé avec ce principe... C'est bien mieux de voir par une exécution réelle, voici un exemple de code :


Le mode opératoire suivant permet sa mise en oeuvre très simplement dans un projet quelconque :

  • dans une fenêtre placer dans le code de déclaration des globales la variable suivante :

    gnCompteur est un entier

  • ajouter un bouton avec le code suivant :

nVarLocaleBouton est un entier
gnCompteur++
nVarLocaleBouton = gnCompteurTrace("Clic, la procédure interne sera lancée dans 10 secondes avec nVarLocaleBouton = "+nVarLocaleBouton)
TimerSys(ProcedureInterneExemple,1000)

PROCEDURE INTERNE ProcedureInterneExemple()
FinTimerSys()
Info("Lors du clic sur le bouton il y a 10 secondes on avait ", "nVarLocaleBouton = " + nVarLocaleBouton, "Pourtant à cet instant le compteur global gnCompteur qui a servi à affecter nVarLocaleBouton vaut "+gnCompteur)
FIN

 

  • exécuter la fenêtre (Go), et faire quelques clics, attendre 10 secondes, et le mécanisme s'éclaircit !


Ce principe est également illustré dans ce billet :

< Retour

1 commentaire

Olivier
02/07/2017 - 04:33 - Répondre
Après avoir coller le code dans le clic d'un bouton, une erreur survient : gnCompteurTrace n'est pas possible dans le code. Solution : Placez le curseur entre le "r" et le "T" de gnCompteurTrace et appuyer sur la touche [entrée]

Publier un commentaire : 
Votre adresse email ne sera pas publiée