RichEdit und RTF Kodierung



  • Hallo erstmal an alle C-ler! 🙂

    Ich versuche einen AnsiString mit RTF-Kodierung in ein RichEdit zu laden, um dabei ganz bequem die Zeilenbreite automatisch setzen zu lassen, was an der Stelle aber jetzt keine Bedeutung hat. Viel merkwürdiger ist die Tatsache, dass er für jedes Zeichen eine eigene Zeile anlegt. Also z.B.: "H\r\na\r\nl\r\nl\r\no\r\n", obwohl die Breite des RichEdit natürlich wesentlich größer ist.

    Hier der Original-Text, der nicht geht:

    {\rtf1\ansi\ansicpg1252\uc1\deff0{\fonttbl
          {\f0\fswiss\fcharset0\fprq2 Arial;}
          {\f1\froman\fcharset2\fprq2 Symbol;}}
          {\colortbl;\red0\green0\blue0;\red255\green255\blue255;}
          {\stylesheet{\s0\itap0\nowidctlpar\f0\fs24 [Normal];}{\*\cs10\additive Default Paragraph Font;}}
          {\*\generator TX_RTF32 13.0.501.502;}
          \deftab1134\margl1134\margt850\margr850\margb850\widowctrl
          {\*\background{\shp{\*\shpinst\shpleft0\shptop0\shpright0\shpbottom0\shpfhdr0\shpbxmargin\shpbxignore\shpbymargin\shpbyignore\shpwr0\shpwrk0\shpfblwtxt1\shplid1025
    {\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillColor}{\sv 16777215}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}
    {\sp{\sn fLine}{\sv 0}}{\sp{\sn fBackground}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}}}\pard\itap0\nowidctlpar\ri6207\plain\f0\fs20 Hier steht Text bla bla bla...\par }[end]
    

    Der eigentliche Text fängt bei „Hier steht Text” an, den er halt Zeichen für Zeichen in eine neue Zeile schreibt.

    Folgender Text geht aber:

    {\rtf1\ansi \deftab850 {\fonttbl{\f2\fcharset0 Arial;}}{\colortbl;}\pard\plain\f2\fs22\pard\ql\li0{Hier steht Text bla bla bla...}{\par}
    \pard\ql\li0{\par}
    \pard\ql\li0{Format: 0,80 x 0,80 m}
    }
    

    Und hier der Vorgang, nichts besonderes an sich:

    Edit->Text = text;
    

    text ist der AnsiString mit obigem Inhalt.
    Was mache ich falsch? Ich habe leider keine große RTF-Erfahrung. 😕

    Edit: Habe noch etwas ganz wichtiges vergessen:
    Edit->Text gibt die Kodierung richtig wieder, über Edit->Lines->Strings[i] geht´s aber nur zeilenweise.



  • Hi,

    auf der Builderseite machst Du wohl eher nix falsch. Ich kann den ersten Text weder mit OpenOffice, Wordpad, Word2003 noch mit Word2007 vernünftig öffnen.
    Womit hast du den Text erstellt?
    Ich denke der ist Fehlerhaft.

    Gruß myerscola



  • Den Text habe ich von jemand anders, funktioniert aber mit anderen Programmen und (bei mir zumindest) auch mit Word. Ich werde da nicht ganz schlau draus.
    Edit: Der Text stammt ursprünglich aus einer Gaeb-Datei.



  • Unsere Hotline hat mir gerade das gleiche Problem reingereicht:

    Schuld ist die Sequenz \ri6207

    ri steht für right indent, also rechter Einzug in twips (default=0)
    6207 twips sind etwa 109 mm, d.h. der Absatz wird um fast 11 cm rechts verkleinert.

    Ich vermute, der Text wurde in DIN A4 geschrieben und mit dem rechten Rand auf die Langtext-Breite angepasst. Im verkleinerten Dokumentenformat bleibt der rechte Rand erhalten und wird entsprechend in GAEB2000 exportiert.



  • Ich habe jetzt den Text genauso formatiert mal mit OpenOffice erzeugt welcher dann so aussieht:

    {\rtf1\ansi\deff0\adeflang1025
    {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\fnil\fprq2\fcharset0 Arial Unicode MS;}{\f4\fnil\fprq2\fcharset0 MS Mincho;}{\f5\fnil\fprq2\fcharset0 Tahoma;}{\f6\fnil\fprq0\fcharset0 Tahoma;}}
    {\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
    {\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1031\loch\f0\fs24\lang1031\snext1 Normal;}
    {\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\afs28\lang255\ltrch\dbch\af4\langfe255\hich\f2\fs28\lang1031\loch\f2\fs28\lang1031\sbasedon1\snext3 Heading;}
    {\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1031\loch\f0\fs24\lang1031\sbasedon1\snext3 Body Text;}
    {\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1031\loch\f0\fs24\lang1031\sbasedon3\snext4 List;}
    {\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ai\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1031\i\loch\f0\fs24\lang1031\i\sbasedon1\snext5 caption;}
    {\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ltrch\dbch\af3\langfe255\hich\f0\fs24\lang1031\loch\f0\fs24\lang1031\sbasedon1\snext6 Index;}
    }
    {\info{\creatim\yr2009\mo10\dy20\hr10\min32}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern3000}}\deftab709
    {\*\pgdsctbl
    {\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
    {\*\pgdscno0}\paperh16837\paperw11905\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
    \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\li0\ri6207\lin0\rin6207\fi0\ql\rtlch\af5\afs20\lang255\ltrch\dbch\af3\langfe255\hich\f2\fs20\lang1031\loch\f2\fs20\lang1031 {\rtlch \ltrch\loch\f2\fs20\lang1031\i0\b0 Hier steht Text bla bla bla...}
    \par }
    

    Der wird in der RichEdit-Komponente auch nur dann richtig dargestellt wenn der Word Wrapper, also die Eigenschaft

    WordWrap=true
    

    gesetzt ist.

    Gruß myerscola



  • Der wird in der RichEdit-Komponente auch nur dann richtig dargestellt wenn der Word Wrapper, also die Eigenschaft WordWrap=true gesetzt ist.

    WordWrap ist natürlich auf true, sonst würden die anderen Texte ja auch spinnen.

    Ich habe aber jetzt eine, naja, „Lösung” gefunden und die ist ganz billig:
    Ich schiebe den Text aus dem kaputten RichEdit in ein zweites RichEdit und da macht er es wie er soll. 🙄
    Also wie folgt:

    Edit->Text = text; //text ist der AnsiString mit der RTF-Kodierung
    NeuesEdit->Text = Edit->Text; //die grandiose Lösung des Problems, Einstein wäre neidisch
    

    Fragt mich nich´ warum, ich weiß es nicht, ich weiß es einfach nicht.

    Schuld ist die Sequenz \ri6207

    So was in der Art habe ich mir auch schon gedacht, aber von RTF habe ich wie gesagt keine Ahnung. Vielleicht probiere ich es mal aus in einer ruhigen Minute.

    Danke euch allen! 🙂


Anmelden zum Antworten