Checkboxen auswerten

  • Moin Moin zusammen. Ich habe mich heute nacht im Bett gefragt, wie man am besten Checkboxen auswerten kann.

    Mit vier Checkboxen wäre das eine Idee, die mir nur so im Kopf herum flog.
    Was spricht gegen diese Art der Auswertung? Was dafür?
    Ich würde mich freuen Eure Meinung zu lesen.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    GUICreate("Checkboxauswertung ",140,100)

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

    $1 = GUICtrlCreateCheckbox("Box 1", 10, 10)
    $2 = GUICtrlCreateCheckbox("Box 2", 10, 30)
    $3 = GUICtrlCreateCheckbox("Box 3", 10, 50)
    $4 = GUICtrlCreateCheckbox("Box 4", 10, 70)

    $Button = GUICtrlCreateButton("OK",75,20,50,50)
    GUICtrlSetState(-1, $GUI_FOCUS) ; "OK" - Button im Fokus

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

    GUISetState()
    Example()

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

    Func Example()
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop

    Case $msg = $Button

    $comboaktiv_1 = GUICtrlRead($1)
    $comboaktiv_2 = GUICtrlRead($2)
    $comboaktiv_3 = GUICtrlRead($3)
    $comboaktiv_4 = GUICtrlRead($4)

    $ted = $comboaktiv_1 & $comboaktiv_2 & $comboaktiv_3 & $comboaktiv_4

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

    if $ted ="1444" then MsgBox(0, "Checkboxauswertung","Checkbox 1 ist alleine aktiv")
    If $ted ="4144" then MsgBox(0, "Checkboxauswertung","Checkbox 2 ist alleine aktiv")
    If $ted ="1144" then MsgBox(0, "Checkboxauswertung","Checkbox 1 und 2 sind aktiv") ;
    If $ted ="4414" then MsgBox(0, "Checkboxauswertung","Checkbox 3 ist alleine aktiv")
    If $ted ="1414" then MsgBox(0, "Checkboxauswertung","Checkbox 1 und 3 sind aktiv")
    If $ted ="4114" then MsgBox(0, "Checkboxauswertung","Checkbox 2 und 3 sind aktiv")
    If $ted ="1114" then MsgBox(0, "Checkboxauswertung","Checkbox 1 bis 3 sind aktiv")
    If $ted ="4441" then MsgBox(0, "Checkboxauswertung","Checkbox 4 ist alleine aktiv")
    If $ted ="1441" then MsgBox(0, "Checkboxauswertung","Checkbox 1 und 4 sind aktiv")
    If $ted ="4141" then MsgBox(0, "Checkboxauswertung","Checkbox 2 und 4 sind aktiv")
    If $ted ="1141" then MsgBox(0, "Checkboxauswertung","Checkbox 1, 2 und 4 sind aktiv")
    If $ted ="4411" then MsgBox(0, "Checkboxauswertung","Checkbox 3 und 4 sind aktiv")
    If $ted ="1411" then MsgBox(0, "Checkboxauswertung","Checkbox 1, 3 und 4 sind aktiv")
    If $ted ="4111" then MsgBox(0, "Checkboxauswertung","Checkbox 2, 3 und 4 sind aktiv")
    If $ted ="1111" then MsgBox(0, "Checkboxauswertung","Checkbox 1 bis 4 sind aktiv")
    If $ted ="4444" then MsgBox(0, "Checkboxauswertung","Es ist keine Checkbox aktiv")
    EndSelect
    WEnd
    EndFunc

    [/autoit]


    Berichtigt. ich meine na klar: Checkboxen

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    Einmal editiert, zuletzt von Alina (12. September 2009 um 20:00)

    • Offizieller Beitrag

    Hi, Alina.

    Das sind doch Checkboxen und keine Combobox ;)

    Deine Art der Abfrage finde ich ein bischen zu Codeaufwendig.

  • Hallo,
    als Stringfreak mache ich das natürlich so :D

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    dim $aCheckBoxArray[20]

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

    guicreate("")
    for $i=0 to ubound($aCheckBoxArray)-1 ;Gui füllen
    $aCheckBoxArray[$i]=GUICtrlCreateCheckbox("Box "&$i, 10, $i*20)
    Next
    guisetstate()

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

    $sTool="Es sind folgende Checkboxen markiert:"&@crlf&@crlf

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

    do
    $sChecked=""
    for $i=0 to ubound($aCheckboxArray)-1 ;abfragen, ob checkbox angehakt
    if guictrlread($aCheckBoxArray[$i])=$GUI_CHECKED Then $sChecked&=" "&$i
    Next
    tooltip($sTool&$sChecked)
    until guigetmsg()=-3

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

    exit

    [/autoit]


    *Edit* String weggelassen und vereinfacht^^

  • Andy

    Das war erstens nur eine mögliche Art der Verarbeitung und dann die Frage, was machst Du, wenn statt "Box" immer was anderes da steht? ;)

    Das es nicht für eine größere Anzahl von Checkboxen geeignet ist, ist schon aus der Berechnung "Anzahl der Checkboxen hoch zwei" zu sehen, aber für kleine Mengen an Checkboxen sollte das gerade für Anfänger/innen ausreichen.

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag

    Ich verwende dafür Dualzahlen. Dann kannst du ganz simpel aus der Summe prüfen, welche Boxen gecheckt sind. Macht hier die Funktion _ReadCB().

    Spoiler anzeigen
    [autoit]

    ; Muster Checkbox-Bearbeitung
    ; Ziel: einfache Abfrage, welche CB aktiviert sind

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

    #include <GUIConstants.au3>
    Opt('GUIOnEventMode', 1)
    Opt("MustDeclareVars", 1)
    Global $bCheckAll, $bUnCheckAll, $GUI, $i, $str
    Global $arCB[20][2] ; Array für Handle und Dual-Wert der CB
    For $i = 0 To UBound($arCB) -1
    $arCB[$i][1] = 2^$i ; Zuweisung eindeutiger Wert
    Next
    Global $Checked = 0 ; Variable nimmt Status ALLER Checkboxen in einem Wert auf,
    ; Startstatus für alle: UNCHECKED
    Global $w = 500, $h = 20*30+40, $l = (@DesktopWidth-$w)/2, $t = (@DesktopHeight-$h)/2
    Global $top = -10
    $GUI = GUICreate('Test Checkbox', $w, $h, $l, $t)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_Ende')
    For $i = 0 To UBound($arCB) -1
    $top += 30
    $arCB[$i][0] = GUICtrlCreateCheckbox('CheckBox_' & $i+1, 40, $top, 120)
    GUICtrlSetOnEvent(-1, '_ClickCB')
    Next
    $bCheckAll = GUICtrlCreateButton('Alle markieren', 250, 20, 150, 21)
    GUICtrlSetOnEvent(-1, '_CheckAll')
    $bUnCheckAll = GUICtrlCreateButton('Markierung aufheben', 250, 50, 150, 21)
    GUICtrlSetOnEvent(-1, '_UnCheckAll')
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Ende()
    Exit
    EndFunc

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

    Func _ClickCB()
    For $i = 0 To UBound($arCB) -1
    If $arCB[$i][0] = @GUI_CtrlId Then
    $Checked = BitXOR($Checked, $arCB[$i][1])
    _ReadCB()
    ExitLoop
    EndIf
    Next
    EndFunc

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

    Func _CheckAll()
    For $i = 0 To UBound($arCB) -1
    If Not BitAND($Checked, $arCB[$i][1]) Then
    GUICtrlSetState($arCB[$i][0], $GUI_CHECKED)
    $Checked = BitXOR($Checked, $arCB[$i][1])
    EndIf
    Next
    _ReadCB()
    EndFunc

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

    Func _UnCheckAll()
    For $i = 0 To UBound($arCB) -1
    If BitAND($Checked, $arCB[$i][1]) Then
    GUICtrlSetState($arCB[$i][0], $GUI_UNCHECKED)
    $Checked = BitXOR($Checked, $arCB[$i][1])
    EndIf
    Next
    _ReadCB()
    EndFunc

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

    Func _ReadCB() ; Fkt. dient nur zur Ausgabe, welche CB markiert sind
    Local $str = 'Markiert: '
    For $i = 0 To UBound($arCB) -1
    If BitAND($Checked, $arCB[$i][1]) Then $str &= $i+1 & ', '
    Next
    WinSetTitle($GUI, '', StringTrimRight($str, 2))
    EndFunc

    [/autoit]
  • Hallo Alina,

    Zitat

    was machst Du, wenn statt "Box" immer was anderes da steht?

    Es ist völlig egal was dort steht, da über die ControlID selektiert wird, das kannst du übrigens mit ALLEN Controls so machen.
    Lass uns mal ein "Problem" konstruieren: Eine GUI für ein größeres Projekt, bei der du am Anfang noch nicht die genaue Anzahl der Controls (Buttons, Checkboxen, Labels, Bilder usw) weist, du weist nur, es werden SEHR viele. Im Lauf der Entwicklung der GUI fallen dir immer weitere Möglichkeiten ein, ein Video-Control, 23 zusätzliche Buttons, eine Listview usw.
    Wie kannst du diese "Flut" von Controls in deiner Abfrage abwickeln? Oder 7 Gruppen mit je 12 Checkboxen? Natürlich könntest du 12 Seiten lang mit

    [autoit]

    If $ted ="14334567841" then

    [/autoit]

    jede einzelne Kombination abfragen, aber wenn nur 3 Checkboxen dazukommen schreibst du auch 12 Seiten Code um, bzw schreibst ihn neu!
    Dem Array dagegen ist es (fast) völlig egal, wieviele Einträge es hat, um mal bei dem Beispiel Checkboxen zu bleiben, du könntest in meinem Beispiel 1000 Checkboxen hinzufügen, ohne daß sich der Code nur um eine Zeile ändert!

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    dim $aCheckBoxArray[300]

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

    guicreate("",@desktopwidth-50, @desktopheight-50,0,0)
    for $i=0 to ubound($aCheckBoxArray)-1 ;Gui füllen
    $aCheckBoxArray[$i]=GUICtrlCreateCheckbox(hex(random(10,1000000),8), 10+80*int($i/30), mod($i,30)*20)
    Next
    guisetstate()

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

    $sTool="Es sind folgende Checkboxen markiert:"&@crlf&@crlf

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

    do
    $sChecked=""
    for $i=0 to ubound($aCheckboxArray)-1 ;abfragen, ob checkbox angehakt
    if guictrlread($aCheckBoxArray[$i])=$GUI_CHECKED Then $sChecked&=" "&$i
    Next
    tooltip($sTool&$sChecked)
    until guigetmsg()=-3

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

    exit

    [/autoit]

    Der "Text" der Boxen bzw der Controls ist unerheblich wie du siehst.
    Ändere einfach mal in Zeile 3 die Anzahl der Controls in eine beliebige Zahl....

    ciao
    Andy

  • Zitat

    Was macht denn dieser Thread hier im Poweruser-Forum?

    ;( OmG, war mir garnicht aufgefallen! Da verschwinde ich mal lieber schnell von der Bildfläche, bevor mir noch

    Zitat

    unqualifizierten Antworten

    entfleuchen.... :D

    • Offizieller Beitrag

    Was macht denn dieser Thread hier im Poweruser-Forum? Ist das Absicht?
    Dann könnte ich ja meine schwierigeren Fragen hier stellen, um sicher zu stellen, dass keine unqualifizierten Antworten kommen. :D8o

    Berechtigte Frage. Thema verschoben.