Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Gedankenaustausch zu WYSIWYG RTF Control (https://www.delphipraxis.net/200069-gedankenaustausch-zu-wysiwyg-rtf-control.html)

hansklok 16. Mär 2019 10:20

Gedankenaustausch zu WYSIWYG RTF Control
 
Hallo alle miteinander,

ich habe erfolgreich eine Unit zur Erstellung und Ausgabe (in verschiedene Formate DOCX, ODT, RTF etc.) von formatierten Text erstellt. Nun möchte ich einen Schritt weitergehen und ein Control erstellen, welches die grafische Ein-/Ausgabe von formatierten Texten (Texte, Tabellen, Bilder) ermöglicht. Ich möchte auf keine fertige Variante (RichEdit, TextControl etc.) zurückgreifen, sondern selber so etwas erstellen.
Die feine grafische Ausgabe sollte nicht das Problem sein, worüber ich mich mit euch gern austauschen möchte ist, wie man die Mauskolrdinaten dem jeweiligen Buchstaben/Auswahl zuordnen kann. Es geht also um die Mausinteraktion. Gibt es dazu irgendwelche Konzepte? Wenn man ganz simpel erst einmal mit einem Viewer startet, dann wird die Anzeige des Dokuments so ausschauen!

1. Dokument mit Block Array (Ein Block kann ein Absatz oder eine Tabelle sein)
2. Items eines Blocks in Zeilen organisieren (Zeilenumbrüche)
3. Höhe jedes Blocks auf Basis seiner Items ermitteln, daraus ergeben sich auch die Koordinaten des folgenden Blocks

Das sollte für die optische Ausgabe reichen. Und wie würdest ihr nun zum matchen vorgehen? Den aktuellen Block und das Item unter der Maus kann man ziemlich simpel auslesen. Aber wie geht’s weiter, beispielsweise bei einem Text Item (StyleRun), mit dem Text „Hallo“ wo die Maus über dem ersten „l“ steht? Wie kann man das matchen?

Freue mich über Anregungen.

peterbelow 16. Mär 2019 11:45

AW: Gedankenaustausch zu WYSIWYG RTF Control
 
Oh weh, da hast Du dir aber was vorgenommen...

Für ein echtes WYSIWYG-Control mit Text etc. in beliebigen Fonts und Größen muss man gemeinhin die Ausgabe vollständig in einem high-resolution mapping mode (MM_TWIPS oder MM_HIMETRIC) machen und jedes Zeichen einzeln plazieren. Sieh Dir mal API-Funktionen wie GetCharABCWidths et al. an:

https://docs.microsoft.com/en-us/win...text-functions

Steku 16. Mär 2019 13:43

AW: Gedankenaustausch zu WYSIWYG RTF Control
 
Oder mal hier "spicken"...TRichView (freeware) v.0.5.2...

Author bei Torry: https://torry.net/authorsmore.php?id=968

Zip-Download: https://torry.net/vcl/edits/rich/richview.zip

Grüße
Steku

Ydobon 16. Mär 2019 18:50

AW: Gedankenaustausch zu WYSIWYG RTF Control
 
Oder schlicht WebBrowser im designMode.

mimi 16. Mär 2019 23:21

AW: Gedankenaustausch zu WYSIWYG RTF Control
 
Mit diesem Thema befasse ich mich schon seit 2007 ungefähr.
Immer wieder holt mich das Thema ein. Es kommt auf deine Interne Struktur an.

In laufe der Zeit habe ich ein Konzept entwickelt, was allerdings recht aufwendig ist. Es gibt zunächst einen Statischen Teil und dann gibt es einen Dynamischen Teil.

Das ist wichtig. Denn die Schrift/Schriftgröße beeinflusst die Anzahl der Wörter die pro Zeile angezeigt werden können. Dabei spielt es keine Rolle, die Breite vom Fenster oder von einer DIN A4 Seite anhängt. Du hast immer ein Automatischen Zeilenumbruch. Bei mir ist das Wortweise.
Dann hast du e

Spannend wird es beim Dynamischen Teil, der wird jedes mal komplett neu berechnet. Bei jeder Größen Änderung vom Fenster(Das wird etwas einfacher bei einem reinen Editor)

Der Dynamische Teile besteht aus eine Line/LineItem Struktur.
Alles wird als Box betrachtet, jede Box kann nur eine Formatierung Anzeigen.

Um deine Frage zu beantworten, hole ich soweit aus.

Wenn die LineItems Struktur Zentral ist, ist deine Frage leicht zu beantworten:

Wenn du mit der Maus z.b. irgendwo hinklickst müssen in meinem Fall folgende Schritte ausgeführt werden(Grob geschrieben):
1. Welche LineItem wurde angeklickt?
2. Dann muss die Pixel breite von jedes Zeichen Einzeln berechnet werden.
3. Die Maus Position ist ja, die Klick Position von deiner "Komponente",
d.h. die Pixelbreite, pro Zeichen muss Zusammen Addiert werden und Relativ zur Box berechnet werden.
Die Box speichert(ist einfacher) die X Position sowie die Y Position.
Das Zusammenaddieren wird so lange gemacht, bis die Position größer oder gleich der Maus Position ist.

Wenn du eine Editor Komponente schreibst, wo jedes Zeichen gleich Groß ist, ist es einfach, dann kann man es berechnen.

Das Thema ist nicht ganz leicht.

Ghostwalker 18. Mär 2019 03:45

AW: Gedankenaustausch zu WYSIWYG RTF Control
 
So als erster Ansatz:

Bei der Ausgabe würd ich für jeden Block die linke obere Ecker und die rechte untere Ecke als Koordinaten speichern. Damit kannst du dann einfach prüfen, ob die Maus Koordinaten innerhalb eines dieser Blöcke ist.


Gruß

Ghostwalker


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