Bei Programmstart Einstellungen laden

  • Hallo,

    bin mal wieder an einem Punkt wo ich verzweifel und auch mit der Hilfe nicht weiterkomme weil ich nicht weiß wonach ich eigentlich schauen muss.

    Wenn ich meine GUI starte, soll ein Pfad aus einer .ini-Datei in eine Variable eingelesen werden. Die Variable habe ich als globale Variable im Kopf definiert. Nach dem GuiCreate rufe ich eine Funktion auf welche die ini-Datei ausliest und den gewünschten Wert in die Variable schreibt. Wenn ich direkt danach diese Variable ausgeben lasse, dann enthält sie aber leider nicht den gewünschten Wert. Führe ich die selbe Funktion durch klick auf einen Button innerhalb meiner GUI aus, dann funktioniert das wunderbar und auch der richtige Wert wird ausgegeben. Also ist die Funktion so wie sie ist in Ordnung.

    Ich vermute also das wenn ich bei Start meines Skripts Funktionen aufrufen will, ich nicht einfach funktion() schreiben kann, sondern einen anderen Weg wählen muss .... aber welchen?


    Ich hoffe es ist einigermaßen verständlich geworden ...


    Gruß

    nasgul

    Einmal editiert, zuletzt von nasgul (20. März 2008 um 11:17)

  • hi..

    ich würde es wie folgt machen

    [autoit]


    ; erstmal die datei zum öffnen angeben
    $file = FileOpen("Dateinname", 0)
    ; dann diese datei auslesen mit deiner und in deiner variable speichern
    $variable = FileRead($file, 1)

    [/autoit]

    so würde ich das machen... ich benutze eig slber oft die hilfe... und habe mir gedacht das es so ja gehen müsste^^

    ps : ich weiß leider nicht wie du es gemacht hast... vllt hasst du ja dasselbe gemacht und es geht nicht.. aber im gui sollte es dann so aussehen (denke ich)

    [autoit]

    GuiCtrlCreate("....", 400,400)
    GuiCtrlCreateLabel($variable, 10,10)

    [/autoit]

    dann sollte der eig ohne probleme die variable wiedergeben

  • Hallo nasgul,

    ohne den Code zu kennen ist es natürlich schwierig das Problem genau zu analysieren, aber immerhin hast Du es ja ganz gut beschrieben.
    Wenn Deine Funktion im Script die gewünschten Resultate liefert, aber am Anfang nicht, dann stimmen beim Start einfach die Rahmenbedingungen noch nicht. Eventuell sind irgendwelche Variablen nicht korrekt initialisiert, die für das Lesen der .ini benötigt werden?
    Bricht die Funktion vielleicht beim ersten Lesen ab, bevor sie den gesuchten Parameter lesen konnte, weil eventuell an anderer Stelle in der Funktion ein Fehler auftritt?

    Aus eigener Erfahrung kann ich Dir jedenfalls sagen das AutoIt das durchaus beherrscht ;), aber das ist Dir wohl eh schon klar.

    Gruß,

    TrueMu

  • Hallo nasgul,
    Zeile 6 & 7 können auch in die Func müssen, dann aber anstatt Global auf Local gesetzt werden.
    Hier nochmal die 1_Click-Datei aus Running Disk, dort funktioniert es so:
    ;)

    Spoiler anzeigen
    [autoit]


    ; by Ritzelrocker04 ==> RD40_1Click_10.au3
    #NoTrayIcon

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

    Opt("MustDeclareVars", 1)

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

    Global $var1 = IniRead(@ScriptDir & "\RD.ini", "Settings", "sichern", "0")
    Global $methode, $ziel, $dest, $src, $logfile, $zip

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

    _main()

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

    Func _main()

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

    If Not FileExists(@ScriptDir & "\RD.ini") Or Not FileExists(@ScriptDir & "\RD.log") Then
    MsgBox(16, "Error", "Die Dateien RD.ini und RD.log müssen vorhanden sein ! ", 10)
    Exit
    EndIf

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

    Switch $var1
    Case 0
    $methode = "PC Sichern"
    Case 1
    $methode = "PC Sichern & Ausschalten"
    EndSwitch

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

    $ziel = "C:\$Backup$"
    $dest = $ziel & "\$EigeneDateien$\EigeneDateien-0" & @WDAY & ".zip "
    $src = '"' & @MyDocumentsDir & '"'
    _copy()

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

    $logfile = FileOpen("RD.log", 1)
    If $logfile = -1 Then
    MsgBox(0, "Error", " Konnte RD.log nicht öffnen.", 3)
    EndIf

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

    FileWriteLine($logfile, "Eigene Dateien den " & $methode & " mit RD_1Click, am : " & @YEAR & "-" & @MON & "-" & @MDAY & " um " & @HOUR & ":" & @MIN & ":" & @SEC & " Uhr")
    FileClose($logfile)

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

    SoundPlay("RDsys\Success.wav", 1)

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

    If $var1 = 1 Then
    Shutdown(9)
    Else
    MsgBox(64, " Sichern", "Sicherung vom " & @CRLF & @CRLF & @MDAY & "-" & @MON & "-" & @YEAR & " um " & @HOUR & ":" & @MIN & " Uhr " & @CRLF & @CRLF & "abgeschlossen !")
    EndIf

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

    EndFunc ; ==> _main()

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

    Func _copy()

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

    If FileExists($dest) Then
    ; ==> FileDelete($dest)
    MsgBox(48, "Simulation...", "...einer Funktion - Dummy für FileDelete, siehe Script ! ")
    EndIf

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

    $zip = "RDsys\7za.exe a -tzip "
    ; ==> RunWait(@ComSpec & ' /c ' & $zip & $dest & $src,@ScriptDir ,@SW_MINIMIZE)
    MsgBox(48, "Simulation...", "...einer Funktion - Dummy für RunWait, siehe Script ! ")

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

    EndFunc ; ==> _copy()

    [/autoit]


    Schönes OFest und weiterhin
    viel Erfolg !

  • Also das mit dem lesen und schreiben in eine Datei funktioniert sehr gut, dass ist nicht das Problem. Die Datei existiert im übrigen und auch die Werte stehen richtig drin!

    Ich versuche mal die Stellen darzustellen die ich nutze:

    Das steht im Kopf:

    [autoit]

    Global $pfad_arbeitsverzeichnis

    [/autoit]

    Danach kommt das:

    [autoit]

    $GUI_fernwartung = GuiCreate("Fernwartung", 500, 350, $width, $height)

    [/autoit]

    Gefolgt von diesem:

    [autoit]

    einstellungen_laden()
    MsgBox(16, "Fehler", GUICtrlRead($pfad_arbeitsverzeichnis))

    [/autoit]

    Die Funktion die aufgerufen wird ist folgende:

    [autoit]

    Func einstellungen_laden()
    $var = IniReadSection("Fernwartung.ini", "Einstellungen")
    If @error Then
    MsgBox(16, "Fehler", "Möglicherweise fehlt die Fernwartung.ini!")
    Else
    For $i = 1 To $var[0][0]
    if $var[$i][0] = "Arbeitsverzeichnis" Then
    GUICtrlSetData($pfad_arbeitsverzeichnis, $var[$i][1])
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit]

    Also ich weiß das die Funktion so wie sie jetzt ist unsinn ist, dazu sei aber gesagt das noch weitere Werte die ausgelesen werden müssen folgen. Der Eeinfachheit halber hab ichs erstmal auf einen Wert beschränkt.

    Wie gesagt funktioniert die Funktion auch so wie ich es haben will wenn ich sie über einen Button aufrufe. Der Aufruf oben scheint so aber nicht das richtige Ergebnis zu liefern, die Ausgabe bringt dann eine 0.

    Ideen?

  • DANKE Ritzelrocker04 !!!

    Ich habs jetzt mal so gemacht wie du es in deinem Skript verwendest. Funktioniert wie ich es mir vorstelle. Ich hab viel zu kompliziert gedacht, damit ich die ganze Funktion erstmal nicht notwendig .... SUPER!

    Warum es über den Weg des Funktionsaufrufs nicht ging versteh ich aber trotzdem nicht.


    Gruß und danke euch, ihr seid eine tolle Community!

    nasgul

  • Nur zum Verständnis, wenn ich die Hilfsvariable $var nur innerhalb dieser Funktion nutze, muss sie dann wirklich unter Global eingetragen werden? Ich schreib den Wert von $var ja am Ende der Funktion in die globale Veriable $pfad_arbeitsverzeichnis und diese ist ja dann von überall nutzbar. Geht mir jetzt nur ums Verständnis, ich will ja so schnell wie möglich so gut werden wie ihr ;)

    Gruß und abenfalls allen ein schönes Osterfest!

    nasgul

  • Hallo nasgul,

    Du kannst $var auch innerhalb der Funktion als lokale Variable deklarieren, das funktioniert genauso gut und macht den Code übersichtlicher. Aber ich würde immer folgendes verwenden:

    [autoit]

    AutoItSetOption("MustDeclareVars", 1) ;Alle Variablen müssen vor der Verwendung deklariert werden

    [/autoit]

    Damit ist sichergestellt, das Du nicht durch einen Schreibfehler eine neue Variable anlegst, statt die vorhandene zu nutzen. Außerdem ist mit aufgefallen, das Du GIUctrlSetData falsch verwendest. Du mußt der Funktion einen Verweis auf das entsprechende Control übergeben!! Nicht nur die Variable!!

    Spoiler anzeigen
    [autoit]

    Dim $ctrl_Pfad, $pfad_arbeitsverzeichnis

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

    ;Hier baust Du Deine GUI
    ;und erzeugst in der GUI eine EditBox für den Pfad
    $ctrl_Pfad = GUICtrlCreateEdit ("Der Pfad", 10,10,200,30)

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

    ;usw..... Hier kommt das Script.....
    einstellungen_laden()

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

    ;und weiter gehts......

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

    Func einstellungen_laden()
    $var = IniReadSection("Fernwartung.ini", "Einstellungen")
    If @error Then
    MsgBox(16, "Fehler", "Möglicherweise fehlt die Fernwartung.ini!")
    Else
    For $i = 1 To $var[0][0]
    if $var[$i][0] = "Arbeitsverzeichnis" Then
    GUICtrlSetData($ctrl_Pfad, $var[$i][1]) ; Hier wird der WErt in der GUI angezeigt
    $pfad_arbeitsverzeichnis = $var[$i][1] ; Hier wird der Wert in die Variable kopiert
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit]

    So sollte die Funktion funktionieren ;)

    Gruß,

    TrueMu