Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Formatierung eines RichEdit speichern (https://www.delphipraxis.net/131154-formatierung-eines-richedit-speichern.html)

TheMiller 19. Mär 2009 17:34


Formatierung eines RichEdit speichern
 
Hallo,

ist es möglich die Formatierung eines RichEdit zu speichern, oder muss ich eine Art BBCode aus der Formatierung erstellen, diese mitspeichern und mit StringReplace etc. wieder in eine Formatierung umwandeln?

Danke!

taaktaak 19. Mär 2009 17:44

Re: Formatierung eines RichEdit speichern
 
RichEdit.Lines.SaveToFile() oder ..SaveToStream() speichern Text+Formatierung :wink:

TheMiller 19. Mär 2009 17:50

Re: Formatierung eines RichEdit speichern
 
Hm... ok,

aber leider muss ich den Text in eine XML-Datei schreiben. Bleibt sich das gleich?

mkinzler 19. Mär 2009 17:51

Re: Formatierung eines RichEdit speichern
 
RTF ist ja ein Format mit Formatierungen. In welchem Format du die Inhalte ablegst ist eigentlich egal.

TheMiller 19. Mär 2009 17:55

Re: Formatierung eines RichEdit speichern
 
Das wäre zu schön. Aber wo werden denn die Infos für die Formatierung gespeichert? Ich speicher so:

Delphi-Quellcode:
  DomElement:=TDomElement.Create(ParDoc, 'Def');
  TBM.AppendChild(DomElement);
  DomText:=TDomText.Create(ParDoc);
  DomText.NodeValue:=reDef.Text; //RichEdit mit Formatierung
  TBM.ChildNodes.Item(1).AppendChild(DomText);

mkinzler 19. Mär 2009 18:00

Re: Formatierung eines RichEdit speichern
 
Die formatierungen werden im Text mitgespeichert (Lass ihn dir doch mal anzeigen)

TheMiller 19. Mär 2009 18:03

Re: Formatierung eines RichEdit speichern
 
Hey,

Zitat:

(Lass ihn dir doch mal anzeigen)
soweit bin ich noch nicht. Der Speicherort der Formatierung hat mich nur interessiert. Ich probiert's dann später mal.

Danke

TheMiller 19. Mär 2009 23:17

Re: Formatierung eines RichEdit speichern
 
So, hier bin ich wieder...

das klappt so nicht. Die Formatierung wird nicht übernommen.

So speicher ich:

Delphi-Quellcode:
DomText:=TDomText.Create(ParDoc);
DomText.NodeValue:=reSchema.Text;
DomNode.AppendChild(DomText);
Und so lese ich wieder ein

Delphi-Quellcode:
cbSchemata.Items.Add(NSchemata.Attributes.GetNamedItem('Name').NodeValue);
with (reSchemata) do
begin
  Lines.Add(NSchemata.Attributes.GetNamedItem('Name').NodeValue);
  Lines.Add(NSchemata.TextContent);
  Lines.Add('');
end;
NSchemata:=NSchemata.FindNextSiblingElement;
Ich benutze die ADOM-Library (OpenXML, oder?)

Satty67 19. Mär 2009 23:21

Re: Formatierung eines RichEdit speichern
 
RichEdit.Text gibt auch nur den reinen Text zurück.

RichEdit.SaveToFile speichert im formatierten Format.

TheMiller 19. Mär 2009 23:23

Re: Formatierung eines RichEdit speichern
 
Tja, das nutzt mir aber reichlich wenig. Ich wollte das doch in einen XML-Knoten speichern. Matze hat gesagt das geht ;)

Satty67 19. Mär 2009 23:28

Re: Formatierung eines RichEdit speichern
 
Du kannst mal versuchen nach dem Erstellen des RichEdit auf PlainText=True umzuschalten. Dann sollte RichEdit.Text die Formatierung enthalten. Nein auch nicht... enthält nur den Code, wenn es schon zuvor eingeschaltet war.

TheMiller 19. Mär 2009 23:32

Re: Formatierung eines RichEdit speichern
 
Hm... hab jetzt im OI PlainText auf True... aber keinen Erfolg. Sehe auch nicht, dass im XML irgendwelche Tags für die Styles drin stehen.

EDIT: Doch, im Dokument hat sich was geändert!

Satty67 19. Mär 2009 23:37

Re: Formatierung eines RichEdit speichern
 
Unschön, würde aber gehen:

Als RTF speichern und mit einer Stringlist einlesen. Die hat keinen Converter, da ist StringList.Text dann mit Formatierungs-Code.

Vielleicht weis ja jemand wie man den Converter ausschalten kann...

TheMiller 19. Mär 2009 23:44

Re: Formatierung eines RichEdit speichern
 
Das ist tatsächlich unschön.

