Progress ohne While-Schleife füllen?

  • Guten Abend.
    Die Frage ist kurz und knapp:
    Kann ich den ProgressBar auch füllen, wenn keine While-Schleife läuft? (In einem Testskript mit GUI und While klappt es tadellos)
    In meinem Skript füllt sich der Balken nicht, obwohl ich ihn per GUICtrlSetData fülle!

    [autoit]

    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Statistik", 446, 250, -1, -1)
    $Progress1 = GUICtrlCreateProgress(16, 200, 406, 25)
    $Label1 = GUICtrlCreateLabel("Bitte warten Sie!", 104, 32, 235, 41)
    GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel("Bearbeite: ", 16, 124, 113, 33)
    GUICtrlSetFont(-1, 16, 400, 0, "MS Sans Serif")
    $Label3 = GUICtrlCreateLabel("", 16, 153, 404, 23)
    GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
    GUISetState(@SW_HIDE)
    #EndRegion ### END Koda GUI section ###

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

    If FileExists("Statistik.txt") Then
    FileDelete("Statistik.txt")
    EndIf

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

    $File = InputBox("Dateiname", "Bitte Dateinamen eingeben!")
    GUISetState(@SW_SHOW)
    Global $Dir = @DesktopDir & "\" & $File & ".txt"
    Global $Lines [1]
    _FileReadToArray($Dir,$Lines)
    Global $Data [$Lines[0]+1]

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

    For $i = 1 To $Lines[0]
    $Data [$i] = StringTrimRight(StringTrimLeft(FileReadLine($Dir,$i),7),8)
    GUICtrlSetData($Label3, $Data[$i])
    GUICtrlSetData($Progress1, $i/$Lines[0])
    Sleep (200)
    Next

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

    $Data = _ArrayUnique($Data)

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

    GUICtrlSetData($Label2, "Schreibe: ")

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

    For $x = 1 To $Data[0]
    FileWrite ("Statistik.txt", $Data[$x]&@CRLF)
    GUICtrlSetData($Label3, $Data[$x])
    Next

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

    GUIDelete($Form1)

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

    _ArrayDisplay($Data)

    [/autoit]


    Kurze Frage Nebenbei:
    Wie kann ich "GUI_EVENT_CLOSE" ausführen, obwohl ich keine While-Schleife hab?
    Ich hatte in meiner frühen AutoIt Zeit das mal gemeistert, hab nur kein Skript Beispiel mehr.
    Denn ihr werdet sehen, das Programm kann ich nicht mit dem roten Windows X beenden.
    Das war irgendwas mit einem "EventSet" oder sowas in der Art :love:


    EDIT:
    Der Progressbar füllt sich nun!
    Dies mache ich so:

    [autoit]

    GUICtrlSetData($Progress1, $i/(100/$Lines[0]))

    [/autoit]


    Bei einer Datei mit 30 Positionen klappt dies.

    Bei meiner Kundenkartei mit 28000 Personen ist der Balken nach 1 Sekunde voll, die Bearbeitungsvorgägge laufen jeodch noch!

    Einmal editiert, zuletzt von PokerFace (12. Dezember 2011 um 17:53)

  • Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    $Form1 = GUICreate("Statistik", 446, 250, -1, -1)
    $Progress1 = GUICtrlCreateProgress(16, 200, 406, 25)
    $Label1 = GUICtrlCreateLabel("Bitte warten Sie!", 104, 32, 235, 41)
    GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel("Bearbeite: ", 16, 124, 113, 33)
    GUICtrlSetFont(-1, 16, 400, 0, "MS Sans Serif")
    $Label3 = GUICtrlCreateLabel("", 16, 153, 404, 23)
    GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
    GUISetState(@SW_HIDE)

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

    If FileExists("Statistik.txt") Then
    FileDelete("Statistik.txt")
    EndIf

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

    $File = InputBox("Dateiname", "Bitte Dateinamen eingeben!")
    GUISetState(@SW_SHOW)
    Global $Dir = @DesktopDir & "\" & $File & ".txt"
    Global $Lines [1]
    _FileReadToArray($Dir,$Lines)
    Global $Data [$Lines[0]+1]

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

    For $i = 1 To $Lines[0]
    $Data [$i] = StringTrimRight(StringTrimLeft(FileReadLine($Dir,$i),7),8)
    GUICtrlSetData($Label3, $Data[$i])
    GUICtrlSetData($Progress1, $i/$lines[0]*100)

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

    $timer = TimerInit()
    Do
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then
    $Data = _ArrayUnique($Data)
    _ArrayDelete($Data,0)
    _FileWriteFromArray("Statistik(Abbruch).txt",$Data)
    Exit
    EndIf
    Until TimerDiff($timer) >= 200

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

    Next

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

    $Data = _ArrayUnique($Data)
    _ArrayDelete($Data,0)
    _FileWriteFromArray("Statistik.txt",$Data)
    GUICtrlSetData($Label3,"Fertig")
    Sleep(1000)
    GUIDelete($Form1)

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

    Hoffe mal ich hab dich richtig verstanden. Du kannst jetzt während des Auslesens abbrechen er speichert dann den Fortschritt unter Statistik(Abbruch).txt. Außerdem schreibt er die Daten nun mit _FileWriteFromArray() in die Datei.

  • Es klappt perfekt !!!
    Nur wenn ich die Pause auf 5 Millisekunden anstatt 200 stelle, geht es nicht mehr.
    Also der Prozess an sich läuft wunderbar nur das Programm bricht nicht mehr ab, sondern bleibt stehen!

  • Damit es bei 5 Millisekunden noch funktioniert müsstest du extrem schnell/oft draufklicken.
    Er fragt nämlich nur in der festgelegten Zeit ab, ob das Fenster geschlossen wird.
    Also müsstest du genau in diesem festgelegten Zeitpunkt klicken.
    Desto länger dieser Zeitraum desto einfach ist es das Programm zu schließen, ohne schnell/oft zu klicken.
    Ich glaub ich wollte ursprünglich die Zeit auf 20ms setzen. Dann passt es denke ich mal.

    Vlt. hat jemand ja noch eine elegantere Lösung

    Einmal editiert, zuletzt von N0THING (16. Dezember 2011 um 21:37)