Blinkender Label die Hunderste....

  • Hallo Zusammen,

    Vorab, ich weiß es gibt schon einige Threats zum Thema Blinkender Label...
    Aber dennoch habe ich eine Frage bzw. kleines Problem:

    [autoit]


    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GuiCtrlCreateLabel_Blink
    ; Description ...: Label blinking
    ; Syntax.........: _GuiCtrlCreateLabel_Blink($sText, $iPosX, $iPosY, $iBlinkRate, $iFontSize = 8.5, $sFont = 'Microsoft Sans Serif', $sColor)
    ; Parameters ....: $sText - Text
    ; $iPosX- X Position
    ; $iPosY- Y Position
    ; $iBlinkRate- Blinkrate (Timer)
    ; $iFontSize = 8.5 - Fontsize
    ; $sFont = 'Microsoft Sans Serif' - Fonttype
    ; $sColor - Color Value
    ; $sBlinkColor - Highlight Color Value
    ; ===============================================================================================================================
    Func _GuiCtrlCreateLabel_Blink($sText, $iPosX, $iPosY, $iBlinkRate, $iFontSize=8.5, $sFont='Microsoft Sans Serif', $sColor=0x000000, $sBlinkColor=0xff0000)
    Local $hLabel
    Local $iTimer = TimerInit()
    Local $on = True

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

    GUISetFont($iFontSize, 400, 0, $sFont)
    GUICtrlSetColor($hLabel, $sColor)
    $hLabel = GUICtrlCreateLabel($sText, $iPosX, $iPosY)

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

    Local $hGui = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", GUICtrlGetHandle(-1))
    $hGui = $hGui[0]

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

    Local $aPos
    For $i = 1 To UBound($sText) -1
    $aPos = ControlGetPos($hGui, "", GUICtrlGetHandle(-1))
    $hLabel[$i] = GUICtrlCreateLabel($sText[$i], $iPosX + $aPos[0] + $aPos[2] - 15 + Ceiling($iFontSize / 3), $iPosY)
    Next

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

    GUICtrlSetFont($hLabel, Default, Default, 0) ;

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

    ; ************** hier fehlt mir die passende Schleife........
    If $on Then
    GUICtrlSetColor($hLabel,$sBlinkColor)
    Else
    GUICtrlSetColor($hLabel,$sColor)
    EndIf
    $on = not $on
    ;***************************************************************

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

    Return $hLabel

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

    EndFunc

    [/autoit]

    Wie kann ich nun in dieser Funktion eine Schleife setzten, die mit dem Timer $iBlinkRate interagiert?

    Ich habe schon versucht mittels TimerInit() und TimeDiff das Ganze irgendwie zu lösen aber komme nicht auf ein sinnvolles Ergebnis.

    Ich weiß, dass man mit AdlibRegister(<function>, time) eine Funktion aufrufen kann, in der die Zeilen 36 -41 eingebunden werden könnten, jedoch kann ich mit AdlibRegister keine Funktion mit Parameter wie $hLabel etc. übergeben...


    Grüße
    Tim.

    PS der Code ist nur ein kleiner Auszug, daher kann das eine oder andere in diesem Fragment sinnlos erscheinen :)

    Einmal editiert, zuletzt von Gwyn (17. Juni 2010 um 21:26)

  • Ich hatte diesen Lösungsansatz:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Timers.au3>
    $hGui = GUICreate("")
    _GuiCtrlCreateLabel_Blink("Test", 20, 20, 1000)
    _GuiCtrlCreateLabel_Blink("Test 2 ", 30, 20, 100)
    GUISetState()

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

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

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

    Func _GuiCtrlCreateLabel_Blink($sText, $iPosX, $iPosY, $iBlinkRate, $iFontSize = 8.5, $sFont = 'Microsoft Sans Serif', $sColor = 0x000000, $sBlinkColor = 0xff0000)
    Local Static $aStaticLabel
    Local Static $hTimerGUI
    Local $hLabel
    If $sText = "~RETURN_ARRAY" Then Return $aStaticLabel
    If $sText = "~RETURN_THGUI" Then Return $hTimerGUI
    If $sText = "~SET_ARRAY" Then
    $aStaticLabel = $iPosX
    Return 0
    EndIf

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

    GUISetFont($iFontSize, 400, 0, $sFont)
    GUICtrlSetColor($hLabel, $sColor)
    $hLabel = GUICtrlCreateLabel($sText, $iPosX, $iPosY)

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

    Local $hGui = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", GUICtrlGetHandle($hLabel))
    $hGui = $hGui[0]
    If $hTimerGUI <> $hGui Then $hTimerGUI = $hGui

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

    GUICtrlSetFont($hLabel, $iFontSize, Default, $sFont) ;

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

    Local $aLabel = $aStaticLabel
    Local $iUB = UBound($aLabel)
    If $iUB > 0 Then ReDim $aLabel[$iUB + 1][6]
    If $iUB = 0 Then Local $aLabel[2][6], $iUB = 1
    $aLabel[$iUB][0] = $hLabel
    $aLabel[$iUB][1] = TimerInit()
    $aLabel[$iUB][2] = $iBlinkRate
    $aLabel[$iUB][3] = $sColor
    $aLabel[$iUB][4] = $sBlinkColor
    $aLabel[$iUB][5] = False
    $aStaticLabel = $aLabel
    __GUIctrlCreateLabel_Blink_Blink(Default, Default, Default, Default)
    ;~ _ArrayDisplay($aLabel)
    Return $hLabel

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

    EndFunc ;==>_GuiCtrlCreateLabel_Blink

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

    Func __GUIctrlCreateLabel_Blink_Blink($hWnd, $Msg, $iIDTimer, $dwTime)
    Local $hTimerGUI = _GuiCtrlCreateLabel_Blink("~RETURN_THGUI", 0, 0, 0), $iTimerMin = -1
    Local $aArray = _GuiCtrlCreateLabel_Blink("~RETURN_ARRAY", 0, 0, 0), $iUB = UBound($aArray)
    _Timer_KillAllTimers($hTimerGUI)
    For $i = 1 To $iUB - 1
    ConsoleWrite($aArray[$i][0] & @TAB & $aArray[$i][1] & @TAB & $aArray[$i][2] & @TAB & $aArray[$i][3] & @TAB & $aArray[$i][4] & @TAB & $aArray[$i][5] & @TAB & @CRLF)
    If TimerDiff($aArray[$i][1]) > $aArray[$i][2] Then
    $aArray[$i][1] = TimerInit()
    $aArray[$i][5] = Not $aArray[$i][5]
    GUICtrlSetColor($aArray[$i][0], ($aArray[$i][4] * ($aArray[$i][5] = True)) + ($aArray[$i][3] * ($aArray[$i][5] = False)))
    EndIf
    If ($iTimerMin = -1) Or ($aArray[$i][2] - TimerDiff($aArray[$i][1]) < $iTimerMin) Then
    $iTimerMin = ($aArray[$i][2] - TimerDiff($aArray[$i][1]))
    EndIf
    Next
    ConsoleWrite(@CRLF)
    ;~ ConsoleWrite($iTimerMin & @CRLF)
    _Timer_SetTimer($hTimerGUI, $iTimerMin, "__GUIctrlCreateLabel_Blink_Blink")
    ;~ __GUIctrlCreateLabel_Blink_Blink("~SET_ARRAY",$aArray,0,0)

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

    EndFunc ;==>__GUIctrlCreateLabel_Blink_Blink

    [/autoit]

    Allerdings blinkt das nicht. Was logisch ist, da der Array, der alle Infomationen enthält nicht geupdated wird. Dafür müsste

    [autoit]

    __GUIctrlCreateLabel_Blink_Blink("~SET_ARRAY",$aArray,0,0)

    [/autoit]


    einkommentiert werden.
    Wenn ich das tue, beklagt sich AutoIt aber über das Rekursionslevel. Wo ist mein denkfehler?

  • also ich würds ungefähr so lösen:

    Spoiler anzeigen
    [autoit]

    $i = 0
    GUICreate("")
    $label = GUICtrlCreateLabel("test",10,20)
    AdlibRegister("_lol",500)
    GUISetState()
    While 1
    $msg = GUIGetMsg()
    WEnd

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

    Func _lol()
    If $i = 0 Then
    GUICtrlSetBkColor($label,0xFF0000)
    $i = 1
    ElseIf $i = 1 Then
    GUICtrlSetBkColor($label,0x000000)
    $i = 0
    EndIf
    EndFunc

    [/autoit]

    funktioniert einwandfrei :D

    Mfg. PCKing


    Mein PC

    CPU: AMD FX 8350 8x4.00GHz
    Ram: 8GB DDR3
    Grafikkarte: Nvidia Geforce GTX 960 (4GB)
    Festplatten: 500GB SSD 1TB HDD
    Laufwerk: Blueray RW+ Brenner

  • Aaaah, ich bin so blöd!

    Hab mich verschrieben. Zeile 73 war nur falsch.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Timers.au3>
    $hGui = GUICreate("")
    _GuiCtrlCreateLabel_Blink("Test", 20, 20, 1000)
    _GuiCtrlCreateLabel_Blink("Test 2 ", 30, 200, 200)
    GUISetState()

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

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

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

    Func _GuiCtrlCreateLabel_Blink($sText, $iPosX, $iPosY, $iBlinkRate, $iFontSize = 8.5, $sFont = 'Microsoft Sans Serif', $sColor = 0x000000, $sBlinkColor = 0xff0000)
    Local Static $aStaticLabel
    Local Static $hTimerGUI
    Local $hLabel
    If $sText = "~RETURN_ARRAY" Then Return $aStaticLabel
    If $sText = "~RETURN_THGUI" Then Return $hTimerGUI
    If $sText = "~SET_ARRAY" Then
    $aStaticLabel = $iPosX
    Return 0
    EndIf

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

    GUISetFont($iFontSize, 400, 0, $sFont)
    GUICtrlSetColor($hLabel, $sColor)
    $hLabel = GUICtrlCreateLabel($sText, $iPosX, $iPosY)

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

    Local $hGui = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", GUICtrlGetHandle($hLabel))
    $hGui = $hGui[0]
    If $hTimerGUI <> $hGui Then $hTimerGUI = $hGui

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

    GUICtrlSetFont($hLabel, $iFontSize, Default, $sFont) ;

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

    Local $aLabel = $aStaticLabel
    Local $iUB = UBound($aLabel)
    If $iUB > 0 Then ReDim $aLabel[$iUB + 1][6]
    If $iUB = 0 Then Local $aLabel[2][6], $iUB = 1
    $aLabel[$iUB][0] = $hLabel
    $aLabel[$iUB][1] = TimerInit()
    $aLabel[$iUB][2] = $iBlinkRate
    $aLabel[$iUB][3] = $sColor
    $aLabel[$iUB][4] = $sBlinkColor
    $aLabel[$iUB][5] = False
    $aStaticLabel = $aLabel
    __GUIctrlCreateLabel_Blink_Blink(Default, Default, Default, Default)
    Return $hLabel

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

    EndFunc ;==>_GuiCtrlCreateLabel_Blink

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

    Func __GUIctrlCreateLabel_Blink_Blink($hWnd, $Msg, $iIDTimer, $dwTime)
    Local $hTimerGUI = _GuiCtrlCreateLabel_Blink("~RETURN_THGUI", 0, 0, 0), $iTimerMin = -1
    Local $aArray = _GuiCtrlCreateLabel_Blink("~RETURN_ARRAY", 0, 0, 0), $iUB = UBound($aArray)
    _Timer_KillAllTimers($hTimerGUI)
    For $i = 1 To $iUB - 1
    If TimerDiff($aArray[$i][1]) > $aArray[$i][2] Then
    $aArray[$i][1] = TimerInit()
    $aArray[$i][5] = Not $aArray[$i][5]
    GUICtrlSetColor($aArray[$i][0], ($aArray[$i][4] * ($aArray[$i][5] = True)) + ($aArray[$i][3] * ($aArray[$i][5] = False)))
    EndIf
    If ($iTimerMin = -1) Or ($aArray[$i][2] - TimerDiff($aArray[$i][1]) < $iTimerMin) Then
    $iTimerMin = ($aArray[$i][2] - TimerDiff($aArray[$i][1]))
    EndIf
    Next
    _Timer_SetTimer($hTimerGUI, $iTimerMin, "__GUIctrlCreateLabel_Blink_Blink")
    _GUIctrlCreateLabel_Blink("~SET_ARRAY",$aArray,0,0)

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

    EndFunc ;==>__GUIctrlCreateLabel_Blink_Blink

    [/autoit]
  • SEuBo:
    Muss aber doch nochmal doof nachfragen:
    in --> Func __GUIctrlCreateLabel_Blink_Blink($hWnd, $Msg, $iIDTimer, $dwTime)
    werden zwar Parameter angegeben - aber wofür? Sie tauchen nicht in der Funktion selbst auf oder werden übergeben. Zwar werden die Parameter in der ersten Funktion als "Default" geseetzt, aber welchen Sinn steckt hier dahinter?!?!

    Ich frage nur, weils mir noch nicht so ganz erschließt. Weglassen kann man die Parameter nicht - ok (dann funktionierts nicht) aber woher weiß die Funktion was sie damit anfangen muss?

  • Muss aber doch nochmal doof nachfragen:
    in --> Func __GUIctrlCreateLabel_Blink_Blink($hWnd, $Msg, $iIDTimer, $dwTime)
    werden zwar Parameter angegeben - aber wofür? Sie tauchen nicht in der Funktion selbst auf oder werden übergeben. Zwar werden die Parameter in der ersten Funktion als "Default" geseetzt, aber welchen Sinn steckt hier dahinter?!?!

    Die ganze Timergeschichte läuft über DLLCallbacks ab. Da gibts ein bestimmtes Schema, das gewahrt werden muss. Schuld ist Microsoft.

    Entfern mal Testweise die Paramter aus dem Funktionksaufruf (also so:)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Timers.au3>
    $hGui = GUICreate("")
    _GuiCtrlCreateLabel_Blink("Test", 20, 20, 1000)
    _GuiCtrlCreateLabel_Blink("Test 2 ", 30, 200, 200)
    GUISetState()

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

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

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

    Func _GuiCtrlCreateLabel_Blink($sText, $iPosX, $iPosY, $iBlinkRate, $iFontSize = 8.5, $sFont = 'Microsoft Sans Serif', $sColor = 0x000000, $sBlinkColor = 0xff0000)
    Local Static $aStaticLabel
    Local Static $hTimerGUI
    Local $hLabel
    If $sText = "~RETURN_ARRAY" Then Return $aStaticLabel
    If $sText = "~RETURN_THGUI" Then Return $hTimerGUI
    If $sText = "~SET_ARRAY" Then
    $aStaticLabel = $iPosX
    Return 0
    EndIf

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

    GUISetFont($iFontSize, 400, 0, $sFont)
    GUICtrlSetColor($hLabel, $sColor)
    $hLabel = GUICtrlCreateLabel($sText, $iPosX, $iPosY)

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

    Local $hGui = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", GUICtrlGetHandle($hLabel))
    $hGui = $hGui[0]
    If $hTimerGUI <> $hGui Then $hTimerGUI = $hGui

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

    GUICtrlSetFont($hLabel, $iFontSize, Default, $sFont) ;

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

    Local $aLabel = $aStaticLabel
    Local $iUB = UBound($aLabel)
    If $iUB > 0 Then ReDim $aLabel[$iUB + 1][6]
    If $iUB = 0 Then Local $aLabel[2][6], $iUB = 1
    $aLabel[$iUB][0] = $hLabel
    $aLabel[$iUB][1] = TimerInit()
    $aLabel[$iUB][2] = $iBlinkRate
    $aLabel[$iUB][3] = $sColor
    $aLabel[$iUB][4] = $sBlinkColor
    $aLabel[$iUB][5] = False
    $aStaticLabel = $aLabel
    __GUIctrlCreateLabel_Blink_Blink()
    Return $hLabel

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

    EndFunc ;==>_GuiCtrlCreateLabel_Blink

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

    Func __GUIctrlCreateLabel_Blink_Blink()
    Local $hTimerGUI = _GuiCtrlCreateLabel_Blink("~RETURN_THGUI", 0, 0, 0), $iTimerMin = -1
    Local $aArray = _GuiCtrlCreateLabel_Blink("~RETURN_ARRAY", 0, 0, 0), $iUB = UBound($aArray)
    _Timer_KillAllTimers($hTimerGUI)
    For $i = 1 To $iUB - 1
    If TimerDiff($aArray[$i][1]) > $aArray[$i][2] Then
    $aArray[$i][1] = TimerInit()
    $aArray[$i][5] = Not $aArray[$i][5]
    GUICtrlSetColor($aArray[$i][0], ($aArray[$i][4] * ($aArray[$i][5] = True)) + ($aArray[$i][3] * ($aArray[$i][5] = False)))
    EndIf
    If ($iTimerMin = -1) Or ($aArray[$i][2] - TimerDiff($aArray[$i][1]) < $iTimerMin) Then
    $iTimerMin = ($aArray[$i][2] - TimerDiff($aArray[$i][1]))
    EndIf
    Next
    _Timer_SetTimer($hTimerGUI, $iTimerMin, "__GUIctrlCreateLabel_Blink_Blink")
    _GUIctrlCreateLabel_Blink("~SET_ARRAY",$aArray,0,0)

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

    EndFunc ;==>__GUIctrlCreateLabel_Blink_Blink

    [/autoit]

    Das Script wird abstürzen / aufhängen. Lange Rede kurzer Sinn: Es muss einfach dahin :D


    EDIT: Hier auch nochmal zum Nachlesen:
    http://msdn.microsoft.com/de-de/library/49313fdf.aspx

  • Vielen Dank für schnelle Rückmeldung. Werd das ganze mal etwas genauer Betrachten :huh: