Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   MEMO als FILE speichern mit LF anstatt CRLF (https://www.delphipraxis.net/190984-memo-als-file-speichern-mit-lf-anstatt-crlf.html)

wschrabi 25. Nov 2016 20:47

MEMO als FILE speichern mit LF anstatt CRLF
 
Hi
Ich habe eine MEMO mit einigen Lines hardcoded im Form.
NUn möchte ich es per sftp an UNIX übertragen. Dazu möchte ich das MEMO mit linebreaks = #10 speichern.
Ich habe auch memoscript.linebreaks = #10 definiert. Doch er speichert immer noch mit CRLF.
Wieso?

t.roller 25. Nov 2016 21:45

AW: MEMO als FILE speichern mit LF anstatt CRLF
 
Demo:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i : Integer;
begin
for i := 0 to 19 do Memo1.Lines.Add(INTTOSTR(i));
end;

procedure TForm1.Button2Click(Sender: TObject);
var newStr : String;
begin
 Label1.Caption:= Memo1.Text;
 newStr:= Label1.Caption;
 newStr := StringReplace(newStr,#$A,'',[rfReplaceAll]);  // entweder
// newStr := StringReplace(newStr,#$D,'',[rfReplaceAll]); // oder
 Label2.Caption:= newStr;
 Application.ProcessMessages;
 Memo2.Text:= Label2.Caption;
 Application.ProcessMessages;
 Memo2.Lines.SaveToFile('F:\Memo2.txt');
end;

Klaus01 25. Nov 2016 21:51

AW: MEMO als FILE speichern mit LF anstatt CRLF
 
Hallo,

welches Memo benutzt Du denn?
TMemo hat meines Wissen kein Property namens LineBreak.

Grüße
Klaus

himitsu 26. Nov 2016 02:14

AW: MEMO als FILE speichern mit LF anstatt CRLF
 
Zitat:

Delphi-Quellcode:
Memo1.Lines.LineBreak

Doch, hat es.

ABER, im TMemoStrings ist es nur "halb" implementiert.
TStrings.GetTextStr beachtet zwar dieses Property, aber TMemoStrings.GetTextStr überschteibt das und dort wird so gut optimiert, dass "direkt" Memo.Text rausgegeben wird, wo das nicht mehr Beachtung findet.

StringReplace anwenden oder in eine andere TStringList umkopieren.
PS: Delphi-Referenz durchsuchenAdjustLineBreaks

HolgerX 26. Nov 2016 07:07

AW: MEMO als FILE speichern mit LF anstatt CRLF
 
Hmm..

oder OldStyle...


Delphi-Quellcode:
procedure SaveStringsLF(AStrings : TStrings; AFileName : string);
var
  fs : TFileStream;
  i : integer;
  s : string;
begin
  fs := TFileStream.Create(AFileName,fmCreate);
  try
    for i := 0 to AStrings.Count-1 do begin
      s := AStrings[i] + #10;
      fs.Write(s[1],length(s) * SizeOf(Char));
    end;
  finally
    fs.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SaveStringsLF(Memo1.Lines, 'F:\Memo2.txt');
end;

himitsu 26. Nov 2016 11:50

AW: MEMO als FILE speichern mit LF anstatt CRLF
 
Und gerade sowas sollte man NIEMALS achen.
Denn diese Datei sieht dann anders aus, wenn man die Anweendung in verschiedenen Delphis kompiliert und das ohne jegliche Format-/Versionsinformationen in der Datei. (Unicode oder nicht)

HolgerX 26. Nov 2016 13:13

AW: MEMO als FILE speichern mit LF anstatt CRLF
 
Zitat:

Zitat von himitsu (Beitrag 1354737)
Und gerade sowas sollte man NIEMALS achen.
Denn diese Datei sieht dann anders aus, wenn man die Anweendung in verschiedenen Delphis kompiliert und das ohne jegliche Format-/Versionsinformationen in der Datei. (Unicode oder nicht)

OK, dann erkläre mir dochmal was dann 'Gleich' bei Memo2.Lines.SaveToFile('F:\Memo2.txt') unter Delphi6 (ANSI) und DelphiX (Unicode) ist?

Auch da wird KEINE Versionsinfo mitgespeichert, sondern nur der reine Textinhalt des MEMOs!
Auch da wird beim einen ein ANSI-Text erstellt und beim Anderen (eventuell) ein Unicode-Text!

Also, was ist an Memo2.Lines.SaveToFile besser?

Die Funktion von mir lässt sich problemlos um einen BOOM ergänzen, damit eine Unterscheidung von ANSI und UniCode möglich ist.
Auch könnte mann statt eine 'String' auch 'AnsiString' verwenden, welches für die meisten UNIX-Texte ausreichen würde..
(Dann allerdings das '* SizeOf(Char)' auskommentieren.

Da wir nicht wissen welches Format der Text haben müsste, können wir nur raten, ob UniCode/ANSI/mit oder ohne Boom benötigt wird..

Der TE wollte nur wissen, wie er ein Memo statt mit CR/LF nur mit LF speichert. Und genau dass mach die Funktion!

wschrabi 26. Nov 2016 13:32

AW: MEMO als FILE speichern mit LF anstatt CRLF
 
Recht herzlichen DANK für die Tips und Kommentare! :-D

himitsu 26. Nov 2016 13:43

AW: MEMO als FILE speichern mit LF anstatt CRLF
 
Es ist nicht immer gleich, da bis D2007 die Dateien als ANSI gespeichert wurden (im DefaultCharset des Windows) und Seit D2009 wird standardmäßig ebenfalls als ANSI gepsiechert, aber man könnte auch als oder sonstwas UTF-8 speichern,
abgesehn davon, dass dabei über das BOM die Codierung mitgegeben wird.

Externe Daten (Speichern, Datenübertagung usw.) dürfen niemals in einem dynamischen Format gespeichert werden, außer man speichert das Format mit oder das Format lässt sich "sicher" erkennen.
Das Selbe gilt auch z.B. für DLL-Schnittstellen.

Niemals String/Char/PChar, sondern immer nur AnsiString/AnsiChar/PAnsiChar oder UnicodeString/WideString/Wide/WideChar/PWideChar oder inkl. Übergabe des Formates.

Klaus01 26. Nov 2016 14:10

AW: MEMO als FILE speichern mit LF anstatt CRLF
 
.. wie werden denn die Dateien auf der Unix Maschine weiterverabeitet?
Es könnte dann vor der Verabeitung noch mit dos2unix konvertiert werden.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz