Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   TRtfLabel - Label zur Darstellung von RTF (https://www.delphipraxis.net/66569-trtflabel-label-zur-darstellung-von-rtf.html)

Flocke 31. Mär 2006 15:15


TRtfLabel - Label zur Darstellung von RTF
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ein paar von euch haben ja schon mitbekommen, dass ich seit einiger Zeit an einem aufgebohrten RichEdit-Control arbeite. Hier schon mal ein Ergebnis vorab:

TRtfLabel

Ein Label zur Darstellung von RTF-Text.
Das Ding
  • kann alle Features von RichEdit 3.0 bzw. 4.1 darstellen
  • kann in das RTF eingebettete Bilder und OLE-Objekte darstellen
  • unterstützt einen transparenten Hintergrund
  • kann von 2% bis 6400% zoomen (update 1.3)
  • kann seine Größe automatisch an den Inhalt anpassen
  • hat kein Fensterhandle, ist also ein Nachfahr von "TControl"
  • bietet keine Editier-Funktionalität, es dient ausschließlich der Anzeige
  • bietet über die ITextDocument-Schnittstelle die Möglichkeit, den Inhalt programmiert zu verändern (update)
Hier findet ihr Screenshots einer der Beispielanwendung (75 KiB) - man sieht oben den RTF-Quelltext, der an "Caption" zuweisen wurde, und unten das Ergebnis.

Auch ganz einfacher RTF-Quelltext ist möglich.
Der Text "{\rtf1{Hier ist \b ein\b0 \ul Wort\ul0 unterstrichen.}}" ergibt "Hier ist ein Wort unterstrichen."

Zusätzlich gibt's noch eine Unit mit der Funktion DrawRtfText, mit der man formatierten Text in einen Canvas ausgeben kann (ähnlich wie DrawText). (update 1.3)

Internes

Im Paket mit drin sind auch die aktuellen Übersetzungen der RichEdit-API-Header richedit.h (inkl. Korrekturen und Erweiterungen), richole.h, TOM.h, TextServ.h. Außerdem noch ein allgemeiner Wrapper für Interfaces von "thiscall" nach "stdcall" und zurück sowie eine rudimentäre Delphi-Implementierung von ITextHost.

Das war eigentlich der größte Teil der Arbeit - sieht man auch sofort daran, dass RtfLabel.pas selbst nur etwa 600 650 720 Zeilen hat :???:.

Testen / Installieren

Das Verzeichnis mit den Projektdateien (nicht den Beispielanwendungen) müsst ihr in euren Suchpfad Bibliothekspfad aufnehmen.

Danach könnt ihr die Beispielanwendungen direkt übersetzen (Win32), da die Komponente dynamisch erzeugt wird.

Für die Installation sucht einfach ein Package eurer Wahl und fügt "RtfLabel.pas" hinzu (dann Installieren bzw. Aktualisieren). Zusätzlich könnt ihr die Datei "RtfLabel_Caption_Editor.pas" einem Entwurfszeitpackage hinzufügen - dann habt ihr einen Editor für die Eigenschaft Caption. (update 1.3)


Zur Installation öffnet ihr einfach das Package "RtfLabel_D#.dpk" für eure Delphi-Version und installiert dies. Für Delphi-Versionen ab 7 ist dies immer dasselbe Package (da sich darin nichts geändert hat). (update 1.3c)

Für Delphi 3 müsst ihr vorher in den drei Dateien "RichEdit2.pas", "RichOle.pas" und "TextServ.pas" noch den Text "{$EXTERNALSYM" durch "//{$EXTERNALSYM" ersetzen, da Delphi 3 dieses Feature noch nicht unterstützt.

Zusätzlich könnt ihr noch das Package "RtfLabel_D#D.dpk" installieren (derselbe Name nur mit einem "D" am Ende), dann habt ihr einen Editor für die Eigenschaft "Caption". (update 1.3b)

Ich freue mich auf eure Kommentare, Anmerkungen und Anregungen.

P.S.: bitte keine Anfragen nach der Editierfunktionalität - das "große" TRichEdit3 ist noch in Arbeit und wird all das unterstützen.

14.04.2006: Update auf die Version 1.1
  • Kleinen Bug korrigiert, der bei gleichzeitiger Benutzung von WordWrap und AutoSize mit Texten, die nach rechts ausgerichtete Absätze enthielten zu einer Endlosschleife führte.
  • Diverse kosmetische Korrekturen.

19.08.2006: Update auf die Version 1.3
  • Bug bei der Darstellung von Bildern/Objekten auf älteren Systemen bereinigt
  • Zooming eingebaut
  • Funktion "DrawRtfText" eingebaut
  • Property-Editor für TRtfEdit.Caption

27.02.2007: Update auf die Version 1.3b
  • Parametertypen von "DrawRichText" geändert.
  • Support für Delphi 3, 5 und 6 hinzugefügt, für Delphi 3 nochmal Dank an Lannes für seine Vorarbeit.
    Delphi 3 benötigt einen kleinen manuellen Eingriff (die $EXTERNALSYM-Dinger müssen in drei Dateien mit "Suchen und Ersetzen" geändert werden), läuft dann aber ohne Schwierigkeiten.
  • Packages für die einfache Installation hinzugefügt.

01.03.2007: Update auf die Version 1.3c
  • Jetzt mit vollständigem Support für Delphi 3 und 4, es sollte jetzt also mit allen Version ab Delphi 3 funktionieren

Flocke 14. Apr 2006 10:34

Re: TRtfLabel - Label zur Darstellung von RTF
 
Update auf die Version 1.1 (siehe oben).

Flocke 19. Aug 2006 01:45

Re: TRtfLabel - Label zur Darstellung von RTF
 
Update auf die Version 1.3 (siehe oben).

Andreas L. 19. Aug 2006 07:35

Re: TRtfLabel - Label zur Darstellung von RTF
 
Hi,
ist es auch möglich einen Link anzeigen zu lassen? Am besten wäre es wenn jeder Link automatisch eine ID bekommt und man dann auch Events zu weisen kann. Bsp.: Der User klickt Link mit ID1 dann soll form2.show; ausgeführt werden. Das wäre richtig geil. Geht sowas irgendwie?

Die Anweisung im RTF könnte ja so aussehen:
Code:
{\rtf1{Hier ist \b ein\b0 \ul Wort\ul0 \link unterstrichen\link0 und noch ein \link Link\link1.}}
Da sind dann die IDs hardcoded, wäre auch ne Möglichkeit.

Bernhard Geyer 19. Aug 2006 08:09

Re: TRtfLabel - Label zur Darstellung von RTF
 
Ich habe jetzt noch nicht reingeschaut, aber kann die Komponente ein Unicode-Interface und arbeitet damit mit intern mit Widestrings?

Flocke 19. Aug 2006 10:22

Re: TRtfLabel - Label zur Darstellung von RTF
 
@onlinehome:

Das wäre eigentlich mehr, als für was diese Komponente gedacht war. Im Moment reiche ich überhaupt keine Meldungen an die ITextServices-Schnittstelle weiter, so dass die überhaupt nicht mitbekommen würde, dass ein Link geklickt wurde. Evtl. geht es aber sehr einfach (du würdest dann im Event keine ID sondern die URL übergeben bekommen, das wäre dir aber bestimmt auch recht, oder?).

@Bernhard Geyer:

Die Komponente nutzt intern die Interfaces, die auch der RichEdit-Fensterklasse das Leben einhauchen und die Microsoft gemeinhin als MSDN-Library durchsuchenWindowless Rich Edit Controls bezeichnet: MSDN-Library durchsuchenITextServices, MSDN-Library durchsuchenIRichEditOle und MSDN-Library durchsuchenITextDocument - halt einfach eben ohne die eigentliche Fensterklasse selbst. Intern arbeiten die mit Unicode, auf älteren Systemen halt mit MSLU.

Ich habe keine speziellen Properties und/oder Methoden für Unicode hinzugefügt, weil in der Eigenschaft "Caption" RTF-Text steht. RTF selbst wird ja normalerweise in 1-Byte-Zeichensätzen codiert und für Unicode-Zeichen muss man dann halt "\u<code>" angeben. Es wäre aber ein leichtes dies nachzuholen (über ITextServices.TxSendMessage / EM_SETTEXTEX und EM_GETTEXTEX), was stellst du dir denn da vor?

Andreas L. 19. Aug 2006 10:29

Re: TRtfLabel - Label zur Darstellung von RTF
 
Zitat:

Zitat von Flocke
@onlinehome:

Das wäre eigentlich mehr, als für was diese Komponente gedacht war. Im Moment reiche ich überhaupt keine Meldungen an die ITextServices-Schnittstelle weiter, so dass die überhaupt nicht mitbekommen würde, dass ein Link geklickt wurde. Evtl. geht es aber sehr einfach (du würdest dann im Event keine ID sondern die URL übergeben bekommen, das wäre dir aber bestimmt auch recht, oder?).

Url wäre auch in Ordnung. Doch eigentlich wollte ich RTFLabel als Hinweistext nehmen in dem der User auch auf einen Link klicken kann um z. B. schneller die Hilfe aufzurufen anstatt auf den entsprechenden Button zu klicken. Vllt. wirft man das Konzept mit den IDs über den Haufen und lässt jeden Link ein OnClickEvent zuweisen.

Zur Komponente, wie diese Momentan ist, kann ich nicht viel sagen. Ich werde sie erst heute Abend testen können.

winx 28. Aug 2006 14:03

Re: TRtfLabel - Label zur Darstellung von RTF
 
Ist die Komponente für D2006.net oder Win32?

Flocke 28. Aug 2006 15:29

Re: TRtfLabel - Label zur Darstellung von RTF
 
Win32!

Lannes 28. Aug 2006 22:23

Re: TRtfLabel - Label zur Darstellung von RTF
 
Hallo,

muss schon sagen, tolles Teil :thumb:

Mit ein paar Änderungen funktioniert es auch mit Delphi 3

Flocke 29. Aug 2006 07:57

Re: TRtfLabel - Label zur Darstellung von RTF
 
Zitat:

Zitat von Lannes
muss schon sagen, tolles Teil :thumb:

Danke für das Lob :mrgreen:

Zitat:

Zitat von Lannes
Mit ein paar Änderungen funktioniert es auch mit Delphi 3

Kannst du mir die Änderungen zukommen lassen? Ich habe selbst kein D3.

Lannes 29. Aug 2006 22:01

Re: TRtfLabel - Label zur Darstellung von RTF
 
Hallo,
Zitat:

Zitat von Flocke
Kannst du mir die Änderungen zukommen lassen? Ich habe selbst kein D3.

werde es noch etwas testen, könnte sein das ich irgendwelche Fehler eingebaut habe.
Dann, nach Kommentierung der Änderungen schicke ich es Dir zu.

Florian H 29. Aug 2006 23:35

Re: TRtfLabel - Label zur Darstellung von RTF
 
Zitat:

Zitat von Flocke
[...]Zusätzlich gibt's noch eine Unit mit der Funktion DrawRtfText, mit der man formatierten Text in einen Canvas ausgeben kann (ähnlich wie DrawText). (update 1.3)[...]

Mit Transparenz oder ohne?
Sprich wenn da drunter schon ein Bild ist und ich da draufzeichne.. ist dann da n weißer Balken unter dem Text oder hübscherweise nur der Text (ggf. sogar mit Alphachannel-Transparenz drübergezeichnet -> weiche Kanten)?

Flocke 30. Aug 2006 07:03

Re: TRtfLabel - Label zur Darstellung von RTF
 
Zitat:

Zitat von Florian H
Mit Transparenz oder ohne?

Transparent natürlich (bis auf die Stellen wo explizit eine Hintergrundfarbe angegeben wird). Weichzeichnen kann das Ding aber nicht, es ist eher ein direkter DrawText-Ersatz für formatierten Text.

Florian H 4. Sep 2006 11:59

Re: TRtfLabel - Label zur Darstellung von RTF
 
Ich bin leicht verwirrt, "TTextFormat" ist nicht definiert beim Versuch, die TDrawRTFText-Unit zu verwenden... es gibt ja ein TTextFormat bei den CLX TTextBrowsern bzw den CLX-RTF-Units, aber die sehen TTextFormat nicht als Set, also ist da wohl auch ein anderes gemeint?
Was tu ich jetzt, damit es funktioniert?

EDIT: naja, ok, in der readme steht, sie wird in der graphics.pas deklariert... wird sie aber net bei mir?

EDIT2: Hm, ok, Delphi6 kennt das offenbar noch nicht.. hab ich trotzdem ne Chance, das zum Laufen zu bekommen, d.h. kann man die Deklaration von TTextformat irgendwie irgendwo rauskopieren aus ner Delphi-Version >7 ?
Kann mir diese deklaration vielleicht jemand kopieren bitte?

EDIT3: OK, war nicht wirklich schwer wohl.. hab mir selber eine gebastelt, danke.. nun nur noch zum Laufen bringen

EDIT4: Na super, ich habs.. damit verliert dieses Posting völlig seinen sinn, aber okay^^

Flocke 4. Sep 2006 13:06

Re: TRtfLabel - Label zur Darstellung von RTF
 
Sorry, bin heute nicht oft online, da ich viel zu tun habe.

Ich hab' alles nur bis runter auf Delphi 7 getestet. In der nächsten Version werden die Konstanten mit drin sein und mit Hilfe von Lannes dann auch bis D3 runter kompatibel.

Flocke 27. Feb 2007 15:56

Re: TRtfLabel - Label zur Darstellung von RTF
 
Update auf die Version 1.3b (siehe ganz oben).

Flocke 1. Mär 2007 11:16

Re: TRtfLabel - Label zur Darstellung von RTF
 
Update auf die Version 1.3c (siehe ganz oben).

Sorry für das Update-Flooding :???:

ThYpHoOn 20. Jan 2011 11:34

AW: TRtfLabel - Label zur Darstellung von RTF
 
Hi Leute,

wollte nur kurz drauf hinweisen das es mittlerweile version 1.3d gibt:
http://flocke.vssd.de/files/rtflabel_1.3d.zip

Leider hat diese neuere Version kein DocHeight property mehr :S

mkinzler 20. Jan 2011 11:38

AW: TRtfLabel - Label zur Darstellung von RTF
 
Danke. Am Besten du ergänzt deinen 1. Beitrag entsprechend

ThYpHoOn 20. Jan 2011 12:01

AW: TRtfLabel - Label zur Darstellung von RTF
 
Zitat:

Zitat von mkinzler (Beitrag 1076061)
Danke. Am Besten du ergänzt deinen 1. Beitrag entsprechend


Ich bin nicht der ersteller der Komponente, mir ist dies nur als Benutzer der Komponente aufgefallen :) Hab Flocke aber noch eine Mail geschrieben, hoffe auf Antwort.


Greetz, ThYpHoOn

JYPDWhite 4. Feb 2011 16:28

AW: TRtfLabel - Label zur Darstellung von RTF
 
Hallo Flocke,


erstmal wollte ich sagen dass ich das RTFLabel echt super finde.
Endlich kann man mal ein Label ein bisschen Layout einhauchen. Nun zu meinem Problem.
Ich habe ein RTFLabel wo der Text rechtsbündig sein soll. Aber zur Laufzeit wird der Text Linksbündig angezeigt.
Das hier ist der Text der in dem Label drinne steht:
Code:
{\rtf1\ansi\deff0{\fonttbl{\f0\fswiss\fcharset0 Arial;}} {\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\qr\lang1031\f0\fs20 %s*10\super 3\par }

JYPDWhite 14. Jun 2017 13:58

AW: TRtfLabel - Label zur Darstellung von RTF
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hat es hier schon jemand geschafft TRtfLabel auf 64 Bit zu verwenden?
Ich probiere das gerade und bekomme immer folgende Exception:

Zitat:

Im Projekt Project5.exe ist eine Exception der Klasse $C0000005 mit der Meldung ' c0000005 ACCESS_VIOLATION' aufgetreten.
Ich habe ein Beispielprojekt im Anhang wo ich das ganze mal nicht als Komponente für die IDE installieren muss sondern einfach von TRTFLabel eine Instanz erzeuge.

Zur Sicherheit habe ich auch die TLB für die msftedit.dll neu erzeugt aus der 64 Bit Version der DLL(RichTom.pas, die alte Version ist auch im Zip mit Unterstrich am Anfang).

Hat jemand eine Idee was hier schief läuft?
Der Aufruf von TRTFLabel.Create verhält sich bei 64Bit anders als in 32 Bit (andere Funktionen werden aufgerufen), deswegen pase ich hier auch mal beide Stacktraces.
Der 64 Bit Stacktrace geht genau bis zu der Zeile bis dann die Access_Violation auftritt.

Zitat:

System._IntfClear(Pointer(nil) as IInterface)
DelphiTextServ.TTextServices.CreateEx([])
DelphiTextServ.TTextServices.Create
RtfLabel.TLabelTextServices.Create($24BA270)
RtfLabel.TCustomRtfLabel.Create($24B2C20)
Unit5.TForm5.FormCreate($24B2C20)
Vcl.Forms.TCustomForm.DoCreate
Vcl.Forms.TCustomForm.AfterConstruction
System._AfterConstruction($24B2C20)
Vcl.Forms.TCustomForm.Create($24D0DB0)
Vcl.Forms.TApplication.CreateForm(TComponentClass( $5A3CF0),(no value))
Project5.Project5
:0000000076D059CD ; C:\WINDOWS\system32\kernel32.dll
:0000000076F3A561 ; ntdll.dll
32Bit:
Zitat:

DelphiTextServ.TTextServices.TxGetPropertyBits(646 3,0)
:6b9bb324 ; C:\WINDOWS\SysWOW64\MSFTEDIT.DLL
:6b9bb220 MSFTEDIT.CreateTextServices + 0x52
DelphiTextServ.TTextServices.CreateEx([])
DelphiTextServ.TTextServices.Create
RtfLabel.TLabelTextServices.Create($1074C90)
RtfLabel.TCustomRtfLabel.Create($1075CC0)
Unit5.TForm5.FormCreate($1075CC0)
:004fec6f TCustomForm.DoCreate + $37
:004fe8b3 TCustomForm.AfterConstruction + $17
:004fe882 TCustomForm.Create + $1A6
:005092ad TApplication.CreateForm + $79
Project5.Project5
:74e5336a kernel32.BaseThreadInitThunk + 0x12
:77129902 ntdll.RtlInitializeExceptionChain + 0x63
:771298d5 ntdll.RtlInitializeExceptionChain + 0x36

JYPDWhite 29. Jun 2017 16:51

AW: TRtfLabel - Label zur Darstellung von RTF
 
Liste der Anhänge anzeigen (Anzahl: 1)
So ich möchte hier auch was zurück geben.
Ich habe es hinbekommen. Im Endeffekt musste man den ThisCallWrapper anpassen, das habe ich gelöst indem ich den in eine neue Datei für x64 ausgelagert habe. Bei den usese der anderen Units wird per Compilerdirektive entschieden welche Datei eingebunden werden soll.
Dann gab es noch ein paar Stellen wo Pointer an Windows übergeben werden diese wurden vorher in integer umgewandelt das habe ich ebenfalls geändert damit da keine Probleme auftreten sollten. Das ganze ist jetzt nicht groß getestet. Ich kann nur Sagen dass es bei mir soweit funktioniert ob es nicht noch irgendwo Probleme gibt möchte ich nicht ausschließen.

jas 18. Apr 2018 08:30

AW: TRtfLabel - Label zur Darstellung von RTF
 
Danke Flocke und JYPDWhite für die Arbeit.
Ich habe den Code auf Delphi Tokyo 32 und 64 Bit ausprobiert. Sehr schön.

Allerdings konnte ich in der Versionsauswahl im RtfLabel Example nicht auf Version 4.1 (bzw.auf MSFTEDIT.DLL) wechseln, was die Darstellung schon etwas einschränkt.

Beim Debuggen habe ich dann festgestellt, dass in RichEditDll.pas -> DllVersionNumber für die MSFTEDIT.dll die dwFileVersionMS=$A0000 ergibt.
Da nur die unteren 2 Bytes (typecast word) als VersionNumber gelesen werden, ist das Ergebnis 0 und die DLL wird nicht in der Combobox angeboten.

Wenn ich den Typecast entferne, erhalte ich zwar unsinnige Versionsnummern, kann aber die MSFTEDIT.dll auswählen und alles ist okay.

Weiß jemand, warum das so ist und wie das korrekt zu beheben ist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04: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