Wert auslesen und zur Variable machen

  • Hey
    ich hab ne Frage, unzwar will ich die werte mit

    [autoit]

    IniReadSection("test", "test"

    [/autoit]

    auslesen

    dabei wird aus der datei "test", der wert "$hallo" und "C:/" ausgelesen,
    wie kann ich jetzt machen das $hallo = C:/ ist?
    mfg

  • Spoiler anzeigen
    [autoit]

    Global $a_Ini = IniReadSection('test.ini', 'section')
    Assign(StringTrimLeft($a_Ini[1][1], 1), $a_Ini[2][1])
    MsgBox(0, '', $variable)

    [/autoit]
    Code
    [section]
    1=$variable
    2=C:\
  • dankeschön :)
    habe schon herausgefunden das es mit Assign / Eval zu tun hat,
    Eval braucht es dann anscheind ja nicht,

    ich kann dieses script im moment nicht testen
    aber es ist ja auch kein problem wenn es

    Code
    [section]
    $variable=C:/
    [autoit]

    Global $a_Ini = IniReadSection('test.ini', 'section')
    Assign(StringTrimLeft($a_Ini[1][0], 1), $a_Ini[1][1])
    MsgBox(0, '', $variable)

    [/autoit]

    ist? oda?

  • so hatte ichs auch gemeint :)
    dankeschön!

    irgentwie wills nicht wie ich :/

    schau ma so hab ichs..

    Spoiler anzeigen
    [autoit]

    Func _LoadSettings()
    $Key = IniReadSection(@ScriptDir & "\" & $Name & "\" & $Name & ".ini", $Name)
    If Not @error Then
    For $o = 1 To $Key[0][0]
    $Variable = Assign(StringTrimLeft(_StringEncrypt(0, $Key[$o][0], $PW, $LV), 1), _StringEncrypt(0, $Key[$o][1], $PW, $LV))
    GUICtrlSetData($Key[$o][0], $Variable)
    Next
    EndIf
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Zattoo (1. Oktober 2012 um 16:00)

    • Offizieller Beitrag

    Ich verstehe nicht, warum ihr hier Assign einsetzen wollt.
    Der Befehl ist so abartig, dass man ihn nur dann, wenn man nicht mehr weiter weiß, nutzen sollte. :D

    Du weißt ja in deinem Skript, wie die Variable, die du aus der INI lädst heißt. Dein Skript verwendet ja bereits intern den Namen.
    Warum also nicht so:

    Deine INI:

    Code
    [Sektion]
    Variable=C:\


    Einlesen:

    [autoit]

    Global $Variable = IniRead('INI-Datei', 'Sektion', 'Variable', 'default')

    [/autoit]
  • so geht das nicht,
    hab ne funktion für speichern wo man einfach nur einen wert mitgibt
    also der weg müsste schon gemacht werden, weil will das dann als udf in allen scripts nutzen ;)
    mfg

  • Wenn du WIRKLICH mit "variablen Variablennamen" arbeiten möchtest, wäre evtl. die Hash-Tabelle was für dich...

    Beispiel von AspirinJunkie
    [autoit]


    ;----------------------------------------------------------------------
    ;------------------------Hash-Table------------------------------------
    ;----------------------------------------------------------------------

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

    ;////Hash-Table Erstellen///////////
    $hash = ObjCreate("System.Collections.Hashtable")

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

    ;////Einträge hinzufügen///////////
    $hash.add ("Berlin", 3395189)
    $hash.add ("Hamburg", 1743627)
    $hash.add ("München", 1259677)
    $hash.add ("Köln", 983347)
    $hash.add ("Dresden", 504795)
    ;Beispiel hier: Einwohnerzahl wird der jeweiligen Stadt zugeordnet.

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

    ;////Anzahl der Elemente bestimmen///////////
    $Count = $hash.Count

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

    ;////Überprüft ob ein Element vorhanden ist///////////
    If $hash.Contains ("Bonn") Then MsgBox(0, "", "Bonn ist eingetragen") ;Bonn ist im Bsp. nicht enthalten

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

    ;////Löscht ein Element aus der Hash-Table///////////
    $hash.remove ("München")

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

    ;////Elemente aufrufen///////////
    ConsoleWrite("Einwohner(Berlin): " & $hash("Berlin") & @CRLF)
    ConsoleWrite("Einwohner(Dresden): " & $hash("Dresden") & @CRLF)

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

    ;////Leert die Hash-Table///////////
    $hash.Clear

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

    ;----------------------------------------------------------------------
    ;----------------------------------------------------------------------

    [/autoit]


    Quelle

    lg chess

  • ach sry
    ich hab vergessen die 2 scriptausschnitte zu posten :/ mein fehler

    also so speichere ich die einstellungen

    [autoit]

    Func _SaveSetting($Key, $Value)
    IniWrite(@ScriptDir & "\" & $Name & "\" & $Name & ".ini", $Name, _StringEncrypt(1, $Key, $PW, $LV), _StringEncrypt(1, $Value, $PW, $LV))
    EndFunc

    [/autoit]

    und so lese ich alle wieder aus

    [autoit]

    Func _LoadSettings()
    $Key = IniReadSection(@ScriptDir & "\" & $Name & "\" & $Name & ".ini", $Name)
    If Not @error Then
    For $o = 1 To $Key[0][0]
    GUICtrlSetData(Assign(Stringtrimleft(_StringEncrypt(0, $Key[$o][0], $PW, $LV), 1), $Key[$o][0], 1), _StringEncrypt(0, $Key[$o][1], $PW, $LV), "")
    Next
    EndIf
    EndFunc

    [/autoit]


    (funktioniert nicht)

    will das dann als UDF für meine scripts nutzen, wissta? ;)
    mfg

  • will ja nicht stalken :/ aber komme nicht mehr weiter..
    könnte jemand sich das ma anschaun?

    hier mal mit erklärung wies gemeint ist:

    Spoiler anzeigen
    [autoit]

    Func _LoadSettings()
    $Key = IniReadSection(@ScriptDir & "\" & $Name & "\" & $Name & ".ini", $Name) ;beide werte auslesen
    If Not @error Then ;wenn nicht leer ->
    For $o = 1 To $Key[0][0] ;for schleife weils mehrere lines sind (unbekannt viele)
    $a = _StringEncrypt(0, $Key[$o][0], $PW, $LV) ;hier dann die variable = $variable
    $b = _StringEncrypt(0, $Key[$o][1], $PW, $LV) ;hier dann der wert = "wert"
    Assign(StringTrimLeft($a, 1), "") ;hier soll die variable erstellt werden mit dem wert "" (der name der variable ist nicht bekannt)
    GUICtrlSetData($a, $b) ;hier sollte eigentlich das input ($variable) mit dem wert "wert" gefüllt werden...
    Next
    EndIf
    EndFunc

    [/autoit]
  • Glaube hier kapiert keiner was du eigentlich erreichen willst, warum sollte dir ja mittlerweile bekannt sein, aber lassen wir das...

    Um mal zusammenzufassen was deine Schleife da macht:

    1. Den Namen der neuen Variable und dessen neuer Wert aus einer ini entschlüsseln, soweit ganz toll, sofern deine encrypt Funktion richtig angewendet wird, zum testen würd ich diese crypt Kacke vllt erstmal weglassen...
    2. Nun erstellst du mit assign() eine Variable mit diesem entschlüsselten Namen (vermutlich wird das ohne dritten Parameter intern per dim deklariert also innerhalb der Funktion als lokale Variable erstellt, ausser sie existiert bereits vor Aufruf global, wovon ich nicht ausgehe, die Variable ist ausserhalb dieser load Funktion also total wertlos und nicht existent), dazu weist du ihr keinen / einen leeren Wert zu --> "", spätestens hier solltest du ihr vllt eher eine ControlID zuweisen... seihe 3.
    3. Danach kommt das sinnfreiste: Du tust so als ob der entschlüsselte Variablenname $a eine ID eines bestehenden Controls wäre. ($a ist aber "$variable", also nur ein String, mehr nicht)... somit wirst du wohl auch kaum irgendeinem Control etwas zuweisen können, denn du hast garkein Control erstellt und demzufolge auch guictrlsetdata nicht richtig angewendet.


    Was 2. angeht siehe Hilfe, da wird der 3. funktionsparameter erklärt. Was 3. angeht erschliesst sich mir nachwievor der Sinn deiner ganzen Vorgehensweise nicht. Wurde hier denke ich auch schon erwähnt, dass es keinen Sinn macht Variablen dynamisch so zu erstellen wie du das gern haben willst. wenn man GUI's dynamisch erstellen und Werte dynamisch aus ini Dateien zuweisen will verwendet man arrays um sowohl die Controlid als auch den Wert des Controls zu speichern, alles andere macht keinen Sinn. Im Script spricht man die betreffenden Controls dann eben nicht per Variablenname an, sondern einfach per Array Index in Schleifen. Aber ohne Script wie immer sinnlos da näher darauf einzugehen...

  • ich habe das doch erklärt...
    mir wurde dazu geraten den variablennamen (zb des inputs) und deren Wert zu speichern
    um ihn dann wieder einzulesen

    das waren nur versuche die nicht funktionieren können (habe ich ja herausgefunden und habe deswegen auch mein testzeugs gepostet)

  • weiß keiner ne lösung?

    Spoiler anzeigen
    [autoit]

    Func _LoadSettings()
    $Key = IniReadSection(@ScriptDir & "\" & $Name & "\" & $Name & ".ini", $Name)
    If Not @error Then
    For $o = 1 To $Key[0][0]
    $a = _StringEncrypt(0, $Key[$o][0], $PW, $LV)
    $b = _StringEncrypt(0, $Key[$o][1], $PW, $LV)
    Assign(StringTrimLeft($a, 1), $b)
    $c = Eval("a")
    ConsoleWrite($c & " " & $a & @CRLF)
    GUICtrlSetData($a, $b)
    Next
    EndIf
    EndFunc

    [/autoit]
  • mir wurde dazu geraten den variablennamen (zb des inputs) und deren Wert zu speichern
    um ihn dann wieder einzulesen


    Bezüglich des Variablennamens ein schlechter Rat. Mache es für jedes Skript individuell/manuell denn dieses Konzept funktioniert im Gegensatz zu deinem.

    Wenn du aber aus Faulheit eine eierlegende Wollmichsau benötigst musst du dir diese schon selbst entwickeln. Oder meist du hier entwickelt einer für dich ein Konzept von dessen Sinn er nicht überzeugt ist? Vor allem da du bisher noch kein komplettes (noch nicht einmal mit Laufzeitfehlern behaftetes) Skript eingestellt hast! Gehe davon aus das andere genaus bequem sind wie du und sich keine unnötige Arbeit machen.

    mfg autoBert

  • Immernoch der selbe Fehler, siehe Punkt 3 von oben. Hier nochmal was du machst:


    [autoit]


    $a = "$test"
    $b = "testwert"
    $test = "testwert" ; dein assign()
    ; $c="$test" ; sowieso nur debugging...
    guictrlsetdata("$test","testwert") ; total falsch, ein string ist keine control ID, selbst wenn du stattdessen
    ; die neu erstellte Variable $test verwenden würdest stünde da nur der Wert "testwert" und keine control ID

    [/autoit]

    Ansonsten wie schon gesagt... sinnfreies Konzept, keine lauffähigen Testscripte --> keine besonders gute Aussichten auf Support :P

    • Offizieller Beitrag

    Dein Konzept ist aus folgenden Gründen sinnfrei:

    Du kannst den Wert von Variablen nicht dynamisch mit deren Wert durch Auslesen Name/Wert speichern. Denn es gibt in AutoIt keine Möglichkeit den Namen einer Variablen auszulesen.
    Also musst du in deinem Skript sowieso auf den DIR BEKANNTEN Variablennamen zugreifen. Du kannst natürlich den zugehörigen Wert in Verbindung mit dem Namen in einer INI speichern (Variablenname=Wert). Aber beim Lesen aus der INI hat Assign nichts verloren. Das Auslesen erfolgt dann nach dem Muster:

    [autoit]

    ; z.B. für eine Variable $zaehler
    $zaehler = IniRead($INI, 'sektion', 'zaehler', '')

    [/autoit]