Animiertes Label?

  • Hiho,

    ich habe vor einiger Zeit mal ein Script in Händen gehalten, welches u.A. ein animiertes Textlabel besaß. Es handelte sich dabei um einen Countdown, der ungefähr so aussah:

    Zitat

    .......... 5 ..........

    Links und rechts die Punkte haben sich reduziert und die Zahl ging halt auch runter. Ist etwas schwierig zu erklären, ich versuchs anders:

    So muss man sich das vorstellen :D Alle 100ms verschwindet halt links und rechts ein Punkt, nach 1000ms reduzierte sich die Zahl und es ging von vorn los.

    Also im Prinzip eine Art animierter Countdown.

    Ich bin schon die ganze Zeit am Rätseln, wie man das performant lösen kann. Mein Ansatz:

    [autoit]

    #include <GUIConstantsEx.au3>

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

    Global $time = 3

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 150, 50, -1, -1)
    $timer = GUICtrlCreateLabel(".......... " & $time & " ..........", 5, 5, 100, 33)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    AdlibRegister("anim", 100)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func anim()
    If StringLeft(GUICtrlRead($timer), 1) = "." Then
    GUICtrlSetData($timer, StringTrimRight(StringTrimLeft($time, 1), 1))
    Else
    $cnt = $time - 1
    $time = $cnt

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

    If $time >= 1 Then
    GUICtrlSetData($timer, ".......... " & $time & " ..........")
    EndIf
    EndIf
    EndFunc

    [/autoit]

    Aber das haut leider nicht wirklich hin ;(

  • Ändere Zeile 23 zu dem:

    GUICtrlSetData($timer, StringTrimRight(StringTrimLeft(GUICtrlRead($timer), 1), 1))

    Gruss Shadowigor

  • Musst n eindimensionales Array machen ( 10 Stück ) also so:

    [autoit]

    Global $Array[10]
    $array[1] = "........."
    $array[2] = "........"
    ; ...

    [/autoit]


    und dann erzeugste das Label in der For schleife, also so:

    [autoit]

    GUICtrlSetData($Label, $array[$i] & " DeineZahl " & $array[$i])

    [/autoit]

    mfg
    Hauke

  • Oh, okay.... :D Danke. Jetzt muss ich mir nurnoch überlegen, wie ich es hin bekomme, dass die Zahl an der Stelle stehen bleibt, wo sie steht :D

  • So (Ab Zeile 22):

    If StringLeft(StringStripWS(GUICtrlRead($timer), 1), 1) = "." Then
    GUICtrlSetData($timer, StringTrimRight(StringReplace(GUICtrlRead($timer), ".", " ", 1), 1))
    .
    .
    .
    etc.

    Gruss Shadowigor

  • Geilomat! Auf die Idee hätte ich auch kommen können... Stattdessen hab ich schon an irgendwelche Regexpressions gedacht :D

    Vielen Dank :)

    Wobei da noch eine Sache wäre (die sich mir nicht so ganz erschließt...):

    Nutzt das Label "$SS_CENTER", bewegt sich die Zahl wieder. Irgendeine Ahnung, warum? Dürfte doch eigentlich nicht passieren, da der Punkt ja durch ein Leerzeichen ersetzt wird und der String somit immer die selbe Länge behält. Oder?

    EDIT:

    Okay, Fehler gefunden. Das Leerzeichen muss weg, dann gehts. Danke nochmal =)

  • Vielleicht so?

    Spoiler anzeigen
    [autoit]


    #include <String.au3>
    #include <StaticConstants.au3>

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

    Global $startcd = 10
    $hGUI = GUICreate("Test", 200, 100)
    $idLabel = GUICtrlCreateLabel(".......... "& $startcd & " ..........", 0, 40, 200, 50, $SS_CENTER)
    GUICtrlSetFont(-1, 10)
    GUISetState()

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

    AdlibRegister("Countdown", 99)

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

    Do
    Until GUIGetMsg() = -3

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

    AdlibUnRegister("Countdown")
    Exit

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

    Func Countdown()
    Local Static $c = 10
    If Not $startcd Then AdlibUnRegister("Countdown")
    Local $s = _StringRepeat(".", $c)
    GUICtrlSetData($idLabel, $s & " " & $startcd & " " & $s)
    $c = Mod($c - 1, 10)
    If Not $c Then
    $c = 10
    $startcd -= 1
    EndIf
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