Ini abfragen, ggf erstellen und weitermachen

  • Hallo.

    Ich schreibe grade ein Programm, das meinen Solarlogger ausliest und eine Reihe Dateien daraus erstellt. Das habe ich auch soweit alles im Griff. Nun habe ich aber ein Problem:
    Für das einwandfreie Funktionieren ist eine INI nötig. Wenn die nicht existiert, dann funktioniert das PRogramm nicht. Deshalb habe ich am Anfang eine Abfrage eingebaut, die nachsieht, ob die ini existiert oder nicht. Wenn es sie nicht gibt, dann poppt ein Messagefenster auf und fragt ob die Datei erstellt werden soll oder nicht. Bei nein wir das Programm abgebrochen, bei Ja wird ein GUI erstellt, wo man die Daten entsprechend eingeben kann. Beim Speichern laufen noch ein paar Prüffunktionen ab und dann wird die INI geschrieben. Das funktioniert auch soweit alles wunderbar. Dann aber soll diese GUI geschlossen werden und das Programm weiterlaufen. Genau da ist mein Problem: Das Fenster geht zu, der Code läuft zwar weiter, aber die Haupt-GUI macht nicht auf. Die exist-abfrage habe ich mit einem Else ausgestattet, in dem, wenn die INI vorhanden ist, der Rest des Programms mit der Initialisierung aller Variablen und ein Hauptteil des Programms läuft. Ich habs schon mit zwei Functionen versucht, die ich beim Programmstart aufrufe.Allerdings kriege ich dan Fehlermeldungen, daß die Variablen benutzt werden bevor sie deklariert wurden. Das sinnige, die Fehler werden angezeigt für den Teil, der sie definiert....
    Wie kann ich beim Start des Programms nach Prüfung der INI entweder das Fenster für die Eingabe der Werte, das Speichern aufrufen und das Programm danach weiterlaufen lassen (also den Else-Teil) oder wenn die ini schon vorhanden ist gleich den Else-Teil ausführen?
    Wenn die INI schon vorhanden ist, greift der Else-Teil und alles läuft schön sauber ab.

    Hier mal der Anfang des Codes :

    Mehr kann ich nicht posten, das script hat 2670 Zeilen.


    Wie kann ich das sauber steuern?
    Besten Dank im Voraus

    saddleburner

  • Hallo saddleburner,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die deutsche Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/Tutorial Sehr hilfreich ist auch das Buch von peethebee .

    und jetzt zu deinem Problem. Mach es so und es sollte funktionieren:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <IE.au3>
    #include <Array.au3>
    #include <Date.au3>
    #include <INet.au3>
    #include <file.au3>
    #include <Timers.au3>
    #include <GuiButton.au3>

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

    Opt("GUIonEventMode", 1)
    If Not FileExists("pv_cgi_csv.ini") Then
    $auswahl = MsgBox(4132, "Konfigurationsfehler!", "Konfigurationsdatei existiert noch nicht. Möchten Sie sie jetzt anlegen?")

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

    If $auswahl = 7 Then Exit
    If $auswahl = 6 Then create_ini_file()
    EndIf

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

    ;------(jetzt) Vorhandene INI-Datei lesen und Werte initialisieren
    $pathin = IniReadSection("pv_cgi_csv.ini", "Pfad")
    Global $Pfad = $pathin[1][1]
    $webpathin = IniReadSection("pv_cgi_csv.ini", "Webpath")

    [/autoit]

    mfg autoBert

  • Danke für die schnelle Antwort, autobert.
    Hat so nicht ganz funktioniert, hat mir aber trotzdem weitergeholfen.
    Die Hilfe hatte ich schon besucht, auch im Tutorial hatte ich einiges gefunden. Das Problem ist nur: Man findet wenig bis gar nichts über guis mit mehreren Fenstern, die entweder nacheinander oder aber von einem aufgerufen werden und auch Werte wieder zurückgeben. So findet man auch kaum etwas, wie man eine Eingabe in ein Feld vor dem Abspeichern mittels einer Funktion überprüfen und im Fehlerfalle eine Messagebox aufpoppen läßt, nach dem Wegklicken der Messagebox wieder die Eingabe-GUI aufruft um dort die Eingabe wiederholen zu lassen. Entweder wird die GUI neu aufgerufen, aber wieder leer und man kann nichts tun (da hängt wohl irgendwo ne Eventschleife) oder aber es funktioniert gar nicht, weil ich irgendwie die Gui beim verlasen der eventschleife gleich mitbeende. Die Fenstersteuerung ist ein bißchen sehr dünn beschrieben.
    Trotzdem Danke, das Progi läuft jetzt relativ sauber. Du hast mich da auf die rettende Idee gebracht.

    Thnx,saddleburner :)

  • Da du ja scheinbar Probleme mit mehreren GUI's hast hab ich dir mal eine Lösung gebastelt und diese kommentiert. Vielleicht hilft es dir ja das ganze besser zu verstehen.

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <IE.au3>
    #include <Array.au3>
    #include <Date.au3>
    #include <INet.au3>
    #include <file.au3>
    #include <Timers.au3>
    #include <GuiButton.au3>

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

    Global $GUI_config
    Global $config_input1
    Global $config_input2
    Global $config_ini = "pv_cgi_csv.ini"
    Global $needconfig = True
    Global $Pfad
    Global $webPfad

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

    Opt("GUIonEventMode", 1)
    If Not FileExists($config_ini) Then
    $auswahl = MsgBox(4132, "Konfigurationsfehler!", "Konfigurationsdatei existiert noch nicht. Möchten Sie sie jetzt anlegen?")

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

    If $auswahl = 7 Then Exit
    If $auswahl = 6 Then create_config_gui()
    Else
    $needconfig = False ; übergeht die warteschleife und liest dann die ini aus, welche ja schon existiert
    EndIf

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

    While $needconfig = True ; hier wartet deine gui solange bis im config Fenster speichern geklickt wird, events der configgui werden erkannt
    Sleep(10)
    WEnd

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

    read_my_ini()

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

    ; main gui erstellen:

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

    $GUI_main = GUICreate("Main",600,400)
    $main_label_Pfad = GUICtrlCreateLabel($Pfad,40,40,300)
    $main_label_WebPfad = GUICtrlCreateLabel($webPfad,40,80,300)
    $main_Exit_btn = GUICtrlCreateButton("Beenden",220,200)
    GUICtrlSetOnEvent(-1,"_exit")
    GUISetState()

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

    While 1 ; hier die Hauptschleife deiner GUI
    Sleep(10)
    WEnd

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

    Func create_config_gui()
    $GUI_config = GUICreate("config",300,300)
    $config_input1 = GUICtrlCreateInput("Pfad",20,20,260)
    $config_input2 = GUICtrlCreateInput("Webpath",20,60,260)
    $config_save_btn = GUICtrlCreateButton("Speichern",120,200)
    GUICtrlSetOnEvent(-1,"create_ini_file") ; klickt man den speichern button wird die ini create funktion aufgerufen
    $config_abort_btn = GUICtrlCreateButton("Abbrechen",200,200)
    GUICtrlSetOnEvent(-1,"_exit")
    GUISetState()
    ; hinweis: im onevet mode muss sich das script immer ausserhalb einer Funktion befinden damit events erkannt werden
    ; daher darf hier keinesfalls eine Schleife verwendet werden, dies würde dafür sorgen, dass klicks auf den Button
    ; nichts bewirken...
    EndFunc

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

    Func create_ini_file()
    $checkresult = check_user_input()
    if $checkresult = -1 then return MsgBox(0,"Fehler","Deine Angaben waren ungültig!") ; verlässt die Funktion ohne die config gui zu löschen und eine ini zu erzeugen

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

    _FileCreate("pv_cgi_csv.ini")
    IniWrite($config_ini,"Pfad","tool1",GUICtrlRead($config_input1))
    IniWrite($config_ini,"Webpath","webtool1",GUICtrlRead($config_input2))
    $needconfig = False
    GUIDelete($GUI_config) ;config gui wieder löschen, alternativ könnte man sie auch mit guisetstate($GUI_HIDE,$GUI_config) unsichtbar machen
    EndFunc

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

    Func check_user_input()
    if GUICtrlRead($config_input1) = "TEST" Then return -1 ; Fehler
    if GUICtrlRead($config_input2) = "Falsch" Then return -1 ; Fehler
    Return 1 ; keine der if bedingungen hat Fehler festgestellt, also war die Prüfung okay
    EndFunc

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

    Func read_my_ini()
    ;------(jetzt) Vorhandene INI-Datei lesen und Werte initialisieren
    $pathin = IniReadSection($config_ini, "Pfad")
    $Pfad = $pathin[1][1]

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

    $webpathin = IniReadSection($config_ini, "Webpath")
    $webPfad = $webpathin[1][1]
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

    [/autoit]

    EDIT: Noch eine Funktion zur Prüfung der Usereingaben hinzugefügt
    EDIT2: Noch einen Abbrechen/Beenden Button in der config GUI hinzugefügt

    3 Mal editiert, zuletzt von misterspeed (12. Juli 2011 um 18:34)