Switch Case bei unbekannter anzahl an Steuerelementen

  • Hallo Autoit'ler

    habe ein problem mit meinem script. habs mal auf das wichtigste runtergekürzt um euch das Problem besser erklären zu können (lasst euch nicht vom aussehn ablenken, is ja gekürzt ;) :(

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #NoTrayIcon
    Opt('GUIResizeMode', 802)

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

    Global $iCount = 1, $iHeight = 145, $iPosH = 60, $chr = Chr(34)
    Global $aCombo[$iCount], $aInput[$iCount], $aCheckbox[$iCount]

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

    $Schnitzel = GUICreate("Programm", 500, $iHeight - 65, (@DesktopWidth - 500)/ 4, 150)
    GUICtrlCreateGroup("", 5, 0, 110, 50)
    $Addbutton = GUICtrlCreateButton("+", 15, 17, 25, 25, 0)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $Delbutton = GUICtrlCreateButton("-", 49, 17, 25, 25, 0)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $addx = GUICtrlCreateInput("", 84, 19, 20, 21, 0x2001)
    GUICtrlCreateGroup("", 125, 0, 150, 50)
    $accs = GUICtrlCreateCombo("", 135, 19, 131, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
    GUICtrlCreateGroup("", 285, 0, 210, 50)
    $create = GUICtrlCreateButton("Button1", 296, 17, 123, 25, 0)
    $backup = GUICtrlCreateCheckbox("Check1", 428, 16, 63, 26)

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

    $Gruppe1 = GUICtrlCreateGroup("", 5, 53, 220, $iPosH + 5)
    $Gruppe2 = GUICtrlCreateGroup("", 224, 53, 222, $iPosH + 5)
    $Gruppe3 = GUICtrlCreateGroup("", 445, 53, 50, $iPosH + 5)

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

    $text1 = GUICtrlCreateLabel("Text1", 20, 67, 194, 17)
    $text2 = GUICtrlCreateLabel("text2", 245, 67, 174, 17)
    $text3 = GUICtrlCreateLabel("text3", 450, 67, 42)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Left()
    Case $Addbutton
    AddButton()
    Case $Delbutton
    DelButton()
    Case $addx
    For $addy = 1 To GUICtrlRead($addx) Step +1
    AddButton()
    Next
    GUICtrlSetData($addx, "")
    Case $create
    Create()
    EndSwitch
    WEnd

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


    Func AddButton()
    If ($iCount <= 20) Then
    HotKeySet("{NUMPADADD}")
    $size = WinGetPos("")
    $iCount += 1
    ReDim $aCombo[$iCount], $aInput[$iCount], $aCheckbox[$iCount]
    $iPosH += 30
    $aCombo[$iCount - 1] = GUICtrlCreateCombo("", 14, $iPosH, 205, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
    GUICtrlSetData($aCombo[$iCount - 1], "Auswahl1|Auswahl2|Auswahl3|Auswahl4|Auswahl5|Auswahl6")
    GUICtrlSetPos($Gruppe1, 5, 53, 220, $iPosH - 25)
    GUICtrlSetPos($Gruppe2, 224, 53, 222, $iPosH - 25)
    GUICtrlSetPos($Gruppe3, 445, 53, 50, $iPosH - 25)
    $aInput[$iCount - 1] = GUICtrlCreateInput("", 230, $iPosH, 210, 21)
    $aCheckbox[$iCount - 1] = GUICtrlCreateCheckbox("", 465, ($iPosH - 4), 28, 28)
    $iHeight += 30
    WinMove($Schnitzel, '', $size[0], $size[1], 506, $iHeight)
    HotKeySet("{NUMPADADD}","AddButton")
    EndIf
    EndFunc

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

    Func DelButton()
    If ($iCount > 2) Then
    HotKeySet("{NUMPADSUB}")
    $size = WinGetPos("")
    GUICtrlDelete($aCombo[$iCount - 1])
    GUICtrlDelete($aInput[$iCount - 1])
    GUICtrlDelete($aCheckbox[$iCount - 1])
    $iCount -= 1
    ReDim $aCombo[$iCount], $aInput[$iCount], $aCheckbox[$iCount]
    $iPosH -= 30
    $iHeight -= 30
    GUICtrlSetPos($Gruppe1, 5, 53, 220, $iPosH - 25)
    GUICtrlSetPos($Gruppe2, 224, 53, 222, $iPosH - 25)
    GUICtrlSetPos($Gruppe3, 445, 53, 50, $iPosH - 25)
    WinMove($Schnitzel, '', $size[0], $size[1], 506, $iHeight)
    HotKeySet("{NUMPADSUB}","DelButton")
    EndIf
    EndFunc

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

    Func Left()
    $beenden = MsgBox( 4 + 48 + 256 + 262144, "Beenden", "Soll das Programm wirklich geschlossen werden???" & @CRLF & "Alle Ungespeicherten Daten gehen damit Verloren")
    if $beenden = 6 then Exit
    EndFunc

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

    Func Create()
    MsgBox(0,"","Hauptfunktion")
    EndFunc

    [/autoit]


    Also mein problem ist:
    Wenn die Combobox geändert wird soll je nach auswahl verschiedene sachen ausgeführt werden.
    z.b. wenn Combobox auf Auswahl1 dann Inputbox
    wenn Combobox auf auswahl2 dann schreibe etwas in die inputbox und setzte die checkbox auf Checked
    usw

    das funktioniert ja egtl ganz gut mit switch case. aber ich bekomms bei mir einfach nicht hin weil immer das mit dem array nicht passt
    meine ideen waren zuerst:

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

    Switch $nMsg
    Case $aCombo[$iCount]
    MACH Irgendwas

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

    funktioniert natürlich nicht weil $aCombo[$iCount] immer nur die letzte combobox ist

    dann hab ich sowas in der art probiert:

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

    for $i = 1 to $iCount
    Switch $nMsg
    Case $aCombo[$iCount]
    MACH Irgendwas
    next

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

    hab ich aber auch nicht hingebracht

    und noch einige andere methoden von denen egtl mehr oder weniger klar war dass die nicht funktionieren.

    wär cool wenn mir jemand einen vernünftigen tipp geben könnte wie es funktioniert

    Mfg Schnitzel

  • Moin,

    Spoiler anzeigen
    [autoit]


    ...
    $msg = GUIGetMsg ( )
    Switch $msg
    Case $aCombo[0] To $aCombo[$iCount-1]
    MachWas ("Irgendetwas")
    ...

    [/autoit]


    Dazu musst Du es aber hinbekommen, daß die IDs aufeinanderfolgend sind, also z.B. 4, 5, 6, 7 ...

    Das ist etwas fummelig unter AutoIt, aber gehen tut es schon.

    Spoiler anzeigen
    [autoit]

    ;
    #include <Constants.au3>
    ...
    $nAlteID = GUICtrlCreateCombo ("Text")
    ...
    $nNeueID = 123 ; neue ID

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

    SetWindowLong (GUICtrlGetHandle ($nAlteID), $GWL_ID, $nNeueID)
    ...
    Func SetWindowLong ($hWnd, $nIndex, $dwNewLong)

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

    Local $aRes = DllCall ('user32.dll', 'long', 'SetWindowLong', _
    'hwnd', $hWnd, _
    'int', $nIndex, _
    'long', $dwNewLong)
    If @error Then _
    Return @error

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

    Return $aRes[0]

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

    EndFunc
    ;

    [/autoit]


    Gruß
    Greenhorn


  • Hallo Greenhorn

    erstmal danke für die schnelle antwort.

    den ersten quellcode kapier ich noch, da is ja auch nich soviel dabei. ich muss zwar ein bisschen was an meinen bisherigen programm ändern aber das ist kein problem. wenn nicht sogar besser so.

    probleme hab ich leider ein bisschen mit dem zweiten quellcode:
    also durchnummerriert sind meine comboboxen ja, zumindest vom quellcode. du sagtest quasi dass es auch durchnummerierte ID's haben muss oder. d.h. wenn man sich die ID's der comboboxen mit dem "Autoit Window Info"-Tool anschauen würde müssten die durchnummeriert sein, stimmts?

    wenn das stimmt schonmal soweit so gut. dann hab ich nur noch das problem das ich nicht genau weiß wie ich den zweiten quellcode richtig einbaue, da ich ja die comboboxen bereits erstellt habe. Kann ich sie weiterhin so erstellen wie in meinem beispiel und muss nur einen teil des quellcodes hinzufügen oder muss ich sie über deinen weg erstellen lassen.

    Gruß
    Schnitzel

  • ok ich hab jetz mal

    [autoit]

    $msg = GUIGetMsg ( )
    Switch $msg
    Case $aCombo[0] To $aCombo[$iCount-1]
    MachWas ("Irgendetwas")

    [/autoit]

    eingebaut und es funktioniert soweit prächtig.
    ich musste nur die erste Combobox quasi die $aCombo[0] von anfang an erstellen lassen da es sonst natürlich einen fehler gibt.

    ob ich den 2ten quellcode-teil jetzt noch brauche weiß ich nicht, aber ich denk mir reicht es so.
    ich brauch nurnochwas womit ich rauskriege welche der comboboxen geändert wurde, damit ich mit der nummer der box auch die in der selben zeile befindliche inputbox bzw checkbox ändern kann.

    Gruß
    Schnitzel

  • Sorry, ich habe deinen Code nicht ausprobiert, aber wenn ich es richtig verstanden habe, dann möchtest Du mehrere Gruppen, die wiederum Eingabefelder und ComboBox Steuerelemente enthalten, dynamisch zur Laufzeit erzeugen, oder liege ich da mal wieder falsch !?

    Sollte dem so sein, dann sind deine IDs bunt durcheinander gemischt, weil AutoIt die IDs bei Erzeugung inkrementiert und dann deiner Variablen zuweist ...
    z.B.

    Spoiler anzeigen
    [autoit]

    ...
    ...
    $aCombo[$iCount - 1] = GUICtrlCreateCombo("", 14, $iPosH, 205, 25, _ ; ID = z.B. 23
    BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
    ...
    $aInput[$iCount - 1] = GUICtrlCreateInput("", 230, $iPosH, 210, 21) ; ID = 24
    $aCheckbox[$iCount - 1] = GUICtrlCreateCheckbox("", 465, ($iPosH - 4), 28, 28) ; ID = 25

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

    ...

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

    ...

    [/autoit]


    Jetzt möchtest Du mit Case $n[$x] To $n[$y] alle ComboBox Steuerelemente prüfen, dann muss die nächste ID = 24 sein, damit das funktioniert. (Für Input 25 und für CheckBox 26)
    Da Du beim nächsten Aufruf von AddButton aber irgendetwas über 25 als ID zugewiesen bekommst, musst Du hinterher die IDs anpassen.

    Spoiler anzeigen
    [autoit]

    ...
    $aCombo[$iCount - 1] = GUICtrlCreateCombo("", 14, $iPosH, 205, 25, _
    BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
    SetWindowLong (GUICtrlGetHandle ($aCombo[$iCount - 1]), _
    $GWL_ID, _
    $aCombo[$iCount - 2] + 1) ;) Alte ID + 1
    ...
    $aInput[$iCount - 1] = GUICtrlCreateInput("", 230, $iPosH, 210, 21)
    SetWindowLong (GUICtrlGetHandle ($aInput[$iCount - 1]), _
    $GWL_ID, _
    $aInput[$iCount - 2] + 1) ;)
    $aCheckbox[$iCount - 1] = GUICtrlCreateCheckbox("", 465, ($iPosH - 4), 28, 28)
    SetWindowLong (GUICtrlGetHandle ($aCheckbox[$iCount - 1]), _
    $GWL_ID, _
    $aCheckbox[$iCount - 2] + 1) ;)
    ...

    [/autoit]


    EDIT:
    Ich habe das nie ausprobiert und weiß daher nicht ob AutoIt das mit macht ...
    GUIGetMsg läuft irgendwie über gemappte IDs, glaube ich, und ich weiß nicht, ob sich das zur Laufzeit auf diese Art ändern lässt.
    Sollte GUIGetMsg nicht darauf ansprechen, dann kannst Du die WM_COMMAND Nachricht mit GUIRegisterMsg registrieren, da klappt das auf jeden Fall ...


    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (20. Juni 2009 um 19:11)

  • ok ich hab jetz mal
    ich brauch nurnochwas womit ich rauskriege welche der comboboxen geändert wurde, damit ich mit der nummer der box auch die in der selben zeile befindliche inputbox bzw checkbox ändern kann.

    Gruß
    Schnitzel


    also gemacht habe ich es noch nicht .... aber als Idee .... kannst Du nicht in einem Array die ID´s der Elemente speichern die Du erstellst, und dann das Array abfragen, bzw. die ID´s daraus auslesen und entsprechend mit CASE abfragen ???

  • hm wäre auch mal ein versuch wert.

    habs aber etwas anders gelöst. und zwar hab ich $msg = guigetmsg(1) eingebaut und dann kann man mit $msg[2] die id des elements abfragen.

    Gruß
    Schnitzel

    Danke nochmal für eure hilfe. Problem ist jetzt gelöst.