[gelöst] Kompletten Text von Memo in eine Zeile einer txt-Datei schreiben und lesen



  • Hallo,

    die Zeilenumbruchthemen wurden ja schon ein paar Mal gestellt, aber hierfür habe ich leider bislang keine brauchbare Lösung.
    Ich hätte gerne den Inhalt eines Memos in eine Textdatei geschrieben, dort allerdings in einer Zeile, meinetwegen mit "\n" o. ä. dazwischen. Ich schaffe es aber nicht so richtig, die Zeilenumbrüche aus dem Memo umzuwandeln.
    Hintergrund ist eigentlich, dass ich den Inhalt mehrerer Memos in eine Datei packen möchte, ein Memo pro Zeile sozusagen.

    Hat jemand einen Tipp?



  • Gibt es nicht eine Methode, welche den Text aus dem Memo in eine Art Puffer oder Character array überträgt?

    Hab da mal auf die Schnelle GetTextBuf(System::WideChar * Buffer, int BufSize) und GetTextLen()gefunden.

    Durch dieses Ergebnis kann dann wahrscheinlich iteriert, und alles was kein "Zeilenumbruch" ist, in ein geeignetes Objekt wie z.B. einen String übertragen werden.
    Man könnte auch ein "anderes Zeichen" anstelle des "Zeilenumbruchs" übertragen.



  • Danke, so, habe nochmal etwas rumprobiert.
    Sowas in der Art scheint quick'n'dirty zu funktionieren, zumindest für den Zweck. Vermutlich eine sehr hässliche Lösung, aber einerseits verhindert man halbwegs "eigene Experimente", falls ins Memo irgendwelche Escapesequenzen geschrieben werden, sprich eingegebene Backslashes werden als "\" escaped und andererseits wird der Line Break korrekt als "\r\n"-String innerhalb der Zeile in die Textdatei geschrieben, und dann eben als "echter" Line Break wieder zurückgelesen, wenn das Memo aus der Textdatei geladen wird. Das tut's jetzt erstmal.

    String __fastcall someClass::encodeLineBreaks (String str)
    {
    	str = StringReplace (str, "\\", "\\\\", TReplaceFlags () << rfReplaceAll);
    	str = StringReplace (str, "\r\n", "\\r\\n", TReplaceFlags () << rfReplaceAll);
    	return str;
    }
    //---------------------------------------------------------------------------
    String __fastcall someClass::decodeLineBreaks (String str)
    {
    	str = StringReplace (str, "\\r\\n", "\r\n", TReplaceFlags () << rfReplaceAll);
    	str = StringReplace (str, "\\\\", "\\", TReplaceFlags () << rfReplaceAll);
    	return str;
    }
    

    Falls es da einen besseren Ansatz geben sollte, immer gerne. 🙂



  • Bei einem TMemo kannst du über die Property Lines auf jede einzelne Zeile zugreifen. Die kannst du dann mit oder ohne Trennzeichen in eine Date schreiben. Wichtig ist hierbei, dass Delphi standardmäßig UnicodeStrings mit 16bit pro Zeichen benutzt, d.h. deine Textdatei ist dann ebenfalls UTF-16.



  • @DocShoe Stimmt natürlich auch wieder, aber der umgekehrte Fall muss ja dann auch funktionieren, und das Trennzeichen muss dann irgendwie wieder ausgelesen und der Line Break über Lines->Add angefügt werden, was vermutlich wieder in einer Art Methode wie oben münden würde. Danke für den Input dennoch. 👍🏼



  • @cppnoobie sagte in [gelöst] Kompletten Text von Memo in eine Zeile einer txt-Datei schreiben und lesen:

    str = StringReplace (str, "\r\n", "\\r\\n", TReplaceFlags () << rfReplaceAll);
    

    Bist du sicher dass die Zeilenumbrüche da als \r\n drin stehen? Oft ist es so dass im Speicher nur mit \n gearbeitet wird, und das dann erst beim Schreiben ins File zu \r\n konvertiert wird.

    Probier mal

    str = StringReplace (str, "\r", "\\r", TReplaceFlags () << rfReplaceAll);
    str = StringReplace (str, "\n", "\\n", TReplaceFlags () << rfReplaceAll);
    


  • @hustbaer Hi!
    Vielen Dank für den Hinweis. Nein, ich bin mir diesbezüglich nicht sicher. Die o. a. Methoden funktionieren erstmal für den Zweck, ich habe ehrlich gesagt nicht weiter ins Detail geguckt. Deine Methode oder zumindest etwas Ähnliches war aber irgendein kurzer Zwischenstand auf dem Weg, wenn ich mich recht entsinne.

    Das Ganze ist unter Windows 10, sollte man vielleicht dazusagen.

    So wie es ist, klappt es. Aus dem Memo werden erst "eingegebene" Backslashes escaped, dann die Zeilenumbrüche. Ich müsste jetzt vermutlich Zeichen für Zeichen aus dem Memo untersuchen, um das herauszufinden, ob die intern nur als '\n' stehen oder als '\r\n'. So oder so, die Konvertierung funktioniert in dem Fall in beiden Richtungen. Rückwärts werden eben erst die Zeilenumbrüche aus dem Klartext in den Umbruch fürs Memo umgewandelt, dann noch eventuelle Backslashes.

    Zur Zeit muss das nur hier laufen, für andere Systeme müsste man sicherlich nochmal genauer hingucken, da hast du völlig Recht. 👍🏼


Anmelden zum Antworten