Objets globaux

Documentation – Objets globaux

Remarques préalables

Les objets renvoyés par une procédure de LambiqueGlobal – même s’ils sont typés dans LambiqueGlobal – doivent être associés à un objet dynamique ou à une interface.

Si on essaie de caster directement l’objet retourné, il est très courant que Windev génère une exception du type :

L’objet X dynamique n’est un objet X dynamique.

Le binding ne fonctionne pas avec les interfaces.

Il est parfois nécessaire de passer par une structure et un tableau de structure par exemple définis dans un présentateur pour alimenter une combo avec les valeurs d’une liste globale.

🔧 AGObjet

Les objets globaux sont structurés autour de la classe abstraite AGObjet, qui sert de base commune à deux types concrets :

  • MGInstance : pour les objets uniques globaux
  • MGListe : pour les listes métier globales
AGObjet est une Classe <abstraite>

  PROTÉGÉ
    m_sType est une chaîne           // Nom de l’énumération
    m_pclModele est un objet dynamique  // Instance injectée dynamiquement

FIN

📘 Énumérations disponibles

🔹 EGlobalInstance

Utilisée pour les objets uniques globaux (MGInstance)

EGlobalInstance est une Enumération
  GInstanceIndefinie   = "[Instance indéfinie]"
  GConnexion           = "Connexion"
  GMonEntite           = "MonEntite"
  GUtilisateurCourant  = "UtilisateurCourant"
FIN

🔸 EGlobalListe

Utilisée pour les listes métier globales (MGListe)

EGlobalListe est une Enumération
GListeIndefinie		= "[Liste indéfinie]"
GCouleurListe		= "Couleur"
GCSSListe		= "CSS"
GDeviseListe		= "Devise"
GGlobalVarListe		= "GlobalVar"
GLangueListe		= "Langue"
GStandardListe		= "Standard"
GTauxHoraireListe	= "TauxHoraire"
GUniteListe		= "Unite"
GUniteTypeListe		= "UniteType"
GUtilisateurListe	= "Utilisateur"
GMatiereCodeListe	= "MatiereCode"
GMatiereNuanceListe	= "MatiereNuance"
FIN

🔗 Intégration avec AGObjet

Le champ m_sType de chaque instance AGObjet contient la valeur de l’énumération correspondante. Cela permet d’identifier et retrouver dynamiquement chaque objet global dans un tableau ou dictionnaire :

SI MonObjetGlobal.m_sType = GUtilisateurListe ALORS
   // Cast dynamique vers MUtilisateurListe possible
FIN

✅ Avantages de cette approche

  • Accès typé aux objets globaux
  • Code plus lisible et structuré
  • Facilement extensible à d’autres objets globaux ou types
  • Isolation métier via injection dynamique

🔄 Alimentation des objets globaux

Pour que les objets globaux soient disponibles dans toute l’application, chaque module fonctionnel doit participer à leur initialisation.

📦 Collection de procédures COL_NomDuModule

Chaque module dispose d’une collection nommée typiquement COL_NomDuModule, qui regroupe les procédures nécessaires à son initialisation. Cette collection doit impérativement contenir une procédure :

PROCÉDURE InitialiserGGlobal()

Cette procédure est responsable de transmettre à LambiqueGlobal les objets globaux que le module souhaite rendre disponibles.

🧩 Exemple d’implémentation

GGlobal.ActualiserGListe(GUtilisateurListe, new MUtilisateurListe)
GGlobal.ActualiserGListe(GUniteListe, new MUniteListe)
GGlobal.ActualiserGListe(GUniteTypeListe, new MUniteListe)
GGlobal.ActualiserGListe(GGlobalVarListe, new MGlobalVarListe)
  • Premier argument : valeur de l’énumération EGlobalListe
  • Deuxième argument : instance concrète d’une classe dérivée de AGObjet
💡 Remarque : Ces appels doivent être faits dans la procédure InitialiserGGlobal propre à chaque module, afin de garantir une initialisation cohérente et modulaire.

✅ Avantages

  • Centralise l’initialisation métier par module
  • Garantit que chaque objet global est connu de GGlobal
  • Favorise la modularité
  • Facilite l’extensibilité