Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TextRect von TMemo.SelText bestimmen


Knulli - Mi 15.06.11 10:31
Titel: TextRect von TMemo.SelText bestimmen
Hi Leute,
ich will in einem TMemo den MausCorsor verändern (TMemo.Cursor auf crDefault/crArrow setzen), wenn ich (in TMemo.MouseMove) über einem SelText bin.
Das Ganze soll zur Vorbereitung von Drag&Drop sein, damit der Benutzer besser erkennt, daß er jetzt Drag&Drop machen kann.

So wie in der Delphi-IDE, wo ich einen markierten Bezeichner aus dem Text-Editor ins Fenster 'Liste der überwachten Ausdrücke' ziehen kann.

Jemand ne Idee, wie ich rausbekomme, welche Mausposition der SelText hat?

Knulli


Gerd Kayser - Mi 15.06.11 12:59

user profile iconKnulli hat folgendes geschrieben Zum zitierten Posting springen:
Jemand ne Idee, wie ich rausbekomme, welche Mausposition der SelText hat?

Nimm am besten ein RichEdit. Das verfügt über das Ereignis OnSelectionChange.
Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
// uses RichEdit;
procedure TForm1.RichEdit1SelectionChange(Sender: TObject);
var
  Bereich        : TCharRange;
  PunktStart     : TPoint;
  PunktEnde      : TPoint;
  ErstesZeichen  : integer;
  LetztesZeichen : integer;
begin
  // Ist cpMin = cpMax, dann ist nichts selektiert.
  SendMessage(RichEdit1.Handle, EM_EXGETSEL, 0, lParam(@Bereich));
  ErstesZeichen := Bereich.cpMin;
  LetztesZeichen := Bereich.cpMax;
  // Koordinaten innerhalb des RichEdits abfragen
  SendMessage(RichEdit1.Handle, EM_PosFromChar, wParam(@PunktStart), lParam(ErstesZeichen));
  SendMessage(RichEdit1.Handle, EM_PosFromChar, wParam(@PunktEnde), lParam(LetztesZeichen));
  // Koordinaten umrechnen auf Screen-Koordinaten
  PunktStart := ClientToScreen(PunktStart);
  PunktEnde := ClientToScreen(PunktEnde);
  // Ausgaben
  // Wenn PunktEnde.Y - PunktStart.Y <> 0, dann sind mehrere Zeilen selektiert.
  Label1.Caption := 'Erstes Zeichen: ' + IntToStr(Bereich.cpMin);
  Label2.Caption := 'Letztes Zeichen: ' + IntToStr((Bereich.cpMax));
  Label3.Caption := '1. Koordinate (x/y): ' + IntToStr(PunktStart.X)
                   + ' - ' + IntToStr(PunktStart.Y);
  Label4.Caption := '2. Koordinate (x/y): ' + IntToStr(PunktEnde.X)
                   + ' - ' + IntToStr(PunktEnde.Y);
end;

Außerdem kannst Du Dir folgendes Beispiel von mir mal ansehen: http://www.delphi-forum.de/viewtopic.php?t=102271