RichEdit; Cursor setzen durch Rechtsklick auch möglich??
-
Meine RichEdit Komponente hat ein PopupMenue, welches mit der rechten Maustaste aufgerufen werden kann.
In diesem PopupMenue soll es dem Anwender ermöglicht werden, eine Zeile zu löschen.
MitRichEditRestpunkte->Lines->Delete(RichEditRestpunkte->CaretPos.y);
funktioniert es zwar, aber nur, wenn der Cursor sich schon in der richtigen Zeile befindet. (Durch vorherigen Linksklick).
Wenn das Popupmenü direkt mit einem Rechtsklick aufgerufen wird,
(in einer neuen Zeile) wird die falsche Zeile gelöscht. Nähmlich die, in der vorher der Cursor geblinkt hat.
-
Hallo MartiMc1,
vielleicht geht es auch eleganter, aber ich würde es ganz stumpf machen, indem ich im OnMouseDown Event bei rechter Maustaste die aktuelle Zeilennummer hole und diese dann für's Löschen verwende:
void __fastcall TForm1::RichEditRestpunkteMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button == mbRight) { TPoint P = Point(X,Y); // Hole den Characterindex von den Mauskoordinaten long charPos = RichEditRestpunkte->Perform(EM_CHARFROMPOS,0,long(&P)); // Hole den Lineindex von dem Characterindex rightClicklineCoord = RichEditRestpunkte->Perform(EM_LINEFROMCHAR,charPos,0); } }
RichEditRestpunkte->Lines->Delete(rightClicklineCoord);
Vielleicht hilft dir das weiter
Schönen Gruß
-
vielen Dank, das klappt schon prima.
Schön wäre noch, wenn die Cursorposition schon durch den Rechtsklick realisiert werden könnte, so als wenn man die linke Maustaste geklickt hätte.
Denn solange der Anwender im Popupmenue noch keine Auswahl getroffen hat, blinkt immernoch der Cursor in der falchen Zeile.Gruß, Martin
-
Hallo Martin,
na, das macht die ganze Sache sogar noch etwas einfacher (und zugegeben wesentlich intuitiver für den Benutzer).
Das Löschen über's PopUp-Menü kannst du dann wieder so machen, wie du es in deinem ersten Post schon getan hast. Und in der onMouseDown-Funktion benutzt du einfach folgendes:
TPoint P = Point(X,Y); // Hole den Characterindex von den Mauskoordinaten long charPos = RichEditRestpunkte->Perform(EM_CHARFROMPOS,0,long(&P)); // Setze Cursor auf Characterindex RichEditRestpunkte->SelStart = charPos;
Schönen Gruß
-
Vielen Dank, das ist genau das was ich wollte.
Gruß, Martin