RichMemo - CharAtPos

Rund um die LCL und andere Komponenten
Antworten
Ronny58
Beiträge: 90
Registriert: So 27. Apr 2014, 20:35

RichMemo - CharAtPos

Beitrag von Ronny58 »

Hallo Zusammen,

wieder mal eine Frage zu TRichMemo. Dort gibt es eine Funktion "CharAtPos(x,y)". Die liefert einen Integer-Wert zurück.

Code: Alles auswählen

  i := RichMemo1.CharAtPos(rmEditor.CaretPos.x,rmEditor.CaretPos.y);
Ich war der Meinung, CaretPos gibt mir die Maus-Koordinaten und CharAtPos das dazugehörige Zeichen unter der Maus.
Da kommt auch eine Zahl zurück. Die sieht auch nicht unplausiebel aus. Wenn ich die aber nutze, um das Zeichen unter dem Cursor zu identifizieren, bekomme ich das falsche Ergebnis:

Ich habe es wie folgt probiert:

Code: Alles auswählen

  i := RichMemo1.CharAtPos(rmEditor.CaretPos.x,rmEditor.CaretPos.y);
  s := RichMemo1.Rtf[i];
  s := RichMemo1.Lines[i];
  s := RichMemo1.Text[i];
  s := RichMemo1.Caption[i];
Egal, welche der 4 Funktionen ich nutze, es kommt immer das falsche Zeichen zurück.

Der Hintergrund für mein Problem ist: Mit einem Doppelklick auf dem Zeichen will ich das ganze Wort markieren.
Ich weis, dass dies eine Standardfunktion im Editor ist. Allerdings will ich die Worterkennung selbst steuern, da der Standard mir das falsche Ergenis liefert.
Hängt mit der Art des Textes zusammen. Das setzt aber voraus, dass ich das Zeichen erstmal habe, dass ich anklicke.

Was mache ich falsch?

LG Ronny58

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: RichMemo - CharAtPos

Beitrag von sstvmaster »

Ich hätte das so gemacht:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, RichMemo;

type

  { TForm1 }

  TForm1 = class(TForm)
    Edit1: TEdit;
    RichMemo1: TRichMemo;
    procedure RichMemo1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.RichMemo1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Edit1.Text:=RichMemo1.GetText(RichMemo1.CharAtPos(x,y),1);
end;

end.
LG Maik
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Antworten