Problem mit GUICtrlSetGraphic

  • Hallo,

    ich hab mich mal wieder an Grafiken rangemacht und probiere jetzt schon seit bestimmt 2 Stunden ein simples Diagramm zum laufen zu bekommen und es will einfach nicht :|

    [autoit]

    $Grafik = GUICtrlCreateGraphic(320, 200, 200, 200)
    $Ab = 0
    For $i = 1 To $Sections[0]
    $Zeit = IniRead(@ScriptDir & "\Auswertung.ini", $Sections[$i], "Zeit", 0)
    $Value = $Zeit/$Zeitpool*100
    $Value = Round($Value, 2)
    GUICtrlSetGraphic($Grafik, $GUI_GR_PIE, 100, 100, 150, 3.6*$Ab, 3.6*$Value)
    $Ab += $Value
    Next

    [/autoit]


    Das ist der Teil, der denke ich mal wichtig ist. Sehr viel mehr enthält das Script auch noch nicht.
    Kurze Erklärung: Ich habe in jeder Section eine Zeit gespeichert (eine Zahl). $Zeitpool ist die gesamtheit dieser Werte, sodass ich den Prozentwert der Zeit in der Section berechnen kann => $Value, den ich dann noch runde. Da ein Kreis 360° besitzt entspricht das wieder 100%, sodass ich den sweepangle herausbekomme, indem ich meinen Wert mit 3,6 malnehme. Der startangle muss immer weiter geschoben werden, damit sich nichts überlappt.
    Das Problem: Es passiert rein gar nichts -.- (Bis auf die Grafik funktioniert aber alles einwandfrei)
    Ich denke mal ihr könnt mir einen Tip geben oder weiterhelfen :)
    Vielen Dank
    Aquaplant

    Einmal editiert, zuletzt von Aquaplant (16. Oktober 2010 um 17:51)

    • Offizieller Beitrag

    Um dein Script zu testen, müssen wir schon eine Beispielsini von dir haben.
    Ohne Daten ist nichts mit austesten.

  • ich hab mal beliebige Werte genommen, da ich keine Lust hatte mir eine ini zu basteln;

    Der Fehler liegt wohl eher an den Werten aus der ini.
    Vielleicht mal mit einer MsgBox überprüfen nach dem Einlesen:

    [autoit]

    #include <GUIConstants.au3>

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

    #region - GUI Create
    GUICreate('',800,600)
    Dim $Zeitpool = 25000, $Zeit = 0, $Value
    $Grafik = GUICtrlCreateGraphic(320, 200, 200, 200)
    $Ab = 0
    For $i = 1 To 18
    $Zeit += 2800
    $Value = $Zeit/$Zeitpool*100
    $Value = Round($Value, 2)
    GUICtrlSetGraphic($Grafik, $GUI_GR_PIE, 100, 100, 150, 3.6*$Ab, 3.6*$Value)
    $Ab += $Value
    Next
    GUISetState()
    #endregion

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

    #region - GUI SelectLoop
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd
    #endregion

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

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    über mich...

    ich habe meine Erfahrungen hauptsächlich gesammelt in (grobe Übersicht):

    - RibbonBar Automation
    - MySQL Nutzung
    - GUIs in vielerlei Ausprägung
    - Nutzung von Powershell / Batch in AutoIt
    - Windows Automatisierung

    außerhalb von AutoIt:

    - Sprachen: PS, Batch, php, html(5), javascript, (perl eingeschränkt), vbs
    - Powershell (AD, WPF inkl. Multi-Threading, ...)
    - Deployment-Automatisierung ohne SCCM
    - Office-Nutzung mit COM-Object (AutoIt, PowerShell)
    - ActiveDirectory und alles was damit zusammenhängt
    - Hyper-V Clustering (Converged / Hyper Converged)
    - Serverhardware (Konfiguration, Aufbau, Architektur, Betrieb)

    Lieblingsthema:

    günstige Automatisierung von Vorgängen, für die andere Firmen viel Geld nehmen

    more to come ...

  • Ich hab jetzt einiges an meinem Script geändert, aber es funktioniert leider immer noch nicht.
    Hier ist mal das komplette Script:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    $Gui = GUICreate('',800,600)
    GUISetState(@sw_show)
    $Grafik = GUICtrlCreateGraphic(320, 200, 200, 200)
    $Zeitpool = 0
    $Ab = 0
    $Sections = IniReadSectionNames(@ScriptDir & "\Auswertung.ini")
    For $i = 1 To $Sections[0]
    $Zeit = IniRead(@ScriptDir & "\Auswertung.ini", $Sections[$i], "Zeit", 0)
    $Zeit = Int($Zeit)
    If $Zeit >= 200 Then
    $Zeitpool += $Zeit
    Else
    IniDelete(@ScriptDir & "\Auswertung.ini", $Sections[$i])
    EndIf
    Next
    MsgBox(0, "Zeitpool", $Zeitpool)
    $Sections = IniReadSectionNames(@ScriptDir & "\Auswertung.ini")
    For $i = 1 To $Sections[0]
    $Zeit = IniRead(@ScriptDir & "\Auswertung.ini", $Sections[$i], "Zeit", 0)
    $Zeit = Int($Zeit)
    $Value = $Zeit/$Zeitpool*100
    $Value = Round($Value, 2)
    ;~ $r = Random(0,255)
    ;~ $g = Random(0,255)
    ;~ $b = Random(0,255)
    ;~ GUICtrlSetGraphic($Grafik, $GUI_GR_COLOR, 0, "0x" & Hex($r, 2) & Hex($g, 2) & Hex($b, 2))
    GUICtrlSetGraphic($Grafik, $GUI_GR_PIE, 100, 100, 150, 3.6*$Ab, 3.6*$Value)
    $Ab += $Value
    Next

    [/autoit]


    Die erste For Schleife ist nur zum einlesen. Eine Beispielini (Name: "Auswertung.ini"):

    Spoiler anzeigen

    [SciTE]
    Zeit=1040
    [Program Manager]
    Zeit=1928
    [Mozilla Firefox]
    Zeit=3004
    [VLC media player]
    Zeit=5930
    [Adobe Flash Player]
    Zeit=1210
    [Chat]
    Zeit=923


    Danke für eure Hilfe

    • Offizieller Beitrag

    Du mußt auch die Gui neu zeichnen, sonst bekommst du die Grafik nie zu sehen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>

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

    $Gui = GUICreate('', 800, 600)
    GUISetState(@SW_SHOW)
    $Grafik = GUICtrlCreateGraphic(320, 200, 200, 200)
    $Zeitpool = 0
    $Ab = 0
    $Sections = IniReadSectionNames(@ScriptDir & "\Auswertung.ini")
    For $i = 1 To $Sections[0]
    $Zeit = IniRead(@ScriptDir & "\Auswertung.ini", $Sections[$i], "Zeit", 0)
    $Zeit = Int($Zeit)
    If $Zeit >= 200 Then
    $Zeitpool += $Zeit
    Else
    IniDelete(@ScriptDir & "\Auswertung.ini", $Sections[$i])
    EndIf
    Next
    MsgBox(0, "Zeitpool", $Zeitpool)
    $Sections = IniReadSectionNames(@ScriptDir & "\Auswertung.ini")
    For $i = 1 To $Sections[0]
    $Zeit = IniRead(@ScriptDir & "\Auswertung.ini", $Sections[$i], "Zeit", 0)
    ConsoleWrite($Zeit & @CRLF)
    $Zeit = Int($Zeit)
    $Value = $Zeit / $Zeitpool * 100
    $Value = Round($Value, 2)
    $r = Random(0, 255)
    $g = Random(0, 255)
    $b = Random(0, 255)
    ;~ GUICtrlSetGraphic($Grafik, $GUI_GR_COLOR, 0, "0x" & Hex($r, 2) & Hex($g, 2) & Hex($b, 2))
    GUICtrlSetGraphic($Grafik, $GUI_GR_PIE, 100, 100, 150, 3.6 * $Ab, 3.6 * $Value)
    $Ab += $Value
    _WinAPI_RedrawWindow($Gui)
    Next

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

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

    [/autoit]

    2. Möglichkeit, die Gui erst anzeigen lassen nachdem gezeichnet wurde.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    $Gui = GUICreate('', 800, 600)
    $Grafik = GUICtrlCreateGraphic(320, 200, 200, 200)
    $Zeitpool = 0
    $Ab = 0
    $Sections = IniReadSectionNames(@ScriptDir & "\Auswertung.ini")
    For $i = 1 To $Sections[0]
    $Zeit = IniRead(@ScriptDir & "\Auswertung.ini", $Sections[$i], "Zeit", 0)
    $Zeit = Int($Zeit)
    If $Zeit >= 200 Then
    $Zeitpool += $Zeit
    Else
    IniDelete(@ScriptDir & "\Auswertung.ini", $Sections[$i])
    EndIf
    Next
    MsgBox(0, "Zeitpool", $Zeitpool)
    $Sections = IniReadSectionNames(@ScriptDir & "\Auswertung.ini")
    For $i = 1 To $Sections[0]
    $Zeit = IniRead(@ScriptDir & "\Auswertung.ini", $Sections[$i], "Zeit", 0)
    ConsoleWrite($Zeit & @CRLF)
    $Zeit = Int($Zeit)
    $Value = $Zeit / $Zeitpool * 100
    $Value = Round($Value, 2)
    $r = Random(0, 255)
    $g = Random(0, 255)
    $b = Random(0, 255)
    ;~ GUICtrlSetGraphic($Grafik, $GUI_GR_COLOR, 0, "0x" & Hex($r, 2) & Hex($g, 2) & Hex($b, 2))
    GUICtrlSetGraphic($Grafik, $GUI_GR_PIE, 100, 100, 150, 3.6 * $Ab, 3.6 * $Value)
    $Ab += $Value
    Next
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • Achso, finde ich zwar etwas unsinnig, aber wenigstens geht es jetzt. Vielen Dank :)
    Jetzt bleibt nur noch die Frage offen, wieso der Kreis nicht ganz geschlossen ist, aber das bekomme ich auch noch raus^^
    Vielen Dank,
    Aquaplant

    • Offizieller Beitrag

    Nichts leichter als das, schau:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    $Gui = GUICreate('', 800, 600)
    $Grafik = GUICtrlCreateGraphic(320, 200, 200, 200)
    $Zeitpool = 0
    $Ab = 0
    $Sections = IniReadSectionNames(@ScriptDir & "\Auswertung.ini")
    For $i = 1 To $Sections[0]
    $Zeit = IniRead(@ScriptDir & "\Auswertung.ini", $Sections[$i], "Zeit", 0)
    $Zeit = Int($Zeit)
    If $Zeit >= 200 Then
    $Zeitpool += $Zeit
    Else
    IniDelete(@ScriptDir & "\Auswertung.ini", $Sections[$i])
    EndIf
    Next
    MsgBox(0, "Zeitpool", $Zeitpool)
    $Sections = IniReadSectionNames(@ScriptDir & "\Auswertung.ini")
    For $i = 1 To $Sections[0]
    $Zeit = IniRead(@ScriptDir & "\Auswertung.ini", $Sections[$i], "Zeit", 0)
    $Value = $Zeit / $Zeitpool * 100
    $r = Random(0, 255)
    $g = Random(0, 255)
    $b = Random(0, 255)
    GUICtrlSetGraphic($Grafik, $GUI_GR_COLOR, 0, "0x" & Hex($r, 2) & Hex($g, 2) & Hex($b, 2))
    GUICtrlSetGraphic($Grafik, $GUI_GR_PIE, 100, 100, 150, Round(3.6 * $Ab), Round(3.6 * $Value))
    $Ab += $Value
    ConsoleWrite($Ab & @CRLF)
    Next
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]