- Offizieller Beitrag
Da ich das Thema gerade in einem Thread wieder entdeckt hatte hier mal ein Weg, wie man Variablen in lokalem Namensraum ablegen kann und doch Globalen Zugriff erlangt.
Inwiefern es wirklich sinnvoll ist Globale Variablen zu meiden sei mal völlig dahingestellt. Dazu wurden schon Diskussionen ergebnisoffen im EN-Forum geführt.
Das Bsp. ist denke ich selbsterklärend:
Spoiler anzeigen
_A(2,3) ; = Summe + 6
_A(4,4) ; = Summe + 16
_A(5,4) ; = Summe + 20
ConsoleWrite('Summe: ' & _ManageVars('Summe') & @LF)
_B(5,3) ; = Summe + 2
_B(12,3) ; = Summe + 9
ConsoleWrite('Summe: ' & _ManageVars('Summe') & @LF)
Func _A($a, $b)
Local $Summe = _ManageVars('Summe') ; == Wert abfragen
If @error Then ; == $Summe wurde noch nicht verwendet - noch ohne Wert
_ManageVars('Summe', False, $a * $b) ; == Wert setzen
Else
_ManageVars('Summe', False, $Summe + $a * $b)
EndIf
EndFunc
Func _B($a, $b)
Local $Summe = _ManageVars('Summe')
If @error Then
_ManageVars('Summe', False, $a - $b)
Else
_ManageVars('Summe', False, $Summe + ($a - $b))
EndIf
EndFunc
;===============================================================================
; Function Name....: _ManageVars
; Description......: Verwaltung von global anwendbaren Variablen in Lokalem Namespace
; Parameter(s).....: $_sVar Variablenname (mit oder ohne "$")
; .................: $_fGet "True" (Standard) fragt Wert ab, "False" um Wert zu setzen
; .................: $_vVal Wenn Wert gesetzt wird, der Variablenwert
; Return Value(s)..: (nur bei Get) Erfolg Der Variablenwert
; .................: Fehler 0 @error=1 angefragte Variable noch nicht hinterlegt
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _ManageVars($_sVar, $_fGet=True, $_vVal=0)
Local Static $oVars = ObjCreate("Scripting.Dictionary")
If $_fGet Then
If $oVars.Exists($_sVar) Then
Return $oVars.Item($_sVar)
Else
Return SetError(1,0,0)
EndIf
Else
If $oVars.Exists($_sVar) Then
$oVars.Item($_sVar) = $_vVal
Else
$oVars.Add($_sVar, $_vVal)
EndIf
EndIf
EndFunc ;==>_ManageVars