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:

user defined image


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?


WasWeißDennIch - Di 17.06.14 08:28

Im Netz gibt es div. HTMLLabels zu finden, sowohl kostenlose [http://www.yunqa.de/delphi/doku.php/products/htmllabel/index] als auch kostenpflichtige [http://www.tmssoftware.com/site/htmlabel.asp] (willkürlich gewählte Beispiele), damit dürfte so etwas auch zu realisieren sein.


trm - Di 17.06.14 12:48

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Im Netz gibt es div. HTMLLabels zu finden, sowohl kostenlose [http://www.yunqa.de/delphi/doku.php/products/htmllabel/index] als auch kostenpflichtige [http://www.tmssoftware.com/site/htmlabel.asp] (willkürlich gewählte Beispiele), damit dürfte so etwas auch zu realisieren sein.


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

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
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;
      // Bei RichEdit.Lines.Add wirkt sich SelAttributes immer auf die komplette
      // Zeile aus.
      RichEdit.SelAttributes.Style := [fsUnderline];
      RichEdit.Lines.Add('Seriennummer:');
      RichEdit.SelAttributes.Style := [];
      RichEdit.Lines.Add('');
      RichEdit.SelAttributes.Color := clRed;
      RichEdit.Lines.Add('XXXX');
      // Soll sich das nicht auf eine komplette Zeile auswirken, dann ist der Text
      // mit "RichEdit.SelText" zu setzen.
      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

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
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?

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
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