Text aktualisieren

  • Hallo,

    nach etlichen Fehlversuchen muß ich mich
    leider schon wieder geschlagen geben.

    Das Problem:

    1. Ich öffne eine Textdatei und lade den Inhalt in ein EDIT-Feld ($Code)
    Das klappt!
    2. Ich ändere bzw. lösche Teile des Textes und klicke auf speichern
    Das Problem:
    Der geänderte Text wird der original-Textdatei hinzugefügt.
    Wenn ich versuche FileDelete einzubauen erhalte ich eine Fehlermeldung.

    Mein Code

    Spoiler anzeigen
    [autoit]


    Case $bnFilecode

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

    Local $message = "Um mehrere Dateien auszuwählen, ist die Strg-Taste oder die Shift-Taste zu drücken."

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

    Local $var = FileOpenDialog($message, @ScriptDir & "", "Code (*.au3;*.txt)", 1 + 4)

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

    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    $var = StringReplace($var, "|", @CRLF)
    MsgBox(4096, "", "Es wurde(n) " & $var & " ausgewählt")
    Local $datei = FileOpen($var, 0)
    $inhalt_der_file = FileRead($datei)

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

    GUICtrlSetData($Code,$inhalt_der_file)

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

    EndIf

    ; bis hierhin PRIMA: Die Datei wird im EDITFELD $Code angezeigt
    ;Ich ändere nun den Text (im EDITFELD) und klicke auf speichern

    Case $btnsave

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

    Msgbox(4096,"",$var); der Pfad incl. Dateiname wird gezeigt!
    ;FileDelete($var) ; ging nicht (Berechtigung....?)
    FileWrite($var, GuictrlRead($Code)); mein GUI EDITFELD heißt $Code
    ;Hier wird der Text der Datei hinzugefügt.
    FileClose

    [/autoit]


    Liebe Grüße
    Ilse ;)

    Einmal editiert, zuletzt von Ilse (12. März 2014 um 14:22)

  • Hallo Schnitzel,

    ja, das habe ich auch schon hinter mir.
    Irgendwie denke ich mal wieder falsch!

    [autoit]


    Local $datei = FileOpen($var,2)

    [/autoit]

    Hier wird beim öffnen kein Text in das Editfeld geschrieben!

    [autoit]


    Local $datei = FileOpen($var,0)

    [/autoit]

    Hier wird Text geschrieben, Ich kann also das Editfeld bearbeiten.

    Muß ich bei
    Case $btnSave
    FileOpen und FileClose erneut einbauen?

    Bin etwas durcheinander...

  • Also immer wenn du ein FileOpen machst sollte es auch ein Fileclose geben.
    Wenn du die Datei einmal lesen möchtest und zu einem anderen Zeitpunkt schreiben dann musst du immer sie an den Stellen im jeweiligen Modus öffnen.
    Eben weil du im Lesemodus nicht schreiben kannst und weil du im Schreibmodus die Datei überschreibst (also hilft dir ein lesen nichts, wenn die Datei leer ist)

    Das Filedelete funktioniert übrigens auch nicht weil du selbst die Datei geöffnet hast (In Zeile 12). Und solange die Datei geöffnet ist darf sie nicht gelöscht werden

    Dein Script bekommt auch Probleme wenn mehrere Dateien ausgewählt werden.
    Weil du in Zeile 12 dann ein FileOpen auf die ganze Dateiliste machst. Da solltest du besser mit Stringsplit und einer for schleife arbeiten.
    Ich würde an deiner Stelle das Script zunächst mal so auslegen dass nur eine Datei geöffnet werden kann. Ich glaube das macht es dir leichter.
    Und für mehrere Dateien umbauen kannst du es dann immer noch

  • wie schnitzel schon schreibt, du machst oben im Case $bnFilecode eine fileclose rein und im Case $btnsave ein fileopen mit entsprechendem parameter und wieder ein fileclose ..

    sollte doch so gehen ..


    gruß gmmg

  • Ja, das habe ich versucht...klappt leider nicht!
    Ich habe mal ne kleine Gui gebastelt, damit man das mal testen kann.

    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $Form1 = GUICreate("Form1", 615, 438, 192, 124)
    $Code = GUICtrlCreateEdit("", 64, 64, 353, 297)
    $btnOpen = GUICtrlCreateButton("Öffnen", 448, 64, 139, 25)
    $btnSave = GUICtrlCreateButton("Speichern", 448, 96, 139, 25)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $btnOpen

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

    Local $var = FileOpenDialog("OPEN", @ScriptDir & "", "Code (*.au3;*.txt)", 1)

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

    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    $var = StringReplace($var, "|", @CRLF)

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

    Local $datei = FileOpen($var, 0)
    $inhalt_der_file = FileRead($datei)

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

    GUICtrlSetData($Code,$inhalt_der_file)

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

    EndIf

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

    FileClose

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

    Case $btnSave

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

    Local $datei = FileOpen($var, 2)
    FileWrite($var, GuictrlRead($Code))

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

    FileClose

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

    EndSwitch
    WEnd

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

    Hab auch alles mal angepasst für 1 File!

    Grüße
    Ilse

  • Huh...

    ich hab's...

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $Form1 = GUICreate("Form1", 615, 438, 192, 124)
    $Code = GUICtrlCreateEdit("", 64, 64, 353, 297)
    $btnOpen = GUICtrlCreateButton("Öffnen", 448, 64, 139, 25)
    $btnSave = GUICtrlCreateButton("Speichern", 448, 96, 139, 25)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $btnOpen

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

    Local $var = FileOpenDialog("OPEN", @ScriptDir & "", "Code (*.au3;*.txt)", 1)

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

    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    $var = StringReplace($var, "|", @CRLF)

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

    Local $datei = FileOpen($var, 0)
    $inhalt_der_file = FileRead($datei)

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

    GUICtrlSetData($Code,$inhalt_der_file)

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

    EndIf
    ;FileClose

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

    Case $btnSave

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

    Local $datei = FileOpen($var, 2)
    FileWrite($var, GuictrlRead($Code))

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

    EndSwitch

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

    WEnd
    FileClose

    [/autoit]
  • dein Script fliegt dir jedoch immernoch um die ohren wenn mehrere Files ausgewählt werden und "ordendlich" sind die handel auch nicht geschlossen.

    [autoit]

    $hHANDEL = FileOpen("deine File", "dein Mode")
    $sInhalt = FileRead($hHANDEL) #cs oder #ce FileWrite($hHANDEL, "dein Text")
    FileClose($hHANDEL)

    [/autoit]
  • Zitat

    dein Script fliegt dir jedoch immernoch um die ohren wenn mehrere Files ausgewählt werden


    Es ist nur noch die einzelne Dateiauswahl möglich. Das Stringreplace ist dann natürlich umsonst ;)
    Beim Rest hast du natürlich recht. Am besten immer ordentlich öffnen und schließen.

    Ilse:
    Was mich auch noch ziemlich stört ist wie du die variable $var verwendest.
    1. $var sagt nichts aus. Nimm am besten Variablennamen die dir was sagen, bzw wo man am Namen schon erkennt wofür sie da sind.
    2. Wenn jemand zuerst den save button drückt dann hast du eine nicht deklarierte variable. Ok der User hat das Programm falsch verwendet, aber abstürzen tut es weil es unsauber ist.

  • garnicht gesehen :pinch: zu kleiner bildschirm hier und scrollen war mir wohl zu umständlich ^^. Stimmt speichern vor dem öffnen sollte verhindert werden

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $Form1 = GUICreate("Form1", 615, 438, 192, 124)
    $Code = GUICtrlCreateEdit("", 64, 64, 353, 297)
    $btnOpen = GUICtrlCreateButton("Öffnen", 448, 64, 139, 25)
    $btnSave = GUICtrlCreateButton("Speichern", 448, 96, 139, 25)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $btnClose = GUICtrlCreateButton("Close File", 0, 0, 0, 0); Position muss selbst erstellt werden
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $btnOpen

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

    Local $sFilePath = FileOpenDialog("OPEN", @ScriptDir & "", "Code (*.au3;*.txt)", 1)

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

    If @error Then
    MsgBox(4096, "", "Keine Datei ausgewählt")
    Else
    Local $hdatei = FileOpen($sFilePath, 0)
    $sInhalt = FileRead($hdatei)
    FileClose($hdatei)
    GUICtrlSetData($Code, $sInhalt)
    GUICtrlSetState($btnSave, $GUI_ENABLE)
    GUICtrlSetState($btnClose, $GUI_ENABLE)
    EndIf

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

    Case $btnSave
    If $sFilePath <> "" Then
    $hdatei = FileOpen($sFilePath, 2)
    FileWrite($sFilePath, GuictrlRead($Code))
    FileClose($hdatei)
    EndIf

    Case $btnClose
    $sFilePath = ""
    GUICtrlSetData($Code,"")
    GUICtrlSetState($btnSave, $GUI_DISABLE)
    GUICtrlSetState($btnClose, $GUI_DISABLE)

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

    EndSwitch

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

    WEnd

    [/autoit]

    ungetestet hab hier kein Autoit... kennt man ja...^^