![]() |
RichEdit, RTF, Leerzeile wird immer angehängt
Hallo,
ich speichere formatierten Text (RTF) in eine Datenbank. Zum Ändern ruf ich den RichEditor auf mit
Delphi-Quellcode:
Im Editor steht der Cursor jetzt immer eine Zeile unter dem Text. Es wird somit automatisch eine neue Zeile angefügt.Procedure SetRTFText(Const cRTFText : String ); Begin Editor.Lines.Clear ; CurrText.Name := DefFontData.Name; CurrText.Size := 12 ; Editor.Lines.Append( cRTFText ); End ; Den Text hole ich mir beim verlassen raus über die folgende Funktion
Delphi-Quellcode:
Ruft man den Editor x-mal auf, hat man auch x neue Leerzeilen im Text. (Sehr nervig).
Function GetRTFText : String ;
Var str : TStringStream ; begin Result := '' ; Try Str := TStringStream.Create('') ; Editor.Lines.SaveToStream( Str ); Result := str.DataString ; Finally str.Free ; End; Da ich nicht weiß ob der User vielleicht selber welche rein gemacht hat, kann ich nicht pauschal am ende alle Leerzeilen entfernen. Hatte jemand schonmal so ein Problem? Ist mein Aufruf falsch? Gruß Ralf |
Re: RichEdit, RTF, Leerzeile wird immer angehängt
Ja also, einige StringList-Funktionen hängen leider an alle Zeilen in der Stringliste ein sLineBreak (CRLF) an, wenn es wieder "serialisiert" wird,
selbst wenn hinter der letzen Zeile Keiner war, als es in die StringList eigelesen wurde. Wenn es jetzt egal ist, ob am Ende eventuelle "gewollte" Leerzeilen wegkommen, dann könntest du es einfach so lösen
Delphi-Quellcode:
Editor.Lines.Append(Trim(cRTFText));
Delphi-Quellcode:
(bzw. RightTrim statt Trim)
Result := Trim(str.DataString);
|
Re: RichEdit, RTF, Leerzeile wird immer angehängt
Dank dir himitsu, für die schnelle Antwort.
Ich habe es probiert, ein Trim löst noch nicht das Problem, es werden immer noch RTF-Umbrüche (\par) angefügt, die natürlich auch mit Trim nicht entfernt werden. Gruß Ralf |
Re: RichEdit, RTF, Leerzeile wird immer angehängt
OK, beim RTF-Code kommt Trim wirklich nicht sehr weit :oops:
Nja, es ist zwar immernoch eine Zeile zuviel dran, da sie in Lines nicht drinen ist und erst später angehängt wird, aber was soll's ... wenigstens wird sie nicht mehr :angel2:
Delphi-Quellcode:
eventuell auch
Function GetRTFText(C : TRichEdit) : String;
Var Str : TStringStream; i : Integer; Begin Result := ''; Str := TStringStream.Create(''); Try i := C.Lines.Count; While (i > 0) and (C.Lines[i - 1] = '') do Begin C.Lines.Delete(i - 1); i := C.Lines.Count; End; C.Lines.SaveToStream(Str); Result := Str.DataString; Finally Str.Free; End; End;
Delphi-Quellcode:
While (i > 0) and (Trim(C.Lines[i - 1]) = '') do Begin
Delphi-Quellcode:
S := GetRTFText(Editor);
für alle, welche jetzt nicht ganz verstehen, was das Problem ist: [pre]man hat dieses Zeile* Zeile* Zeile serialisiert wäre das eigentlich Zeile*Zeile*Zeile durch derartige Billigcodes for i := 0 to Count do result := Zeile[i] + ZeilenWechsel; wird allerdings das draus Zeile*Zeile*Zeile* was diesem entspricht Zeile* Zeile* Zeile* deserialisiert wäre es dann Zeile* Zeile* Zeile* leerzeile und nach erneutem serialisieren kommt dann das raus Zeile*Zeile*Zeile** wieder deserialisiert dann Zeile* Zeile* Zeile* leerzeile* leerzeile dann wieder Zeile*Zeile*Zeile*** usw. ... ( * = Zeilenwechsel )[pre] PS: .Create gehört immer vor Try-Finally-.Free |
Re: RichEdit, RTF, Leerzeile wird immer angehängt
Hallo,
hm ... diese "abschließende Leerzeile" wird nur dann angehängt, wenn nach Clear mit Append die erste Zeile im RichEdit gesetzt wird. Nachfolgende Append fügen weitere Zeilen vor dieser abschließenden "Leerzeile" ein. Löscht man die "abschließende Leerzeile" nach dem ersten Anlegen der Zeile(n), fügt dann weitere Zeilen mit Append an, gibt es keine "abschließende Leerzeile" mehr. Hab den Code aus dem Eröffnungs-Beitrag erweitert, "abschließende Leerzeile" wird gelöscht, aber nur beim ersten Einfügen:
Delphi-Quellcode:
Alternativ bietet sich auch das direkte Setzen von RichEdit.Text an, es erzeugt keine "abschließende Leerzeile" und Clear kann man sich auch sparen:
Procedure SetRTFText(Const cRTFText : String );
Begin Editor.Lines.Clear ; CurrText.Name := DefFontData.Name; CurrText.Size := 12 ; Editor.Lines.Append( cRTFText ); Editor.Selstart := Editor.Selstart -2; Editor.SelLength := 2; Editor.ClearSelection; //weitere Zeilen mit Append ... oder durch Anwender End ;
Delphi-Quellcode:
Procedure SetRTFText(Const cRTFText : String );
Begin CurrText.Name := DefFontData.Name; CurrText.Size := 12 ; Editor.Text := cRTFText; //weitere Zeilen mit Append ... oder durch Anwender End ; |
Re: RichEdit, RTF, Leerzeile wird immer angehängt
Ich mache es so:
Delphi-Quellcode:
Stream : TMemoryStream;
Lines : TStringList; // Zum externen Speichern des Textes // Text in Richedit einsetzen Lines.SaveToStream( Stream); Stream.Position := 0; RichEd.Lines.LoadFromStream(Stream); // Text aus Richedit auslesen RichEd.Lines.SaveToStream( Stream ); Stream.Position := 0; Lines.LoadFromStream( Stream ); |
Re: RichEdit, RTF, Leerzeile wird immer angehängt
Hallo Tom,
du hast den optimalen Lösungsvorschlag. Es klappt super. Danke Gruß Ralf |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 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