Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Welche Komponente zeigt verschiedene Schriftstile an?
trm - Di 17.06.14 00:32
Titel: Welche Komponente zeigt verschiedene Schriftstile an?
Huhu.
Gibt eine Standardkomponente, um verschiedene Schriftstile/Schriftarten innerhalb eines Satzes anzeigen zu lassen und ohne, dass es ein RichEdit ist?
Hier mal ein Beispiel, was ich meine:
Delete - Di 17.06.14 06:31
Meiner Kenntnis nach sind alle entsprechenden Komponenten von TMemo bzw. TRichEdit abgeleitet. Was spricht denn gegen dein Einsatz von TRichEdit?
trm - Di 17.06.14 12:48
Perlsau hat folgendes geschrieben : |
Meiner Kenntnis nach sind alle entsprechenden Komponenten von TMemo bzw. TRichEdit abgeleitet. Was spricht denn gegen dein Einsatz von TRichEdit? |
Ich wollte vermeiden, extra ein RTF Dokument nachladen oder per Resource einbinden zu müssen.
Den Quelltext eines RTF (Steuercodes incl. Text) habe ich versucht direkt in Lines einzubinden, der wird aber nicht formatiert übernommen. Es steht dann der Quelltext vom RTF da drin.
Vielen Dank für den Hinweis, ich hatte jedoch die Hoffnung, dies mit Standardkomponenten aus der Palette von Delphi erreichen zu können.
Delete - Di 17.06.14 12:55
trm hat folgendes geschrieben : |
Ich wollte vermeiden, extra ein RTF Dokument nachladen oder per Resource einbinden zu müssen. Den Quelltext eines RTF (Steuercodes incl. Text) habe ich versucht direkt in Lines einzubinden, der wird aber nicht formatiert übernommen. Es steht dann der Quelltext vom RTF da drin. |
Jetzt wird manches klarer: Du hast einen festen vorformatierten (incl. Farben?) Text, den du anzeigen möchtest. Mir ist noch immer nicht klar, worin jetzt der Vorteil einer anderen Komponente gegenüber TRichEdit liegen soll. Der Text, den du benötigst, soll ja weder von Datei noch von einer Ressource kommen. Woher soll er aber dann kommen?
jaenicke - Di 17.06.14 13:10
trm hat folgendes geschrieben : |
Vielen Dank für den Hinweis, ich hatte jedoch die Hoffnung, dies mit Standardkomponenten aus der Palette von Delphi erreichen zu können. |
In der JVCL gibt es so etwas auch. Die zähle ich im Grunde zu den Standardkomponenten, auch wenn ich nicht besonders viele davon tatsächlich benutze. Die ist aber in der Standardinstallationsroutine bei mir privat genauso dabei wie im Büro.
Bei TV-Browser war das aber ein RichEdit, wenn ich mich recht entsinne.
Gerd Kayser - Di 17.06.14 18:54
trm hat folgendes geschrieben : |
Den Quelltext eines RTF (Steuercodes incl. Text) habe ich versucht direkt in Lines einzubinden, der wird aber nicht formatiert übernommen. Es steht dann der Quelltext vom RTF da drin. |
Man kann den Text auch zur Laufzeit des Programms zusammensetzen. Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| RichEdit.Clear; RichEdit.SelAttributes.Style := [fsUnderline]; RichEdit.Lines.Add('Seriennummer:'); RichEdit.SelAttributes.Style := []; RichEdit.Lines.Add(''); RichEdit.SelAttributes.Color := clRed; RichEdit.Lines.Add('XXXX'); RichEdit.SelAttributes.Style := [fsBold, fsUnderline]; RichEdit.SelAttributes.Name := 'Arial Narrow'; RichEdit.SelAttributes.Size := 18; RichEdit.SelAttributes.Color := clLime; RichEdit.SelText := 'Beispiel:'; RichEdit.SelAttributes.Style := [fsBold, fsUnderline]; RichEdit.SelAttributes.Name := 'Courier New'; RichEdit.SelAttributes.Size := 10; RichEdit.SelAttributes.Color := clRed; RichEdit.SelAttributes.Style := [fsItalic]; RichEdit.SelText := ' Text in roter Farbe.'; |
Delete - Di 17.06.14 19:40
Gerd Kayser hat folgendes geschrieben : |
Man kann den Text auch zur Laufzeit des Programms zusammensetzen. Beispiel: |
Das rangiert bei mir unter "Ressource", auch wenn man dafür keinen Ressource-Editor benötigt :roll:
trm - Di 17.06.14 20:35
Perlsau hat folgendes geschrieben : |
Gerd Kayser hat folgendes geschrieben : | Man kann den Text auch zur Laufzeit des Programms zusammensetzen. Beispiel: |
Das rangiert bei mir unter "Ressource", auch wenn man dafür keinen Ressource-Editor benötigt :roll: |
Dem stimme ich zu, außerdem ist es mir zu aufwändig zu ändern.
Hier mal ein Beispiel, was ich in Lines reinschreiben könnte:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| {\rtf1\ansi\deff3\adeflang1025 {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\fswiss\fprq2\fcharset1 Arial;}{\f6\fnil\fprq2\fcharset0 Microsoft YaHei;}{\f7\fnil\fprq2\fcharset0 Mangal;}{\f8\fnil\fprq0\fcharset1 Mangal;}} {\colortbl;\red0\green0\blue0;\red0\green0\blue128;\red128\green128\blue128;} {\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af9\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1031 Normal;} {\*\cs15\snext15\cf2\ul\ulc0\langfe255\alang255\lang255 Internetlink;} {\s16\sbasedon0\snext17\sb240\sa120\keepn\dbch\af6\dbch\af7\afs28\loch\f4\fs28 \u220\'dcberschrift;} {\s17\sbasedon0\snext17\sl288\slmult1\sb0\sa140 Textk\u246\'f6rper;} {\s18\sbasedon17\snext18\sl288\slmult1\sb0\sa140\dbch\af8 Liste;} {\s19\sbasedon0\snext19\sb120\sa120\noline\i\dbch\af8\afs24\ai\fs24 Beschriftung;} {\s20\sbasedon0\snext20\noline\dbch\af8 Verzeichnis;} }{\info{\creatim\yr2014\mo6\dy17\hr20\min27}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67240962}}\deftab709 \viewscale100 {\*\pgdsctbl {\pgdsc0\pgdscuse451\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}} \formshade\paperh16838\paperw11906\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc \pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af9\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1031{\cf2\b\afs48\ab\rtlch \ltrch\loch\fs48\loch\f5 Das ist einfach nur ein Beispiel.} \par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af9\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1031\rtlch \ltrch\loch\loch\f5
\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af9\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1031{\rtlch \ltrch\loch\loch\f5 Oben die Schrift ist sch\u246\'f6n blau und fett, ich bin es mangels Alkohol zum Gl\u252\'fcck nie.} \par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af9\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1031\rtlch \ltrch\loch\loch\f5
\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af9\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1031{\ul\ulc0\rtlch \ltrch\loch\loch\f5 Lorem ipsum blah blah...} \par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af9\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1031\rtlch \ltrch\loch\loch\f5
\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af9\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1031{\rtlch \ltrch\loch\loch\f5 Falls gew\u252\'fcnscht, hier noch eine kleine URL: }{{\field{\*\fldinst HYPERLINK "http://www.entwickler-ecke.de/viewtopic.php?p=687420" }{\fldrslt \cf2\ul\ulc0\langfe255\alang255\lang255\rtlch \ltrch\loch\loch\f5 Dieser Thread}}} \par } |
Im Anhang die originale RTF-Datei, erstellt mit Libre Office.
Das lustigste an der ganzen Sache ist, wenn ich den Inhalt des Libreoffice-Textes, also aus Libreoffice heraus in das Richedit kopiere, wird es im Editor korrekt formatiert angezeigt. Wenn ich dann auf OK drücke, ist es nur noch unformatierter Text.
Und den Code oben rein zu schreiben bringt auch nichts.
Delete - Di 17.06.14 20:55
Binde doch einfach deine RichText-Datei in die Ressourcen-Datei ein und lade sie beim Programmstart in deine RichEdit-Komponente. Allerdings kann das normale TRichEdit nicht ohne weiteres Links darstellen. Dazu verwende ich stets das TjvRichEdit aus den Jedi-Komponenten. Der Link ist da jedoch nicht maskiert, d.h. er wird nur ausgeschriebne dargestellt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| Procedure TForm1.ShowRichText; Var Strom : TResourceStream; Ergebnis : String;
begin Strom := TResourceStream.Create(HInstance, 'RTFtext', RT_RCDATA); Try SetLength(Ergebnis, Strom.Size); Strom.ReadBuffer(Ergebnis[1], Strom.Size); RichEd.Text := Ergebnis; Finally Strom.Free; End; end;
procedure TForm1.FormShow(Sender: TObject); begin ShowRichText; end; |
trm - Di 17.06.14 21:17
So, nach etlichem Herumprobieren mache ich es nun ganz anders.
Den Quelltext des RTF habe ich in ein Memo rein kopiert, während Erzeugung der Form kopiere ich den Inhalt per Stream ins RichEdit. Dann wird es korrekt dargestellt.
Warum das so herum klappt und nicht, indem man den Quelltext direkt eingibt, ist mir ein echtes Rätsel.
Danke an alle Ideengeber.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.FormShow(Sender: TObject); var x: Integer; RichEditStream: TMemoryStream; begin
RichEditStream := TMemoryStream.Create; Memo1.Lines.SaveToStream(RichEditStream); RichEditStream.Position := 0; RichEdit1.Lines.LoadFromStream(RichEditStream); RichEditStream.Free; |
Aber Achtung - Das Memo darf nicht auf WordWrap stehen, sonst kommt der Quelltext bei langen Zeilen durcheinander - oder einzelne Stuerzeichen werden falsch interpretiert (?).
Delete - Di 17.06.14 21:20
trm hat folgendes geschrieben : |
Den Quelltext des RTF habe ich in ein Memo rein kopiert, während Erzeugung der Form kopiere ich den Inhalt per Stream ins RichEdit. Dann wird es korrekt dargestellt. |
Warum nochmal eine Anzeige-Komponente, die du gar nicht anzeigen willst? Da wäre doch die Lösung mit der Ressource einfacher, nicht wahr? Aber mach, was du willst, du mußt hier keine Ratschläge annehmen, das steht dir selbstverständlich frei. Sollte es daran liegen, daß du nicht weißt, wie man den Ressourcen-Editor bedient?
trm hat folgendes geschrieben : |
Warum das so herum klappt und nicht, indem man den Quelltext direkt eingibt, ist mir ein echtes Rätsel. |
Das ist doch ganz einfach: Du kopierst den Steuerzeilen-Text in Lines, obwohl Lines den reinen Text erwartet. Da werden dann natürlich die Steuerzeichen mit dargestellt.
Nebenbei: Du solltest unbedingt einen Try-Finally-Block verwenden, wenn du Streams erzeugst und freigibst, sonst handelst du dir eventuell ein Speicherleck ein.
trm - Di 17.06.14 22:04
Perlsau hat folgendes geschrieben : |
Da wäre doch die Lösung mit der Ressource einfacher, nicht wahr? Aber mach, was du willst, du mußt hier keine Ratschläge annehmen, das steht dir selbstverständlich frei. Sollte es daran liegen, daß du nicht weißt, wie man den Ressourcen-Editor bedient?
[..]
Nebenbei: Du solltest unbedingt einen Try-Finally-Block verwenden, wenn du Streams erzeugst und freigibst, sonst handelst du dir eventuell ein Speicherleck ein. |
Doch, ich weiß wie ich eine Resource einbinde :)
Und nein, es ist mir bei diesem RichEdit einfach zu blöd ständig die Resource neu generieren zu müssen (auch wenn ich dafür eine batch erstellen würde) - einfacher für mich ist es, den Text dort hin zu kopieren, wo ich ihn benötige. Außerdem kann ich auf diesem Weg Versionsnummern viel schneller anpassen. Oder Datumsänderungen.
Ja, per Code und Constante ginge das auch. Bin aber zu faul an zwei oder mehr Stellen dies zu ändern, wo ich es einfach schnell in einem Textabschnitt realisieren kann.
Danke für den Hinweis mit dem Try-Finally-Block.
Gruß aus Thüringen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!