AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Buchstabe/Position unter Maus auslesen

Ein Thema von hansklok · begonnen am 11. Jan 2020 · letzter Beitrag vom 13. Jan 2020
Antwort Antwort
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
289 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
643 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#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
289 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

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
3.789 Beiträge
 
Delphi 10.3 Rio
 
#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.046 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#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

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
3.789 Beiträge
 
Delphi 10.3 Rio
 
#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.046 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#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
643 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#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
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 12:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf