Je hoort de puristen nogal eens zeggen dat het niet nodig is binnen VO om met GLOBAL gedeclareerde variabelen te werken. De vraag is echter, hoe dan? Eigenlijk, maar dat is met alles als je het eenmaal weet, is het antwoord simpel. Door het gebruik van de global App-klasse. Als je hier een sub-klasse van maakt, en daar voor elke te gebruiken 'GLOBAL' een ACCCESS en eventueel een ASSIGN Method schrijft, kun je deze op elke plaats in je programma aanroepen.
De werkwijze is als volgt:
CLASS MyApp INHERIT App
INSTANCE MyFormerGlobal
ACCESS MyFormerGlobal CLASS MyApp
RETURN MyFormerGlobal
ASSIGN MyFormerGlobal( uVal ) CLASS MyApp
RETURN MyFormerGlobal := uVal
De init methode is vervolgens een goede plaats om waarden aan deze var's toe te kennen, maar dat kan natuurlijk (als je ook die ASSIGN hebt geschreven) ook elders in de applicatie
METHOD INIT( oOwner ) CLASS MyApp
SUPER:init( oOwner )
MyFormerGlobal := "Aap noot mies" // veel verder ben ik op school niet gekomen.....
Vervolgs gebruik je een start functie om de applicatie op te starten.
FUNCTION Start
LOCAL oApp AS AppSettings
__SetAppObject(oApp:=MyApp{} ) // Zorg ervoor dat MyApp als App-classe gezien wordt oApp:Start()
En in plaats van de gebruikelijke App:Start() method gebruik je nu een MyApp:Start()
METHOD Start() CLASS MyApp
LOCAL oMainWindow AS StandardShellWindow
oMainWindow := StandardShellWindow{SELF} oMainWindow:Show(SHOWCENTERED)
SELF:Exec()
Nu is er nog een probleem te overwinnen, dat zijn de compiler-warnings. Die zullen op het moment dat je met GetAppObject() functie een van de instancevars van de MyApp klasse opvraagt, aangeven dat dat geen methods van de App klasse zijn. Dit probleem is te omzeilen door een eigen functie te schrijven:
FUNCTION MyGetAppObject
RETURN GetAppObject()
Nu kun je overal in je programma, dus ook in een library, als volgt de MyFormerGlobal variabele benaderen:
uLocal := MyGetAppObject():MyFormerGlobal