- Offizieller Beitrag
Hallo!
Ich habe mal eine große Digitalanzeige (Zahlen) programmiert.
Es gibt dafür zwei Funktionen (CreateDisplay und UpdateDisplay). Ich habe die Funktionen mit zahlreichen Kommentaren versehen, so dass sie hoffentlich verständlich sind. Übergabeparameter usw. sind anhand eines Beispiels beschrieben.
Zusätzlich muss sich im Scriptverzeichnis das 'gfx'-Verzeichnis befinden, dass sich im anhängenden ZIP-Archiv befindet.
Spoiler anzeigen
#include <GUIConstants.au3>
Dim $ar_ipl[1], $ar_dpl[1]; Arrays deklarieren
[/autoit] [autoit][/autoit] [autoit]$a = GUICreate('Digitalanzeige', 640, 480, -1, -1); GUI-Fenster erstellen
GUISetState(); Fenster anzeigen
; Anwendungsbeispiel meiner beiden Funktionen: CreateDisplay() und UpdateDisplay()
[/autoit] [autoit][/autoit] [autoit]$ret = CreateDisplay($a, 100, 80, 5, 2); Display erstellen und anzeigen (Position: Left=100, Top=80, 5 Vorkommastellen und 2 Nachkommastellen)
[/autoit] [autoit][/autoit] [autoit]If Not $ret Then; wenn bei erstellen des Displays kein Fehler aufgetreten ist, dann
For $j = 0 To 100
$r = random(0, 99999, 1); Zufallszahl (ohne Nachkommastellen) erzeugen
UpdateDisplay($r); Display updaten
sleep(500)
$r = random(0, 99999); Zufallszahl (mit Nachkommastellen) erzeugen
UpdateDisplay($r); Display updaten
sleep(500)
Next
EndIf
Func CreateDisplay($gui, $posx, $posy, $iplaces, $dplaces); gui = GUI-Handle, posx = Left, posy = Top, iplaces = Vorkommastellen, dplaces = Nachkommastellen)
$ar_size = WinGetClientSize($gui); Größe des GUI-Fensters holen ($ar_size[0] = width, $ar_size[1] = height)
If $ar_size[0] < $posx + (($iplaces + $dplaces) * 46 + 24) Then Return (1); passt horizontal nicht ins Fenster - Funktion beenden
If $ar_size[1] < $posy + 78 Then Return (1); passt vertikal nicht ins Fenster - Funktion beenden
ReDim $ar_ipl[$iplaces]; Vorkommastellen anpassen
For $i = 0 To $iplaces - 1; Schleife für die Vorkommastellen
If $i = $iplaces - 1 Then; Wenn letzte Stelle der Vorkommastellen...
$dig = 'gfx\0.gif'; dann eine Null
Else
$dig = 'gfx\b.gif'; sonst eine Leerstelle
EndIf
$ar_ipl[$i] = GUICtrlCreatePic($dig, $posx + $i * 46, $posy, 46, 78); Stelle anzeigen
Next; weiter mit Vorkommastellen
$posx += $i * 46; neue Startposition (nach der letzten Vorkommastelle)
If $dplaces = 0 Then; Wenn keine Nachkommastellen gewünscht...
GUICtrlCreatePic('gfx\nd.gif', $posx, $posy, 12, 78); dann Platzhalter anzeigen
Return (0); und Funktion beenden
Else
GUICtrlCreatePic('gfx\d.gif', $posx, $posy, 12, 78); sonst Dezimalpunkt anzeigen
EndIf
$posx += 12; neue Startposition (nach dem Dezimalpunkt)
ReDim $ar_dpl[$dplaces]; Nachkommastellen anpassen
For $j = 0 To $dplaces - 1; Schleife für Nachkommastellen
$ar_dpl[$j] = GUICtrlCreatePic('gfx\0.gif', $posx + $j * 46, $posy, 46, 78); für jede Nachkommastelle eine Null anzeigen
Next
GUICtrlCreatePic('gfx\nd.gif', $posx + $j * 46, $posy, 12, 78); abschließend noch einen Platzhalter einfügen
Return (0); und Funktion beenden
EndFunc
Func UpdateDisplay($value); $value = Übergabewert (Fließkommazahl)
$iplaces = UBound($ar_ipl) - 1; Anzahl der Vorkommastellen des Displays
$dplaces = UBound($ar_dpl) - 1; Anzahl der Nachkommastellen des Displays
$ar_val = StringSplit(String(Round($value, $dplaces + 1)), '.'); Übergabewert in Vor- und Nachkomma-Anteil splitten
$len = StringLen($ar_val[1]); Anzahl der Vorkommastellen des Übergabewertes holen
For $i = 0 To $iplaces; Alle Vorkommastellen des Displays bearbeiten
If $len - 1 > $iplaces Then; Wenn die Anzahl der Vorkommastellen des Übergabewertes die des Displays übersteigt...
$dig = 'gfx\e.gif'; dann das Display mit 'E' füllen
Else
If $iplaces - $len >= $i Then; sonst testen, ob die richtige Stelle erreicht ist
$dig = 'gfx\b.gif'; Nein, dann eine Leerstelle einfügen
Else
$dig = 'gfx\' & StringMid($ar_val[1], $i - ($iplaces - $len), 1) & '.gif'; Ja, dann die Zahl einfügen
EndIf
Endif
GUICtrlSetImage($ar_ipl[$i], $dig); Vorkommastelle anzeigen
Next
If $ar_val[0] = 1 Then
$len = 0; Wenn der Übergabewert keine Nachkommastellen enthält, dann Nullen anzeigen
Else
$len = StringLen($ar_val[2]); sonst die Anzahl der Nachkommastellen des Übergabewertes holen
EndIf
For $i = 0 To $dplaces; Alle Nachkommastellen des Displays bearbeiten
If $i < $len Then; Wenn Nachkommastellen des Displays kleiner als Nachkommastellen des Übergabewertes
$dig = 'gfx\' & StringMid($ar_val[2], $i + 1, 1) & '.gif'; dann Zahl einfügen
Else
$dig = 'gfx\0.gif'; sonst Null einfügen
EndIf
GUICtrlSetImage($ar_dpl[$i], $dig); Nachkommastelle anzeigen
Next
EndFunc
Vielleicht kann ja der Ein oder Andere diese Funktionen gebrauchen.
MfG. Oscar