AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Text farbig darstellen

Ein Thema von stahli · begonnen am 20. Jan 2018 · letzter Beitrag vom 21. Jan 2018
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.598 Beiträge
 
Delphi 7 Professional
 
#1

AW: Text farbig darstellen

  Alt 20. Jan 2018, 09:31
Kennst Du SynEdit? https://github.com/SynEdit/SynEdit

Kennt die Farbhervorhebung für viele Programmiersprachen ..., die Farbgestaltung ist vielfältig anpassbar.

Kann u. a. nach HTML, RTF, Tex exportieren, dabei bleibt dann die Farbgestaltung erhalten. Der Export sieht so aus, wie im Editor. Führende Leerzeichen ... bleiben erhalten.

Für eigene "Sprachen" kann man auch eigene Highlighter bauen.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Text farbig darstellen

  Alt 20. Jan 2018, 12:57
Vielen Dank. Ihr hattet das schon richtig verstanden.

Ich habe mir aber doch lieber einen eigenen Formatierer gebaut, da ich so flexibler bin und später auch formatierte Darstellungen auf einem Canvas leichter realisieren kann.

Anbei mal als Anregung ein paar Codeschnipsel, falls das jemandem hilft.
Aktuell wird erst mal nur BackColor übernommen.
Ich werde das nach und nach weiter ausbauen. Falls Interesse besteht, werfe ich einen späteren Stand auch gern hier rein.


Delphi-Quellcode:
uses
  ..., Vcl.ComCtrls, Winapi.RichEdit;

procedure RE_SetSelBgColor(RichEdit: TRichEdit; AColor: TColor);
var
  Format: TCHARFORMAT2;
begin
  FillChar(Format, SizeOf(Format), 0);
  with Format do
  begin
    cbSize := SizeOf(Format);
    dwMask := CFM_BACKCOLOR;
    crBackColor := AColor;
    RichEdit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
  end;
end;

procedure RichFormat(const aRichEdit: TRichEdit);
var
  SearchStartPos, SearchLength: Integer;
  P1, P2, PE: Integer;
  P_, C_: Integer;
  sFormat: string;
  lSL: TStringList;
  lS: string;
  lColor: TColor;
