AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Buchstabe/Position unter Maus auslesen

Ein Thema von hansklok · begonnen am 11. Jan 2020 · letzter Beitrag vom 22. Jan 2020
Antwort Antwort
Seite 1 von 2  1 2      
hansklok

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

Buchstabe/Position unter Maus auslesen

  Alt 11. Jan 2020, 23:53
Hallo,

ich plane grade ein eigenes Control zur Darstellung und Editierung von formatierten Texten. Vorweg, ich weiß, es gibt eine Menge existierender Controls ABER ich möchte mir alleine ein solches von Grundauf entwickeln.

Ich habe zum einen die Datenstruktur für einen Absatz, der aus Zeilen besteht, aus x Zeilen besteht, die x StyleRun Objekte aufnehmen kann. Ich konvertiere die Datenstruktur in ein gerendertes Absatzobjekt und teile die StyleRuns in den einzelnen Zeilen-Objekte innerhalb der Absatzklasse auf. Die Navigation mit der Tastatur innerhalb der Zeilen und StyleRuns ist nicht das Problem. Ich suche nach Ansätzen, Herangehensweisen, Ideen, wie man den Cursor mithilfe eines Mausklicks an der entsprechenden Stelle einer Zeile setzen kann. Im Anhang findet ihr eine schematische Darstellung eines Absatz-Objektes mit einer Zeile und drei StyleRuns. Wie könnte ich nach einem Klick in StyleRun 2 das gewünschte Ergebnis (siehe Grafik) erhalten?

Vielen Dank.
Miniaturansicht angehängter Grafiken
textedit-schema.jpg  
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.446 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Buchstabe/Position unter Maus auslesen

  Alt 13. Jan 2020, 09:33
Hallo,
ich habe selber so was schon mal gemacht, ist aber schon über 20 Jahre her.
Beim "Malen" des Textes werden die Positionen gespeicehrt. Zuerst zeilenweise dann jeweils innerhalb einer Zeile.
bei der Mausposition geht man dann erst zeilenweise durch so lange bis man die die Position erreicht hat. Dann das gleiche in der Zeile. Innherhalb eines Wortes (oder so) wird dann nicht gespeichert sondern auch dann berechent.
  Mit Zitat antworten Zitat
hansklok

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

AW: Buchstabe/Position unter Maus auslesen

  Alt 13. Jan 2020, 12:54
Hallo freimatz,
genau. Ich lese die Zeile unter der Maus Position und das StyleRun darunter bereits erfolgreich aus. Sagen wir das StyleRun beginnt bei der x-Position 365, die Maus befindet sich aber bei der x-Position 420. Erinnerst Du Dich noch, wie Du dann die Position des aktuellen Buchstabens unter der Maus ermittelt hast?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Buchstabe/Position unter Maus auslesen

  Alt 13. Jan 2020, 13:20
Ich hatte das Thema eigener Controls und der Caret-Position auch schon einmal.
Du kannst mal hier schauen: https://www.delphipraxis.net/185623-...-controls.html
Dort sind auch 2 Videos verlinkt.

Ich zeichne "Controls" einfach in ein Bitmap und verwalte die gezeichneten Positionen.

Zunächst ermittle ich das Offset des betreffenden Controls und suche dann die passende X-Position, indem ich den Originaltext immer weiter verkürze und den Länge ermittle. Die Position mit der geringsten Abweichung zur Klickposition nehme ich dann.

Der Cursor selbst wird einfach als Strich in das Bild gezeichnet. Der blinkende Cursor wird durch zyklisches Neuzeichnen mit und ohne Cursorstrich erreicht.


Ich glaube nicht, dass Di der Code hilft, aber für alle Fälle füge ich ihn mal ein:


