Autor Beitrag
Knulli
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 2

Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
BeitragVerfasst: Mi 15.06.11 10:31 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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:
ausblenden 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: www.delphi-forum.de/viewtopic.php?t=102271