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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

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