AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte BBCode-Parser für TRichEdit

BBCode-Parser für TRichEdit

Ein Thema von Codewalker · begonnen am 3. Jan 2009 · letzter Beitrag vom 21. Apr 2010
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von Codewalker
Codewalker
Registriert seit: 18. Nov 2005
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
Angehängte Dateien
Dateityp: zip libbb_109.zip (11,1 KB, 86x aufgerufen)
Dateityp: exe demo_175.exe (707,0 KB, 79x aufgerufen)
 
Benutzerbild von s.h.a.r.k
s.h.a.r.k
 
#11
  Alt 21. Apr 2010, 06:56
Ohne genaue Angaben kann dir keiner helfen. Wir können im Moment nur raten...

// edit

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?! Hab mich bisher immer gefragt, warum diese so heißt...
  Mit Zitat antworten Zitat
danu1104

 
Delphi 2006 Personal
 
#12
  Alt 21. Apr 2010, 07:02
Zitat von s.h.a.r.k:
Ohne genaue Angaben kann dir keiner helfen. Wir können im Moment nur raten...

// edit

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?! 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
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

 
Delphi XE2 Professional
 
#13
  Alt 21. Apr 2010, 07:11
klingt alles sehr merkwürdig. Ich schaue mir das heute nachmittag an, vorher werde ich da leider nicht zu kommen.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#14
  Alt 21. Apr 2010, 07:13
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 von s.h.a.r.k:
Diese Abkürzung ist nicht dein Ernst?! 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.
Angehängte Dateien
Dateityp: zip libbb_withoutjedi_975.zip (6,6 KB, 23x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze

 
Turbo Delphi für Win32
 
#15
  Alt 21. Apr 2010, 07:15
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.

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*
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#16
  Alt 21. Apr 2010, 07:19
Wenn ich mich noch recht erinner, dann hab ich es so geändert.
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
  Mit Zitat antworten Zitat
danu1104

 
Delphi 2006 Personal
 
#17
  Alt 21. Apr 2010, 07:29
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!

 BBCodes := GenerateStdBBCodes([bbBold,bbFontColor]);
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#18
  Alt 21. Apr 2010, 07:41
Ja, JEDI = JCL (JEDI Code Library) und JVCL (JEDI Visual Code Library)

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!

 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.
Nimm besser dieses,
{$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.
  Mit Zitat antworten Zitat
danu1104

 
Delphi 2006 Personal
 
#19
  Alt 21. Apr 2010, 09:31
Kleiner verbesserungs vorschlag:

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.
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#20
  Alt 21. Apr 2010, 09:52
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:50 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