AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Gedankenaustausch zu WYSIWYG RTF Control
Thema durchsuchen
Ansicht
Themen-Optionen

Gedankenaustausch zu WYSIWYG RTF Control

Ein Thema von hansklok · begonnen am 16. Mär 2019 · letzter Beitrag vom 18. Mär 2019
Antwort Antwort
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#1

Gedankenaustausch zu WYSIWYG RTF Control

  Alt 16. Mär 2019, 11:20
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.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#2

AW: Gedankenaustausch zu WYSIWYG RTF Control

  Alt 16. Mär 2019, 12:45
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
Peter Below
  Mit Zitat antworten Zitat
Steku

Registriert seit: 12. Mai 2008
184 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Gedankenaustausch zu WYSIWYG RTF Control

  Alt 16. Mär 2019, 14:43
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
  Mit Zitat antworten Zitat
Ydobon

Registriert seit: 3. Mär 2006
264 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Gedankenaustausch zu WYSIWYG RTF Control

  Alt 16. Mär 2019, 19:50
Oder schlicht WebBrowser im designMode.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Gedankenaustausch zu WYSIWYG RTF Control

  Alt 17. Mär 2019, 00:21
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Ghostwalker

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

AW: Gedankenaustausch zu WYSIWYG RTF Control

  Alt 18. Mär 2019, 04:45
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
Uwe
e=mc² or energy = milk * coffee²
  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 18:31 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