mehrere Checkboxen überprüfen

  • Hi,
    wie kann ich die Checkboxen, die ausgwählt wurden nach einem Bestätigungsbutton überprüfen?
    so gings nicht:

    [autoit]


    $msg = 0
    While $msg <> $GUI_EVENT_CLOSE
    $msg = GUIGetMsg()

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

    Select
    Case $msg = $b_install And $msg = $info_check1 And $msg = $info_check2

    [/autoit]


    Danke

  • Hi

    Ich bin mir nicht ganz sicher aber du willst dich wissen ob die Checkboxen angeklickt wurden wenn ja dann kannste das benutzten überprüft halt nur wenn du einen butten drückst kannste ja aber auch abändern.
    das selbe Problem hatte ich vorn kurzem auch aber die Hilfe hilft:

    [autoit]


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

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

    Case $Button1
    If GUICtrlRead($checkbox) = $GUI_CHECKED Then
    ...
    EndIf

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

    EndSwitch
    WEnd

    [/autoit]

    Gruß
    Redclaw

    2 Mal editiert, zuletzt von Redclaw (24. Oktober 2007 um 13:07)

  • Hi,
    ich glaube mein Problem ist eher die Abfrage in der while Schleife, oder ich verstehe das ganze GUI-Zeugs noch nicht ganz ;)
    Wenn ich den Status auslese, dann muss ich den doch immer noch nach dem "senden" Button abfragen um dann darauf zu reagieren, oder nicht?

    • Offizieller Beitrag

    Hi,

    kannst dir auch ne Hilfsfunc schreiben:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    GUICreate("My GUI Checkbox")
    $1_CB = GUICtrlCreateCheckbox("AN", 10, 10, 120, 20)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $2_CB = GUICtrlCreateCheckbox("AUS", 10, 30, 120, 20)
    $start = GUICtrlCreateButton("Statuscheck", 10, 50, 100, 21)
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()

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

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    If $msg = $start Then
    ConsoleWrite(_getCheckboxState($1_CB) & @CRLF)
    ConsoleWrite(_getCheckboxState($2_CB) & @CRLF)
    EndIf
    WEnd

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

    Func _getCheckboxState($controlID)
    Return BitAND(GUICtrlRead($controlID),$GUI_CHECKED)
    EndFunc ;==>_getCheckboxState

    [/autoit]

    Edit: Ich würde erst den case machen und dann innerhalb des Case mit if auf die Checkboxen fragen.

    So long,

    Mega

  • Hi Xenobiologist,
    die Idee ist gut, ich denke ich werde es so umsetzen. Probiere es nachher mal aus. Thx

    edit:
    ich habe es jetzt so gelöst:

    [autoit]


    Case $msg = $b_install
    _checkbox($check1,$check2,$check3)

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

    Func _checkbox($check1,$check2,$check3)
    $state1 = GUICtrlRead($check1)
    $state2 = GUICtrlRead($check2)
    $state3 = GUICtrlRead($check3)
    EndFunc

    [/autoit]


    wie bekomme ich jetzt am besten die Abhängigkeiten gelöst. Also wenn state1 = checked dann das , wenn 1 und 2. wenn 1 und 3 ...
    mit If wäre das wohl etwas mühselig.

    Einmal editiert, zuletzt von sunghost (24. Oktober 2007 um 16:22)

  • mh bei mir funktioniert die Func:

    [autoit]


    Func _checkbox($check1,$check2,$check3)
    $state1 = GUICtrlRead($check1)
    $state2 = GUICtrlRead($check2)
    $state3 = GUICtrlRead($check3)

    if $state1 = $GUI_CHECKED Then
    If $state1 = $GUI_CHECKED AND $state2=$GUI_CHECKED Then
    MsgBox(0,"test","test")
    EndIf

    EndIf
    EndFunc

    [/autoit]


    oder wie meinst du das?

    • Offizieller Beitrag

    Hi,

    laß dir dies

    GUICtrlRead($check2)

    mal ausgeben, dann siehst du was ich meine.

    P.S.:

    [autoit]

    if $state1 = $GUI_CHECKED Then
    If $state1 = $GUI_CHECKED AND $state2=$GUI_CHECKED Then
    MsgBox(0,"test","test")
    EndIf

    [/autoit]

    die erste Abfrage kannst du dir auch sparen, wenn er nur was passiert wenn beides ...

  • mh wenn ich beides anhake, dann ist das Ergenis von state2 = 1 von state1 ebenfalls und von 3=4.
    Das If ist schon ok, ist der Beginn von der Verschachtelung. Gedanklich sollte dann ein else folgen, sodass ich den Status 1 mit berücksichtige.

    • Offizieller Beitrag

    Wenn du mehrere Checkboxen abfragen willst, ist folgendes Beispiel vllt. hilfreich.
    Hier setzt du für 'Checked' deinen eigenen Statuswert (Bitwert), der für jede Box unterschiedlich ist. Startwert für alle Checkboxen ist dabei 'UnChecked'.
    Egal, welche Boxen markiert sind - die Summe des Statuswertes ist eineindeutig. D.h. wenn z.B. der Wert 3 ist, sind die Boxen 1 und 2 markiert.
    Das läßt sich dann prima mit Switch verarbeiten.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1)
    Dim $CB_Bit = 0
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 460, 318, 286, 144)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 54, 42, 97, 17)
    GUICtrlSetOnEvent(-1, "Checkbox1Click")
    $Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 54, 81, 97, 17)
    GUICtrlSetOnEvent(-1, "Checkbox2Click")
    $Checkbox3 = GUICtrlCreateCheckbox("Checkbox3", 54, 120, 97, 17)
    GUICtrlSetOnEvent(-1, "Checkbox3Click")
    $Checkbox4 = GUICtrlCreateCheckbox("Checkbox4", 54, 160, 97, 17)
    GUICtrlSetOnEvent(-1, "Checkbox4Click")
    $Checkbox5 = GUICtrlCreateCheckbox("Checkbox5", 54, 199, 97, 17)
    GUICtrlSetOnEvent(-1, "Checkbox5Click")
    $Checkbox6 = GUICtrlCreateCheckbox("Checkbox6", 54, 238, 97, 17)
    GUICtrlSetOnEvent(-1, "Checkbox6Click")
    $Input1 = GUICtrlCreateInput("", 282, 38, 121, 21)
    $Label1 = GUICtrlCreateLabel("Markiert sind:", 206, 42, 67, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    Sleep(100)
    WEnd

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

    Func Form1Close()
    Exit
    EndFunc

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

    Func Checkbox1Click()
    $CB_Bit = BitXOR($CB_Bit, 1)
    _CBRead()
    EndFunc
    Func Checkbox2Click()
    $CB_Bit = BitXOR($CB_Bit, 2)
    _CBRead()
    EndFunc
    Func Checkbox3Click()
    $CB_Bit = BitXOR($CB_Bit, 4)
    _CBRead()
    EndFunc
    Func Checkbox4Click()
    $CB_Bit = BitXOR($CB_Bit, 8)
    _CBRead()
    EndFunc
    Func Checkbox5Click()
    $CB_Bit = BitXOR($CB_Bit, 16)
    _CBRead()
    EndFunc
    Func Checkbox6Click()
    $CB_Bit = BitXOR($CB_Bit, 32)
    _CBRead()
    EndFunc

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

    Func _CBRead()
    Local $str = ''
    If BitAND($CB_Bit, 1) Then $str &= 1 & ', '
    If BitAND($CB_Bit, 2) Then $str &= 2 & ', '
    If BitAND($CB_Bit, 4) Then $str &= 3 & ', '
    If BitAND($CB_Bit, 8) Then $str &= 4 & ', '
    If BitAND($CB_Bit, 16) Then $str &= 5 & ', '
    If BitAND($CB_Bit, 32) Then $str &= 6
    GUICtrlSetData($Input1, $str)
    EndFunc

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

    ; mögliche Abarbeitung:
    Switch $CB_Bit
    Case 1
    ; Code für CB 1 markiert
    Case 2
    ; Code für CB 2 markiert
    Case 3
    ; Code für CB 1+2 markiert
    Case 4
    ; Code für CB 3 markiert
    Case 5
    ; Code für CB 1+3 markiert
    ; usw.....
    EndSwitch

    [/autoit]
  • Danke,
    probier ich mal.

    edit:
    so hatte mal Zeit genauer über deinen Code zu schauen:
    Was mir noch nicht ganz einleuchtet ist der Punkt mit der Kombination von 1+2 Click. Du weist doch der Checkbox3, 4Bit zu und der $str die 3. Im Switch fragst du dann die 3 ab und schreibst das dies die Box 1 und 2 sein sollen. Das versteh ich grad nicht ganz.

    Einmal editiert, zuletzt von sunghost (26. Oktober 2007 um 09:41)

    • Offizieller Beitrag

    Das ist Bitlogik.
    Wenn du 3 in die Potenzen von 2 zerlegst sind das:
    1* 2^0 = 1 und
    1* 2^1 = 2

    Alle zugewiesenen Werte sind Potenzen von 2. Somit kannst du aus einer Summe jederzeit feststellen welche 2-er Potenzen zur Summenbildung geführt haben.
    Denn eine kleinere Ganzzahlzerlegung als mit 2-er Potenzen geht nunmal nicht.

    Du darfst auch nicht die Funktion _CBRead() mit der Switch-Auswertung durcheinanderwürfeln.
    _CBRead() diente hier nur dazu um optisch sofort das Ergebnis der markierten Boxen sichtbar zu machen. Und $str &= 3 bedeutet, dass die BitAnd-Überprüfung ergibt, dass die Checkbox Nr.3, mit dem Wert 4 markiert ist.
    Die Variable $str führt nur die Namen der markierten Boxen zusammen und schreibt sie in das Inputfeld.
    Für die normale Arbeit benötigst du die Funktion _CBRead() nicht, diente wirklich nur der Veranschaulichung.

  • so hatte nun endlich mal wieder Zeit für das Script. Danke BugFix, dass funktioniert prima. Mir ist die Funktion zwar noch nicht richtig klar, aber sonst funktioniert es schon primar.
    Danke