Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "RichEdit" Cursorposition in einem Wort (https://www.delphipraxis.net/143142-richedit-cursorposition-einem-wort.html)

EarlyBird 10. Nov 2009 17:59


"RichEdit" Cursorposition in einem Wort
 
Hallo,

ich suche in einem RichEdit die Cursorposition in einem Wort.

Testsatz: "Köln, Mainz, Ha|mburg, Berlin, Paris"

Hier brauche ich jetzt den Wert 2 weil der Cursor an der 2ten Position im Wort "Hamburg" steht.

Folgende Werte habe ich bereits:
  • Länge des Strings = 35
  • Länge des Wortes in dem der Cursor ist = 7
  • Position des Cursors im String = 15
Wahrscheinlich ganz einfach aber ich komme gerade einfach nicht drauf. :wall:

Besten Dank

himitsu 10. Nov 2009 19:09

Re: "RichEdit" Cursorposition in einem Wort
 
.SelStart liefert die die Position des Cursors
und .Text den Text dazu

nun mußt du nur noch von der Position aus den Anfang des Wortes suchen und die Differenz ausrechnen.

EarlyBird 10. Nov 2009 19:55

Re: "RichEdit" Cursorposition in einem Wort
 
Danke,
das bringt mich auf den richtigen Weg.
Ich versuche es erstmal so.

Delphi-Quellcode:
Function CursorPosInWord(str : String; CursorPos : Integer) : Integer;
 var
 I : Integer;
 begin
   Result := -1;
     for I := CursorPos Downto 0 do
       begin
         if Word(str[I]) in [13, 32, 9, 188] then
           begin
             Result := CursorPos - I;
             break;
           end;
       end;
 end;
Sonderzeichen usw habe ich so auch noch nicht berücksichtigt :?
Wie würdet Ihr den Wortanfang suchen?

Matze 10. Nov 2009 20:35

Re: "RichEdit" Cursorposition in einem Wort
 
Vielleicht so:

Delphi-Quellcode:
// 1. Zeichen gehört zum 1. Wort, somit ist zu Beginn "WortAnfang" = true
WortAnfang := true;

for i := ... to ... do
begin
  // Auswertung / Pos ermitteln etc.
  // if WortAnfang then AnfangsIndex := i;
  // ...

  Wortanfang := false;

  // Beim Leerzeichen das nächste Zeichen als Wortanfang markieren
  if Text[i] = ' ' then
    WortAnfang := true;
end;
Nur so auf die Schnelle aus dem Kopf. Sonderzeichen & Co. fehlen ebenfalls.

Lannes 10. Nov 2009 21:43

Re: "RichEdit" Cursorposition in einem Wort
 
Delphi-Quellcode:
function CursorPosInWord(str : String; CursorPos : Integer) : Integer;
begin
  Result := CursorPos;
  while (Result > 1) and (not (str[Result] in [#13,#10,#09,' '])) do
    dec(Result);
end;

himitsu 10. Nov 2009 21:52

Re: "RichEdit" Cursorposition in einem Wort
 
man kann hier nun zwei Grundsätzliche Wege gehn

- man sucht der rückwärts solange, bis man ein Trennzeichen findet
und und das Zeichen danach ist der 1. Wort-Buchstabe

PS: dazu zählen nicht nur Zeilenumbrüche, Leerzeichen und Tabulatoren, sondern auch Satzzeichen und sonstnochwas

- oder man geht solange zurück, wie man einen "Buchstaben" findet

dieses wird bei Unicode etwas schwieriger
und bei ANSI ist es außerhalb des ASCII-Bereich's abhängig von der aktuellen Codepage

Lannes 10. Nov 2009 22:16

Re: "RichEdit" Cursorposition in einem Wort
 
Hallo,
Zitat:

Zitat von himitsu
...
PS: dazu zählen nicht nur Zeilenumbrüche, Leerzeichen und Tabulatoren, sondern auch Satzzeichen und sonstnochwas ...

jedoch vor den Satzzeichen kommt ein Leerzeichen(in der Regel), wenn man rückwärts durchläuft.
Klar, sind noch einige Randbedingungen zu beachten, die aber Anwendungsabhängig sind.

himitsu 10. Nov 2009 22:44

Re: "RichEdit" Cursorposition in einem Wort
 
Zitat:

Zitat von Lannes
in der Regel

und regeln Sind Dazu Da,Um Vergessen Oder Ignoriert Zu Werden. :zwinker:

Lannes 10. Nov 2009 22:54

Re: "RichEdit" Cursorposition in einem Wort
 
Zitat:

Zitat von Lannes
ein Leerzeichen(iln der Regel), we

soviel zu Regeln und Randbedingungen :angel2: und Klammern


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz