![]() |
WriteLN + Zeilenumbruch
Hallo,
ich habe folgendes Problem was mich zum verzweifeln bringt: Ich schreibe Zeilen in eine Textdatei mit WriteLn was an sich ganz gut klappt. Wenn ich dann aber ein Edit Feld ergänze und es wieder speichere, dann schreibt er die alte Zeile, macht danach einen Zeilenumbruch und schreibt in die neue Zeile die Ergänzung. Wenn ich z.B. in Edit1 "Test" drin stehen habe, das speichere, dann schreibt Delphi das auch so in die Textdatei, wenn ich nun aus "Test" "Test1" mache und wieder speichere, habe ich 2 Zeilen in der Textdatei: 1. Zeile: Test 2. Zeile: 1 Zudem setzt Delphi mir nach jedem Speichern einen Zeilenumbruch zwischen die verschiedenen Zeilen, sodass die Datei immer größer und die Zeilenabstände ebenfalls immer größer werden. Ich komm nicht dahinter woran das liegen kann :( Gibt irgendwie keinen Sinn :? Habe schon probiert die Textdatei vor dem Speichern komplett zu löschen und neu anzulegen, aber dann tritt dasselbe Problem auf. Danke schon mal ;)
Delphi-Quellcode:
procedure TForm1.SpeichernClick(Sender: TObject);
var f:TextFile; Punkte:String; i:integer; begin Punkte:='........................................'; // 40 Punkte i:=0; {if fileexists(Label2.Caption+'\'+Combobox1.text+'\'+edit3.Text) then DeleteFile(Label2.Caption+'\'+Combobox1.text+'\'+edit3.Text); !auch wenn ich die Datei lösche, dann schreibt er in mehrer Zeilen und macht zeilenbrüche >.<!} AssignFile(f,Label2.Caption+'\'+Combobox1.text+'\'+edit3.Text); {$I-} Rewrite(f); {$I+} if IOResult<>0 then showmessage('Fehler beim Speichern.'); for i := 0 to memo1.Lines.Count do WriteLn(f,memo1.Lines[i]); WriteLN(f,'..........Informationen zu "'+Combobox1.text+'"..........'); Write(f,#10#13); // Zeilenumbruch (hieran liegt es nicht!) WriteLn(f,'TEST'+Punkte+Edit1.Text); WriteLn(f,'TEST'+Punkte+Edit2.Text); WriteLn(f,'TEST'+Punkte+Edit3.Text); WriteLn(f,'TEST'+Punkte+Edit4.Text); WriteLn(f,'TEST'+Punkte+Edit5.Text); WriteLn(f,'TEST'+Punkte+Edit6.Text); WriteLn(f,'TEST'+Punkte+Edit7.Text); WriteLn(f,'TEST'+Punkte+Edit8.Text); WriteLn(f,'TEST'+Punkte+Edit9.text); WriteLn(f,'TEST'+Punkte+Edit10.text); WriteLN(f,'TEST'+Punkte+Edit11.Text); WriteLN(f,'TEST'+Punkte+Edit12.Text); closefile(f); TextLaden; // Hieran liegt es auch nicht end; |
AW: WriteLN + Zeilenumbruch
Delphi schreibt garantiert nicht einfach so von sich aus irgendwelche Zeilenumbrüche (abgesehn von dem Einen im WriteLn, welches man dann aber selber so will)
Wie sieht TextLaden aus? Zitat:
0 bis Count ist eine Zeile zuviel und dort sollte sich die StringListe des Memos doch eigentlich beschweren :gruebel: (0 to Count - 1) Zitat:
Soweit ist es ja OK, aber dann wird dennoch versucht die Schreibfunktionen auszuführen, was auch nicht gut Enden wird. |
AW: WriteLN + Zeilenumbruch
Hallo,
in deinem Edit1 steht 'Test'#10#13. Dann schreibst du 1 dazu und speicherst das ganze. Damit zeigt dir jeder Editor 2 Zeilen an. Probier einfach mal den Debugger - da wird dir alles angezeigt und du findest den Fehler sicher ohne Probleme, welcher beim Schreiben in Edit1 passiert. |
AW: WriteLN + Zeilenumbruch
Erstmal Danke an euch beide ;)
TextLaden lädt den Text nur noch mal ins Memo. Daran liegt das nicht, das habe ich auch schon auskommentiert und nach dem Speichern in die Textdatei geschaut und die Zeilenbrüche waren auch vorhanden. Mhm zum 2. Punkt von himitsu: Selbst wenn ich
Delphi-Quellcode:
schreibe kommt keine Fehlermeldung, sondern Delphi schreibt nur leere Zeilen , aber das hat ja nichts mit den Zeilenbrüchen zu tun.
for i := 0 to memo1.Lines.Count+10 do
WriteLn(f,memo1.Lines[i]); Zitat:
zu HiWieGehts: woher kommen denn die "#10#13" und wie kann ich das verhindern bzw. umgehen? |
AW: WriteLN + Zeilenumbruch
HiWieGehts hatte Recht.
wenn ich vor dem Speichern dies davor setze:
Delphi-Quellcode:
bekomme ich die Meldung 'vorhanden'.
if pos(#13#10,Edit1.Text) <> 0 then showmessage('vorhanden');
Jetzt frag ich mich halt nur woher das kommt? Oder wie kann ich das rauslöschen? Das ist noch nicht normal das an ein Edit "#13#10" gesetzt wird, oder? Danke schon mal :-D |
AW: WriteLN + Zeilenumbruch
Zitat:
Zitat:
Wobei es auch unpraktisch ist, den eigentlichen Fehlergrund zu verschleiern, denn dann weiß man zwar daß etwas nicht geht, aber nicht warum.
Delphi-Quellcode:
Was man nun vermutlich erfahren würde.
if IOResult = 0 then begin
... hier die Dateizugriffe end else ShowMessage('Fehler beim Speichern.' + sLineBreak + SysErrorMessage(IOResult)); Die Steuerzeichen #13 und #10 sind in einem Edit schon erlaubt, nur daß sie dort nicht als Zeilenumbruch/Steuerzeichen, sondern als stinknormale Zeichen interpretiert werden. (so wie ein Texteditor <B> als Text behandelt, was ein Webbrowser nicht macht, sobald er den Text als HTML interpretiert) |
AW: WriteLN + Zeilenumbruch
ok du hattest Recht ;)
ich habe beim Auslesen der Textdatei einen Fehler gemacht und habe die Zeilenbrüche mit ausgelesen, habe jetzt überall 2 Zeichen abgezogen und er liest die Zeilenbrüche nicht mehr ein :-D Danke für eure Hilfe Habe jedoch noch schnell 2 Fragen:
Delphi-Quellcode:
Hat sLinebreak diesselbe Bedeutung wie "#13#10" ?
ShowMessage('Fehler beim Speichern.' + sLineBreak + SysErrorMessage(IOResult));
wieso tritt bei
Delphi-Quellcode:
kein Fehler auf?
for i := 0 to memo1.Lines.Count+10 do
WriteLn(f,memo1.Lines[i]); |
AW: WriteLN + Zeilenumbruch
OK,
![]() Versuch das aber mal bei einer TStringList oder einer anderen Liste, wie TList und Co. Bei dynamischen Arrays vergessen viele probehalber mal die Bereichsprüfung in den Projektoptionen zu aktivieren, was oftmals in Zugriffsverletzungen oder gar in einem Bufferoverrun resultiert. ![]() Kompiliert man eine Linux-Anwendung, ist es eine #10 und für MAC ist es eine #13. (Kylix oder XE2) Es paßt sich also ans Zielsystem an. :angle: [edit] Ohh, wieso gibt's das nicht in der OH? :shock: |
AW: WriteLN + Zeilenumbruch
Man ist eigentlich gut beraten sich für das Speichern von Daten, die man später auch wieder einlesen und verarbeiten möchte, ein möglichst einfach zu lesendes Format zu verwenden.
Ein Human-Readable-Format ist für ein Programm meistens schlecht/umständlich zu verarbeiten - und auch umgekehrt. Speicher die Daten in 2 Dateien ... eine im Human-Readable-Format (nur zum lesen) und in einem weiteren Format, welches sich auch wieder einfach auslesen lässt. In diesem Fall könnte dir z.B. auch eine schnöde Ini-Datei helfen ![]() |
AW: WriteLN + Zeilenumbruch
@himitsu danke für die erklärung
@Sir Rufo, kann schon sein, dass das mit einer .ini einfacher geht, aber jetzt läufts ja :D Merk ich mir fürs nächste Mal |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 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