Brauche Hilfe zur Erstellung einer Funktion zum Auslesen einer INI Datei

  • Hallo zusammen,

    ich habe bisher ein Script, welches eine INI Datei ausliest.
    Jetzt möchte ich hierfür eine "neutrale" Funktion schreiben, jedoch "hänge" ich noch ein wenig ?(

    Folgendes ist mir ja bekannt:

    1.) Der Name der INI Datei
    2.) Der Sektionsname in der INI Datei
    3.) Der Schlüsselname in der INI Datei

    Alle 3 Angaben müssen variabel übergeben werden, da es in der selben INI Datei verschiedene Sektionen gibt.

    Als Ergebnis erwarte ich logischerweise den Wert, bzw verschiedene Werte (für ABC und EFG)

    Hier mal ein Beispielscript (habe es noch nicht getestet !!)

    Spoiler anzeigen
    [autoit]

    Global $var_ini_name, $var_ini_sektion, $var_ini_key, $var_ini_wert, $var_ini_wert_ABC, $var_ini_wert_EFG

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

    ;Ermittlung von INI Wert ABC
    $var_ini_name = "Datei.ini"
    $var_ini_sektion = "Sektion1"
    $var_ini_key = "Key1"

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

    $var_ini_wert = _func_read_ini($var_ini_name,$var_ini_sektion,$var_ini_key)
    $var_ini_wert_ABC = $var_ini_wert; mit $var_ini_wert_ABC möchte ich weiterarbeiten

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

    ;Ermittlung von INI Wert EFG
    $var_ini_name = "Datei.ini"
    $var_ini_sektion = "Sektion1"
    $var_ini_key = "Key2"

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

    $var_ini_wert = _func_read_ini($var_ini_name,$var_ini_sektion,$var_ini_key)
    $var_ini_wert_EFG = $var_ini_wert; mit $var_ini_wert_EFG möchte ich weiterarbeiten

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

    Func _func_read_ini($var_ini_name, $var_ini_sektion, $var_ini_key)
    $var_ini_wert = IniRead($var_ini_name, $var_ini_sektion, $var_ini_key, "Schlüssel " & $var_ini_key & " existiert nicht")
    If $var_ini_wert = "" Then
    $var_ini_wert = "Wert von Schlüssel " & $var_ini_key & " in Sektion [" & $var_ini_sektion & "] ist nicht vorhanden"
    MsgBox(0, "Warnung", $var_ini_wert, 3)
    EndIf
    Return $var_ini_wert
    EndFunc ;==>_func_read_ini

    [/autoit]

    1. Frage:

    Könnte der Aufbau so stimmen ?

    2. Frage:

    Macht es Sinn in der Funktion weiterhin Globale Variablen zu verwenden, oder sollte man hier besser Lokale Varibalen verwenden ?
    Wenn Lokale, wo kommt die Zeile der Variablendeklaration dann hin. Außerhalb der Funktion oder Innerhalb ?
    Wird hinter Return dann ein Lokale oder eine Globale Variable angegeben ?

    Ich hoffe mich halbwegs verständlich ausgedrückt zu haben 8)

    Gruss Hassan

    Einmal editiert, zuletzt von HassanMullah (9. November 2010 um 08:34)

  • Wieso so kompliziert?

    Spoiler anzeigen
    [autoit]

    Local $var_ini_wert_ABC, $var_ini_wert_EFG

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

    $var_ini_wert_ABC = _func_read_ini("Datei.ini","Sektion1","Key1")
    $var_ini_wert_EFG = _func_read_ini("Datei.ini","Sektion1","Key2")

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

    Func _func_read_ini($var_ini_name, $var_ini_sektion, $var_ini_key)
    $tmp = IniRead($var_ini_name, $var_ini_sektion, $var_ini_key,"")
    If $tmp <> "" Then Return $tmp
    MsgBox(0,"Warnung","Wert von Schlüssel " & $var_ini_key & " in Sektion [" & $var_ini_sektion & "] ist nicht vorhanden")
    Return ""
    EndFunc ;==>_func_read_ini

    [/autoit]
  • Also ich habs überflogen sollte aber gehen.
    Globale in Funktionen zu deklarieren is im normalfall nich besonders geschickt weil du dann probleme bekommen könntest falls du eine globale variable mit dem selben Namen schon hast.
    Ratsamer sind da lokale. Die kannst du einfach am Anfang der Funktion deklarieren und gut^^
    Nach dem Return wird nichts mehr ausgeführt er springt sofort aus der Funktion.
    Wenn du mit Return was zurückgeben willst, schreibst einfach die Lokale dahinter.
    Also wie in deinem Beispiel nur mit lokalen Variablen.
    Wenn du Globale nimmst bräuchtest du im grunde nix zurückgeben weil dann ja in die Variable schon reingeschrieben wird

    EDIT:
    wenn du ne Funktion definierst mit übergabeparameter sind die automatisch als lokale variablen deklariert in dieser funktion

  • Also da sind aber zwei Zeilen (IniRead in Verbindung mit If-Abfrage mit MsgBox) kürzer als ne ganze Funktion dafür extra, es sei denn man nutzt es öfters im Script.

  • Zitat

    Also ich habs überflogen sollte aber gehen.

    freut mich :D

    Zitat

    Globale in Funktionen zu deklarieren is im normalfall nich besonders geschickt weil du dann probleme bekommen könntest falls du eine globale variable mit dem selben Namen schon hast.

    Ja, das leuchtet ein, und wird mit Sicherheit so auch vorkommen.

    Zitat

    Ratsamer sind da lokale. Die kannst du einfach am Anfang der Funktion deklarieren und gut

    Meinst Du das dann so ?:

    [autoit]

    Func _func_read_ini($var_local_ini_name, $var_local_ini_sektion, $var_local_ini_key)

    Local $var_local_ini_name, $var_local_ini_sektion, $var_local_ini_key

    $var_local_ini_wert = IniRead($var_local_ini_name, $var_local_ini_sektion, $var_local_ini_key, "Schlüssel " & $var_local_ini_key & " existiert nicht")

    If $var_local_ini_wert = "" Then
    $var_local_ini_wert = "Wert von Schlüssel " & $var_local_ini_key & " in Sektion [" & $var_local_ini_sektion & "] ist nicht vorhanden"
    MsgBox(0, "Warnung", $var_local_ini_wert, 3)
    EndIf

    Return $var_local_ini_wert
    EndFunc ;==>_func_read_ini

    [/autoit]
    Zitat

    Nach dem Return wird nichts mehr ausgeführt er springt sofort aus der Funktion.
    Wenn du mit Return was zurückgeben willst, schreibst einfach die Lokale dahinter.

    Aha, und bei mir steht da die Globale Variable

    Zitat

    Also wie in deinem Beispiel nur mit lokalen Variablen.

    Wieso Lokal ? Ich definiere die doch ganz oben als Global! (im ersten Beispiel ganz oben)

    Zitat

    wenn du ne Funktion definierst mit übergabeparameter sind die automatisch als lokale variablen deklariert in dieser funktion


    und hier kann ich mir dann die Antwort wohl selber geben, oder ?

  • So?

    [autoit]

    MsgBox(0, "Test", _IniReadEx("test.ini", "Sektion", "Schlüssel"))

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

    Func _IniReadEx($sFilename, $sSection, $sKey)
    If IniRead($sFilename, $sSection, $sKey, "") = "" Then MsgBox(16, "Fehler", 'Wert von Schlüssel "' & $sKey & '" in Sektion "' & $sSection & '" ist nicht vorhanden')
    Return IniRead($sFilename, $sSection, $sKey, "")
    EndFunc

    [/autoit]

  • also du kannst
    Local $var_local_ini_name, $var_local_ini_sektion, $var_local_ini_key
    weglassen, wie ich oben geschrieben habe sind die variablen die du in der funktionszeile definierst schon als lokale variablen deklariert
    also :
    Func _func_read_ini($var_local_ini_name, $var_local_ini_sektion, $var_local_ini_key)
    definiert schon die variablen $var_local_ini_name, $var_local_ini_sektion, $var_local_ini_key
    also kannst die sofort nutzen

    Zitat


    Wieso Lokal ? Ich definiere die doch ganz oben als Global! (im ersten Beispiel ganz oben)


    ich meinte das du es schon richtig gemacht hast nur halt das anstelle der globalen eine lokale Variable hin soll^^