AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi RichEdit, RTF, Leerzeile wird immer angehängt
Thema durchsuchen
Ansicht
Themen-Optionen

RichEdit, RTF, Leerzeile wird immer angehängt

Ein Thema von Ralf Meyer · begonnen am 19. Okt 2009 · letzter Beitrag vom 20. Okt 2009
Antwort Antwort
Ralf Meyer

Registriert seit: 24. Mär 2008
36 Beiträge
 
#1

RichEdit, RTF, Leerzeile wird immer angehängt

  Alt 19. Okt 2009, 16:56
Hallo,

ich speichere formatierten Text (RTF) in eine Datenbank.
Zum Ändern ruf ich den RichEditor auf mit

Delphi-Quellcode:
  
Procedure SetRTFText(Const cRTFText : String );
  Begin
    Editor.Lines.Clear ;
    CurrText.Name := DefFontData.Name;
    CurrText.Size := 12 ;
    Editor.Lines.Append( cRTFText );
  End ;
Im Editor steht der Cursor jetzt immer eine Zeile unter dem Text. Es wird somit automatisch eine neue Zeile angefügt.

Den Text hole ich mir beim verlassen raus über die folgende Funktion

Delphi-Quellcode:
Function GetRTFText : String ;
Var
  str : TStringStream ;
begin
  Result := '' ;
  Try
    Str := TStringStream.Create('') ;
    Editor.Lines.SaveToStream( Str );
    Result := str.DataString ;
  Finally
    str.Free ;
  End;
Ruft man den Editor x-mal auf, hat man auch x neue Leerzeilen im Text. (Sehr nervig).

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#2

Re: RichEdit, RTF, Leerzeile wird immer angehängt

  Alt 19. Okt 2009, 17:24
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
Editor.Lines.Append(Trim(cRTFText)); Result := Trim(str.DataString); (bzw. RightTrim statt Trim)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Ralf Meyer

Registriert seit: 24. Mär 2008
36 Beiträge
 
#3

Re: RichEdit, RTF, Leerzeile wird immer angehängt

  Alt 19. Okt 2009, 17:33
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#4

Re: RichEdit, RTF, Leerzeile wird immer angehängt

  Alt 19. Okt 2009, 17:48
OK, beim RTF-Code kommt Trim wirklich nicht sehr weit


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
Delphi-Quellcode:
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;
eventuell auch
While (i > 0) and (Trim(C.Lines[i - 1]) = '') do Begin 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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#5

Re: RichEdit, RTF, Leerzeile wird immer angehängt

  Alt 19. Okt 2009, 18:49
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:
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 ;
Alternativ bietet sich auch das direkte Setzen von RichEdit.Text an, es erzeugt keine "abschließende Leerzeile" und Clear kann man sich auch sparen:
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 ;
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Tom

Registriert seit: 7. Jan 2003
318 Beiträge
 
RAD-Studio 2009 Pro
 
#6

Re: RichEdit, RTF, Leerzeile wird immer angehängt

  Alt 20. Okt 2009, 06:20
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 );
  Mit Zitat antworten Zitat
Ralf Meyer

Registriert seit: 24. Mär 2008
36 Beiträge
 
#7

Re: RichEdit, RTF, Leerzeile wird immer angehängt

  Alt 20. Okt 2009, 09:33
Hallo Tom,

du hast den optimalen Lösungsvorschlag. Es klappt super.

Danke
Gruß Ralf
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz