Wie kann man eine Variablen-Liste an Switch-Case übergeben?

  • In einer Switch-Case Anweisung stehen in einem Case Zweig mehrere Variablen, als durch Kommas getrennte Liste. Beispiel:

    AutoIt
    Switch $idControl
        Case $idLabel_1, $idLabel_2 , $idButton_1 , $idChkBox_1 , $idRadio_1 , $idRadio_2 , $idRadio_3 , $idInput_1

    Diese Liste wird an mehreren Stellen im Code benutzt und es können durchaus weitere Variablen zur Liste hinzukommen. Aus diesen Gründen und für bessere Wartbarkeit würde ich die Liste gerne zentral erstellen und an verschiedenen Stellen im Code benutzen.

    Probiert habe ich folgendes, leider erfolglos.

    Code
    Local $iListe = $idLabel_1, $idLabel_2 , $idButton_1 , $idChkBox_1 , $idRadio_1 , $idRadio_2 , $idRadio_3 , $idInput_1
    
    Switch $idControl
        Case $iListe

    Wie macht man das richtig?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Professor Bernd 26. August 2020 um 23:52

    Hat den Titel des Themas von „Wie kann man eine Variablen-Liste übergeben?“ zu „Wie kann man eine Variablen-Liste an Switch-Case übergeben?“ geändert.
  • Wenn in AutoIt Controls angelegt werden, so wird von der entsprechenden Funktion eine ID zurückgegeben. Dies ist eine fortaufende Nummer.
    Wenn sichergestellt ist, dass alle abzufragenden Controls im Code hintereinander angelegt werden (also keine anderen Controls dazwischen liegen), dann kann man das so abkürzen:

    Code
    Switch $idControl
        Case $idFirstControl To $idLastControl
  • Wenn sichergestellt ist, dass alle abzufragenden Controls im Code hintereinander angelegt werden (also keine anderen Controls dazwischen liegen)

    Leider werden die Controls nicht zusammenhängend erstellt. Es geht auch genau darum, die Variablen-Liste frei zusammenstellen zu können. Hast du eine Idee? :)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Leider nein. Das war’s schon von mir.

    • Offizieller Beitrag

    Nimm nicht Switch-Case, sondern Select-Case:

    • Offizieller Beitrag

    Im OnEventModus geht das schon:

  • Es sieht wohl so aus, als ob es in AutoIt keine Integer-Listen gibt, die man mit Switch-Case benutzen kann, oder? Mit eueren Vorschlägen kann man aber gute Workarounds erstellen.

    water Dein Ansatz funktioniert mit zusammenhängenden Control-IDs. :)

    Oscar Dein Ansatz hat mich auf Ideen gebracht! :)

    Es geht in diesem Thread allerdings nicht um die Auswertung von MouseClicks, sondern um die Auswertung von Switch-Case um ein MouseHover zu erkennen. Aber dein Ansatz hat mich auf 2 Ideen gebracht. Zum einen könnte man vielleicht MouseMove und MouseLeave registrieren um das MousHover zu erfassen. ... Mal sehen. - Zum anderen hast du mir einen Denkanstoß zum OnEventModus gegeben, den ich in einem anderen Projekt gerade gut gebrauchen kann. :thumbup:

    AutoIt
    GUIRegisterMsg($WM_MOUSEMOVE, WM_MOUSEMOVE)
    GUIRegisterMsg($WM_MOUSELEAVE, WM_MOUSELEAVE)

    BugFix Geniale Idee, ein Array in einer Funktion auszuwerten. :thumbup:

    Das kann man mit Select-Case benutzen, oder einfach mit If-Then, wenn es z.B. nur 1 Liste gibt. Dein Workaround ist für mein Vorhaben am besten geeignet. :)

    Benutzt du "ByRef $aList", damit das Array nicht umkopiert wird, oder hat es einen anderen Grund?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Benutzt du "ByRef $aList", damit das Array nicht umkopiert wird, oder hat es einen anderen Grund?

    Genau, um den Kopiervorgang zu sparen. Ist bei kleinen Arrays sicher nicht von großer Relevanz, aber es ist nicht verkehrt, sich das anzugewöhnen.

  • ByRef:

    es ist nicht verkehrt, sich das anzugewöhnen.

    :thumbup:


    Basierend auf dem Vorschlag von BugFix hier eine Alternative.

    Bei meiner Variante gefällt mir besser, dass sie kompakt ist (bei bis zu 4 Listen). Bei deiner Variante gefällt mir besser, dass die Listen (Arrays) sehr übersichtlich untereinander stehen und damit gut zu warten sind. Das hilft Fehler zu vermeiden. :thumbup:

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Genau, um den Kopiervorgang zu sparen.

    Wobei anzumerken ist, dass der Kopiervorgang nur dann durchgeführt wird, wenn der Array in der Funktion geändert wird. D.h. ein reiner Lesezugriff auf den Array kopiert den Array nicht.

  • Wobei anzumerken ist, dass der Kopiervorgang nur dann durchgeführt wird, wenn der Array in der Funktion geändert wird. D.h. ein reiner Lesezugriff auf den Array kopiert den Array nicht.

    Ja, stimmt, aber...

    Entire arrays can be passed to functions (and returned from them) by simply using the array name without any brackets. Arrays should be passed to user-defined functions using the ByRef keyword to avoid the overhead of copying all the data in the array. Note that AutoIt only copies an array parameter if the contents are changed, so it is only in this case that ByRef offers an advantage, although it is recommended that to use it in all cases.

    Ganze Arrays können an Funktionen übergeben (und von diesen zurückgegeben) werden, indem einfach der Array-Name ohne Klammern verwendet wird. Arrays sollten mit dem Schlüsselwort ByRef an benutzerdefinierte Funktionen übergeben werden, um den Aufwand für das Kopieren aller Daten im Array zu vermeiden. Beachten Sie, dass AutoIt einen Array-Parameter nur kopiert, wenn der Inhalt geändert wird. Daher bietet ByRef nur in diesem Fall einen Vorteil, obwohl empfohlen wird, ihn in allen Fällen zu verwenden.

  • Sehe ich etwas differenzierter. Ich verwende stets ohne ByRef, außer ich möchte den Array im Hauptprogramm direkt ändern.

    Dies hat den Vorteil, dass ein Programmierfehler in der Unterfunktion (sprich eine ungewollte Änderung des Array) nicht auf das Hauptprogramm durchschlagen kann (da der geänderte Array nach Ende der Unterfunktion wieder freigegeben wird). Dies erleichtert die Fehlereingrenzung erheblich.

    • Offizieller Beitrag

    Ich denke, dass für deinen Zweck eine System.Collections.ArrayList auch gut Verwendung finden könnte:

  • Wenn ich das richtig verstehe, ist die ArrayList quasi ein Array-Objekt mit Methoden und Eigenschaften. Auch eine gute Idee!

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.