Variable nach einem String benennen $($string)

  • Moin zusammen,

    Ich bin gerade dabei eine Schleife zu schreiben, in der ich GUI Buttons aus einem Array erzeugen möchte. Jetzt habe ich das Problem, das ich für eine Funktion, die ich beim Klick auf den Button ausführen möchte, einen Case brauche (z.b $Ping) der genauso heißt wie die Beschriftung des Buttons.

    $Ping = GUICtrlCreateButton($arr[$i], $ButtonStart + ($ButtonIndex * $ButtonSpacer), $Buttonhoehe, $Buttonbreite, 25))

    und dann später in der WHILE SCHLEIFE, in der auf User Interaktion gewartet wird:

    Case $Ping

    Ping()

    Ich finde leider keine Lösung wie ich eine Variable nach einem String bennen kann. Ich habe das Problem mal auf ein paar Zeilen Code runtergebrochen. Das mit dem Assign klappt aber nicht so, wie ich mir das vorgestellt habe und es werden keine Variablen AA, BB und CC erzeugt mit dem Inhalt "Es" "hat" "funktioniert".

    Ich bin am verzweifeln ;( und freue mich auf Eure Hilfe :)


  • Ich finde leider keine Lösung wie ich eine Variable nach einem String bennen kann.

    Welchen Vorteil bringt dir das denn, bzw. warum soll das erforderlich sein, dass ein Text ausgewählt wird und dann eine Variable der Form $TEXT gebildet wird?

    Variablen sind nur Container, ihr Name ist völlig wumpe, er muss nur eindeutig sein. Wichtig ist deren Inhalt.

    Erklär mal, was du genau vorhast, dann können wir dir auch einen Lösungsansatz bieten. Eval & Assign sind Krücken, die man tunlichst vermeiden sollte und in 99,99% der Programmierung auch tatsächlich nicht braucht.


    EDIT:

    Ich vermute, Du meinst sowas:

  • Zumal du im Code damit dann garnicht arbeiten kannst.

    Du kennst den Variablennamen nicht und kannst ihn dann gar nicht ansprechen.

    Im Code musst du deine Variablennamen durchaus Sinnvoll wählen.

    Assign($Arrayname, $data, $ASSIGN_FORCEGLOBAL) ist das Gleiche wie Global $Arrayname = $data bzw.

    Assign($Arrayname, 'Daten', $ASSIGN_FORCEGLOBAL)  ist das Gleiche wie Global $Arrayname = 'Daten'

    (Ich bevorzuge dir korrekten Konstanten zu nutzen anstatt der Zahl)

    Ich weiß nicht ob man deinen Wunsch mit "Execute()" hin bekommen könnte, halte es aber nach wie vor für nicht Sinnvoll.

  • Welchen Vorteil bringt dir das denn, bzw. warum soll das erforderlich sein, dass ein Text ausgewählt wird und dann eine Variable der Form $TEXT gebildet wird?

    Variablen sind nur Container, ihr Name ist völlig wumpe, er muss nur eindeutig sein. Wichtig ist deren Inhalt.

    Erklär mal, was du genau vorhast, dann können wir dir auch einen Lösungsansatz bieten. Eval & Assign sind Krücken, die man tunlichst vermeiden sollte und in 99,99% der Programmierung auch tatsächlich nicht braucht.

    Moin Bugfix

    ich schreibe an einem Programm um Clients im beruflichen Umfeld zu administieren, dieses Tool wird abteilungsübergreifend eingesetzt. Ich habe vor 2-3 Jahren die Aufgabe bekommen dieses Programm, von einem Kollegen der die Abteilung gewechselt hat, zu übernehmen und zu administrieren. Nun versuche ich das Programm von Grund auf neu aufzubauen.

    Mein Kollege hat alle Buttons einzeln erzeugt nach dem Schema wie ich es bereits angegeben hatte:

    Code
    $Ping = GUICtrlCreateButton("Ping", $ButtonStart + ($ButtonIndex * $ButtonSpacer), $Buttonhoehe, $Buttonbreite, 25))
    $RechnerButtonIndex = $ButtonIndex + 1
    $FastPing = GUICtrlCreateButton("FastPing", $ButtonStart + ($ButtonIndex * $ButtonSpacer), $Buttonhoehe, $Buttonbreite, 25))
    
    ;und dann später in der WHILE SCHLEIFE der GUI, in der auf User Interaktion gewartet wird, wie im unteren Beispiel auch:
    Case $Ping
        Exit
    Case $FastPing
        Exit

    ich versuche das nun dynamisch zu lösen damit ich Buttons einfach im array $rechnerbuttonlist hinzufügen kann und diese automatisch in Reihe und Spalte erzeugt werden

  • ich versuche das nun dynamisch zu lösen damit ich Buttons einfach im array $rechnerbuttonlist hinzufügen kann und diese automatisch in Reihe und Spalte erzeugt werden

    Exakt das macht mein Beispiel. Wenn mehrere Button nebeneinander erstellt werden sollen, musst du auch $x in der Schleife berechnen.

    EDIT: Aber überleg lieber, ob diese Lösung sinnvoll ist. Bei veränderlicher Anzahl von Aufgaben (für die die Button ja stehen) ist die bessere Lösung ein Listview und dazu ein Button "Ausführen". Dann selektiert der User die Aufgabe in der Liste und klickt den Button. Ist auch vom Handling wesentlich geschmeidiger.

    Für eine volldynamische Lösung muss dann aber auch die GUI angepasst werden. Hier ein Bsp. mit Inputfeldern, wie das geht.:

  • Ist es so gemeint? Würde ich aber auch nicht machen.

  • Ich dachte das Du es so meinst, das wenn Du die Variable $_variabel_name änderst, das dann die Beschriftung auf dem Button sich anpasst.

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Danke für eure Lösungen, ich schaue mir diese entspannt noch einmal an, ich will nur erstmal mit dem Projekt, ich werde mit Sicherheit beim Feinschliff darauf zurückkommen. Listview ist leider nichts für die Kollegen, die sind Gewohnheitstiere :D

    funkeys Lösung entspricht ja ungefähr meiner. Alinas habe ich noch nicht ganze verstanden, da brauche ich noch einen Augenblick.

    Danke euch aber schonmal.

    Ich habe das Ganze jetzt vorerst so gelöst:

  • Einen Tipp noch: Das Ubound ist unnötig, sofern dein $rechnerarr durch Stringsplit gefüllt wird und nicht explizit $STR_NOCOUNT mit angegeben wurde.

    Du kannst das einfacher so setzen: Global $rechnerbtn[$rechnerarr[0]]

    Einmal editiert, zuletzt von Moombas (23. Juni 2022 um 13:00) aus folgendem Grund: kleiner Tippfehler beseitigt :)

  • Etwas dynamischer könntest du das machen, indem du auch die Funktionen zu den einzelnen Buttons in ein entsprechendes Array packst und dann so ausführst (die beiden Zahlen müssten immer zusammen passen und die Funktion muss es natürlich geben):

    AutoIt
    ;Nur als Beispiel
    $rechnerfunc[] = [1, 'Test()']
    ;...
    Case $rechnerbtn[1]
        Execute($rechnerfunc[1])
    
    ;...
    Func Test()
        ConsoleWrite('Works')
    EndFunc

    Einmal editiert, zuletzt von Moombas (23. Juni 2022 um 14:07)