- Offizieller Beitrag
Hallo!
Mein nächstes Script ist fertig.
Damit kann man einen 24 Bit Binärcode nach Dezimal 'umwandeln' und andersrum. Grafisch dargestellt durch Schalter und Leuchtdioden.
Es sind 2 Icons erforderlich, die in dem Zip-Archiv liegen. Das Zip-Archiv einfach ins Script-Verzeichnis entpacken.
Es gibt eine neue Version. Hier mal die Änderungen:
- jetzt 24 Bit statt bisher 16 Bit
- Bit 0 ist jetzt rechts
- es gibt jetzt einen Zähler mit [Start], [Pause] und [Stop] plus Geschwindigkeitsregler
- das Umrechnungsergebnis kann man nun markieren und in die Zwischenablage kopieren
- Umrechnung von dezimal nach binär ist jetzt auch möglich
Die Icons sind auch neu, also das Icons.zip bitte mit downloaden.
Noch eine neuere Version. Mir ist noch was eingefallen:
- Man kann dem Zähler jetzt einen beliebigen Startwert vorgeben.
- Im Pause-Modus des Zählers kann man den Zählerstand verändern. Nach der Pause wird dann mit dem neuen Zählerstand weitergezählt.
- Das Flackern beim ganz schnellen zählen ist behoben.
- Die Eingabe wird überprüft, ob sie größer ist als 24 Bit
- Mehr Kommentare (ich bin selbst schon fast nicht mehr durchgestiegen)
Version 1.3 - Neue Funktionen:
- Der Zähler kann jetzt vorwärts oder rückwärts zählen (umschaltbar auch während des zählens)
- Ergebnis (Dezimal oder Binär) kann nun per Button (One-Klick) in die Zwischenablage befördert werden.
- Ein paar kosmetische Korrekturen
Spoiler anzeigen
#AutoIt3Wrapper_Res_Language=1031 ;Resource Language code . default 2057=English (United Kingdom)
#AutoIt3Wrapper_Res_Comment=Bin2Dez
#AutoIt3Wrapper_Res_Description=Damit kann man einen 24 Bit Binaercode nach Dezimal umwandeln.
#AutoIt3Wrapper_Res_Fileversion=1.3.0.0 ;File Version
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n ;(y/n/p)AutoIncrement FileVersion After Aut2EXE is finished. y=Yes/n=No/P=Prompt default=n
#AutoIt3Wrapper_Res_LegalCopyright=Thomas Stephan
#AutoIt3Wrapper_Res_Field=Email|[email='oscar@elektronik-kurs.de'][/email]
#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
#AutoIt3Wrapper_Res_Field=created on:|%longdate% %time%
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
If Not FileExists("schalter_an.ico") Then
MsgBox(48, "Bin2Dez", "Es fehlt folgende Datei: schalter_an.ico" & @CRLF & "Das Programm wird beendet!")
Exit
EndIf
If Not FileExists("schalter_aus.ico") Then
MsgBox(48, "Bin2Dez", "Es fehlt folgende Datei: schalter_aus.ico" & @CRLF & "Das Programm wird beendet!")
Exit
EndIf
$gMaxBits = 23; Maximale Bitzahl -1 (hier: 24 Bit = 0...23)
[/autoit] [autoit][/autoit] [autoit]Dim $gaSBit[$gMaxBits+1]
Dim $gaDBit[$gMaxBits+1]
Dim $gaWert[$gMaxBits+1]
Dim $gaButton[6]
Global $gStop, $gStart, $gPause, $gTmp1, $gTmp2, $gx, $gZaehler
Global $gBgColor = 0x909090; Hintergrundfarbe
Global $gUsColor = 0xeeeeee; Vordergrundfarbe der Überschrift
Global $gBsColor = 0x000000; Vordergrundfarbe der Bitbeschriftung
Global $gBwVColor = 0xcccccc; Vordergrundfarbe der Bitwerte
Global $gBwHColor = 0xffff00; Hintergrundfarbe der Bitwerte
Global $gGeschw = 50; Startwert für die Zählergeschwindigkeit
Global $gZaehlRichtung = 1; 1= vorwärts, -1= rückwärts
$gMain = GUICreate("Bin2Dez", 940, 330, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "f_Beenden")
GUISetBkColor($gBgColor, $gMain)
GUICtrlCreateLabel("24 Bit Binär / Dezimal",270,5,600,60)
GUICtrlSetFont(-1,32,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
GUICtrlCreateLabel("Bit: ",8,58,40,20)
GUICtrlSetFont(-1,12,800, "Tahoma")
GUICtrlSetColor(-1,$gBsColor)
GUICtrlCreateLabel("Wert:",8,171,40,20)
GUICtrlSetFont(-1,10,800, "Tahoma")
GUICtrlSetColor(-1,0xffff00)
GUICtrlCreateGroup ("Zähler", 535, 200, 395, 120)
GUICtrlSetFont(-1,10,400, "Tahoma")
$gaButton[0] = GUICtrlCreateButton("Start",685,235,60,30)
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
$gaButton[1] = GUICtrlCreateButton("Pause",755,235,60,30)
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetState(-1,$GUI_DISABLE)
$gaButton[2] = GUICtrlCreateButton("Stop",825,235,60,30)
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetState(-1,$GUI_DISABLE)
$gSlider = GUICtrlCreateSlider(685, 275, 200, 25)
GUICtrlSetData(-1,$gGeschw)
GUICtrlSetOnEvent(-1, "f_Tempo")
GUICtrlCreateLabel("Geschwindigkeit: min.",555,280,129,20)
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
GUICtrlCreateLabel("max.",889,280,30,20)
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
GUICtrlCreateLabel("Richtung:",555,237,45,20)
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
$gaButton[3] = GUICtrlCreateButton("vorwärts",605,235,65,20)
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlCreateGroup ("",-99,-99,1,1)
For $gx = $gMaxBits To 0 Step -1
$gaWert[$gx] = 0
$gTmp2 = $gMaxBits - $gx
$gTmp1 = StringFormat("% 4u",($gx))
GUICtrlCreateLabel($gTmp1,48+$gTmp2*37,60,30,16)
GUICtrlSetFont(-1,10,400, "Tahoma")
GUICtrlSetColor(-1,$gBsColor)
$gaSBit[$gx] = GUICtrlCreateIcon("schalter_aus.ico", -1, 50+$gTmp2*37, 75, 25, 85)
GUICtrlSetOnEvent(-1, "f_Schalten")
$gTmp1 = StringFormat("% 7u",(2^$gx))
$gaDBit[$gx] = GUICtrlCreateLabel($gTmp1,50+$gTmp2*37,175,35,10)
GUICtrlSetFont(-1,7,400, "Tahoma")
GUICtrlSetColor(-1,$gBwVColor)
Next
GUICtrlCreateGroup ("Ergebnis", 8, 200, 520, 120)
GUICtrlSetFont(-1,10,400, "Tahoma")
GUICtrlCreateLabel("Dezimal = ",26,224,200,60)
GUICtrlSetFont(-1,28,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
$gDez = GUICtrlCreateInput("0",220,220,230,50)
GUICtrlSetFont(-1,28,800, "Tahoma")
GUICtrlSetColor(-1,$gBsColor)
GUICtrlSetOnEvent(-1, "f_Eingabe")
$gaButton[4] = GUICtrlCreateButton("kopieren",455,234,55,20)
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlCreateLabel("Binär = ",110,280,200,30)
GUICtrlSetFont(-1,20,800, "Tahoma")
GUICtrlSetColor(-1,$gUsColor)
$gBin = GUICtrlCreateInput("000000000000000000000000",220,286,230,20, $ES_READONLY)
GUICtrlSetFont(-1,10,800, "Tahoma")
GUICtrlSetColor(-1,$gBsColor)
$gaButton[5] = GUICtrlCreateButton("kopieren",455,286,55,20)
GUICtrlSetOnEvent(-1, "f_Zaehlertasten")
GUICtrlSetFont(-1,8,800, "Tahoma")
GUICtrlCreateGroup ("",-99,-99,1,1)
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit];-----------------------------------------------------------------------------
; Hauptschleife
;-----------------------------------------------------------------------------
While 1
GUICtrlSetState($gDez, $GUI_FOCUS)
Do
Sleep(10)
Until $gStart = 1
GUICtrlSetState($gaButton[0],$GUI_DISABLE)
GUICtrlSetState($gaButton[1],$GUI_ENABLE)
GUICtrlSetState($gaButton[2],$GUI_ENABLE)
$gStart = 0
$gZaehler = GUICtrlRead($gDez); Startwert für den Zähler holen
Do; Hier startet der Zähler
For $gx = 0 To $gMaxBits; Die entsprechenden Bits von $gZaehler setzen bzw. löschen
If BitAnd($gZaehler, 2^$gx) Then
If $gaWert[$gx] = 0 Then; nur setzen, wenn noch nicht gesetzt
$gaWert[$gx] = 1
GUICtrlSetImage($gaSBit[$gx],"schalter_an.ico")
GUICtrlSetColor($gaDBit[$gx],$gBsColor)
GUICtrlSetBkColor($gaDBit[$gx],$gBwHColor)
EndIf
Else
If $gaWert[$gx] = 1 Then; nur löschen, wenn noch nicht gelöscht
GUICtrlSetImage($gaSBit[$gx],"schalter_aus.ico")
GUICtrlSetColor($gaDBit[$gx],$gBwVColor)
GUICtrlSetBkColor($gaDBit[$gx],$gBgColor)
$gaWert[$gx] = 0
EndIf
EndIf
Next
If $gPause = 1 Then; Wenn der Benutzer auf [Pause] geklickt hat
GUICtrlSetState($gaButton[2],$GUI_DISABLE)
GUICtrlSetData($gaButton[1],"Weiter")
Do
Sleep(10)
Until $gPause = 0; warten bis er die Pause beendet
$gZaehler = GUICtrlRead($gDez); wenn der Benutzer inzwischen den Wert verändert hat, Zählerwert ändern
GUICtrlSetData($gaButton[1],"Pause")
GUICtrlSetState($gaButton[2],$GUI_ENABLE)
EndIf
If $gStop = 1 Then; Wenn der Benutzer auf [Stop] geklickt hat
$gStop = 0; Werte zurücksetzen und für neuen Zählerstart vorbereiten
$gZaehler = 1
For $gx = 0 To $gMaxBits
$gaWert[$gx] = 0
GUICtrlSetImage($gaSBit[$gx],"schalter_aus.ico")
GUICtrlSetColor($gaDBit[$gx],$gBwVColor)
GUICtrlSetBkColor($gaDBit[$gx],$gBgColor)
Next
f_Berechnen()
ExitLoop; Zählerschleife verlassen
EndIf
f_Berechnen()
Sleep(10*(100-$gGeschw)); Warteschleife, die mit dem Slider beeinflusst werden kann
$gZaehler += $gZaehlRichtung
Until ($gZaehler < 0) or ($gZaehler >= 2^($gMaxBits+1)); 24 Bit überschritten oder kleiner als 0? Ja, dann Zählerschleife verlassen
GUICtrlSetState($gaButton[1],$GUI_DISABLE); [Pause] sperren
GUICtrlSetState($gaButton[2],$GUI_DISABLE); [Stop] sperren
GUICtrlSetState($gaButton[0],$GUI_ENABLE); [Start]-Button wieder freigeben
WEnd
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn der Benutzer das Programm beenden will
;******************************************************************************************
Func f_Beenden()
Exit
EndFunc
;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn einer der grafischen Schalter angeklickt wurde
;******************************************************************************************
Func f_Schalten()
Local $lAusw = (@GUI_CTRLID - $gaSBit[$gMaxBits]) / 3
$lAusw = $gMaxBits - $lAusw
$gaWert[$lAusw] = Not $gaWert[$lAusw]
Switch $gaWert[$lAusw]
Case 0
GUICtrlSetImage($gaSBit[$lAusw],"schalter_aus.ico")
GUICtrlSetColor($gaDBit[$lAusw],$gBwVColor)
GUICtrlSetBkColor($gaDBit[$lAusw],$gBgColor)
Case 1
GUICtrlSetImage($gaSBit[$lAusw],"schalter_an.ico")
GUICtrlSetColor($gaDBit[$lAusw],$gBsColor)
GUICtrlSetBkColor($gaDBit[$lAusw],$gBwHColor)
EndSwitch
f_Berechnen()
GUICtrlSetState($gDez, $GUI_FOCUS)
EndFunc
;******************************************************************************************
; Diese Funktion berechnet die Dezimal- und Binärwerte und zeigt sie an
;******************************************************************************************
Func f_Berechnen()
Local $lErgDez = 0
Local $lErgBin = ""
For $lx = $gMaxBits To 0 Step -1
$lErgDez += 2^$lx*$gaWert[$lx]
Switch $gaWert[$lx]
Case 0
$lErgBin &= "0"
Case 1
$lErgBin &= "1"
EndSwitch
Next
GUICtrlSetData($gDez, $lErgDez)
GUICtrlSetData($gBin, $lErgBin)
EndFunc
;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn der Benutzer einen der Buttons angeklickt hat
;******************************************************************************************
Func f_Zaehlertasten()
Local $lAusw = @GUI_CtrlId
Switch $lAusw
Case $gaButton[0]; Start
$gStart = 1
Case $gaButton[1]; Pause
$gPause = Not $gPause
Case $gaButton[2]; Stop
$gStop = 1
Case $gaButton[3]; Zaehlrichtung änder
$gZaehlRichtung = -$gZaehlRichtung
Beep(400,50)
If $gZaehlRichtung = 1 Then
GUICtrlSetData($gaButton[3],"vorwärts")
Else
GUICtrlSetData($gaButton[3],"rückwärts")
EndIf
Case $gaButton[4]; Dezimal-Ergebnis in die Zwischenablage kopieren
ClipPut(GUICtrlRead($gDez))
Beep(800,50)
Case $gaButton[5]; Binär-Ergebnis in die Zwischenablage kopieren
ClipPut(GUICtrlRead($gBin))
Beep(800,50)
EndSwitch
GUICtrlSetState($gDez, $GUI_FOCUS)
EndFunc
;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn der Benutzer den Slider verändert
;******************************************************************************************
Func f_Tempo()
$gGeschw = GUICtrlRead($gSlider)
EndFunc
;******************************************************************************************
; Diese Funktion wird aufgerufen, wenn der Benutzer etwas in Dezimalfeld eingibt
;******************************************************************************************
Func f_Eingabe()
Local $lx
Local $ld = GUICtrlRead($gDez)
If $ld >= 2^($gMaxBits+1) Then
MsgBox(48,"Bin2Dez","Die eingegebene Zahl ist zu groß!" & @CRLF & "Sie läßt sich mit " & $gMaxBits+1 & " Bit nicht darstellen.")
GUICtrlSetData($gDez,0)
GUICtrlSetState($gDez, $GUI_FOCUS)
$ld = -1
EndIf
If $ld >= 0 Then
$gZaehler = $ld
For $lx = 0 To $gMaxBits
If BitAnd($ld, 2^$lx) Then
If $gaWert[$lx] = 0 Then
$gaWert[$lx] = 1
GUICtrlSetImage($gaSBit[$lx],"schalter_an.ico")
GUICtrlSetColor($gaDBit[$lx],$gBsColor)
GUICtrlSetBkColor($gaDBit[$lx],$gBwHColor)
EndIf
Else
If $gaWert[$lx] = 1 Then
$gaWert[$lx] = 0
GUICtrlSetImage($gaSBit[$lx],"schalter_aus.ico")
GUICtrlSetColor($gaDBit[$lx],$gBwVColor)
GUICtrlSetBkColor($gaDBit[$lx],$gBgColor)
EndIf
EndIf
Next
f_Berechnen()
GUICtrlSetState($gDez, $GUI_FOCUS)
EndIf
EndFunc
MfG. Oscar