begin
  SearchStartPos := 0;
  SearchLength := (Length(aRichEdit.Text) - SearchStartPos);
  aRichEdit.Lines.BeginUpdate;
  repeat
    sFormat := '';
    C_ := 0;
    P1 := aRichEdit.FindText('[RTF ', SearchStartPos, SearchLength, [stMatchCase]);
    if (P1 >= 0) then
    begin
      PE := aRichEdit.FindText(']', SearchStartPos, SearchLength, [stMatchCase]);
      aRichEdit.SelStart := P1;
      aRichEdit.SelLength := (PE - P1 + 1);
      sFormat := aRichEdit.SelText;
      aRichEdit.ClearSelection;
      SearchStartPos := P1;
      SearchLength := (Length(aRichEdit.Text) - SearchStartPos);
      repeat
        P2 := aRichEdit.FindText('[RTF/]', SearchStartPos, SearchLength, [stMatchCase]);
        if (P2 > P1) then
        begin
          P_ := aRichEdit.FindText('[RTF ', SearchStartPos, SearchLength, [stMatchCase]);
          if (P_ >= 0) and (P_ < P2) then
          begin
            Inc(C_);
            SearchStartPos := (P_ + 1);
            SearchLength := (Length(aRichEdit.Text) - SearchStartPos);
          end
          else
          begin
            Dec(C_);
            SearchStartPos := (P2 + 1);
            SearchLength := (Length(aRichEdit.Text) - SearchStartPos);
          end;
        end;
      until (C_ < 0);
      if (P2 > P1) then
      begin
        aRichEdit.SelStart := P2;
        aRichEdit.SelLength := (Length('[RTF/]'));
        aRichEdit.ClearSelection;
        aRichEdit.SelStart := P1;
        aRichEdit.SelLength := (P2 - P1);

        sFormat := StringReplace(sFormat, '[RTL ', '', [rfReplaceAll]);
        sFormat := StringReplace(sFormat, ']', '', [rfReplaceAll]);
        sFormat := StringReplace(sFormat, '; ', #13#10, [rfReplaceAll]);
        lSL := TStringList.Create;
        lSL.Text := sFormat;
        lS := lSL.Values['BackColor'];
        lColor := StrToInt(lS);
        FreeAndNil(lSL);

        RE_SetSelBgColor(aRichEdit, lColor);
        SearchStartPos := P1;
        SearchLength := (Length(aRichEdit.Text) - SearchStartPos);
      end
      else
        Break;
    end;
  until (P1 < 0);
  aRichEdit.Lines.EndUpdate;
end;

//

  Text := '-> [RTF FontName=Arial; FontColor=$0000ff; BackColor=$ff7777]hellblauer [RTF FontName=Arial; FontColor=$0000ff; BackColor=$7777ff]und dazwischen hellroter[RTF/] Text[RTF/]';
  RichEdit.SelText := Text;
  RichFormat(RichEdit);
Angehängte Grafiken
Dateityp: png tufo.png (248,5 KB, 30x aufgerufen)
Dateityp: png tufo2.png (29,1 KB, 17x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (20. Jan 2018 um 19:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#3

AW: Text farbig darstellen

  Alt 20. Jan 2018, 13:56
Funktioniert das auch z.B. bei 3-facher Schachtelungstiefe?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Text farbig darstellen

  Alt 20. Jan 2018, 14:16
Ja

Delphi-Quellcode:
 Text := '-> [RTF FontName=Arial; FontColor=$0000ff; BackColor=$ff7777]hellblauer [RTF FontName=Arial; FontColor=$0000ff; BackColor=$7777ff]'
    + 'und dazwischen [RTF FontName=Arial; FontColor=$0000ff; BackColor=$77ffff]gelb-[RTF/] hellroter[RTF/] [RTF FontName=Arial; FontColor=$0000ff; BackColor=$77ffff](nochmal gelb)[RTF/] Text[RTF/]';
Angehängte Grafiken
Dateityp: png tufo3.png (19,9 KB, 25x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Text farbig darstellen

  Alt 20. Jan 2018, 14:29
Wie Fukiszo schon sagte, würde auch ich das lieber über HTML/CSS lösen. Damit bist einfach flexibler.

Leerzeichen kannst du einfach mit &nbsp; ersetzen. Zeilenumbrüche einfach mit einem <br/> und jut.

Außerdem hättes du die Möglichkeit (spätere Erweiterung), das du über CSS-Klassen das ganze von "Außen" beinflussen kannst, ohne den Code anzufassen.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#6

AW: Text farbig darstellen

  Alt 20. Jan 2018, 14:37
Also ich hatte die aufgabe doch falsch verstanden.
Ich dacht dein endresultat soll deine "Text:=" konstante werden und nicht andersrum.
Also das Text reinkommt und du auf bestimmte wörter/symbole reagiesrt um sie zu färben. (wie SynEdit o.ä.)

Aber solange du happy bist bin ich es auch
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Text farbig darstellen

  Alt 20. Jan 2018, 14:50
Ach so, dann hatte ich falsch verstanden, dass Du mich richtig verstanden hattest.

So bin ich jetzt sehr zufrieden mit dem Ergebnis.

HTML wäre auch gegangen, aber so ist es für mich übersichtlicher.
Ich kann selbst benötigte Tags definieren und dann die entsprechenden Abschnitte über das RichEdit formatieren lassen (oder entsprechend in anderen Szenarien in anderer Form).

Keine Ahnung, warum RTF so kompliziert gestaltet ist. Das erscheint mir unnötig unübersichtlich.
Aber wenn das das alles intern im RichEdit abgewickelt wird, kann es mir egal sein.

Eine HTML-Datei mit Formatierungen zu erzeugen ist relativ einfach möglich, aber eine RTF erscheint mir zu komplex dafür.

Für mich passt es jetzt so super und der Aufwand ist ja auch nicht so hoch gewesen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Text farbig darstellen

  Alt 20. Jan 2018, 18:39
RTF manuell ist nicht unbedingt empfehlenswert, aber wie bei HTML/DOC/usw. kann man auch Komponenten verwenden, welche als Schnittstelle dienen.

z.B. ganz billig ein TRichEdit, darüber den Text formatieren und dann den RTF-Code auslesen,
oder ein DOM wie bei JSON/XML/HTML, um darüber den HTML-Code zu generieren.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (20. Jan 2018 um 18:44 Uhr)
  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 09:06 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