Radio "Gruppen"

  • Hallo Leute!

    Ich habe folgenden Code:

    [autoit]

    GUICtrlCreateRadio("", 160, 17+$i*20, 17, 17)
    GUICtrlCreateRadio("", 192, 17+$i*20, 17, 17)

    [/autoit]

    Da sich das Ganze in einer For Schleife befindet, ändert sich die Anzahl der Radios.
    Man soll aber je einen RadioButton von 2 auswählen können.
    Momentan kann ich von zehn pärchen nur einen Radio Button auswählen.

    Danke!

  • Habe gleich nochmals ein Problem.

    Die messageboxes kommen, ohne dass ich die radios anklicke.

    [autoit]

    While 1
    For $o = 1 To $Anzahl
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $RadioO[$o] And BitAND(GUICtrlRead($RadioO[$o]), $GUI_CHECKED) = $GUI_CHECKED
    MsgBox(0,$o,"O")
    Case $RadioD[$o] And BitAND(GUICtrlRead($RadioD[$o]), $GUI_CHECKED) = $GUI_CHECKED
    MsgBox(0,$o,"D")
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Next
    WEnd

    [/autoit]

    Wie müsste ich das schreiben?

    • Offizieller Beitrag

    Deine For schleife würde bedeuten wenn du 14 RAdios hast das immer 13 mal die MSGBox kommt . Wenn ich net ganz irre.

  • Deine For schleife würde bedeuten wenn du 14 RAdios hast das immer 13 mal die MSGBox kommt . Wenn ich net ganz irre.

    Genau das ist das Ziel :D (falls sie "gecheckt" sind)
    Er will durch die For-Schleife alle RadioButtons abfragen.

    Aber er sagt, dass es bei ihm nicht funktioniert, aber ohne Den Restcode kann ich nicht helfen, weil ich ned ausprobieren kann :)

    • Offizieller Beitrag

    Genau das ist das Ziel :D (falls sie "gecheckt" sind)
    Er will durch die For-Schleife alle RadioButtons abfragen.

    Aber er sagt, dass es bei ihm nicht funktioniert, aber ohne Den Restcode kann ich nicht helfen, weil ich ned ausprobieren kann :)

    Hm, ich denke des mit 13 mal ist doch auch Humbug. er will ne MsgBox wenn er einen Radio Anklickt . Soweit ich Radiobuttons verstanden habe , kann immer nur ein Radio in 1 Gruppe selektiert sein , net 14 oder 13 ....

    • Offizieller Beitrag

    Raupi : Was soll das werden? - Eine Zitatschlacht?
    Nur ein Zitat zu bringen ohne eigenen Kommentar ist weitgehend sinnfrei... :S

    Ich will hier net Zitieren. ich denke du hast mehr Ahnung mit Gui Progen als ich . Schau dir mal meinen Code an und sag mir ob ich falsh Denke . Nur ein Radio in einer Gruppe kann selektiert sein . Eine For schleife ist meinermeinung falsch .

    Ich gehe mal davon aus das er deinen Rat beherzigt hat und dann folgendes gemacht hat .

    [autoit]

    $RadioGroup[$i] = GuiCtrlCreateGroup
    $RadioO[$i]=GUICtrlCreateRadio("", 160, 17+$i*20, 17, 17)
    $RadioD[$i]=GUICtrlCreateRadio("", 192, 17+$i*20, 17, 17)

    [/autoit]

    $i hab ich nur zur veranschaulichung gewählt

    Eventuell kann es aber auch sein das er nur die MsgBox falsch aufruft ;)
    Shit, ich sollte net denken und essen gleichzeitig der aufruf der MsgBox ist korrekt.

  • Hm, ich denke des mit 13 mal ist doch auch Humbug. er will ne MsgBox wenn er einen Radio Anklickt . Soweit ich Radiobuttons verstanden habe , kann immer nur ein Radio in 1 Gruppe selektiert sein , net 14 oder 13 ....

    Nein. Es wird nur eine Msgbox ausgegeben wenn der RadioButton auch tatsächlich selektiert ist.
    Und weil er jetzt jetzt nicht unbedingt 14 Case Abfragen laufen lassen will, lässt er das ein for-Schleife für sich machen.
    Die for-Schleife dient nur zur Abfrage welche tatsächlich ausgewählt sind.

    Ich hab jetzt genug gespammt und kann eigentlich auf die Frage keine antwort geben. Ich halte mich jetzt mal zurück :P.

    • Offizieller Beitrag

    Klar kommen die MsgBoxen - es sind ja alle Bedingungen erfüllt. Du hast falsch abgefragt und keine Klammern verwendet.
    Case $RadioO[$o] - ist schonmal True
    And BitAND(GUICtrlRead($RadioO[$o]), $GUI_CHECKED) ergibt das True, welches für And notwendig ist und somit ist die gesamte Abfrage wahr!
    = $GUI_CHECKED wird gar nicht mehr geprüft
    Außerdem mußt du für diese Abfrageform Select-Case statt Switch-Case verwenden.

    • Offizieller Beitrag

    BugFix

    Wäre folgeder Code richtig ?

    Spoiler anzeigen
    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $nmsg >= $Radio0[1] And $nmsg <= $Radio0[$Anzahl]
    if $RadioO[$nmsg-$RadioO[1] +1 ] =1 then
    MsgBox(0,$o,"O")
    EndIf
    Case $nmsg >= $RadioD[1] And $nmsg <= $RadioD[$Anzahl]
    if $RadioD[$nmsg -$RadioD[1] + 1] = 1 then
    MsgBox(0,$o,"D")
    Endif
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    oder was würdes du vorschlagen ? Ich weiß, ist vielleicht ein wenig umständlich aber so in der art funzt des bei meiner Gui .

    • Offizieller Beitrag

    OK, hier mal ein Muster:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Global $arRadio[10], $str

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

    $gui = GUICreate('test', 500, 400)
    GUICtrlCreateGroup('', 10, 10, 400, 60)
    $arRadio[0] = GUICtrlCreateRadio('Radio 1', 20, 20, 70)
    $arRadio[1] = GUICtrlCreateRadio('Radio 2', 20, 45, 70)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup('', 10, 80, 400, 60)
    $arRadio[2] = GUICtrlCreateRadio('Radio 3', 20, 90, 70)
    $arRadio[3] = GUICtrlCreateRadio('Radio 4', 20, 115, 70)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup('', 10, 150, 400, 60)
    $arRadio[4] = GUICtrlCreateRadio('Radio 5', 20, 160, 70)
    $arRadio[5] = GUICtrlCreateRadio('Radio 6', 20, 185, 70)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup('', 10, 220, 400, 60)
    $arRadio[6] = GUICtrlCreateRadio('Radio 7', 20, 230, 70)
    $arRadio[7] = GUICtrlCreateRadio('Radio 8', 20, 255, 70)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup('', 10, 290, 400, 60)
    $arRadio[8] = GUICtrlCreateRadio('Radio 9', 20, 300, 70)
    $arRadio[9] = GUICtrlCreateRadio('Radio 10', 20, 325, 70)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    For $i = 0 To UBound($arRadio) -2 Step 2
    GUICtrlSetState($arRadio[$i], $GUI_CHECKED)
    Next
    $bCheck = GUICtrlCreateButton('Check', 10, 370, 60, 20)
    GUISetState()

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

    Do
    $msg = GUIGetMsg()
    If $msg = $bCheck Then
    $str = ''
    For $i = 0 To UBound($arRadio) -1
    If BitAND(GUICtrlRead($arRadio[$i]), $GUI_CHECKED) Then
    $str &= ControlGetText("", "", $arRadio[$i]) & @LF
    EndIf
    Next
    MsgBox(0, '', 'Markiert sind: ' & @LF & $str )
    EndIf
    Until $msg = $GUI_EVENT_CLOSE

    [/autoit]
    • Offizieller Beitrag

    BugFix

    Danke für des Beispiel . Ist sehr Aufschlußreich . :)

    • Offizieller Beitrag

    BugFix

    Ich hab mal versucht eine Dynamische Variante von deinem Code zu bauen. Da du der King of Array bist kannst du mir bestimmt sagen ob des mit der Array declaration so richtig ist . Oder fällt dir was anderes ein ? KAnn sein das ich en bissle Steßig bin aber ich bin eine absolute Array-Niete .

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    Global $RadioO[1]
    Global $RadioD[1]
    Global $RadioGroup[1]
    Global $RadioResult[1] ;Wird im Augenblick nicht gebraucht
    $RadioO[0] ='Radiobuttons O'
    $RadioD[0] ='Radiobuttons D'
    $RadioGroup[0] ='RadioGroup'
    $RadioResult[0] ='Auswahl'
    Global $Anzahl

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

    $Anzahl = InputBox("Radiobuttons", "Wieviele Radios sollen erstellt werden ?."&@CRLF&"Auswahl 1 bis 20 ","20")

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

    GUICreate("Meine GUI mit Optionsfeldern",370,800,-1,-1 ) ; erstellt ein GUI-Fenster welches mittig ausgerichtet wird
    For $i=0 to $Anzahl-1
    _ArrayAdd($RadioGroup, GUICtrlCreateGroup("Gruppe "&$i+1,10 ,7+$i*35 ,350, 35))
    _ArrayAdd($RadioO, GUICtrlCreateRadio("Radio A ", 100, 19+$i*35, 70, 17))
    GUICtrlSetState( -1, $Gui_Checked)
    _ArrayAdd($RadioD, GUICtrlCreateRadio("Radio B ", 250, 19+$i*35, 70, 17))
    _ArrayAdd($RadioResult, "O")
    next
    $bCheck = GUICtrlCreateButton('Check', 10, 770, 60, 20)
    GUISetState()

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

    Do
    $msg = GUIGetMsg()
    If $msg = $bCheck Then
    $str = ''
    For $i = 1 To UBound($RadioO) -1
    If BitAND(GUICtrlRead($RadioO[$i]), $GUI_CHECKED) Then
    $str &= "Gruppe "&$i&" "&ControlGetText("", "", $RadioO[$i]) & @LF
    elseif BitAND(GUICtrlRead($RadioD[$i]), $GUI_CHECKED) Then ; geht auch mit else aber brauch das Später noch
    $str &= "Gruppe "&$i&" "& ControlGetText("", "", $RadioD[$i]) & @LF
    EndIf
    Next
    MsgBox(0, '', 'Markiert sind: ' & @LF & $str )
    EndIf
    Until $msg = $GUI_EVENT_CLOSE

    [/autoit]


    THX im voraus .

    MfG Raupi

  • Wow! Solche Bemühungen hätte ich nicht erwartet! Entschuldigt, dass ich gestern nicht mehr reingeschaut habe.
    Der ganze Code sieht so aus:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Array.au3>

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

    $Anzahl = 5

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

    $Form1 = GUICreate("Form1", 777, 20*$Anzahl+50, 193, 125)
    $Graphic1 = GUICtrlCreateGraphic(160, 24, 17, 17)
    $Graphic2 = GUICtrlCreateGraphic(192, 24, 17, 17)
    $Graphic3 = GUICtrlCreateGraphic(248, 24, 17, 17)
    $Graphic4 = GUICtrlCreateGraphic(288, 24, 17, 17)
    $Graphic5 = GUICtrlCreateGraphic(328, 24, 17, 17)
    $Graphic6 = GUICtrlCreateGraphic(368, 24, 17, 17)
    $Graphic7 = GUICtrlCreateGraphic(440, 24, 17, 17)
    $Graphic8 = GUICtrlCreateGraphic(480, 24, 17, 17)
    $Graphic9 = GUICtrlCreateGraphic(520, 24, 17, 17)
    $Graphic10 = GUICtrlCreateGraphic(560, 24, 17, 17)
    $Graphic11 = GUICtrlCreateGraphic(632, 24, 17, 17)
    $Graphic12 = GUICtrlCreateGraphic(672, 24, 17, 17)
    $Graphic13 = GUICtrlCreateGraphic(744, 24, 17, 17)
    $Label2 = GUICtrlCreateLabel("Label2", 8, 8, 60, 28)
    GUICtrlSetFont(-1, 16, 400, 0, "MS Sans Serif")

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

    Dim $CheckST[$Anzahl+1], $CheckSC[$Anzahl+1], $CheckAK[$Anzahl+1], $CheckBS[$Anzahl+1], $CheckSP[$Anzahl+1], $CheckLK[$Anzahl+1], $CheckBB[$Anzahl+1], $CheckSK[$Anzahl+1], $CheckRA[$Anzahl+1], $CheckKA[$Anzahl+1], $CheckAG[$Anzahl+1], $RadioO[$Anzahl+1], $RadioD[$Anzahl+1]
    For $i = 1 To $Anzahl
    $Label1 = GUICtrlCreateLabel("Label" & $i, 8, 17+$i*20, 124, 17)

    GUIStartGroup()
    $RadioO[$i] = GUICtrlCreateRadio("", 160, 17+$i*20, 17, 17)
    $RadioD[$i] = GUICtrlCreateRadio("", 192, 17+$i*20, 17, 17)


    $CheckST[$i] = GUICtrlCreateCheckbox("", 248, 17+$i*20, 17, 17)
    $CheckSC[$i] = GUICtrlCreateCheckbox("", 288, 17+$i*20, 17, 17)
    $CheckAK[$i] = GUICtrlCreateCheckbox("", 328, 17+$i*20, 17, 17)
    $CheckBS[$i] = GUICtrlCreateCheckbox("", 368, 17+$i*20, 17, 17)

    $CheckSP[$i] = GUICtrlCreateCheckbox("", 440, 17+$i*20, 17, 17)
    $CheckLK[$i] = GUICtrlCreateCheckbox("", 480, 17+$i*20, 17, 17)
    $CheckBB[$i] = GUICtrlCreateCheckbox("", 520, 17+$i*20, 17, 17)
    $CheckSK[$i] = GUICtrlCreateCheckbox("", 560, 17+$i*20, 17, 17)

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

    $CheckRA[$i] = GUICtrlCreateCheckbox("", 632, 17+$i*20, 17, 17)
    $CheckKA[$i] = GUICtrlCreateCheckbox("", 672, 17+$i*20, 17, 17)

    $CheckAG[$i] = GUICtrlCreateCheckbox("", 744, 17+$i*20, 17, 17)
    Next
    GUISetState(@SW_SHOW)

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

    While 1
    For $o = 1 To $Anzahl
    $nMsg = GUIGetMsg()
    Select
    Case $nMsg = $RadioO[$o] And BitAND(GUICtrlRead($RadioO[$o]), $GUI_CHECKED) = $GUI_CHECKED
    MsgBox(0,$o,"O")
    Case $nMsg = $RadioD[$o] And BitAND(GUICtrlRead($RadioD[$o]), $GUI_CHECKED) = $GUI_CHECKED
    MsgBox(0,$o,"D")
    Case $nMsg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    Next
    WEnd

    [/autoit]

    Wenn eine Radiobox angewählt wird, sollen gewisse Checkboxen gecheckt werden.
    Im oberen Fall reagieren die Checkboxen nur selten.
    Eigentlich sollte nur eine MessageBox aufspringen, wenn eine Radiobox frisch angewählt wurde.

    Danke für eure Bemühungen

    Einmal editiert, zuletzt von ManuIt (3. Oktober 2008 um 10:42)

    • Offizieller Beitrag

    Du musst das GUIGetMsg außerhalb der For...Next-Schleife setzen:

    [autoit]


    While 1
    $nMsg = GUIGetMsg()
    For $o = 1 To $Anzahl
    Select
    Case $nMsg = $RadioO[$o] And BitAND(GUICtrlRead($RadioO[$o]), $GUI_CHECKED)
    MsgBox(0,$o,"O")
    Case $nMsg = $RadioD[$o] And BitAND(GUICtrlRead($RadioD[$o]), $GUI_CHECKED)
    MsgBox(0,$o,"D")
    Case $nMsg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    Next
    WEnd

    [/autoit]

    Edit: Was soll dieses Löschen der Nachrichten? Das reisst die anschließenden Post's völlig aus dem Zusammenhang. :(

  • Edit: Was soll dieses Löschen der Nachrichten? Das reisst die anschließenden Post's völlig aus dem Zusammenhang.

    Entschuldige, ich habe gerade rausgefunden woran es lag.

    Meine Lösung sieht jetzt so aus:

    Spoiler anzeigen
    [autoit]

    While 1
    For $o = 1 To $Anzahl
    $nMsg = GUIGetMsg()
    Select
    Case $RadioO[$o] And BitAND(GUICtrlRead($RadioO[$o]), $GUI_CHECKED) = $GUI_CHECKED
    GUICtrlSetState($RadioO[$o],$GUI_UNCHECKED)

    GUICtrlSetState($CheckST[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckSC[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckAK[$o],$GUI_CHECKED)
    GUICtrlSetState($CheckBS[$o],$GUI_UNCHECKED)

    GUICtrlSetState($CheckSP[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckLK[$o],$GUI_CHECKED)
    GUICtrlSetState($CheckBB[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckSK[$o],$GUI_UNCHECKED)

    GUICtrlSetState($CheckRA[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckKA[$o],$GUI_UNCHECKED)

    GUICtrlSetState($CheckAG[$o],$GUI_UNCHECKED)

    Case $RadioD[$o] And BitAND(GUICtrlRead($RadioD[$o]), $GUI_CHECKED) = $GUI_CHECKED
    GUICtrlSetState($RadioD[$o],$GUI_UNCHECKED)

    GUICtrlSetState($CheckST[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckSC[$o],$GUI_CHECKED)
    GUICtrlSetState($CheckAK[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckBS[$o],$GUI_CHECKED)

    GUICtrlSetState($CheckSP[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckLK[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckBB[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckSK[$o],$GUI_CHECKED)

    GUICtrlSetState($CheckRA[$o],$GUI_UNCHECKED)
    GUICtrlSetState($CheckKA[$o],$GUI_UNCHECKED)

    GUICtrlSetState($CheckAG[$o],$GUI_UNCHECKED)
    EndSelect
    Next
    If $nMsg = $GUI_EVENT_CLOSE Then
    Exit
    EndIf
    WEnd

    [/autoit]

    Das ist die einzige Lösung die ich gerade sehe.
    Man soll die checkboxen selbst noch verändern können.
    Schade, dass ich die RadioBox unchecken muss damit es benutzerdefinierte einstellungen zulässt.

    Einmal editiert, zuletzt von ManuIt (3. Oktober 2008 um 10:43)