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 globauxMGListe
: 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é