Verständnisfrage.
Es gibt verschiedene Funktionen, die Zweier-Potenzen als Flags verwenden (heißt das so?), also 1, 2, 4, 8, 16, 32, ... Ein berühmter Vertreter dafür ist die MsgBox, die eine beachtliche Anzahl von Flags benutzt.
In diesem Thread möchte ich die Shift-States der Tastatur betrachten, die die Flags 1, 2, 4, 8, 16 und 32 benutzen. Auswerten kann man sie z.B. so:
Beispiel 1
Code
Local $iFlag = 6
ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
ConsoleWrite(_ShiftState($iFlag) & @CRLF)
ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
Func _ShiftState($_iFlag)
Local $sRet
If $_iFlag = 0 Then Return '0 [""]'
If BitAND($_iFlag, 1) Then $sRet &= " 1, 'Either SHIFT key is pressed.' "
If BitAND($_iFlag, 2) Then $sRet &= " 2, 'Either CTRL key is pressed.' "
If BitAND($_iFlag, 4) Then $sRet &= " 4, 'Either ALT key is pressed.' "
If BitAND($_iFlag, 8) Then $sRet &= " 8, 'The Hankaku key is pressed' "
If BitAND($_iFlag, 16) Then $sRet &= " 16, 'Reserved (defined by the keyboard layout driver).' "
If BitAND($_iFlag, 32) Then $sRet &= " 32, 'Reserved (defined by the keyboard layout driver).' "
Return $sRet
EndFunc ;==>_ShiftState
Alles anzeigen
Beispiel 2
Code
Local $iFlag = 6
ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
ConsoleWrite(_ShiftState($iFlag) & @CRLF)
ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
Func _ShiftState($_iFlag)
Local $sRet
For $i = 0 To 6 Step 1
; ConsoleWrite('BitAND(' & $_iFlag & ', ' & 2^$i & ') = ' & BitAND($_iFlag, 2^$i) & @CRLF)
Switch True
Case $_iFlag = 0
Return '0 [""]'
Case BitAND($_iFlag, 2 ^ $i) = 1
$sRet &= " 1, 'Either SHIFT key is pressed.' "
Case BitAND($_iFlag, 2 ^ $i) = 2
$sRet &= " 2, 'Either CTRL key is pressed.' "
Case BitAND($_iFlag, 2 ^ $i) = 4
$sRet &= " 4, 'Either ALT key is pressed.' "
Case BitAND($_iFlag, 2 ^ $i) = 8
$sRet &= " 8, 'The Hankaku key is pressed' "
Case BitAND($_iFlag, 2 ^ $i) = 16
$sRet &= " 16, 'Reserved (defined by the keyboard layout driver).' "
Case BitAND($_iFlag, 2 ^ $i) = 32
$sRet &= " 32, 'Reserved (defined by the keyboard layout driver).' "
EndSwitch
Next
Return $sRet
EndFunc ;==>_ShiftState
Alles anzeigen
Meine Frage ist, was sind die praktischen Unterschiede? Für welchen Anwendungsfall ist die eine besser geeignet, als die andere? Oder ist am Ende alles gleich?