Große Digitalanzeige

    • 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
    [autoit]


    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]

    Vielleicht kann ja der Ein oder Andere diese Funktionen gebrauchen.

    MfG. Oscar