Gestion de variables accessibles à l'ensemble d'une application

Il est souvent utile de gérer lors de l'exécution d'une application Paradox des informations caractéristiques de celle-ci. Par exemple, si vous utilisez un mécanisme d'identification des utilisateurs, le nom de l'utilisateur qui travaille est à conserver. On peut également mémoriser la date de travail (dans certaines applications, il peut être utile de désynchroniser la date de travail pour l'utilisateur de la date machine) ainsi que certaines caractéristiques techniques (utilisation ou non des fichiers distribués, fonctionnement en run-time, ...) ou applicatives (seuil d'autorisation lié à l'utilisateur, ...).

 

Une première solution consiste à stocker ces données dans des tables localisées:

- dans un répertoire privé de l'utilisateur, ou

- dans un répertoire partagé, l'identifiant de l'enregistrement comprenant l'utilisateur.

 

Cette mémorisation en table est nécessaire si vous souhaitez conserver la valeur au-delà de l'exécution en cours de l'application, c'est-à-dire pouvoir réutiliser la valeur lors de la prochaine connexion de l'utilisateur.

 

Si en revanche vous n'avez pas besoin des informations ultérieurement, il est souvent plus pratique et plus performant de gérer ces informations directement en mémoire. De la même façon, si vous avez besoin fréquemment d'utiliser des informations stockées dans des tables mmais qui ne sont pas sujettes à modification, il peut être utile de stocker ces informations en mémoire.

Paradox n'offrant pas de variables globales rattachées à l'application en cours d'exécution, il est nécessaire de mettre en place par programmation un mécanisme similaire.

 

Pour cela, nous allons utiliser une des caractéristiques des librairies Paradox à savoir le fait qu'on a un seul chargement en mémoire d'une librairie pour une application Paradox en cours d'exécution.

La gestion en mémoire des librairies

On a, à un instant donné, pour une application Paradox donnée, au plus une version d'une librairie chargée en mémoire. Lorsqu'une fiche (ou un script, ou une autre librairie) demande l'ouverture d'une librairie déjà ouverte, Paradox se contente de réutiliser la librairie déjà ouverte. Vous pouvez réserver l'utilisation d'une bibliothèque à votre fiche en précisant le paramètre PrivateToForm lors de l'ouverture de votre librairie. Dans notre cas, nous souhaitons au contraire partager notre bibliothèque et surtout ce qui se trouvera dedans, ce qui correspond au paramètre GlobalToDeskTop, qui est la valeur par défaut.

Solution pour nos variables globales

Nous créons une librairie dont le rôle va être de stocker nos variables globales puis de nous les restituer lorsque nous le souhaiterons. Nous avons appeler cette bibliothèque gLibVar.

 

Dans le bloc de définition des variables de la bilbiothèque nous définissons un tableau dynamique qui nous permettra de stocker nos variables quels que soient leurs types et nous créons une métohde pour stocker une valeur de variable et une seconde méthode pour lire. Le nom de la variable sera utilisé comme clé de notre tableau dynamique. Pour simplifier la programmation, nous convertissons systématiquement les noms fournis en majuscule.

 

Voici le contenu de notre bibliothèque:


var
DYARAT DYNARRAY[] ANYTYPE
endvar

method varget_AT(const NomVariableST String) AnyType
 cette méthode retourne la valeur de la variable dont le nom est fourni par NomVariableST
 si la variable n'est pas connu, la méthode retourne blank
Return(DYARAT[upper(NomVariableST)]
endMethod

method varset(const NomVariableST String, Const ValeurVariableAT AnyType)
 cette méthode stocke la valeur fournie
DYARAT[NomVariableST] = ValeurVariableAT
endMethod

method varview()
 cette méthode vous permet de visualiser le contenu de vos variables globales
DYARAT.view()
endmethod

et dans nos fiches,scripts et autres librairies:


Uses ObjectPal
  VarGet_AT(Const NomVariableST String) AnyType
  VarSet(Const NomVariableST String, const ValeurAT AnyType)
enduses
var
  gvarlib Library
endvar

method init(var eventInfo Event)    initialisation de lafiche ou dans les méthodes open des scritps et librairies
  If not gvarvar.open(":alias:GVARLIB") then
    ErrorShow()
    RETURN(false)
Endif
endmethod

method ......
  gvarLib.varset("Test","Valeur de la variable Test")
  ....
  view(gvarlib.varget_AT("TEST"))
endmethod