Checkbox (array) Problem

  • Hallo,

    ...kurze Info:
    Auf meiner Form sind einige Checkboxen und dazugehörige Progressbars!
    Ich möchte nun die Checkboxen abfragen
    und wenn diese gesetzt sind, die jeweilieg Progressbar starten.

    Beispiel:
    chk 1 und chk3 sind wahr

    Dann sollte die Progressbar von chk1 starten
    wenn diese dann fertig ist, dann sollte die Progressbar v. chk3 starten

    Das Abfragen bereitet mir Probleme

    Mein Code:

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

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>

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

    Dim $arControl[5]
    Dim $arControlProg[5]
    $Form1 = GUICreate("Form1", 615, 440, 391, 202)
    $arControl[1] = GUICtrlCreateCheckbox("Checkbox1", 64, 64, 97, 17)
    $arControl[2] = GUICtrlCreateCheckbox("Checkbox2", 64, 100, 97, 17)
    $arControl[3] = GUICtrlCreateCheckbox("Checkbox3", 64, 136, 97, 17)
    $arControl[4] = GUICtrlCreateCheckbox("Checkbox4", 64, 168, 97, 17)
    $arControlProg[1] = GUICtrlCreateProgress(164, 64, 150, 17)
    $arControlProg[2] = GUICtrlCreateProgress(164, 100, 150, 17)
    $arControlProg[3] = GUICtrlCreateProgress(164, 136, 150, 17)
    $arControlProg[4] = GUICtrlCreateProgress(164, 168, 150, 17)
    $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Go
    For $i = 0 To UBound($arControl) - 1
    ;if GUICtrlgetState($arControl[$i], $gui_checked) then
    ;MsgBox(0,"an","ok")
    ;endif

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

    next

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

    EndSwitch
    WEnd

    [/autoit]


    komm da einfach nicht weiter....


    ;) Grüße Ilse

  • Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>

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

    Dim $arControl[5]
    Dim $arControlProg[5]
    $Form1 = GUICreate("Form1", 615, 440, 391, 202)
    $arControl[1] = GUICtrlCreateCheckbox("Checkbox1", 64, 64, 97, 17)
    $arControl[2] = GUICtrlCreateCheckbox("Checkbox2", 64, 100, 97, 17)
    $arControl[3] = GUICtrlCreateCheckbox("Checkbox3", 64, 136, 97, 17)
    $arControl[4] = GUICtrlCreateCheckbox("Checkbox4", 64, 168, 97, 17)
    $arControlProg[1] = GUICtrlCreateProgress(164, 64, 150, 17)
    $arControlProg[2] = GUICtrlCreateProgress(164, 100, 150, 17)
    $arControlProg[3] = GUICtrlCreateProgress(164, 136, 150, 17)
    $arControlProg[4] = GUICtrlCreateProgress(164, 168, 150, 17)
    $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Go
    For $i = 0 To UBound($arControl) - 1
    If GUICtrlRead($arControl[$i]) = 1 Then
    GUICtrlSetData($arControlProg[$i], 100)
    Else
    GUICtrlSetData($arControlProg[$i], 0)
    EndIf
    Next

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

    EndSwitch
    WEnd

    [/autoit]
  • Hallo BadBunny,

    merci für die Hilfe.
    In deinem Code läuft die Anzeige zusammen los.

    Es war folgerdermaßen gedacht:

    1 Startet....fertig, erst dann.... 3 startet beendet!
    Also die Progressbar sollte nacheinander langsam starten.

    kann man die Geschwindigkeit der Progressbar beinflussen?
    Sollte viel langsamer laufen.

    Liebe Grüße
    Ilse ;)

  • Hallo BadBunny,

    merci für deine Hilfe.

    Es sollte eigentlich so sein:
    1 startet, dann 3 startet
    also nacheinander

    hm...wie kann man die Geschwindigkeit der Progressbar bestimmen?

    Liebe Grüße
    Ilse ;)

  • [autoit]


    ;i so sind keine Include nötig! ;)
    Dim $arControl[5]
    Dim $arControlProg[5]
    GUICreate("Form1", 615, 440, 391, 202)
    For $i = 0 To 4 ;i erstellt 0 bis 4 = 5 Checkbox
    $arControl[$i] = GUICtrlCreateCheckbox("Checkbox" & $i, 64, 64+$i*36, 97, 17)
    $arControlProg[$i] = GUICtrlCreateProgress(164, 64+$i*36, 150, 17)
    Next
    $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)

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

    GUISetState(@SW_SHOW)

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $Go
    For $i = 0 To UBound($arControl) - 1
    If GUICtrlRead($arControl[$i]) = 1 Then
    GUICtrlSetData($arControlProg[$i], 100)
    Else
    GUICtrlSetData($arControlProg[$i], 0)
    EndIf
    Next
    EndSwitch
    WEnd
    ; Ende

    [/autoit]
  • ...
    habe Sleep eingebaut!
    Kommt jetzt nacheinander,
    aber immer noch zu schnell

    [autoit]


    ;i so sind keine Include nötig! ;)
    Dim $arControl[5]
    Dim $arControlProg[5]
    GUICreate("Form1", 615, 440, 391, 202)
    For $i = 0 To 4 ;i erstellt 0 bis 4 = 5 Checkbox
    $arControl[$i] = GUICtrlCreateCheckbox("Checkbox" & $i, 64, 64+$i*36, 97, 17)
    $arControlProg[$i] = GUICtrlCreateProgress(164, 64+$i*36, 150, 17)
    Next
    $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)

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

    GUISetState(@SW_SHOW)

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $Go
    For $i = 0 To UBound($arControl) - 1
    If GUICtrlRead($arControl[$i]) = 1 Then
    GUICtrlSetData($arControlProg[$i], 100)
    Else
    GUICtrlSetData($arControlProg[$i], 0)
    EndIf
    Sleep(2000)
    Next
    EndSwitch
    WEnd
    ; Ende

    [/autoit]
  • Versteh dein anliegen nicht so recht. Normalerweise ändert man den Wert einer Porgressbar doch nur in Verbindung mit einer Funktion, die dann automatisch auch die Fortschrittsgeschwindigkeit bestimmt, denn die Progressbar soll doch den Fortschritt anzeigen von der Sache die da gemacht wird. Wenn du garnix machst welchen Sinn hat dann eine Verlaufsanzeige?

    Gehen wir mal davon aus, dass du hier für jede Datei mit der du etwas anstellen willst eine Checkbox und eine Progressbar hast. Der Benutzer wählt nun durch die Checkbox aus welche der Dateien er bearbeiten möchte, an der Progressbar ändert sich zunächst nichts. Sobald er seine Auswahl getroffen hat klickt er einen Strat Button. Ab hier liest dein Programm dann die ganzen Checkboxen aus um zu wissen welche Dateien der Benutzer gewählt hat:

    [autoit]


    for $i = 0 to ubound($checkarray) -1
    If BitAnd(GUICtrlRead($checkarray[$i]),$GUI_CHECKED) = $GUI_CHECKED Then ; ja die checkbox ist markiert...
    meinefunktion($i) ; ruft meine Funktion auf die die aktuelle Datei nun bearbeitet...
    endif
    next

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

    func meinefunktion($index)
    ; so hier machste dein Ding mit der Datei, gleichzeitig änderst du die Progressbar, sofern es deine Funktion erlaubt hier einen sinnvollen Verlauf anzuzeigen, sofern es nur darum geht zu zeigen, dass die Datei bearbeitet wurde setzt du sie einfach von 0 auf 100
    ; copy(...) ; Beispielhafte aktion
    ; zur Demonstration ein Dreistufiger verlauf
    sleep(333)
    guictrlsetdata($progarr[$index], 33)
    sleep(333)
    guictrlsetdata($progarr[$index], 66)
    sleep(333)
    guictrlsetdata($progarr[$index], 100)
    endfunc

    [/autoit]

    3 Mal editiert, zuletzt von misterspeed (10. Juni 2011 um 17:02)

  • Hallo Misterspeed,

    hab das schon verstanden.
    Was mir unklar ist, ist ganz einfach der Zeitliche Ablauf der Progressbar.


    Beispiel:

    Checkbox 1 ist an: (langsame Progressbar)
    hier wird umfangreicher Code abgearbeitet z.B. Dauer 15 Sekunden
    d.h. die Progressbar soll ganz langsam laufen, bis der Code am Ende ist!

    Checkbox 2 ist an: (schnelleProgressbar)
    hier wird kurzer Code abgearbeitet z.B. Dauer 3 Sekunden
    d.h. die Progressbar soll schneller laufen, bis der Code am Ende ist!

    Muß ich dann für jeden Codeablauf eine eigene Progressbar einbauen?
    Am Anfang 10% und am Ende 100%

    Wie kann man darauf reagieren?
    Das versteh ich noch nicht so richtig!

    ;) Grüße Ilse

  • Naja wenn dem so ist verwendest du ja anscheinend je nach checkbox verschiedene Funktionen. Poste doch mal zwei dieser Funktionen, eine schnelle und eine langsame. Dann kann man dir auch am ehesten sagen wie du da einen sinnvollen Verlauf reinbekommst. Solange unklar ist was da geschieht kann man schlecht eine Aussage treffen wie du das am besten realisierst.

    Kommen Schleifen darin vor? Gibt es andere Anhaltspunkte wie weit die betreffende Funktion ist? Haben die Funktionen mehrere Teilschritte? Es gibt die verschiedensten Arten wie man einen Verlauf realisieren kann.

  • Ich glaube Du meinst es etwa so:
    ;)

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

    ;i Hier sind keine Include nötig, aber nur bis hier! ;)
    Dim $arControl[5]
    Dim $arControlProg[5]
    GUICreate("Form1", 615, 440, 391, 202)
    For $i = 0 To 4 ;i erstellt 0 bis 4 = 5 Checkboxen, ;i statisch kein Ubound
    $arControl[$i] = GUICtrlCreateCheckbox("Checkbox " & $i + 1, 64, 64 + $i * 36, 97, 17)
    $arControlProg[$i] = GUICtrlCreateProgress(164, 64 + $i * 36, 150, 17)
    Next
    $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)

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

    GUISetState(@SW_SHOW)

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $Go
    For $i = 0 To 4
    If BitAND(GUICtrlRead($arControl[$i]), 1) = 1 Then ; ja die checkbox ist markiert...
    meinefunktion($i) ; ruft meine Funktion auf die die aktuelle Datei nun bearbeitet...
    EndIf
    Next
    EndSwitch
    WEnd

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

    Func meinefunktion($index)
    For $j = 0 To 100 Step 10
    GUICtrlSetData($arControlProg[$i], $j)
    Sleep(500)
    Next
    MsgBox(0, "TaTa ...", "Die Funktion wurde ausgeführt und die Einstellungen zurückgesetzt." & @TAB & @CRLF & "Bitteschön !")
    GUICtrlSetData($arControlProg[$i], 0)
    GUICtrlSetState($arControl[$i], 4)
    EndFunc ;==>meinefunktion

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

    ; Ende

    [/autoit]
  • huh...
    wie soll ich's sagen.

    Beispiel:
    Checkbox 1 soll z.B. http://www.eBay.de starten
    das dauert.... bis alles geladen ist.
    Checkbox 3 startet http://www.Google.de
    das geht flott!
    Checkbox 4 startet http://www.t-online.de
    ....das dauert

    Jede dieser Progressbars benötigt doch unterschiedlich lang bis 100% erreicht sind!
    Ich weiß, man muß abfragen wann die Seite kpl. geladen wurde....
    Die Frage ist die Geschwindigkeit v. 0 bis 100% für jede Seite
    Bei Google sind die 100% in 3 Sekunden erreicht (Progressbarzeit)
    Bei T-online jedoch in 6 Sekunden (Progressbarzeit) gleichmäßige Geschwindigkeit der Fortschrittanzeige!

    Hoffe ich konnte das irgendwie verständlich machen

    ;) Ilse

  • Wie man das passend zur Laufzeit macht, kann ich Dir nicht sagen. Aber Du kannst den Progress beeinflussen:

    [autoit]


    Func meinefunktion($index)
    For $j = 0 To 100 Step 10 ;i########## hier die 10 auf Step 1 setzen z.B.
    GUICtrlSetData($arControlProg[$i], $j)
    Sleep(500)
    Next
    MsgBox(0, "TaTa ...", "Die Funktion wurde ausgeführt und die Einstellungen zurückgesetzt." & @TAB & @CRLF & "Bitteschön !")
    GUICtrlSetData($arControlProg[$i], 0)
    GUICtrlSetState($arControl[$i], 4)
    EndFunc ;==>meinefunktion

    [/autoit]


    :thumbup:

  • Naja du müsstest dafür evtl. den Lade Progress aus dem IE oder FF auslesen. Das dürfte aber nicht ganz leicht sein. Ich vermute aber, dass du nicht nur eine Seite öffnest und das wars, sondern dass du da auch noch Formulare usw. ausfüllst und ggf. weitere Unterseiten aurufst. In diesem Fall hast du ja mehrere Schritte in deiner Funktion und kannst dadurch dann auch deine Progressbar fortschreiten lassen. Mal angenommen deine Funktion hat 7 Schritte für Seite 1 und 3 Schritte für Seite 2:

    [autoit]


    func google() ; dauer nicht lange hat nur 3 schritte
    ; funktion beginnt, also setzen wir die Progressbar auf 10
    guictrlsetdata($progressbar,10)
    ; 1. Schritt
    ;_ieloadwait(...)
    guictrlsetdata($progressbar,30)
    ; 2. Schritt
    ; irgendwas ausfüllen, geht schnell, also setzen wir den Verluaf nur ein wenig höher
    guictrlsetdata($progressbar,50)
    ; 3. Schritt Formular abschicken und aufs Ergebnis warten
    ; submit()
    guictrlsetdata($progressbar,100) ; fertig
    endfunc

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

    func keineahnungwas()
    hier das selbe, nur dass wir 7 Schritte haben und entsprechend unseren Verlauf anders verteillen.
    endfunc

    [/autoit]

    Das ist natürlich kein flüssiger Verlauf und jenachdem wie gut du abschätzen kannst wielange einzelne Teilschritte im Vergleich zur ganzen Funktion benötigen auch nicht sehr genau. Genauaer und flüssiger geht nunmal nicht solange man keine Verlaufsrückmeldung vom externen Programm erhält (in deinem Fall ja der IE oder FF). Anders würde es ausschaun, wenn du kein externes Programm benutzt und in deiner Funktion zum Beispiel eine Datei Zeilenweise verschlüsselst oder sowas, dann hast du in der Regel eine Schleife mit einer dir bekannten Durchlaufszahl und kannst den exakten Fortschritt nach jedem Schleifendurchlauf anzeigen.

    Für dich wäre vielleicht eine Marquee Progressbar interessanter, da du unmöglich vorhersagen kannst wielange deine Funktion benötigt. In solchen Fällen benutzt man dann eine Progressbar die sich kontinuierlich hin und her bewegt und erst dann stoppt wenn du die Funktion verlässt. Der Benutzer sieht also nicht wielange es wohl noch dauern könnte, aber er sieht dass noch etwas gemacht wird.

    Ein Beispiel findest du hier: https://autoit.de/index.php?page…sbar#post200612

  • Hallo Misterspeed,

    merci für die Erläuterungen.
    Ganz so komplex ist der Ablauf nicht!
    Es gibt je Seite 2 Schritte


    1. Form (aufruf der Formseite) sagen wir 0-50% (das ist halt unterschiedlich)
    2. _IEFormSubmit ($oForm) 51-100% (das ebenfalls, bis es übertragen wurde)

    dann die nächste...

    Das Problem ist, daß manche Seiten wirklich
    Zeit brauchen (und das muß ich sichtbar machen)

    Wenn 3 Seiten gewählt wurden, sollte man das zur Laufzeit verfolgen können.
    Das mit der Marquee Progressbar klingt interessant.
    Habe halt jetzt alles mit normalen Progressbars aufgebaut.

    Ich lese mir das mal durch.

    Liebe Grüße
    Ilse ;)
    ...und danke auch an RR04

  • Veilleicht weiss ja jemand wie man den Verlauf des IE ausliest. Sollte prinzipiell ja möglich sein, sich eine eigene wait Funktion zu basteln die den Verlauf der aktuellen Browser Aktion auswertet. Das wäre wie gesagt der einzige Weg um hier einen flüssigen und exakten Verlauf reinzubekommen.

  • Hallo Misterspeed,

    habe das in deinem Link entdeckt

    [autoit]


    $progress = GUICtrlCreateProgress(10, 60, 380, 25, 0x08)
    GUICtrlSendMsg($progress, 0x040A, 1, 10

    [/autoit]

    sieht interessant aus,
    aber das Problem mit den 100% wenn die Seite fertig ist, bleibt.

    Ich schau mal, ob ich noch was finde

    ;) Ilse