Radio & Checkboxen

  • Hallo.

    Ich versuche gerade das Prinzip der Radio & Checkboxen zu verstehen.

    Frage mich wie ich nachlese, ob Radiobutton makiert ist , oder eine Checkbox ausgewählt ist und wie man damit arbeitet.

    Der folgenden Script zeigt wie ich versuche das ganze irgendwie zu verstehen, aber es kam nicht viel gutes bei raus. Ist einfach das nächste Thema was ich lernen möchte und vllt. mag mir ja jemand dabei helfen. Wo finde ich Info (außer Doku)? Wie müsste ich das Script richtig aufbauen?

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, -1, -1)
    $Avi1 = GUICtrlCreateAvi("E:\sampleAVI.avi", -1, 8, 24, 32, 32)
    $Label1 = GUICtrlCreateLabel("AVI", 8, 16, 21, 17)
    $Radio1 = GUICtrlCreateRadio("Radio1", 8, 136, 57, 33)
    $Radio2 = GUICtrlCreateRadio("Radio2", 8, 176, 57, 41)
    $Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 168, 80, 97, 25)
    $Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 168, 112, 105, 25)
    $Checkbox3 = GUICtrlCreateCheckbox("Checkbox3", 168, 144, 105, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

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

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

    ; wieso startet er sofort und nicht erst wenn ich einen Button drücke ?
    Case $Radio1
    msgbox(0,"Test","Test")
    sleep(1000)
    Exit
    Case $Radio2

    ; Wieso startet es sofort mit dem GUI und nicht erst wenn ich einen Button drücke?
    ; kann man eigentlich ein Case erst dann ausführen lassen, wenn beide Bedingungen erfüllt sind und dann ein Button gedrückt wird?
    Case $Checkbox1 And $Checkbox2
    msgbox(0,"Test2","Test2")
    sleep(1000)
    Exit

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

    Case $Checkbox3
    EndSwitch
    WEnd

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


    LG, Crazy-A.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    • Offizieller Beitrag

    OK, dann erst mal was zur Erklärung.
    Radiobutton und Checkboxen werden auf $GUI_CHECKED bzw $GUI_UNCHECKED (also markiert/nicht markiert) geprüft.
    In einer GUIGetMsg-Konstruktion erhältst du von diesen Controls keine Msg - du mußt über einen Button die Abfrage auslösen.
    - Bei Radiobutton kann immer nur einer (in einer Gruppe) markiert sein. Wenn nur eine Gruppe Radiobutton auf der GUI ist, ist das Anlegen einer Group nicht erforderlich - aber empfehlenswert schon wegen der Optik.
    - Checkboxen können unabhängig voneinander markiert werden.

    Die Abfrage erfolgt für beide Controls identisch. Es gibt mehrere Formen der Abfrage, jedoch rate ich zu folgender:

    [autoit]

    If BitAnd(GUICtrlRead($Control), $GUI_CHECKED) Then

    [/autoit]

    Na dann probier mal weiter :)

  • Hi,

    Meine Lösung ist bestimmt net die beste aber für meine Scripte hat es bis jetzt immer gereicht.


    Spoiler anzeigen
    [autoit]


    $lable_border_front = GUICtrlCreateLabel("Rahmen Front an",380,30)
    $check_front = GUICtrlCreateCheckbox("",480,25)
    GUICtrlSetState(-1, $GUI_CHECKED)

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

    $lable_border_back = GUICtrlCreateLabel("Rahmen Back an",380,50)
    $check_back = GUICtrlCreateCheckbox("",480,45)
    GUICtrlSetState(-1, $GUI_CHECKED)

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

    $nMsg = GUIGetMsg()

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

    if GUICtrlRead($check_front) = 1 then
    $borderf = (Chr(34)&"1"&Chr(34))
    Else
    $borderf = (Chr(34)&"0"&Chr(34))
    EndIf

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

    if GUICtrlRead($check_back) = 1 then
    $borderb = (Chr(34)&"1"&Chr(34))
    Else
    $borderb = (Chr(34)&"0"&Chr(34))
    EndIf

    [/autoit]


    MfG
    Der_Doc

  • Hallo.

    Ich komme hier einfach nicht weiter:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, -1, -1)

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

    $Radio1 = GUICtrlCreateRadio("Radio1", 8, 136, 57, 33)
    $Radio2 = GUICtrlCreateRadio("Radio2", 8, 176, 57, 41)

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

    $Button1 = GUICtrlCreateButton("Button1", 80, 48, 57, 57, 0)

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

    $Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 168, 80, 97, 25)
    $Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 168, 112, 105, 25)
    $Checkbox3 = GUICtrlCreateCheckbox("Checkbox3", 168, 144, 105, 25)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

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

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

    Case $Button1

    ;funktioniert: soll aufgehen, wenn NUR Checkbox 1 ausgewählt ist und ein Button über das GUI gedrückt wird.
    if GUICtrlRead($Checkbox1) = 1 then
    msgbox(0,"Test 1","Test 1 ")
    Exit

    ;funktioniert: soll aufgehen, wenn NUR Checkbox 2 ausgewählt ist und ein Button über das GUI gedrückt wird.
    ElseIf GUICtrlRead($Checkbox2) = 1 then
    msgbox(0,"Test 2","Test 2")
    Exit

    ;soll aufgehen, wenn Checkbox 1 UND 2 ausgewählt ist und ein Button über das GUI gedrückt wird.
    ElseIf GUICtrlRead($Checkbox1) = 1 And GUICtrlRead($Checkbox2) = 1 then
    msgbox(0,"Test 1 und 2","Test 1 und 2")
    Exit

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

    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Wer kann mir sagen, wie ich es mache, das er, wenn ich den Button drücke, er das alles richtig macht. Habe es die Tage ja versucht, aber ich bekomme es nicht hin.

    LG, Crazy-A.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Hi Alina!, :)
    Also, du hast das schon richtig gecodet, nur der Fehler liegt darin, das wenn beide angeklickt sind, wird schon das erste ausgeführt, weil die erste Box ja angeklickt ist. D.h. aber auch, wenn du das Exit rausmachen würdest, würde es nicht funktionieren, weil ElseIf nur dann ausgeführt wird, wenn das If ja nicht zutrifft aber bei dir trifft es natürlich immer zu. Ich empfehle dir also, dass du die Bedingung, dass beide angeklickt sind, als If schreibst, sprich nach ganz oben setzt und die anderen als ElseIf.

    • Offizieller Beitrag

    Hallo Crazy-A!

    Immer erst auf die längste Kombination der Checkboxen testen, denn sonst ist ja bereits die erste Bedingung erfüllt und das Programm wird beendet.
    Außerdem solltest Du lieber BitAnd() und $GUI_CHECKED benutzen, denn der Wert '1' könnte sich ja in einer späteren AutoIt-Version ändern und dann funktioniert das Script nicht mehr.
    Hier mal die "richtige" Version:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, -1, -1)

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

    $Radio1 = GUICtrlCreateRadio("Radio1", 8, 136, 57, 33)
    $Radio2 = GUICtrlCreateRadio("Radio2", 8, 176, 57, 41)

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

    $Button1 = GUICtrlCreateButton("Button1", 80, 48, 57, 57, 0)

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

    $Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 168, 80, 97, 25)
    $Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 168, 112, 105, 25)
    $Checkbox3 = GUICtrlCreateCheckbox("Checkbox3", 168, 144, 105, 25)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    ;soll aufgehen, wenn Checkbox 1 UND 2 ausgewählt ist und ein Button über das GUI gedrückt wird.
    If BitAnd(GUICtrlRead($Checkbox1), $GUI_CHECKED) And BitAnd(GUICtrlRead($Checkbox2), $GUI_CHECKED) then
    msgbox(0,"Test 1 und 2","Test 1 und 2")
    Exit
    ;funktioniert: soll aufgehen, wenn NUR Checkbox 2 ausgewählt ist und ein Button über das GUI gedrückt wird.
    ElseIf BitAnd(GUICtrlRead($Checkbox2), $GUI_CHECKED) then
    msgbox(0,"Test 2","Test 2")
    Exit
    ;funktioniert: soll aufgehen, wenn NUR Checkbox 1 ausgewählt ist und ein Button über das GUI gedrückt wird.
    ElseIf BitAnd(GUICtrlRead($Checkbox1), $GUI_CHECKED)then
    msgbox(0,"Test 1","Test 1 ")
    Exit
    EndIf
    EndSwitch
    WEnd

    [/autoit]
  • Oscar

    Vielen Dank. Das habe ich jetzt verstanden.

    Aber wieso bin ich nicht selber darauf gekommen? Weil ich halt zu kompliziert denke. ;(

    So, jetzt werde ich mal das Forum durch forsten und schauen ob ich helfen kann.

    LG, Crazy-A(lina).

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Oscar
    Tolle Ausführungen in Post 7. Auch von mir Dank für die Erklärung! :rolleyes:^^

    Ich suche eine Lösung (Funktion), mit der ich nicht jede Checkbox abfragen muss. Mein Beispiel mit 8 mal read kommt etwas simpel daher auch mit BitAnd? ?(
    Wie kann ich das verbessern oder geht es nicht Anders, wie würdest Du es machen? ?(

    Spoiler anzeigen
    [autoit]


    If GUICtrlRead($ckbZeit) = 1 And GUICtrlRead($rbWoche) = 1 Then
    $time = "_0" & @WDAY
    EndIf

    If GUICtrlRead($ckbZeit) = 1 And GUICtrlRead($rbMonat) = 1 Then
    $time = "_" & @MDAY
    EndIf

    If GUICtrlRead($ckbZeit) = 1 And GUICtrlRead($rbJahr) = 1 Then
    $time = "_" & @YEAR & "-" & @MON & "-" & @MDAY
    EndIf

    If GUICtrlRead($ckbFF) = 1 Then
    $dest = $ziel & "\$Bookmarks$\Bookmarks" & $time & ".zip "
    $src = '"' & @AppDataDir & '\Mozilla\Firefox\Profiles\rgcmygqc.default\bookmarkbackups"'
    $ff = "Bookmarks - "
    _sichernFunc()
    EndIf

    If GUICtrlRead($ckbIE) = 1 Then
    $dest = $ziel & "\$Favoriten$\Favoriten" & $time & ".zip "
    $src = '"' & @FavoritesDir & '"'
    $ie = "Favoriten - "
    _sichernFunc()
    EndIf

    If GUICtrlRead($ckbEDateien) = 1 Then
    $dest = $ziel & "\$EigeneDateien$\EigeneDateien" & $time & ".zip "
    $src = '"' & @MyDocumentsDir & '"'
    $ed = "Eigene Dateien - "
    _sichernFunc()
    EndIf

    If GUICtrlRead($ckbFF) = 4 And GUICtrlRead($ckbIE) = 4 And GUICtrlRead($ckbEDateien) = 4 Then
    MsgBox(16, "Error", "Es sind keine Daten zur Sicherung ausgewählt ! ")
    ExitLoop
    EndIf

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


    Danke

    • Offizieller Beitrag

    Bei derart verschiedenen Werten bleibt eigentlich keine andere Möglichkeit als die IF-Abfragen. Wie ich oben aber bereits schrieb, sollte man lieber BitAnd und $GUI_CHECKED bzw. GUI_UNCHECKED benutzen. Die Werte 1 und 4 müssen nicht für alle Ewigkeit diese Werte bleiben. Mal abgesehen davon, dass man das Script mit $GUI_(UN)CHECKED leichter verstehen kann.