Bild in Gui aktualisieren.

  • Hallo zusammen

    Ich möchte gerne einen Status als Bitmap in einer Gui aktualisiert angezeigt bekommen.

    In einer Funktion habe ich dazu folgendes geschrieben.

    [autoit]


    func status()
    If DriveStatus( $drive ) = "Ready" Then
    GUICtrlCreatePic ( "online.bmp", 25, 70 , 20 , 20)
    Else
    GUICtrlCreatePic ( "offline.bmp", 25, 70 , 20 , 20)
    EndIf
    EndFunc

    [/autoit]

    Betätige ich nun einen Button... ich nenn Ihn mal Connect soll die Grafik aktualisiert werden.
    Ich kürze mal mein Skript ab....

    [autoit]


    $connect = GUICtrlCreateButton("Connect", 16, 100, 100, 30, 0)
    .....
    While 1
    $msg=GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop

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

    Case $msg = $connect
    Run .......
    status()
    EndSelect
    WEnd

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

    Ich habe jetzt das Problem, dass das Statusbild nicht automatisch aktualisiert wird.

    Hat das jemand eine Idee wie man das realisieren kann ?

    Vielen Dank im voraus.

    Gruß viper67

    Einmal editiert, zuletzt von viper67 (22. August 2008 um 12:05)

  • Schon einmal mit "GUICtrlSetImage()" versucht ?

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • [autoit]


    func status()
    If DriveStatus( $drive ) = "Ready" Then
    GUICtrlCreatePic ( "online.bmp", 25, 70 , 20 , 20)
    Else
    GUICtrlCreatePic ( "offline.bmp", 25, 70 , 20 , 20)
    EndIf
    EndFun

    [/autoit]

    hmm...
    also wenn du auf den button klickst??
    dann müsste $drive aber Ready sein.
    Fals das $drive aber schon Ready ist und es immer noch nicht geht dann probier das Hier:


    Die Func:

    [autoit]


    func status($drive)
    while 1
    If DriveStatus( $drive ) = "Ready" Then
    GUICtrlSetImage ($StatusBild,@scriptdir & "online.bmp") ;du musst den richtigen pfad des bildes angeben!!
    Else
    GUICtrlSetImage ($StatusBild,@scriptdir & "offline.bmp") ;du musst den richtigen pfad des bildes angeben!!
    EndIf
    wend
    EndFun

    [/autoit]

    und der abgekürtzte Script:

    [autoit]


    $connect = GUICtrlCreateButton("Connect", 16, 100, 100, 30, 0)
    .....
    While 1
    $msg=GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop

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

    Case $msg = $connect
    Run (x)
    status("D") ;hier der LaufwerBuchstabe "D" ;; mach deinen rein
    EndSelect
    WEnd

    [/autoit]

    Du hast bei der Func reingemacht

    [autoit]

    If DriveStatus( $drive ) = "Ready" Then ...

    [/autoit]


    Du must $drive GLobalisieren ich habs dir vereinfacht und du musst nur noch den LaufwerkBuchstaben eingeben.
    Kannst du natürlich auch wieder wegmachen aber
    das While und das Wend müssen bleiben denn dadurch wird es immer aktualisiert und du hast nicht den ompletten dateipfad angegeben
    und du musst halt noch mal die Variable zur änderung des Bildes ändern.

  • Hallo

    Ich hatte erstmals mein script mit GUICtrlSetImage() erstellt.

    [autoit]


    func status ()
    $status_button1 = GUICtrlCreateButton("", 25, 70, 20, 20, $BS_BITMAP)
    If DriveStatus( $drive_1 ) = "Ready" Then
    GUICtrlSetImage (-1, "online.bmp",22)
    Else
    GUICtrlSetImage (-1, "offline.bmp",22)
    EndIf
    .....
    EndFunc

    [/autoit]

    generell hat das erstmal funktioniert.
    In der Anleitung zu GUICtrlSetImage steht
    Bestimmt das Bitmap- oder Iconbild, das für ein Steuerelement verwendet wird.


    Bemerkungen
    Wenn die Funktion auf einen Button angewendet wird, wird das Bild auf der Schaltfläche angezeigt. Bilder können auch für Checkbox-Elemente (Kontrollkästchen) verwendet werden, wenn der $BS_PUSHLIKE Stil benutzt wird. In beiden Fällen muss der $BS_ICON- oder $BS_BITMAP-Stil angegeben werden, um den Typ des verwendeten Bildes festzulegen.

    Hier war das Problem, dass es nach dem Überfahren des Buttons mit der Maus das Bild gewechselt hat.

    Nun den Button wollte ich ohnehin nicht haben, aus diesem Grund nur das Bild als Anzeige ob das Laufwerk vorhanden ist.
    Und jenachdem mit welchem Laufwerk ich mich connected habe die Anzeige wechselt.

    Dann kam mir die Idee, dass ich nur GUICtrlCreatePic ( "online.bmp", 25, 70 , 20 , 20) nehme. Das haut allerdings nur hin, wenn ich die Gui schließe und wieder öffne. Oder was mir komischerweise aufgefallen ist, mit irgendeinem Windowsfenster überlagere. Danach ist der Zustand korrekt.

    Die Idee von jiyan006 hab ich probiert. Was hast Du als $StatusBild definiert ?
    Im Grund genommen ja eigenlich das gleich wie ich es einmal angedacht hatte.

    Gruß und Danke

    viper67

    • Offizieller Beitrag

    Das erstellen des Bildes nicht in der Funktion machen, sondern beim erstellen der übrigen GUI und innerhalb der Funktion dann nur GUICtrlSetImage benutzen:

    [autoit]


    $StatusPic = GUICtrlCreatePic($filename, 10, 10, 32, 32) ; Beispiel

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

    ; [...]

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

    Func Status()
    If DriveStatus( $drive_1 ) = "Ready" Then
    GUICtrlSetImage($StatusPic, "online.bmp")
    Else
    GUICtrlSetImage($StatusPic, "offline.bmp")
    EndIf
    EndFunc

    [/autoit]
  • Hallo Oscar

    Erstmal Danke für Deine Hilfe.

    Leider hat das nicht funktioniert. .
    So ganz verstehe ich das skript nicht. Ein Bild wird nicht angezeigt.
    Ich hab mal $filename mit

    global $filename definiert ?

    und alles so übernommen wie Du geschrieben hast.
    Kannst Du mir erklären wie das abläuft ? In GuiSetCtrlImage wird der Wert der Variable $StatusPic geschrieben. Und $filename ?
    Na irgendwie hab ich einen Denkfehler :(

    gruß viper67

  • Ich versteh zwar deinem Post nicht, bzw. mit was du Probleme hast, aber meine Kristallkugel sagt mir das du vllt. nicht verstanden hast, dass $Filename für den Pfad zur Dazei steht. ?(;)

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

  • hi fast2
    vielleicht hab ich mich nicht richtig ausgedrückt.
    ich erkläre nochmal kurz mein script.
    eine gui mit checkboxen und connectbutton. neben den checkboxen soll der status wiedergegeben werden in form einer zustandsanzeigen on oder off.
    ich hake je nach auswahl checkboxen an und drücke auf connect. die zur checkbox gehörigen zustandsanzeigen zeigen online oder offline an.

    so richtig funktioniert das nur wenn die gui geschlossen und neu gestartet wurde. eigentlich klar. innerhalb der gui wechselt das bild (on oder off) nach drücken des connect buttons nicht. bzw so wie ich es heute um 11:55 geschrieben hatte war ja teilweise lauffähig.
    alle anderen dinge die ich is jetzt ausprobiert hatte gingen garnicht oder brachten nur flicker zwischen den wechsel der bilder online.bmp und offline.bmp


    gruß viper67

    • Offizieller Beitrag

    Es ist schwierig etwas zu erklären, wenn Du nicht Dein ganzes Script postest. Dann kann man das nur allgemein erklären.
    Ich will aber mal versuchen mein Beispiel zu verdeutlichen, indem ich davon ausgehe, dass sich die BMPs direkt in Deinem Scriptverzeichnis befinden:

    [autoit]


    Global $StatusPic = GUICtrlCreatePic(@ScriptDir & "\online.bmp", 10, 10, 32, 32) ; Beispiel

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

    ; [...]

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

    Func Status()
    If DriveStatus($drive_1) = "Ready" Then
    GUICtrlSetImage($StatusPic, @ScriptDir & "\online.bmp")
    Else
    GUICtrlSetImage($StatusPic, @ScriptDir & "\offline.bmp")
    EndIf
    EndFunc

    [/autoit]

    Vielleicht (hoffentlich) wird das jetzt deutlicher?
    Also das Bild außerhalb der Funktion (einmalig) erstellen und dann nur noch per GUICtrlSetImage ändern.

  • Hi Oscar

    Sorry. Hier kommt das Skript

    [autoit]


    #include <GUIConstants.au3>
    $server_1 = "server1"
    $share_1 = "temp1"
    $drive_1 = "G:"
    $name_1 = "Temp1"
    $server_2 = "server2"
    $share_2 = "temp2"
    $drive_2 = "H:"
    $name_2 = "Temp2"
    global $StatusPic = GUICtrlCreatePic(@ScriptDir & "\Online.bmp", 250, 70, 20, 20)
    global $StatusPic2 = GUICtrlCreatePic(@ScriptDir & "\Online.bmp", 250, 110, 20, 20)

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

    func drive1_on ()
    $drive1_on = DriveMapAdd ( $drive_1, "\\"& $server_1 &"\"& $share_1 &"" , 8)
    EndFunc
    Func drive1_off ()
    $drive1_off = DriveMapDel ( $drive_1 )
    EndFunc
    func drive2_on ()
    $drive2_on = DriveMapAdd ( $drive_2, "\\"& $server_2 &"\"& $share_2 &"" , 8)
    EndFunc
    Func drive2_off ()
    $drive1_off = DriveMapDel ( $drive_2 )
    EndFunc
    func status()
    If DriveStatus( $drive_1 ) = "Ready" Then
    GUICtrlSetImage($StatusPic, @ScriptDir & "\Online.bmp")
    Else
    GUICtrlSetImage($StatusPic, @ScriptDir & "\Offline.bmp")
    EndIf
    If DriveStatus( $drive_2 ) = "Ready" Then
    GUICtrlSetImage($StatusPic2, @ScriptDir & "\Online.bmp")
    Else
    GUICtrlSetImage($StatusPic2, @ScriptDir & "\Offline.bmp")
    EndIf

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

    EndFunc

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

    $Form1_1 = GUICreate("", 400, 400, 477, 121)
    $Checkbox1 = GUICtrlCreateCheckbox($name_1, 40, 70, 185, 17)
    $Checkbox2 = GUICtrlCreateCheckbox($name_2, 40, 110, 185, 17)
    $connect = GUICtrlCreateButton("connect", 16, 308, 113, 33, 0)
    $disconnect = GUICtrlCreateButton("disconnect", 262, 308, 113, 33, 0)
    status()
    GUISetState(@SW_SHOW)
    While 1
    $msg=GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $connect
    $Checkbox1_ReadCheck = GUICtrlRead($Checkbox1)
    $Checkbox2_ReadCheck = GUICtrlRead($Checkbox2)

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

    If $Checkbox1_Readcheck = $GUI_CHECKED Then
    drive1_on()
    Else
    ;~ do nothing
    EndIf
    If $Checkbox2_Readcheck = $GUI_CHECKED Then
    drive2_on()
    Else
    ;~ do nothing
    EndIf
    status()
    Case $msg = $disconnect
    If $Checkbox1_Readcheck = $GUI_CHECKED Then
    drive1_off()
    Else
    ;~ do nothing
    EndIf
    If $Checkbox2_Readcheck = $GUI_CHECKED Then
    drive2_off()
    Else
    ;~ do nothing
    EndIf
    status()
    EndSelect
    WEnd

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

    Exit

    [/autoit]

    Dachte es wird dann zu unübersichtlich wenn ich alles poste.

    Danke im voraus.

    Gruß viper67

    • Offizieller Beitrag

    Bitte für so lange Scripte den Spoiler (hier im Forum-Editor) verwenden.

    Siehst Du, so kann das zu Missverständnissen kommen. Die Bilder müssen zwischen GUICreate() und GUISetState() eingefügt sein, sonst werden sie nicht angezeigt.

    So sollte es gehen:

    Spoiler anzeigen
    [autoit]


    #include<GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    $server_1 = "server1"
    $share_1 = "temp1"
    $drive_1 = "G:"
    $name_1 = "Temp1"
    $server_2 = "server2"
    $share_2 = "temp2"
    $drive_2 = "H:"
    $name_2 = "Temp2"

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

    Func drive1_on()
    $drive1_on = DriveMapAdd($drive_1, "\\" & $server_1 & "\" & $share_1 & "", 8)
    EndFunc ;==>drive1_on
    Func drive1_off()
    $drive1_off = DriveMapDel($drive_1)
    EndFunc ;==>drive1_off
    Func drive2_on()
    $drive2_on = DriveMapAdd($drive_2, "\\" & $server_2 & "\" & $share_2 & "", 8)
    EndFunc ;==>drive2_on
    Func drive2_off()
    $drive1_off = DriveMapDel($drive_2)
    EndFunc ;==>drive2_off
    Func status()
    If DriveStatus($drive_1) = "Ready" Then
    GUICtrlSetImage($StatusPic, @ScriptDir & "\Online.bmp")
    Else
    GUICtrlSetImage($StatusPic, @ScriptDir & "\Offline.bmp")
    EndIf
    If DriveStatus($drive_2) = "Ready" Then
    GUICtrlSetImage($StatusPic2, @ScriptDir & "\Online.bmp")
    Else
    GUICtrlSetImage($StatusPic2, @ScriptDir & "\Offline.bmp")
    EndIf
    EndFunc ;==>status

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

    $Form1_1 = GUICreate("", 400, 400, 477, 121)
    $StatusPic = GUICtrlCreatePic(@ScriptDir & "\Online.bmp", 250, 70, 20, 20)
    $StatusPic2 = GUICtrlCreatePic(@ScriptDir & "\Online.bmp", 250, 110, 20, 20)
    $Checkbox1 = GUICtrlCreateCheckbox($name_1, 40, 70, 185, 17)
    $Checkbox2 = GUICtrlCreateCheckbox($name_2, 40, 110, 185, 17)
    $connect = GUICtrlCreateButton("connect", 16, 308, 113, 33, 0)
    $disconnect = GUICtrlCreateButton("disconnect", 262, 308, 113, 33, 0)
    status()
    GUISetState(@SW_SHOW)
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $connect
    $Checkbox1_ReadCheck = GUICtrlRead($Checkbox1)
    $Checkbox2_ReadCheck = GUICtrlRead($Checkbox2)

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

    If $Checkbox1_ReadCheck = $GUI_CHECKED Then
    drive1_on()
    Else
    ;~ do nothing
    EndIf
    If $Checkbox2_ReadCheck = $GUI_CHECKED Then
    drive2_on()
    Else
    ;~ do nothing
    EndIf
    status()
    Case $msg = $disconnect
    If $Checkbox1_ReadCheck = $GUI_CHECKED Then
    drive1_off()
    Else
    ;~ do nothing
    EndIf
    If $Checkbox2_ReadCheck = $GUI_CHECKED Then
    drive2_off()
    Else
    ;~ do nothing
    EndIf
    status()
    EndSelect
    WEnd

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

    Exit

    [/autoit]