Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   BBCode-Parser für TRichEdit (https://www.delphipraxis.net/126859-bbcode-parser-fuer-trichedit.html)

Codewalker 3. Jan 2009 18:20


BBCode-Parser für TRichEdit
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen.

Ich möchte hier gerne eine kleine Unit/Bibliothek/Klassemsammlung vorstellen, die im Rahmen eines Projektes entstanden ist. Hintergrund war, dass für ein Tool ein vernünftiges Logbuch mit Formatierung implementiert werden sollte. Wer sich schonmal mit TRichEdit und Formatierungen rumgeschlagen hat, wird wissen wie nervtötend das sein kann. Bei einem Glas Wein und der Idee, den einfach BBCode dafür nutzen zu wollen ist dann mein BBCodeToRichEdit entstanden.

Das ganze Funktioniert so:
Für jeden BBCode entwickelt man eine kleine Klasse. Aufwand sind ~ 20 Zeilen, von denen aber ~15 per Copy&Paste übernommen werden können. Eigene BBCodes sind so in wenigen Minuten umgesetzt. Ich habe die Klassen mittlerweile ein gutes Stück weiterentwickelt und so viele Formatierungen wie ich gefunden habe implementiert. Da das alles bisher auf der JVCL aufsetzt (die meisten Formatierungen bringt das normale TRichEdit nicht direkt mit), muss außerdem die JVCL installiert sein. Für alle, die keine JVCL nutzen möchten sei auf Beitrag #14 von himitus verwiesen.

Letzte Änderungen:
  • Generics werden nur noch verwendet, wenn Delphi 2009 zur Verfügung steht, ansonsten wird eine TObjectList verwendet
  • Verschachtelte Tags und Tags mit gleichen Anfängen funktionieren jetzt auch korrekt
  • Deutlich mehr Tags werden unterstützt
  • Beispielprogramm erweitert
  • Einfache Tags ohne CloseTag werden jetzt auch unterstützt

Was noch fehlt:
  • Andere Arten von Aufzählungen
  • Gliederungsebenen bei Aufzählungen
  • Einbinden von Grafiken
  • Tabellen
  • neue, vollständige Dokumentation

Bin wie immer auf Meinungen und Kommentare gespannt.

Grüße

arne99 16. Jan 2009 08:52

Re: BBCode-Parser für TRichEdit
 
Finde ich super, ich möchte es nutzen um eine Abwandlung von BB vorzunehmen, denn es gibt schon andere Standards für best. Seiten die ich dann implementiere, ich zeige wenns fertig ist. Danke!

Codewalker 11. Jun 2009 13:32

Re: BBCode-Parser für TRichEdit
 
Habe die Bibliothek nochmal komplett überarbeitet und ein paar alte Einschränkungen entfernt. Außerdem sind jetzt etliche mehr Formatierungen möglich und in BBCodes implementiert. Würde mich über Feedback sehr freuen

danu1104 21. Apr 2010 06:26

Re: BBCode-Parser für TRichEdit
 
Ich bekomme immer diesen Error: "[DCC Fehler] LibBB.pas(17): F1026 Datei nicht gefunden: 'Contrns.dcu'" mit Delphi 2007

Kann mir da jemand helfen woran das liegt?

s.h.a.r.k 21. Apr 2010 06:32

Re: BBCode-Parser für TRichEdit
 
Probier mal die Unit Contnrs in ein nacktes Projekt einzubinden und zu compilieren. Wenn es nicht klappen sollte, dann hat D2007 scheinbar diese Unit nicht :gruebel:

danu1104 21. Apr 2010 06:37

Re: BBCode-Parser für TRichEdit
 
Delphi sagt aber das die unit bereits in rtl vorhanden ist.

Edit:

Ok mit der unit war wohl ein schreibfehler vom Autor:

Ich bekomme aber jetzt andere Fehler:

Delphi-Quellcode:

[DCC Fehler] LibBB.pas(82): E2003 Undefinierter Bezeichner: 'TKlasse'
[DCC Fehler] LibBB.pas(97): E2003 Undefinierter Bezeichner: 'TCustomBBCode'
[DCC Fehler] LibBB.pas(112): E2003 Undefinierter Bezeichner: 'TCustomBBCode'
[DCC Fehler] Unit1.pas(8): F2063 Verwendete Unit 'LibBB.pas' kann nicht compiliert werden

himitsu 21. Apr 2010 06:41

Re: BBCode-Parser für TRichEdit
 
Contrns wird in D2010 auch nicht physisch gefunden, wobei sie bei Delphi 7 und 2006 ebenfalls nicht existiert. :shock:

Kommentiere die Unit einfach mal aus und schau was (Funktionen, Konstanten und So.) nun nicht gefunden werden.

danu1104 21. Apr 2010 06:43

Re: BBCode-Parser für TRichEdit
 
TObjectList wird dann nicht gefunden

Delphi-Quellcode:
[DCC Fehler] LibBB.pas(55): E2003 Undefinierter Bezeichner: 'TObjectList'
[DCC Fehler] LibBB.pas(55): E2021 Klassentyp erwartet

himitsu 21. Apr 2010 06:48

Re: BBCode-Parser für TRichEdit
 
Joar, das Copy&Paste Contrns wurde hier natürlich wirklich nicht gefunden. :angel2:

Contrns
Contnrs

Ist aber auch ein seltendemlischer und unaussprächlicher Name.
Ich weiß nichmal ob man den mit ein bissl Groß-/Kleinschreibung aussprechbarer machen könnte,
so wie z.B. bei
Sysutils > SysUtils
Designintf > DesignIntf

Ich denk mir mal, das soll womöglich die mißlungenste Abkürzung für Containers darstellen. :gruebel:

danu1104 21. Apr 2010 06:53

Re: BBCode-Parser für TRichEdit
 
Zitat:

Zitat von himitsu
Joar, das Copy&Paste Contrns wurde natürlich wirklich nicht gefunden. :angel2:

Contrns
Contnrs

Naja ich habe mir ja nur die Libs runtergeladen und dachte es funktioniert sofort ^^
Aber auch wenn ich es richtig hinschreibe kommen andere weitere fehler :confused:

bin ich evtl zu unfähig um units einzubinden ^^

s.h.a.r.k 21. Apr 2010 06:56

Re: BBCode-Parser für TRichEdit
 
Ohne genaue Angaben kann dir keiner helfen. Wir können im Moment nur raten...

// edit

Zitat:

Zitat von himitsu
Ich denk mir mal, das soll womöglich die mißlungenste Abkürzung für Containers darstellen. Grübelnd...

Diese Abkürzung ist nicht dein Ernst?! :cyclops: Hab mich bisher immer gefragt, warum diese so heißt...

danu1104 21. Apr 2010 07:02

Re: BBCode-Parser für TRichEdit
 
Zitat:

Zitat von s.h.a.r.k
Ohne genaue Angaben kann dir keiner helfen. Wir können im Moment nur raten...

// edit

Zitat:

Zitat von himitsu
Ich denk mir mal, das soll womöglich die mißlungenste Abkürzung für Containers darstellen. Grübelnd...

Diese Abkürzung ist nicht dein Ernst?! :cyclops: Hab mich bisher immer gefragt, warum diese so heißt...


Ich habe die units Runtergeladen und wie in der Demo eingebunden, dazu habe ich mir ganz einfach die Main.pas angeschaut da ich das Project nicht öffnen kann (warum auch immer)


So wie du bereits in den Anderen Posts entnehmen kannst habe ich die Unit nun geändert und bekomme nicht mehr den fehler wie o.g.
So, jetzt bekomme ich aber andere Fehler und zwar:


[delphi][DCC Fehler] LibBB.pas(82): E2003 Undefinierter Bezeichner: 'TKlasse'
[DCC Fehler] LibBB.pas(97): E2003 Undefinierter Bezeichner: 'TCustomBBCode'
[DCC Fehler] LibBB.pas(112): E2003 Undefinierter Bezeichner: 'TCustomBBCode'
[DCC Fehler] Unit1.pas(8): F2063 Verwendete Unit 'LibBB.pas' kann nicht compiliert werden[/delphi

Codewalker 21. Apr 2010 07:11

Re: BBCode-Parser für TRichEdit
 
klingt alles sehr merkwürdig. Ich schaue mir das heute nachmittag an, vorher werde ich da leider nicht zu kommen.

himitsu 21. Apr 2010 07:13

Re: BBCode-Parser für TRichEdit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, hier hat einer vergessen zu sagen, daß hierfür die JEDI installiert sein muß, da vieles auf das TJvRichEdit ausgelegt wurde und nicht nur, wie erwähnt auf das TRichEdit.

Außerdem hat derjenige wohl auch nicht die Codeteile für die Abwärtskompatibilität getestet.


Hier mal die Codes ohne TJvRichEdit.
Einige BBCodes, z.B. für die speziellen Unterstreichungen und die Hintergrundfarbe konnte ich jetzt nicht übersetzen und hab sie weggelassen.


Zitat:

Zitat von s.h.a.r.k
Diese Abkürzung ist nicht dein Ernst?! :cyclops: Hab mich bisher immer gefragt, warum diese so heißt...

TObjectList ist zumindestens ein Container für Objekte und diese Unit ist voll mit sowas ... also das wäre schon eine gute Erklärung. :angel2:

Matze 21. Apr 2010 07:15

Re: BBCode-Parser für TRichEdit
 
Ne, ich erhalte die gleichen Fehler.

Wenn ich das so ändere, parst es bei mir BBCodes. Ob die Verschachtelung etc. noch funktioniert, kann ich dir aber nicht sagen. :stupid:

Original-Code:
Delphi-Quellcode:
Result := TKlasse(inherited Items[Index]); // LibBB.pas, Zeile 82
Result := inherited TCustomBBCode(First()); // LibBB.pas, Zeile 97
Result := inherited TCustomBBCode(Last()); // LibBB.pas, Zeile 112
Die Änderungen:
Delphi-Quellcode:
Result := TCustomBBCode(inherited Items[Index]); // LibBB.pas, Zeile 82
Result := TCustomBBCode(First()); // LibBB.pas, Zeile 97
Result := TCustomBBCode(Last()); // LibBB.pas, Zeile 112
Woher "TKlasse" kommt, weiß ich auch nicht.

Edit: Ok meinen Beitrag dürft ihr nun ignorieren. Der von himi ist sicher inhaltlich besser. *g*

himitsu 21. Apr 2010 07:19

Re: BBCode-Parser für TRichEdit
 
Wenn ich mich noch recht erinner, dann hab ich es so geändert. :-D
Delphi-Quellcode:
Result := TCustomBBCode(inherited Items[Index]); // LibBB.pas, Zeile 82
Result := TCustomBBCode(inherited First()); // LibBB.pas, Zeile 97
Result := TCustomBBCode(inherited Last()); // LibBB.pas, Zeile 112

danu1104 21. Apr 2010 07:29

Re: BBCode-Parser für TRichEdit
 
Mit JEDI wird doch JCL / JVCL gemeint oder ? Wenn ja das ist eigentlich das erste was ich installieren für delphi :)

Der geändete code geht auch von dir mir fehlt nur das [ b ] [ /b ] :/

Edit:

Mein fehler, habe es vergessen dabei zu schreiben! Danke @all functioniert wunderbar!

Delphi-Quellcode:
 BBCodes := GenerateStdBBCodes([bbBold,bbFontColor]);

himitsu 21. Apr 2010 07:41

Re: BBCode-Parser für TRichEdit
 
Ja, JEDI = JCL (JEDI Code Library) und JVCL (JEDI Visual Code Library)

Zitat:

Zitat von danu1104
Der geändete code geht auch von dir mir fehlt nur das [ b ] [ /b ] :/

Edit:

Mein fehler, habe es vergessen dabei zu schreiben! Danke @all functioniert wunderbar!

Delphi-Quellcode:
 BBCodes := GenerateStdBBCodes([bbBold,bbFontColor]);

Es fehlt "nur" das Superset, Einiges vom Underline (Style und Color) und die Backgroundcolor.


@Codewalker:
Wenn du keinen alten Compiler hast, dann ändere einfach mal die Deklarationen von {$IFDEF VER120} z.B. in {$IFDEF VER120xx}, solange du es testest, dann werden auch in deinem neuen Delphi die alten Codes zumindestens auf die "Rechtschreibung" getestet.

Und vielleicht ist es nicht schlecht, wenn in die Units sowas wie {$DEFINE UseJEDI} {$IFDEF UseJEDI} aufgenommen wird, womit der Code dann für das TJyRichEdit und etwas abgespeckt auch für's TRichEdit liefe.

PS: {$IFDEF VER120] ist nicht so praktisch, dann in Delphi 2010 (VER140) würden keine Generics verwendet. :zwinker:
Nimm besser dieses,
Delphi-Quellcode:
{$IF CompilerVersion >= 12} {$IFEND}
oder verwende wenigstens die Versions-.INC, welche den JEDI doch irgendwo beiliegt, da gibt es sowas wie {$IFDEF Delphi2009Up} oder wie es da heißt.

danu1104 21. Apr 2010 09:31

Re: BBCode-Parser für TRichEdit
 
Kleiner verbesserungs vorschlag:

Delphi-Quellcode:
RichEdit.SelAttributes.Color := StringToColor('cl'+Data.DynamicValue);
statt dieses:

Delphi-Quellcode:
RichEdit.SelAttributes.Color := StringToColor(Data.DynamicValue);
{Hier meckert er wenn ich nur [ COLOR=red ] schreibe}
da sonst [ COLOR=clred ] statt [ COLOR=red ] steht, und nicht viele foren was damit anfangen können. Aber ansonsten ein fettes Lob.

himitsu 21. Apr 2010 09:52

Re: BBCode-Parser für TRichEdit
 
Wenn, dann bitte diese Funktion verwenden.
Delphi-Quellcode:
function MyStringToColor(const S: string): TColor;
var
  LColor: LongInt;
begin
  if IdentToColor('cl' + S, LColor) or IdentToColor(S, LColor) then
    Result := TColor(LColor)
  else
    Result := TColor(StrToInt(S));
end;
Denn sonst kann man nur noch die Farbkonstanten und keine direkten Farbwerte (aka [color=$0000FF] ) mehr verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz