Editfeld mehrzeilig speichern und auslesen

  • Hallo liebe AutoIT'ler,

    ich stehe derzeit wieder vor einer Herausforderung.

    In meinem Skript wird ein Editfeld in der GUI verwendet welches Quasi als Notizfeld dient. Es ist entsprechend gross und mehrzeilig.

    Das ganze wird mit einem Savebutton in einer *.ini Datei gespeichert wo auch einige andere Sachen aus dem Skript hinterlegt werden.

    Das speichern ist kein Problem - der Saveeintrag in der *.ini erfolgt direkt so, wie es im Editfeld auch geschrieben wurde. Jedoch bereitet mir das Auslesen der *.ini beim Neustart des Skriptes Probleme - schliesslich will ich ja die abgespeicherten Notizen später auch wieder einsehen können ;)

    Ich habe das Problem, dass er immer nur die erste Zeile aus der *.ini ausliest. Sobald der Zeilenumbruch kommt ist vorbei...

    Ich hab über Google bereits Sachen gefunden wo der @CRLF durch Stringreplace ersetzt werden muss. Aber irgendwie hab ich nichts passendes gefunden was bei mir funktionieren wollte - in der jetzigen Version die ich unten mit Anhänge ist lediglich die Speicherfunktion enthalten - die fehlgeschlagenen Ausleseversuche habe ich vorerst wieder entfernt. Kann mir da wer helfen das Editfeld also mehrzeilig auszulesen?

    Vielen lieben Dank im voraus!

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=C:\Documents and Settings\751076\Desktop\wiki_backup\ups.ico
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Res_Description=UPS
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.0
    #AutoIt3Wrapper_Res_LegalCopyright="(C) Copyright CT-Team 2011"
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #NoTrayIcon
    ;------------------INCLUDES------------------------
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <GUIConstants.au3>
    #include <EditConstants.au3>
    #include <String.au3>
    #include <Timers.au3>
    #include <Date.au3>
    ;--------------------MODIS-------------------------
    Opt('GUIOnEventMode', 1)
    Opt('TrayOnEventMode', 1)
    Opt('TrayMenuMode', 1)
    ;-----------------SPLASH-GUI-----------------------
    #Region Splash GUI
    FileInstall("C:\Documents and Settings\751076\Desktop\wiki_backup\UPS-Logo.JPG", @TempDir & "\ups-logo.jpg", 1)
    $bootlogo = @TempDir & "\ups-logo.jpg"
    SplashImageOn("Loading UPS... | Bitte warten... | Please wait...", $bootlogo, 403, 122, -1, -1)
    Sleep(3000)
    SplashOff()
    #EndRegion Splash GUI
    ;-----------------HAUPT-GUI------------------------
    $ver = "v1.3"
    Global $ini = @WindowsDir & '\pws.ini'
    Global $MasterPW = 'Master'
    Global $ABeschreibung[3] = ['Programme', 'Login', 'Passwort']
    Global $Programm[10], $Login[10], $Passwort[10], $hCheck[10]

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

    If Not FileExists(@WindowsDir & "\pws.ini") Then
    IniWrite(@WindowsDir & "\pws.ini", "Notizen", "Notizen", "Deine Notizen")
    For $i = 0 To 2
    For $e = 0 To 9
    IniWrite($ini, $ABeschreibung[$i], $ABeschreibung[$i] & $e + 1, "")
    Next
    Next

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

    EndIf

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

    Global $mainGui = GUICreate("UPS - Der ultimative Passwort-Safe " & $ver, 800, 415)
    GUISetOnEvent(-3, 'E')
    GUISetOnEvent($GUI_EVENT_MINIMIZE, '_Minimize')
    TraySetOnEvent( -7, '_Restore')
    GUICtrlCreateGroup("", 725, 2, 70, 43)
    GUICtrlCreateLabel("____________", 728, 13, 63, 15)
    GUICtrlSetFont(-1, 9, 800, 2, "Arial")
    $date = GUICtrlCreateLabel(@MDAY & "." & @MON & "." & @YEAR, 728, 10, 65, 15)
    GUICtrlSetFont(-1, 9, 800, 2, "Arial")
    $time = GUICtrlCreateLabel(@HOUR & ":" & @MIN & ":" & @SEC, 733, 28, 60, 15)
    GUICtrlSetFont(-1, 9, 800, 2, "Arial")
    GUICtrlCreateGroup("Notizen", 510, 50, 285, 320)
    GUICtrlSetFont(-1, 8, 600, 0, "Verdana")
    $notizen = GUICtrlCreateEdit("", 520, 70, 265, 290, BitOR ($WS_VSCROLL, $ES_MULTILINE, $ES_AUTOVSCROLL, $ES_WANTRETURN))
    ;~ GUICtrlCreateLabel("UPS", 225, 5, 60, 30)
    ;~ GUICtrlSetFont(-1, 15, 800, 0, "Verdana")
    ;~ GUICtrlCreateLabel("Der ultimative Passwort-Safe", 165, 30, 200, 20)
    ;~ GUICtrlSetFont(-1, 8, 800, 3, "Verdana")
    FileInstall("C:\Documents and Settings\751076\Desktop\wiki_backup\ups-head.jpg", @TempDir & "\ups-head.jpg", 1)
    $Pic1 = GUICtrlCreatePic(@TempDir & "\ups-head.jpg", 250, 5, 376, 42)
    GUICtrlCreateGroup("Programm:", 15, 50, 150, 320)
    GUICtrlSetFont(-1, 8, 800, 0, "Verdana")
    Local $x = 70
    For $i = 0 To 9
    $Programm[$i] = GUICtrlCreateInput(IniRead($ini, $ABeschreibung[0], $ABeschreibung[0] & $i + 1, ""), 22, $x, 135, 25)
    $x += 30
    Next
    GUICtrlCreateGroup("User/Login:", 173, 50, 150, 320)
    GUICtrlSetFont(-1, 8, 800, 0, "Verdana")
    $x = 70
    For $i = 0 To 9
    $Login[$i] = GUICtrlCreateInput(IniRead($ini, $ABeschreibung[1], $ABeschreibung[1] & $i + 1, ""), 180, $x, 135, 25)
    $x += 30
    Next
    GUICtrlCreateGroup("Passwort:", 330, 50, 150, 320)
    GUICtrlSetFont(-1, 8, 800, 0, "Verdana")
    $x = 70
    Local $y = 75
    For $i = 0 To 9
    $Passwort[$i] = GUICtrlCreateInput(IIF(Not IniRead($ini, $ABeschreibung[2], $ABeschreibung[2] & $i + 1, ""), '', _StringEncrypt(0, IniRead($ini, $ABeschreibung[2], $ABeschreibung[2] & $i + 1, ""), $MasterPW, 2)), 337, $x, 135, 25)
    GUICtrlSendMsg($Passwort[$i], $EM_SETPASSWORDCHAR, Asc('*'), 0)
    $hCheck[$i] = GUICtrlCreateCheckbox("", 485, $y, 10, 10)
    GUICtrlSetOnEvent(-1, 'Menue')
    $x += 30
    $y = $x + 6
    Next
    $SaveButton = GUICtrlCreateButton("Save", 225, 375, 50, 19)
    GUICtrlSetOnEvent(-1, 'Menue')
    GUICtrlSetFont(-1, 8, 800, 0, "Verdana")
    $MasterPW_ChangeButton = GUICtrlCreateButton("MasterPW löschen!", 200, 400, 100, 14)
    GUICtrlSetOnEvent(-1, 'Menue')
    GUICtrlSetFont(-1, 6, 800, 0, "Verdana")
    $SaveButtonNotiz = GUICtrlCreateButton("Save", 625, 375, 50, 19)
    GUICtrlSetOnEvent(-1, 'Menue')
    GUICtrlSetFont(-1, 8, 800, 0, "Verdana")
    GUICtrlCreateLabel("Konzept: Patrick Berg", 699, 395)
    GUICtrlSetFont(-1, 6, 800, 0, "Verdana")
    GUICtrlCreateLabel("Umsetzung: Mirko Hässelbarth", 658, 405)
    GUICtrlSetFont(-1, 6, 800, 0, "Verdana")
    GUIsetstate()

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

    _Timer_SetTimer($mainGui, 1000, "_UpdateStatusBarClock")

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

    Func _UpdateStatusBarClock($hWnd, $Msg, $iIDTimer, $dwTime)
    #forceref $hWnd, $Msg, $iIDTimer, $dwTime
    GUICtrlSetData($Time, StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC))
    EndFunc ;==>_UpdateStatusBarClock

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

    Func Menue()
    Switch @GUI_CtrlId
    Case $SaveButtonNotiz
    IniWrite(@WindowsDir & "\pws.ini", "Notizen", "Notizen", GUICtrlRead($notizen))
    MsgBox(64, "Done", "Notizen gespeichert!")
    Case $MasterPW_ChangeButton
    IniDelete(@WindowsDir & "\pws.ini", "MASTER", "MASTER")
    MsgBox(64, "Done", "Password deleted!" & @CRLF & @CRLF & "If you restart this tool you" & @CRLF & "can choose a new password!")
    Case $SaveButton
    For $i = 0 To 9
    If GUICtrlRead($Programm[$i]) <> '' Or IniRead($ini, $ABeschreibung[0], $ABeschreibung[0] & $i + 1, "") <> GUICtrlRead($Programm[$i]) Then
    IniWrite($ini, $ABeschreibung[0], $ABeschreibung[0] & $i + 1, GUICtrlRead($Programm[$i]))
    EndIf
    If GUICtrlRead($Login[$i]) <> '' Or IniRead($ini, $ABeschreibung[1], $ABeschreibung[1] & $i + 1, "") <> GUICtrlRead($Login[$i]) Then
    IniWrite($ini, $ABeschreibung[1], $ABeschreibung[1] & $i + 1, GUICtrlRead($Login[$i]))
    EndIf
    If GUICtrlRead($Passwort[$i]) <> '' Or _StringEncrypt(0, IniRead($ini, $ABeschreibung[2], $ABeschreibung[2] & $i + 1, ""), $MasterPW, 2) <> GUICtrlRead($Passwort[$i]) Then
    IniWrite($ini, $ABeschreibung[2], $ABeschreibung[2] & $i + 1, _StringEncrypt(1, GUICtrlRead($Passwort[$i]), $MasterPW, 2))
    EndIf
    Next
    MsgBox(64, "Done", "Speichern erfolgreich!")
    Case Else
    For $i = 0 To 9
    If @GUI_CtrlId = $hCheck[$i] Then
    GUICtrlSendMsg($Passwort[$i], $EM_SETPASSWORDCHAR, Not BitAND(GUICtrlRead($hCheck[$i]), $GUI_CHECKED) * Asc('*'), 0)
    GUICtrlSetState($Passwort[$i], $GUI_FOCUS)
    EndIf
    Next
    EndSwitch

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

    EndFunc ;==>Menue

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

    Func IIF($V_Expr, $F_True = True, $F_False = False)
    If $V_Expr Then Return $F_True
    Return $F_False
    EndFunc ;==>IIF

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

    Func E()
    FileDelete(@Tempdir & "\ccc.jpg")
    FileDelete(@Tempdir & "\ups-logo.jpg")
    FileDelete(@Tempdir & "\fedex.jpg")
    _SelfDelete_UPSEXE()
    Exit
    EndFunc ;==>E

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

    Func _Restore()
    TraySetState(2)
    GUISetState(@SW_SHOW)
    EndFunc

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

    Func _Minimize()
    TraySetState(1)
    GUISetState(@SW_HIDE)
    EndFunc

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

    Func _SelfDelete_UPSEXE()
    $iDelay = 4
    Local $sCmdFile
    FileDelete(@TempDir & "\scratch.bat")
    $sCmdFile = 'ping -n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _
    & ':loop' & @CRLF _
    & 'del "' & @TempDir & '\ups.exe' & '"' & @CRLF _
    & 'if exist "' & @TempDir & '\ups.exe' & '" goto loop' & @CRLF _
    & 'del ' & @TempDir & '\scratch.bat'
    FileWrite(@TempDir & "\scratch.bat", $sCmdFile)
    Run(@TempDir & "\scratch.bat", @TempDir, @SW_HIDE)
    Exit
    EndFunc

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

    While 1 * Sleep(10)
    WEnd

    [/autoit]

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

    Einmal editiert, zuletzt von mirko2002 (27. Oktober 2011 um 14:10)

  • So in der Art würde ich es machen musst nur noch schauen was dieses eigenartige Zeichen da ist-.- [] oder so ..

    [autoit]


    $readNotizen = GUICtrlRead($notizen)
    $splitNotizen = StringSplit($readNotizen,@CR)

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

    For $i = 1 To UBound($splitNotizen)-1
    IniWrite(@ScriptDir & '\Notizen.ini','Notizen','Notiz',$splitNotizen[$i] & ';') ; dass ';' ist zum Späteren Split beim wieder auslesen der INI um die Returns wieder einzufügen wie sie vorher waren
    Next

    [/autoit]
    • Offizieller Beitrag

    Oder so, dann hast du nach dem Lesen einen Text, den du wieder mit GUICtrlSetData in dein Edit einfüge kannst, mit allen Umbrüchen.

    [autoit]

    ; == Bsp. Text mit GuiCtrlRead($edit) gelesen:
    $text = "Zeile 1" & @CRLF & "Zeile 2" & @CRLF & "Zeile 3" & @CRLF & "Zeile 4"

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

    ; == in INI schreiben mit Ersetzen der Umbrüche durch [CRLF]
    IniWrite('INI', 'section', 'key', StringReplace($text, @CRLF, '[CRLF]'))

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

    ; == in INI sthet jetzt: key=Zeile 1[CRLF]Zeile 2[CRLF]Zeile 3[CRLF]Zeile 4
    ; == Beim Lesen:
    $key = IniRead('INI', 'section', 'key', '')
    $key = StringReplace($key, '[CRLF]', @CRLF)

    [/autoit]
  • Hey vielen Dank für die Hilfestellung, jedoch bekomm ich es trotzdem nicht gebacken...

    Ich hatte die ganze Zeit an Protex seinen Vorschlag versucht umzusetzen - jedoch weiterhin gescheitert...

    [autoit]


    For $i = 1 To UBound($splitNotizen)-1
    IniWrite(@ScriptDir & '\pws.ini','Notizen','Notiz',$splitNotizen[$i] & ';')
    Next

    [/autoit]

    Diesen Teil hatte ich bei der Savefunktion (also beim Button) eingefügt - jedoch speichert er rein gar nichts in meiner pws.ini

    [autoit]


    $readNotizen = GUICtrlRead($notizen)
    $splitNotizen = StringSplit($readNotizen,@CR)

    [/autoit]

    Diesen Teil hatte ich mit unters Editfeld gesetzt.... aber er schreibt jetzt noch nichtmal in die .ini rein. Bei meinem vorherigen Skript hat er wenigstens geschrieben - nur ohne die CRLF's die BugFix jetzt ansprach.

    Ich versuch ne Menge selber aber ich hab hier schon jetzt schon so viel probiert das mein Kopf qualmt und ich deswegen evtl auch einfach nur ne Denkblockade habe -.-

    Mein aktueller Code (nur ein Schnipsel) ist jetzt der hier:

    Hier wird das Editfeld erstellt und die ini ausgelesen und im Editfeld eingetragen

    [autoit]

    $test = IniReadSection(@WindowsDir & '\pws.ini', "Notizen")
    $notizen = GUICtrlCreateEdit($test, 520, 70, 265, 290, BitOR ($WS_VSCROLL, $ES_MULTILINE, $ES_AUTOVSCROLL, $ES_WANTRETURN))
    $readNotizen = GUICtrlRead($notizen)
    $splitNotizen = StringSplit($readNotizen,@CR)

    [/autoit]

    Das ist die Savefunktion vom Button...

    [autoit]

    Case $SaveButtonNotiz
    For $i = 1 To UBound($splitNotizen)-1
    IniWrite(@ScriptDir & '\pws.ini','Notizen','Notiz',$splitNotizen[$i] & ';')
    Next
    ;IniWrite(@WindowsDir & "\pws.ini", "Notizen", "Notizen", GUICtrlRead($notizen))
    MsgBox(64, "Done", "Notizen gespeichert!")

    [/autoit]

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • machen wir es doch einfacher hiermit sollte es gehen

    [autoit]


    $readNotizen = GUICtrlRead($notizen)
    If FileExists('text.txt' Then
    FileDelete('text.txt')
    FileWrite('text.txt',$readNotizen)
    Else
    FileWrite('text.txt',$readNotizen)
    EndIf

    [/autoit]

    und zum auslesen

    [autoit]


    $readFile = FileRead('text.txt')
    Guictrlsetdata($notizen,$readFile)

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

  • Hehe, ja über diese Möglichkeit hatte ich auch schon nachgedacht, da es wenig Code bedarf, jedoch soll nichts mit einer weiteren Textdatei erstellt werden. Eigentlich ist die *.ini auch schon zuviel - ich könnts auch über Registryeinträge machen - ich will aber das die Daten portable sind und das ist mit der ini-Datei perfekt gelöst. Und damit der User, der das dann letzendlich nutzt nicht etliche Dateien kopieren muss (ok - hier wärs jetzt nur eine mehr) soll alles in eine Datei rein.

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • xD na wenn du unbedingt eine INI willst dann bau dir eine passende Lösung und fertig am besten mach es dass du alles in einen String packst also
    >String = Zeile1;Zeile2;Zeile3

    beim einlesen der Datei musst du nur noch mit StringSplit die Datei bei jedem ';' trennen und in das Edit Feld eintragen

    Fertig

    Gruß

  • Ja na die treffendste Lösung (vom meinem wenigen Verständiss) war das Beispiel von BugFix.

    Da ich noch nicht gut AutoIt kann versteh ich sein Codebeispiel noch am besten - jedoch nur der erste Teil ist für mich unverständlich. In seinem Beispiel lautet es:

    [autoit]

    ; == Bsp. Text mit GuiCtrlRead($edit) gelesen:
    $text = "Zeile 1" & @CRLF & "Zeile 2" & @CRLF & "Zeile 3" & @CRLF & "Zeile 4"

    [/autoit]

    Und das versteh ich nicht.... mein Text kommt ja auch der Editbox, welche bei mir ja wie folgt aussieht:

    [autoit]

    $test = IniReadSection(@WindowsDir & '\pws.ini', "Notizen")
    $notizen = GUICtrlCreateEdit($test, 520, 70, 265, 290, BitOR ($WS_VSCROLL, $ES_MULTILINE, $ES_AUTOVSCROLL, $ES_WANTRETURN))

    [/autoit]

    Das schnall ich einfach nicht. Sorry wenn es für Euch recht einfach und evtl offensichtlich ist, aber ich steig da einfach nicht hinter. Da mein AutoIt wissen leider begrenzt ist stoß ich wahrscheinlich bei einem ganz einfachen Thema an meine Grenzen.

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

    • Offizieller Beitrag

    Und das versteh ich nicht.... mein Text kommt ja auch der Editbox,


    Wenn du einen Text aus einer Editbox ausliest, sieht er genau so aus, wie in meinem Beispiel-Text. Nur dass beim Anzeigen in einem Editor natürlich der Editor auch (sinnvollerweise ;)) die Zeichenfolge 'ASCII13 ASCII10', in AutoIt durch das Makro @CRLF vertreten, in einen Zeilenumbruch wandelt.
    Ich hatte diese Textzeile erstellt, damit du die Zeilenumbrüche auch mal bewußt wahrnimmst.

  • Ahhhh..... alles klar - jetzt wo Du es so erklärt hast habe ich es verstanden und es erfolgreich in meinem Skript untergebracht.

    Vielen Dank für Eure großartige Hilfe!!!!!

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.