Habe jetzt mal eine RTF als Plain gespeichert, mit dem Editor geöffnet und deren Inhalt mal mit Copy&Paste in die XML reinkopiert. Doch beim Öffnen sagt er immer:

Fehler beim Einfügen einer Zeile in RichEdit

:wink:

Satty67 19. Mär 2009 23:50

Re: Formatierung eines RichEdit speichern
 
Copy+Paste behandelt sich evtl. überschneidende Steuerzeichen nicht? Würde im XML nur über die Komponente speichern.

TheMiller 19. Mär 2009 23:54

Re: Formatierung eines RichEdit speichern
 
Ich hab's jetzt so gemacht:

Delphi-Quellcode:
function RichText(re: TRichEdit): String;
var
  ss: TStringStream;
begin
  ss := TStringStream.Create ('');
  try
    re.Lines.SaveToStream(ss);
    Result := ss.DataString;
  finally
    ss.Free;
  end;
end;
Diese Funktion ist von marabu. Doch leider kommt wieder diese "Einfüge-Fehler"

EDIT: Jap, die XML-Datei ist nun nicht mehr wohlgeformt... Mal sehen, wie ich den RTF-Kram escapen kann. Liegt doch daran, oder?

mjustin 20. Mär 2009 06:15

Re: Formatierung eines RichEdit speichern
 
Zitat:

Zitat von DJ-SPM
EDIT: Jap, die XML-Datei ist nun nicht mehr wohlgeformt... Mal sehen, wie ich den RTF-Kram escapen kann. Liegt doch daran, oder?

Vermutlich, ist aber leicht lösbar mit einem CDATA Abschnitt:

http://de.wikipedia.org/wiki/Cdata

Mit einem CDATA-Abschnitt wird einem Parser mitgeteilt, dass kein Markup folgt, sondern normaler Text.

Konkret müsste nur über die entsprechende DOM Funktion ein CDATA Element angehängt werden, und diesem dann als Inhalt der RTF Code zugewiesen werden.

TheMiller 20. Mär 2009 08:12

Re: Formatierung eines RichEdit speichern
 
Morgen!

Das hört sich interessant an. Das werde ich heute Mittag mal ausprobieren und Rückmeldung geben.

Danke

TheMiller 20. Mär 2009 13:42

Re: Formatierung eines RichEdit speichern
 
Hey Leute...

ich bin geknickt... mit CData funzt es auch nicht. Die Formatierung wird überhaupt nicht übernommen - obwohl ich mit StringStream etc gespeichert hab...

Was soll ich denn noch tun?

ADOM OpenXML ist doch der hinterletzte Dreck.... :twisted:

mkinzler 20. Mär 2009 13:46

Re: Formatierung eines RichEdit speichern
 
Welchen Wert hat .PlainText?

TheMiller 20. Mär 2009 13:54

Re: Formatierung eines RichEdit speichern
 
So sieht der CData-Teil aus:

Code:
<![CDATA[HALLO DU DA]]></Schema><Schema Name="dasdsad"><![CDATA[{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil Tahoma;}}

\viewkind4\uc1\pard\b\f0\fs16 I. Hallo\b0 

\par II. Und wie?

\par

\par }

 ]]>
Sobald das in der XML steht, ist die Datei nicht mehr wohlgeformt und es gibt Parser-Error.

Wenn dann noch PlainText auf False steht kommt die Meldung: Fehler beim Einfügen der Zeile in TRichEdit.

mkinzler 20. Mär 2009 13:55

Re: Formatierung eines RichEdit speichern
 
Was passiert, wenn du den "inneren" CDATA-Abschnitt entfernst?

TheMiller 20. Mär 2009 13:57

Re: Formatierung eines RichEdit speichern
 
Hm... irgendwie auch einen Parser-Error

Code:
<Schema Name="xfgfdgfdg"><![CDATA[]]></Schema>
Delphi-Quellcode:
DomCData:=TDomCDataSection.Create(ParDoc);

  ss := TStringStream.Create ('');
  try
    reSchema.Lines.SaveToStream(ss);
    DomCData.NodeValue:=ss.DataString;
  //DomText.AppendChild(DomCData);

    DomNode.AppendChild(DomCData);
  finally
    ss.Free;
  end;
Node etc alles in Ordnung. Speicherort innerhalb der XML perfekt.

TheMiller 20. Mär 2009 17:25

Re: Formatierung eines RichEdit speichern
 
So, jetzt funktioniert es. Hatte beim Auslesen einen Fehler. Hier die richtige "Auslese-Funktion":

Delphi-Quellcode:
  ss:=TStringStream.Create('');
  ss.WriteString(Base64Decode(NSchemata.TextContent));
  ss.Position:=0;
  reSchemata.Lines.LoadFromStream(ss);
  ss.Free;
Vielen Dank an alle, die mir geholfen haben!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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