Delphi-Quellcode:
  if (fCaretCalcPos) then
  begin
    if (fCaretXPosNear > 0) then
    begin
      DX := fCaretXPosNear - ClientRect.Left;
      fCaretXPosNear := 0;
    end
    else
      DX := _MX;
    L := 0;
    R := Length(lText);
    CaretXPos := 0;
    XD := MaxInt;
    repeat
      XC := L + ((R - L) div 2);
      XP := X + aBitmap.Canvas.TextExtent(Copy(lText, 1, XC)).Width - 1;
      XD_ := Abs(DX - XP);
      if (XD_ < XD) then
      begin
        CaretXPos := XC;
        XD := XD_;
      end;
      if (DX <= XP) then
      begin
        if (R > XC) then
          R := XC
        else
          R := Pred(XC);
      end
      else
      begin
        if (L < XC) then
          L := XC
        else
          L := Succ(XC);
      end;
    until (L > R);
    fCaretCalcPos := False;
  end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Buchstabe/Position unter Maus auslesen

  Alt 13. Jan 2020, 13:20
Das kommt darauf an wie du den Text renderst. Unterschiedliche Schriftgrößen, -grade und -arten müssten berücksichtigt werden (siehe TCanvas.TextWidth, TextHeight usw.). Notfalls müsste jeder Textabschnitt mit abweichender Formatierung als eigenes Objekt gespeichert werden, das dann auch Koordinaten enthält. Dann wäre es ein einfaches PtInRect.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Buchstabe/Position unter Maus auslesen

  Alt 13. Jan 2020, 13:35
Entweder man verwaltet jeden Buchstaben als Objekt (dann könnte PtInRect reichen oder noch die Unterscheidung ober rechts oder links von der Mitte) oder jedes einheitlich formatierte Wort wird als Objekt gespeichert, dann muss man später die Länge der einzelnen Buchstaben ermitteln.

Ich habe mich für die zweite Variante entschieden.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Buchstabe/Position unter Maus auslesen

  Alt 13. Jan 2020, 13:54
Entweder man verwaltet jeden Buchstaben als Objekt (dann könnte PtInRect reichen oder noch die Unterscheidung ober rechts oder links von der Mitte) oder jedes einheitlich formatierte Wort wird als Objekt gespeichert, dann muss man später die Länge der einzelnen Buchstaben ermitteln.
Für jeden Buchstaben vllt nicht unbedingt aber für jeden Textabschnitt mit einer bestimmten Formatierung. Also im Prinzip so wie im Eröffnungspost als Bild dargestellt. Man könnte sich die Methodik so ähnlich vorstellen wie beim VirtualTreeview mit aktivierten Gridextensions. Da kann man sich auch für jede Textzelle separat per Canvas-Objekt unterschiedliche Texteigenschaften holen und berechnen.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.446 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Buchstabe/Position unter Maus auslesen

  Alt 13. Jan 2020, 15:30
Die Position des aktuellen Buchstabens unter der Maus ermittele ich analog - Buchstabe für Buchstabe. Die Breite der Buchstaben hole ich über eine separate Klasse ab wo für jeden von mir verwendeten Font und Char die Breite gespeichert wird. (Bei den Surrogaten von Unicode sehr spassig )
  Mit Zitat antworten Zitat
hansklok

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

AW: Buchstabe/Position unter Maus auslesen

  Alt 19. Jan 2020, 16:13
Vielen lieben Dank meinen Vorrednern für deren Input.

Mir fehlt tatsächlich nur der letzte Schritt. Nehmen wir an, ich habe die aktuelle Zeile, sagen wir Nummer 2, und das aktuelle StyleRun der Zeile, sagen wir Nummer 4, identifiziert. Das Style<run beginnt an der x-Position 760 und die Maus befindet sich an Position 820. Mir fehlt nur der Ansatz, wie ich jetzt die Buchstaben ermittle. Also, muss man da eine Schleife verwenden und solange immer wieder die Textbreite abfragen, bis man die Koordinate erreicht hat? Wie könnte so ein Pseudo-Code aussehen?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Buchstabe/Position unter Maus auslesen

  Alt 19. Jan 2020, 16:36
Das macht mein Code oben eigentlich genau.

In DX wird zunächst die X-KlickPosition vom aktuellen WordOffset aus definiert bzw. die Zielposition wo der Cursor sein soll.
Dann wird von der Mitte aus geschaut, ob diese rechts oder links von dieser Position aus ist.
Dann wird der gefundene rechte oder linke Bereich immer weiter eingeschränkt, bis der Buchstabe gefunden wird, der der Zielposition am nächsten ist.

In CaretXPos wird das Ergebnis zurück geliefert.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:48 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