IniWrite

  • Hallo,

    ich habe das Problem dass mein ini-Eintrag überschrieben wird.

    Meine Ini ist so aufgebaut:

    Spoiler anzeigen


    [Link]
    1=.....
    2=....
    3=....

    Im code wird der Eintrag geschrieben:

    [autoit]


    $MerkNr +=1; das ist mein Startwert

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

    Func _merken()

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

    IniWrite(@ScriptDir & "\ini\" & guictrlread($LargeInput)&".ini", "Link", $MerkNr, Clipget()); also ini und Wert

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

    $MerkNr +=1

    endfunc

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

    Das Problem ist folgendes:
    Ich kann z.B. in verschiendene inis schreiben. Mit LargeInput wähle ich eine andere ini.
    Bei einer ini geht das.
    Wird gewechselt oder geschlossen, dann stimmen logischerweise
    meine Startwerte bzw. Endwerte nicht mehr.

    Wie kann man das verhindern?

    Komme da nicht weiter.


    Grüße
    ;) Ilse

    Einmal editiert, zuletzt von Ilse (30. Mai 2012 um 10:54)

  • Hallo Ilse,

    Du hast die Variable $MerkNr nicht global erstellt, das heißt die Funktion kann garnicht auf sie zugreifen.
    Versuche mal

    [autoit]


    Global $MerkNr = 1

    [/autoit]

    Oder du machst es statisch:

    [autoit]


    Func _Merken()
    Local Static $MerkNr = 1 ;Beim ersten Funktions-Aufruf wird $MerkNr 1 gesetzt, danach nicht mehr
    IniWrite(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Link", $MerkNr, ClipGet())
    $MerkNr += 1 ;Merk-Nummer hochzählen
    EndFunc

    [/autoit]

    Mfg

  • Hallo Blume,

    das Problem ist folgendes:

    Schliesse ich die ini
    und mache am nächsten Tag weitere Einträge,
    dann stimmen die Zahlen nicht mehr

    Es geht wieder mit 1 los...

    :( Grüße Ilse

  • Hallo,

    genau das ist das Problem
    wie kann ich das machen?

    Bevor da etwas reinkommt müssen die "Zahlenwerte ermittelt werden".
    Und dann am Ende erweitert.

    Ich habe einfach mal die Werte in 2 Inis geschrieben:
    das sieht am Ende dann so aus:

    Spoiler anzeigen

    Test1.ini

    [Link]
    1=http
    2=http
    3=http
    7=http
    8=http

    Test2.ini

    [Link]
    4=http:
    5=http:
    6=http:

    d.h. sobald die Ini gewechselt wird
    wird bei der zweiten weitergezählt.

    :( Ilse

  • Ehrlich gesagt, ich versteht jetzt nur noch Bahnhof. Mußt Du Dir deine $MerkNr merken?

    Wenn ja dann mach doch sowas bei Programmstart- und bei Ende:

    [autoit]

    $MerkNr = IniRead ( "MyProgramm.ini", "Meine Settings", "MerkNr", 0 )
    ...
    ...
    <Dein Programm>
    ...
    ...
    IniWrite( "MyProgramm.ini", "Meine Settings", "MerkNr", $MerkNr )
    exit

    [/autoit]

    happy computing
    R@iner

  • Hallo Skyteddy,

    ich versuchs nochmal zu erklären:
    Schritt für Schritt:

    1. In der Zwischenablage ist ein Eintrag
    2. Dann kommt die Frage nach der INI Datei (z.B. Test.ini)
    3. Dann wird die Funktion aufgerufen

    [autoit]



    Func _Merken()
    Local Static $MerkNr = 1 ;Beim ersten Funktions-Aufruf wird $MerkNr 1 gesetzt, danach nicht mehr
    IniWrite(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Link", $MerkNr, ClipGet())
    $MerkNr += 1 ;Merk-Nummer hochzählen
    EndFunc

    [/autoit]

    ist Test.ini leer dann startet das ganze mit 1
    [Link]
    1=Zwischenablage
    2=Zwischenablage
    3=Zwischenablage

    Ich müßte also jedesmal den Letzen Wert als Startwert verwenden
    und diesen in der Funktion neu setzen.
    Also in diesem Beispiel 3 damit es mit
    $MerkNr += 1 weitergeht.
    Die Frage ist: Wie kann ich bevor geschrieben wird
    den letzen Nr.Wert v.[Link] ermitteln und diesen
    als neuen Startwerst setzen.
    Dann müsste es gehen, egal bei welcher ini, oder?

    :( Ilse

  • Die Frage ist: Wie kann ich bevor geschrieben wird
    den letzen Nr.Wert v.[Link] ermitteln und diesen
    als neuen Startwerst setzen.

    Ja das kann man schon auch machen, in dem man alles einliest und den höchsten Wert ermitteln.

    Alternativ kannst Du es so machen:

    Spoiler anzeigen
    [autoit]

    Func _Merken()
    ; Letzte MerkNr ermitteln
    $MerkNr = IniRead(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Mein Merker", "MerkNr", 0)
    ; MerkNr erhöhen
    $MerkNr += 1
    ; Link rausschreiben
    IniWrite(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Link", $MerkNr, ClipGet())
    ; MerkNr rausschreiben
    IniWrite(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Mein Merker", "MerkNr", $MerkNr)
    EndFunc ;==>_Merken

    [/autoit]

    happy computing
    R@iner

  • Hallo Skyteddy,

    hm irgendwie etwas verwirrend:

    Kannst du mal die Felder korrekt eintragen:

    Spoiler anzeigen


    IniWrite(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Link", $MerkNr, ClipGet())


    Meine Ini = GUICtrlRead($LargeInput) & ".ini
    Meine Sektion = [Link]
    Mein Schlüssel = $MerkNr
    Mein Eintrag = Clipget()


    Die Funktion von dir

    Spoiler anzeigen
    [autoit]


    Func _Merken()
    ; Letzte MerkNr ermitteln
    $MerkNr = IniRead(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Mein Merker", "MerkNr", 0)
    ; MerkNr erhöhen
    $MerkNr += 1
    ; Link rausschreiben
    IniWrite(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Link", $MerkNr, ClipGet())
    ; MerkNr rausschreiben
    IniWrite(@ScriptDir & "\ini\" & GUICtrlRead($LargeInput) & ".ini", "Mein Merker", "MerkNr", $MerkNr)
    EndFunc ;==>_Merken

    [/autoit]
  • hm irgendwie etwas verwirrend


    Tut mir leid, ich versteh Dein Geschreibsel und Deine Aufgabenstellung nicht, von daher kann ich Dir nicht helfen. Es muss Dir ein anderer helfen, der Dich versteht.

    Gut wäre es auch, wenn Du Deinen ganzen Code posten würdest, so macht es wenig Sinn.

    happy computing
    R@iner

    PS: Wenn Du die Parameter eines Befehls nicht verstehst, dann klick auf den Befehl, z.B. IniWrite und drücke F1

  • Ich probiers mal so:

    Spoiler anzeigen
    [autoit]


    $var = IniReadSection("Test1.ini", "Link")
    $Zahl= IniRead("Test1.ini","Anzahl","Nr","default")

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

    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Warscheinlich keine INI Datei vorhanden.")
    Else
    For $i = 1 To $var[0][0]
    MsgBox(4096, "", "Schlüssel: " & $var[$i][0] & @CRLF & "Wert: " & $var[$i][1])
    $Zahl+=1
    Next
    IniWrite("Test1.ini","Anzahl","Nr",$Zahl -1)

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

    EndIf

    [/autoit]


    hm...hab immer noch Probleme zusammen mit der Funktion!
    Beim allererstenmal wird ja die ini erzeugt und auch der 1. Startwert.
    Und da komme ich nicht weiter.

    :( Ilse

    2 Mal editiert, zuletzt von Ilse (29. Mai 2012 um 20:34)

  • Ilse Ilse Ilse. Was hast du eigentlich immer für Probleme mit Ini's.

    Was ist denn jetzt genau dein Problem?

  • Hallo m-obi,

    mein Retter naht...

    Ich fang mal an zu erklären: 1. Duchlauf

    1. Ich kopiere was in die Zwischenablage
    2. Dann ermittle ich per inputbox meine ini, sagen wird Namen.ini
    3. Der Wert wird auch in die ini geschrieben. Fortlaufend 1,2,3

    soweit klappt alles. 2. Durchlauf

    1. Ich kopiere was in die Zwischenablage
    2. Dann ermittle ich per inputbox meine ini, sagen wird Tiere.ini
    3. Der Wert wird auch in die ini geschrieben. Fortlaufend 1,2,3 da sie neu ist

    So, und nun kommt das Problem

    1. Ich kopiere was in die Zwischenablage
    2. Dann wähle ich per inputbox meine existierende ini: Namen.ini
    3. Der Wert wird auch in die ini geschrieben. Aber die Nr. stimmt nicht mehr.

    Beende ich das Script und starte nochmal neu, dann wird der Eintrag 1 überschrieben.

    Hoffe ich konnte das Problem erklären.
    Ich starte also einfach meine Funktion(....geht alles)
    und möchte daß die Einträge in der jeweiligen ini landen
    nummeriert und ohne etwas zu löschen.

    Hier nochmal das Grundgerüst

    [autoit]


    $MerkNr = 1

    Func _merken()

    Send("{CTRLDOWN}c{CTRLUP}")
    Sleep(100)

    IniWrite(@ScriptDir & "\ini\" & guictrlread($LargeInput)&".ini", "Link", $MerkNr, Clipget())
    Sleep(200)


    $MerkNr +=1

    endfunc

    [/autoit]


    Liebe Grüße
    ;) Ilse

  • Wenn du vorher die Sektion ausliest, hast du doch die,Anzahl der Einträge. Dann weißt du doch wo du weitermachen musst.

  • Ich bin da total durcheinander.

    Wenn die ini noch nicht existiert,
    also die Inputbox kommt, dann trage ich z.B. Namen ein
    Die erste ini wird dann angelegt. Es existiert die Nr. 1

    Startwert = 1

    ...da komme ich nicht weiter

    Ich kann mittlerweile nicht mehr klar denken
    Ich muß doch auch einen Startwert in der ini haben. Oder?
    Der muß dann igendwie erneuert werden...

    ...es geht nicht

    :( Ilse

  • Und nochwas für deine komische Kombination bei Send kannst du auch ^c schreiben für Strg+c. Oder nimm einfach ClipPut und ClipGet.

  • nochmal zum verstehen:

    1. Ich schreibe die neue Ini, also nur den Eintrag....
    2. Ich ermittle dann direkt die Anzahl
    3. Diese Anzahl schreibe ich in die ini?

  • Wieso willst du die Anzahl mit eintragen? Du kannst sie doch zu jeder Zeit auslesen mit IniReadSection.

  • Hallo m-obi,

    es geht leider immer noch nicht!

    Hier meine Schlussvariante:
    File wird angelegt, wird auch geprüft
    nur die Zähler stimmen nicht, Bei 2 ist Ende

    [autoit]


    Func _merken()
    Global $MerkNr = 1

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

    Send("^c"); EIntrag für die Zwischenablage
    Sleep(300)

    If FileExists(GUICtrlRead($LargeInput) & ".ini") Then ;Prüft ob INI vorhanden ist!
    $svar = IniReadSection(GUICtrlRead($LargeInput) & ".ini", "Link")
    Msgbox(0,"","Ini existiert")

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

    For $i = 1 To $svar[0][0]
    $MerkNr += 1
    Next
    Msgbox(0,"",$MerkNr)
    IniWrite(@ScriptDir & "\ini\" & guictrlread($LargeInput)&".ini", "Link", $MerkNr, Clipget())

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

    Else
    Msgbox(0,"","Ini wird angelegt")
    IniWrite(@ScriptDir & "\ini\" & guictrlread($LargeInput)&".ini", "Link", $MerkNr, Clipget()); Ini wird mit MerkNr = 1 angelegt...
    EndIf

    endfunc

    [/autoit]


    :( Liebe Grüße
    Ilse