Variable "variabel" machen

  • Hi zusammen,

    sorry für die bescheuerte Überschrift, aber besseres fällt mir dazu gerade nicht ein.

    Folgendes kleines Problem (Beispiel)

    [autoit]


    Local $Spalte1 = "NACHWEIS NR"
    Local $Spalte2 = "NACHWEIS ID"
    Local $Spalte3 = "VORLÄUFIGE NR"
    ;....
    Local $Spaltenanzahl = 15

    [/autoit]

    Jetzt möchte ich gerne die Variablen $Spalte1, $Spalte2, $Spalte3 in einer For Schleife variable machen, d.h. den Namen der Variablen

    [autoit]


    For $i = 1 To $Spaltenanzahl
    ConsoleWrite ("Variable i = " & $i & @CRLF)
    Local $SpalteX = "$Spalte" & $i
    ConsoleWrite ("$SpalteX = " & $SpalteX & @CRLF)
    _GUICtrlListView_InsertColumn($listview, $i, $SpalteX, 50)
    Next

    [/autoit]

    Ausgabe in der Console:

    Leider heißen dann meine Spaltennamen nicht "NACHWEIS NR" oder "NACHWEIS ID", sondern "$Spalte1" und "$Spalte2", d.h. die Es wird der Variablenname und nicht der Variablenwert genommen

    Irgend eine Idee ?

  • Ich würde eher auf assoziative Arrays (Dictionarys) zurückgreifen:

    [autoit]


    $oDict = ObjCreate("Scripting.Dictionary")
    $oDict("Hund") = "Wuff!"
    MsgBox(0, "", "Ein Hund macht: " & $oDict("Hund"))

    [/autoit]

    Eine ausführliche Beschreibung zum Dictionary-Objekt findet sich im MSDN oder irgendwo hier im Forum.

    lg

  • Also ich habe jetzt mal so umgebaut

    [autoit]


    $oDict = ObjCreate("Scripting.Dictionary")
    For $i = 1 To $Spaltenanzahl
    $oDict("Spalte") = $i
    ConsoleWrite("Spalte" & $oDict("Spalte") & @CRLF)
    _GUICtrlListView_InsertColumn($listview, $i, $oDict("Spalte"), 50)
    Next

    [/autoit]


    Jetzt heißen die Spalten nur noch 1,2,3 usw. was ja auch logisch ist, da ich nicht wie in der Consolenansicht noch ein "Spalte" davor habe.
    Ich will ja aber das die eigentlichen Variablen, welche ich unter

    [autoit]


    Local $Spalte1 = "NACHWEIS NR"
    Local $Spalte2 = "NACHWEIS ID"
    Local $Spalte3 = "VORLÄUFIGE NR"
    ;....
    Local $Spaltenanzahl = 15

    [/autoit]


    definiert habe, ausgelesen werden.

    Könnte mir bitte mal jemand ein Beispiel geben, wie man das mit einem Array abbildet.
    Danke!

  • Du programmierst doch schon ne ganze Weile in Autoit, daher bin ich echt ein wenig verwundert, dass du nachwievor nicht mit arrays arbeiten kannst. Wie dem auch sei:


    [autoit]


    dim $aSpaltenNamen[4] = ["s1","s2","s3","s4"]

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

    for $i = 0 to ubound($aSpaltenNamen)-1
    ConsoleWrite ($aSpaltenNamen[$i] & @CRLF)
    _GUICtrlListView_InsertColumn($listview, $i, $aSpaltenNamen[$i], 50)
    next

    [/autoit]

    Gibt hier btw auch irgendwo ein Tutorial bezüglich Arrays.

    Da du letzlich ein Listview befüllen willst bietet es sich evtl auch an ein 2D Array für die Daten zu verwenden, hier könntest du in Zeile 0 z.B. die Spaltennamen gleich mit unterbringen.

    [autoit]


    #include <array.au3>

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

    dim $aDaten[1][4] = [["s1","s2","s3","s4"]] ; irgendwann am programm anfang
    _ArrayDisplay($aDaten)

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

    ; irgendwann kommen dann noch die eigentlichen Daten von deinen SQL Querys dazu:

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

    $dummyLoop = 0
    while $dummyLoop < 10; deine resultset auswertung...
    redim $aDaten[UBound($aDaten)+1][UBound($aDaten,2)] ; fügt neue Zeile zum Array hinzu, lässt es also dynamisch anwachsen
    $zeile = UBound($aDaten)-1 ; nur zur veranschaulichung...
    $aDaten[UBound($aDaten)-1][0] = $zeile & " ergebnis deines sql qrys für spalte 1 in die letzte Zeile des Arrays schreiben"
    $aDaten[UBound($aDaten)-1][1] = $zeile & " ergebnis deines sql qrys für spalte 2 in die letzte Zeile des Arrays schreiben"
    $aDaten[UBound($aDaten)-1][2] = $zeile & " ergebnis deines sql qrys für spalte 3 in die letzte Zeile des Arrays schreiben"
    $aDaten[UBound($aDaten)-1][3] = $zeile & " ergebnis deines sql qrys für spalte 4 in die letzte Zeile des Arrays schreiben"
    $dummyLoop += 1
    WEnd

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

    _ArrayDisplay($aDaten)

    [/autoit]
  • Hier ein Beispiel wie es ohne Array bzw. Dictionary funktioniert:

    Spoiler anzeigen
    [autoit]

    Local $Spalte1 = "NACHWEIS NR"
    Local $Spalte2 = "NACHWEIS ID"
    Local $Spalte3 = "VORLÄUFIGE NR"
    ;....
    Local $Spaltenanzahl = 3

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

    For $i = 1 To $Spaltenanzahl
    $sInhalt = Eval("Spalte" & $i)
    ConsoleWrite("! Spalte" & $i & " = " & $sInhalt & @CRLF)
    Next

    [/autoit]
  • Der Bub sucht vermutlich eine Lösung mit der er nicht sein ganzes Programm neuschreiben muss. Und eine Lösung die er versteht.

    [autoit]

    For $i = 1 To $Spaltenanzahl
    ConsoleWrite ("Variable i = " & $i & @CRLF)
    Local $SpalteX = Eval("Spalte" & $i)
    ConsoleWrite ("$SpalteX = " & $SpalteX & @CRLF)
    _GUICtrlListView_InsertColumn($listview, $i, $SpalteX, 50)
    Next

    [/autoit]

    Eval ist zwar eine "unschöne" Funktion, aber im Moment genau das was du brauchst, wenn du nicht auf Objekte oder Arrays umsteigen willst.

    M

  • Hallo,

    erst mal vielen Dank für die Beispiele. Da ich das Programmieren nie gelernt habe, sondern mir das soweit mit Learning by Doing selbst beigebracht habe, bitte ich mal alle im Forum vorab um Verzeichung, wenn es den Eindruck machen würde, als ob hier ein langjähriger Hase am Werk ist. Ich bin vielleicht schon einige Zeit mit Autoit vertraut, was aber nicht heißt, das ich mich einmal durch die Hilfe programmiert habe. Vielleicht hat ein Array einige Code Zeilen weniger, aber für mein Verständnis sind manchmal ein paar Schritte mehr leichter. Vielleicht kapier ich das mit den Arrays auch irgendwann mal :)

    So, jetzt werde ich mal versuchen, die Beispiele umzusetzen.

    Danke nochmals