Checkbox (array) Problem

    • [ offen ]

      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-Quellcode

      1. #include <ButtonConstants.au3>
      2. #include <GUIConstantsEx.au3>
      3. #include <ProgressConstants.au3>
      4. #include <WindowsConstants.au3>
      5. #include <Array.au3>
      6. Dim $arControl[5]
      7. Dim $arControlProg[5]
      8. $Form1 = GUICreate("Form1", 615, 440, 391, 202)
      9. $arControl[1] = GUICtrlCreateCheckbox("Checkbox1", 64, 64, 97, 17)
      10. $arControl[2] = GUICtrlCreateCheckbox("Checkbox2", 64, 100, 97, 17)
      11. $arControl[3] = GUICtrlCreateCheckbox("Checkbox3", 64, 136, 97, 17)
      12. $arControl[4] = GUICtrlCreateCheckbox("Checkbox4", 64, 168, 97, 17)
      13. $arControlProg[1] = GUICtrlCreateProgress(164, 64, 150, 17)
      14. $arControlProg[2] = GUICtrlCreateProgress(164, 100, 150, 17)
      15. $arControlProg[3] = GUICtrlCreateProgress(164, 136, 150, 17)
      16. $arControlProg[4] = GUICtrlCreateProgress(164, 168, 150, 17)
      17. $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)
      18. GUISetState(@SW_SHOW)
      19. While 1
      20. $nMsg = GUIGetMsg()
      21. Switch $nMsg
      22. Case $GUI_EVENT_CLOSE
      23. Exit
      24. Case $Go
      25. For $i = 0 To UBound($arControl) - 1
      26. ;if GUICtrlgetState($arControl[$i], $gui_checked) then
      27. ;MsgBox(0,"an","ok")
      28. ;endif
      29. next
      30. EndSwitch
      31. WEnd



      komm da einfach nicht weiter....


      ;) Grüße Ilse
      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include <ButtonConstants.au3>
      2. #include <GUIConstantsEx.au3>
      3. #include <ProgressConstants.au3>
      4. #include <WindowsConstants.au3>
      5. #include <Array.au3>
      6. Dim $arControl[5]
      7. Dim $arControlProg[5]
      8. $Form1 = GUICreate("Form1", 615, 440, 391, 202)
      9. $arControl[1] = GUICtrlCreateCheckbox("Checkbox1", 64, 64, 97, 17)
      10. $arControl[2] = GUICtrlCreateCheckbox("Checkbox2", 64, 100, 97, 17)
      11. $arControl[3] = GUICtrlCreateCheckbox("Checkbox3", 64, 136, 97, 17)
      12. $arControl[4] = GUICtrlCreateCheckbox("Checkbox4", 64, 168, 97, 17)
      13. $arControlProg[1] = GUICtrlCreateProgress(164, 64, 150, 17)
      14. $arControlProg[2] = GUICtrlCreateProgress(164, 100, 150, 17)
      15. $arControlProg[3] = GUICtrlCreateProgress(164, 136, 150, 17)
      16. $arControlProg[4] = GUICtrlCreateProgress(164, 168, 150, 17)
      17. $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)
      18. GUISetState(@SW_SHOW)
      19. While 1
      20. $nMsg = GUIGetMsg()
      21. Switch $nMsg
      22. Case $GUI_EVENT_CLOSE
      23. Exit
      24. Case $Go
      25. For $i = 0 To UBound($arControl) - 1
      26. If GUICtrlRead($arControl[$i]) = 1 Then
      27. GUICtrlSetData($arControlProg[$i], 100)
      28. Else
      29. GUICtrlSetData($arControlProg[$i], 0)
      30. EndIf
      31. Next
      32. EndSwitch
      33. WEnd
      mfg BB

      "IF YOU'RE GOING TO KILL IT
      OPEN SOURCE IT!
      "

      by Phillip Torrone


      Shoutbox schrieb:

      [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:




      Neon Snake
      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 ;)

      AutoIt-Quellcode

      1. ;i so sind keine Include nötig! ;)
      2. Dim $arControl[5]
      3. Dim $arControlProg[5]
      4. GUICreate("Form1", 615, 440, 391, 202)
      5. For $i = 0 To 4 ;i erstellt 0 bis 4 = 5 Checkbox
      6. $arControl[$i] = GUICtrlCreateCheckbox("Checkbox" & $i, 64, 64+$i*36, 97, 17)
      7. $arControlProg[$i] = GUICtrlCreateProgress(164, 64+$i*36, 150, 17)
      8. Next
      9. $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)
      10. GUISetState(@SW_SHOW)
      11. While 1
      12. Switch GUIGetMsg()
      13. Case -3
      14. Exit
      15. Case $Go
      16. For $i = 0 To UBound($arControl) - 1
      17. If GUICtrlRead($arControl[$i]) = 1 Then
      18. GUICtrlSetData($arControlProg[$i], 100)
      19. Else
      20. GUICtrlSetData($arControlProg[$i], 0)
      21. EndIf
      22. Next
      23. EndSwitch
      24. WEnd
      25. ; Ende
      ...
      habe Sleep eingebaut!
      Kommt jetzt nacheinander,
      aber immer noch zu schnell

      AutoIt-Quellcode

      1. ;i so sind keine Include nötig! ;)
      2. Dim $arControl[5]
      3. Dim $arControlProg[5]
      4. GUICreate("Form1", 615, 440, 391, 202)
      5. For $i = 0 To 4 ;i erstellt 0 bis 4 = 5 Checkbox
      6. $arControl[$i] = GUICtrlCreateCheckbox("Checkbox" & $i, 64, 64+$i*36, 97, 17)
      7. $arControlProg[$i] = GUICtrlCreateProgress(164, 64+$i*36, 150, 17)
      8. Next
      9. $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)
      10. GUISetState(@SW_SHOW)
      11. While 1
      12. Switch GUIGetMsg()
      13. Case -3
      14. Exit
      15. Case $Go
      16. For $i = 0 To UBound($arControl) - 1
      17. If GUICtrlRead($arControl[$i]) = 1 Then
      18. GUICtrlSetData($arControlProg[$i], 100)
      19. Else
      20. GUICtrlSetData($arControlProg[$i], 0)
      21. EndIf
      22. Sleep(2000)
      23. Next
      24. EndSwitch
      25. WEnd
      26. ; Ende
      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-Quellcode

      1. for $i = 0 to ubound($checkarray) -1
      2. If BitAnd(GUICtrlRead($checkarray[$i]),$GUI_CHECKED) = $GUI_CHECKED Then ; ja die checkbox ist markiert...
      3. meinefunktion($i) ; ruft meine Funktion auf die die aktuelle Datei nun bearbeitet...
      4. endif
      5. next
      6. func meinefunktion($index)
      7. ; 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
      8. ; copy(...) ; Beispielhafte aktion
      9. ; zur Demonstration ein Dreistufiger verlauf
      10. sleep(333)
      11. guictrlsetdata($progarr[$index], 33)
      12. sleep(333)
      13. guictrlsetdata($progarr[$index], 66)
      14. sleep(333)
      15. guictrlsetdata($progarr[$index], 100)
      16. endfunc

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „misterspeed“ ()

      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-Quellcode

      1. ;i Hier sind keine Include nötig, aber nur bis hier! ;)
      2. Dim $arControl[5]
      3. Dim $arControlProg[5]
      4. GUICreate("Form1", 615, 440, 391, 202)
      5. For $i = 0 To 4 ;i erstellt 0 bis 4 = 5 Checkboxen, ;i statisch kein Ubound
      6. $arControl[$i] = GUICtrlCreateCheckbox("Checkbox " & $i + 1, 64, 64 + $i * 36, 97, 17)
      7. $arControlProg[$i] = GUICtrlCreateProgress(164, 64 + $i * 36, 150, 17)
      8. Next
      9. $Go = GUICtrlCreateButton("Start", 448, 164, 75, 25)
      10. GUISetState(@SW_SHOW)
      11. While 1
      12. Switch GUIGetMsg()
      13. Case -3
      14. Exit
      15. Case $Go
      16. For $i = 0 To 4
      17. If BitAND(GUICtrlRead($arControl[$i]), 1) = 1 Then ; ja die checkbox ist markiert...
      18. meinefunktion($i) ; ruft meine Funktion auf die die aktuelle Datei nun bearbeitet...
      19. EndIf
      20. Next
      21. EndSwitch
      22. WEnd
      23. Func meinefunktion($index)
      24. For $j = 0 To 100 Step 10
      25. GUICtrlSetData($arControlProg[$i], $j)
      26. Sleep(500)
      27. Next
      28. MsgBox(0, "TaTa ...", "Die Funktion wurde ausgeführt und die Einstellungen zurückgesetzt." & @TAB & @CRLF & "Bitteschön !")
      29. GUICtrlSetData($arControlProg[$i], 0)
      30. GUICtrlSetState($arControl[$i], 4)
      31. EndFunc ;==>meinefunktion
      32. ; Ende
      huh...
      wie soll ich's sagen.

      Beispiel:
      Checkbox 1 soll z.B. www.eBay.de starten
      das dauert.... bis alles geladen ist.
      Checkbox 3 startet www.Google.de
      das geht flott!
      Checkbox 4 startet 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-Quellcode

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

      :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-Quellcode

      1. func google() ; dauer nicht lange hat nur 3 schritte
      2. ; funktion beginnt, also setzen wir die Progressbar auf 10
      3. guictrlsetdata($progressbar,10)
      4. ; 1. Schritt
      5. ;_ieloadwait(...)
      6. guictrlsetdata($progressbar,30)
      7. ; 2. Schritt
      8. ; irgendwas ausfüllen, geht schnell, also setzen wir den Verluaf nur ein wenig höher
      9. guictrlsetdata($progressbar,50)
      10. ; 3. Schritt Formular abschicken und aufs Ergebnis warten
      11. ; submit()
      12. guictrlsetdata($progressbar,100) ; fertig
      13. endfunc
      14. func keineahnungwas()
      15. hier das selbe, nur dass wir 7 Schritte haben und entsprechend unseren Verlauf anders verteillen.
      16. endfunc


      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: autoit.de/index.php?page=Threa…ee+progressbar#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-Quellcode

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


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

      Ich schau mal, ob ich noch was finde

      ;) Ilse
    autoit.de Webutation