Problem: Ini-Werte werden (scheinbar?) nicht korrekt in GUI übernommen

  • Hallo,


    ich habe folgendes Problem:
    Das Script soll eine .exe mit den Einstellungen fernsteuern, die in der GUI eingegeben werden.
    Die GUI-Eingabewerte sollen in einer INI gespeichert werden.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <String.au3>

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

    #Region
    $Form1 = GUICreate("Macro", 378, 460, 393, 137)
    $Button1 = GUICtrlCreateButton("Browse...", 16, 68, 75, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Okay", 64, 416, 243, 33, $WS_GROUP)
    $input1 = GUICtrlCreateInput("", 17, 35, 342, 21)
    $input2 = GUICtrlCreateInput("", 16, 168, 177, 21)
    $input3 = GUICtrlCreateInput("", 16, 224, 177, 21)
    $input4 = GUICtrlCreateInput("", 16, 280, 177, 21)
    $input5 = GUICtrlCreateInput("", 16, 360, 177, 21)
    $Label1 = GUICtrlCreateLabel("", 16, 48, 4, 4)
    $Label2 = GUICtrlCreateLabel("text1", 16, 144, 262, 17)
    $Label3 = GUICtrlCreateLabel("text2", 16, 200, 77, 17)
    $Label4 = GUICtrlCreateLabel("text3", 16, 256, 197, 17)
    $Label5 = GUICtrlCreateLabel("text4", 16, 312, 210, 17)
    $Label6 = GUICtrlCreateLabel("text5", 16, 336, 168, 17)
    $Group1 = GUICtrlCreateGroup("Specify the path to the .exe", 8, 8, 361, 97, $BS_RIGHTBUTTON)
    GUICtrlSetColor(-1, 0x0000FF)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Setup", 8, 120, 361, 281, $BS_RIGHTBUTTON)
    GUICtrlSetColor(-1, 0x0000FF)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion

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

    If FileExists(@ScriptDir & "\Macro.ini") Then
    GUICtrlSetData($input1, IniRead(@ScriptDir & "\Macro.ini", "Section", "Path","No data!"))
    GUICtrlSetData($input2, IniRead(@ScriptDir & "\Macro.ini", "Section", "1","No data!"))
    GUICtrlSetData($input3, IniRead(@ScriptDir & "\Macro.ini", "Section", "2","No data!"))
    GUICtrlSetData($input4, IniRead(@ScriptDir & "\Macro.ini", "Section", "3","No data!"))
    GUICtrlSetData($input5, IniRead(@ScriptDir & "\Macro.ini", "Section", "4","No data!"))
    EndIf

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

    While 1
    $nMsg = GUIGetMsg()

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

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    $dialog = FileOpenDialog("open", "C:\","(*.exe)")
    GUICtrlSetData($input1, $dialog)
    $read = GUICtrlRead($input1)

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

    Case $input1
    $read = GUICtrlRead($input1)

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

    Case $input2
    $time = GUICtrlRead($input2)
    $timeforsleep = $time * 1000

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

    Case $input3
    $prefix = GUICtrlRead($input3)

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

    Case $input4
    $suffix = GUICtrlRead($input4)

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

    Case $input5
    $NumberOfMeasurements = GUICtrlRead($input5)

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

    Case $Button2
    SaveToIni()
    GUIDelete()
    ExitLoop

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

    EndSwitch
    WEnd

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

    Func SaveToIni ()
    IniWrite(@ScriptDir & "\Macro.ini", "Section Path to ARTA.exe", "Path",GUICtrlRead($input1))
    IniWrite(@ScriptDir & "\Macro.ini", "Section Measurement Setup", "1",GUICtrlRead($input2))
    IniWrite(@ScriptDir & "\Macro.ini", "Section Measurement Setup", "2",GUICtrlRead($input3))
    IniWrite(@ScriptDir & "\Macro.ini", "Section Measurement Setup", "3",GUICtrlRead($input4))
    IniWrite(@ScriptDir & "\Macro.ini", "Section Measurement Setup", "4",GUICtrlRead($input5))
    EndFunc

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

    ; ab hier soll´s starten...

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

    Run ($read)
    WinWaitActive("Programm")

    [/autoit]

    Bis hierhin funktionierts, denn beim nächsten Programmstart sind die letztmalig eingetragenen Werte in der GUI vorhanden.
    Führt man das Script dann aber aus (also mit den Werten aus der INI), kommt folgende Fehlermeldung:

    Spoiler anzeigen
    [autoit]

    C:\Documents and Settings\Administrator\My Documents\Makro.au3 (100) : ==> Variable used without being declared.:
    Run ($read)
    Run (^ ERROR

    [/autoit]

    Abhilfe schafft nur, die Werte in der GUI wieder neu einzutragen. Das können dann sogar die selben Werte sein, aber nur so startet das Script wieder fehlerfrei.
    Mein erster Verdacht war, dass Pfadangaben (C:\Program Files\...) oder andere Sonderzeichen, die in der INI gespeichert werden, das Problem sein könnten. Dann habe ich aber gemerkt, dass auch eine einfache Ziffernangabe (1) durch eine neue Ziffer (1) manuell in der GUI überschrieben werden muss, damit´s läuft...


    Hirnkrampfige Grüße...
    00-Schneider

    4 Mal editiert, zuletzt von 00-Schneider (26. Oktober 2011 um 12:05)

  • Wenn ich mich nicht irre, dann kann man mit dem Run Befehl nur externe Programme aufrufen/starten.
    Deshalb wird das wohl nicht funktionieren und darum wird dir die Fehlermeldung angezeigt.

    Ich würde folgendes versuchen:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <String.au3>

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

    #Region
    $Form1 = GUICreate("Macro", 378, 460, 393, 137)
    $Button1 = GUICtrlCreateButton("Browse...", 16, 68, 75, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Okay", 64, 416, 243, 33, $WS_GROUP)
    $input1 = GUICtrlCreateInput("", 17, 35, 342, 21)
    $input2 = GUICtrlCreateInput("", 16, 168, 177, 21)
    $input3 = GUICtrlCreateInput("", 16, 224, 177, 21)
    $input4 = GUICtrlCreateInput("", 16, 280, 177, 21)
    $input5 = GUICtrlCreateInput("", 16, 360, 177, 21)
    $Label1 = GUICtrlCreateLabel("", 16, 48, 4, 4)
    $Label2 = GUICtrlCreateLabel("text1", 16, 144, 262, 17)
    $Label3 = GUICtrlCreateLabel("text2", 16, 200, 77, 17)
    $Label4 = GUICtrlCreateLabel("text3", 16, 256, 197, 17)
    $Label5 = GUICtrlCreateLabel("text4", 16, 312, 210, 17)
    $Label6 = GUICtrlCreateLabel("text5", 16, 336, 168, 17)
    $Group1 = GUICtrlCreateGroup("Specify the path to the .exe", 8, 8, 361, 97, $BS_RIGHTBUTTON)
    GUICtrlSetColor(-1, 0x0000FF)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Setup", 8, 120, 361, 281, $BS_RIGHTBUTTON)
    GUICtrlSetColor(-1, 0x0000FF)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion

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

    datenimport()
    Func datenimport()
    If FileExists(@ScriptDir & "\Macro.ini") Then
    GUICtrlSetData($input1, IniRead(@ScriptDir & "\Macro.ini", "Section", "Path","No data!"))
    GUICtrlSetData($input2, IniRead(@ScriptDir & "\Macro.ini", "Section", "1","No data!"))
    GUICtrlSetData($input3, IniRead(@ScriptDir & "\Macro.ini", "Section", "2","No data!"))
    GUICtrlSetData($input4, IniRead(@ScriptDir & "\Macro.ini", "Section", "3","No data!"))
    GUICtrlSetData($input5, IniRead(@ScriptDir & "\Macro.ini", "Section", "4","No data!"))
    EndIf
    EndFunc

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

    While 1
    $nMsg = GUIGetMsg()

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

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Button1
    $dialog = FileOpenDialog("open", "C:\","(*.exe)")
    GUICtrlSetData($input1, $dialog)
    $read = GUICtrlRead($input1)

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

    Case $input1
    $read = GUICtrlRead($input1)

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

    Case $input2
    $time = GUICtrlRead($input2)
    $timeforsleep = $time * 1000

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

    Case $input3
    $prefix = GUICtrlRead($input3)

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

    Case $input4
    $suffix = GUICtrlRead($input4)

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

    Case $input5
    $NumberOfMeasurements = GUICtrlRead($input5)

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

    Case $Button2
    SaveToIni()
    GUIDelete()
    ExitLoop

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

    EndSwitch
    WEnd

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

    Func SaveToIni ()
    IniWrite(@ScriptDir & "\Macro.ini", "Section Path to ARTA.exe", "Path",GUICtrlRead($input1))
    IniWrite(@ScriptDir & "\Macro.ini", "Section Measurement Setup", "1",GUICtrlRead($input2))
    IniWrite(@ScriptDir & "\Macro.ini", "Section Measurement Setup", "2",GUICtrlRead($input3))
    IniWrite(@ScriptDir & "\Macro.ini", "Section Measurement Setup", "3",GUICtrlRead($input4))
    IniWrite(@ScriptDir & "\Macro.ini", "Section Measurement Setup", "4",GUICtrlRead($input5))
    EndFunc

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

    ; ab hier soll´s starten...

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

    datenimport()
    WinWaitActive("Programm")

    [/autoit]

    Den Bereich mit GUICtrlSetData in eine Funktion gesteckt, und aufgerufen. 1x beim Scriptstart und 1x nach beenden der While-Schleife. Nicht getestet, sollte aber funktionieren.

    mfG Lottich

  • Hi,

    Wenn ich mich nicht irre, dann kann man mit dem Run Befehl nur externe Programme aufrufen/starten.
    Deshalb wird das wohl nicht funktionieren und darum wird dir die Fehlermeldung angezeigt.


    Genau das will ich ja auch (eine externe .exe mit Befehlen versorgen). Den Teil nach dem run-Befehl habe ich aber nicht oben reinkopiert...
    Wie gesagt, das Script läuft beim ersten Mal fehlerfrei durch, wenn man die Werte manuell in die GUI einfügt.
    Die Fehlermeldung taucht erst dann auf, wenn die Werte aus der INI verwendet werden.

  • Das du die Ini-Werte neu eintragen musst liegt daran dass du beim Einlesen falsche Sektionsnamen verwendest. Ausserdem solltest du $read auch beim OK-Button zuweisen:

    [autoit]

    Case $Button2
    SaveToIni()
    $read = GUICtrlRead($input1)

    [/autoit]

    mfg autoBert

  • hi,

    falsche sektionsnamen waren nicht die ursache (alle sektionen heißen "section1").
    der entscheidende tipp war:

    [autoit]


    Case $Button2
    SaveToIni()
    $read = GUICtrlRead($input1)

    [/autoit]

    ich habe auch noch alle cases für die inputs gelöscht und die ganzen variablen unter den case $button2 gesetzt. jetzt läufts - danke!

  • falsche sektionsnamen waren nicht die ursache (alle sektionen heißen "section1").

    Im geposteten Skript hast du aber bei SaveToIni andere Namen verwendet:

    mfg autoBert