Hey Leute,
ich habe mal eine prinzipielle Frage zu den Möglichkeiten globale Variablen zu vermeiden, wenn ich mir UDF erstelle. Bei Variablen, deren Wert dauerhaft verfügbar sein soll, habe ich schon einige Male mit einer Local Static Variable gearbeitet. Dabei wird immer eine Funktion mit Parametern aufgerufen, in der dann die jeweilige Routine für den Parameter ausgeführt wird. Ich habe gerade wieder darüber nachgedacht einige Skripte anzupassen und möchte nun aber vorher klären, ob das so überhaupt sinnvoll ist.
Hier mal ein Bsp. dass ich auch verwende.
Das HotKeySet-Beispiel aus der Hilfe zum Pausieren eines Programmablaufs
Spoiler anzeigen
#include <MsgBoxConstants.au3>
; Press Esc to terminate script, Pause/Break to "pause"
Global $g_bPaused = False
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{ESC}", "Terminate")
HotKeySet("+!d", "ShowMessage") ; Shift-Alt-d
While 1
Sleep(100)
WEnd
Func TogglePause()
$g_bPaused = Not $g_bPaused
While $g_bPaused
Sleep(100)
ToolTip('Script is "Paused"', 0, 0)
WEnd
ToolTip("")
EndFunc ;==>TogglePause
Func Terminate()
Exit
EndFunc ;==>Terminate
Func ShowMessage()
MsgBox($MB_SYSTEMMODAL, "", "This is a message.")
EndFunc ;==>ShowMessage
Alles anzeigen
Hier die Variante mit Local Static $g_bPaused statt Global $g_bPaused
Spoiler anzeigen
HotKeySet("{PAUSE}", "_PauseToggle") ; Pause zum Pausieren.
HotKeySet("{ESC}", "Terminate") ; Escape zum Beenden.
While 1
Sleep(100)
WEnd
; das Äquivalent der Funktion aus dem Hilfe-Beispiel.
Func _PauseToggle($sTooltip = "*", $iX = 0, $iY = 0)
Local $g_bPaused = _PauseSetState(0)
If $g_bPaused Then
$g_bPaused = _PauseSetState(-1)
Return
Else
$g_bPaused = _PauseSetState(1)
EndIf
Do
If IsDeclared("sTooltip") Then
ToolTip($sTooltip, $iX, $iY)
Else
ToolTip("*", 0, 0)
EndIf
Sleep(300)
Until Not _PauseSetState(0)
ToolTip("")
EndFunc ;==>_PauseToggle
; hier wird die Variable $g_bPaused verwaltet.
Func _PauseSetState($bStatus)
Local Static $g_bPaused = False
If $bStatus = 1 Then
$g_bPaused = True
Return $g_bPaused
ElseIf $bStatus = -1 Then
$g_bPaused = False
Return $g_bPaused
Else
Return $g_bPaused
EndIf
EndFunc ;==>_PauseSetState
; zum Setzen einer Pause im Quelltext
Func _PauseSet($sTooltip = "*", $iX = 0, $iY = 0)
_PauseSetState(-1)
_PauseToggle($sTooltip)
EndFunc ;==>_PauseSet
; aus der Hilfe
Func Terminate()
Exit
EndFunc ;==>Terminate
Alles anzeigen
Hat diese Methode neben dem erhöhten Aufwand größere Nachteile oder ist gar falsch?
Kennt ihr bessere Alternativen?