Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Text markieren trotz HideCaret
galagher - Sa 20.11.10 18:13
Vielen Dank, aber das Problem ist, dass bei RichEdit's überhaupt kein Text selektiert werden kann (es wird tatsächlich gar nicht selektiert!), ausser durch Doppelklick -> ganzer Block und durch Klicken am linken Rand -> ganze Zeile. Das - unsichtbare - Caret wird zwar positioniert, aber es wird nichts selektiert.
Der Code im Link funktioniert hier leider nicht!
Bei Memos kann ganz normal selektiert werden!
//Edit:
Ich müsste den Text irgendwie manuell selektieren, mit MouseDown als SelStart, dann MouseMove, und MouseUp als SelLenght. Ja, so etwas eben in eine Formel giessen... :gruebel:
toms - Sa 20.11.10 18:27
Hallo,
Hier findest du eine andere Methode, das Caret zu verstecken. Das Markieren von Text funktioniert jedoch trotzdem.
http://delphi.about.com/cs/adptips2003/a/bltip0703_5.htm
Edit: Zusätzlich noch CreateCaret(Memo1.handle, 0, 0, 0); im OnMouseDown setzen
galagher - Sa 20.11.10 18:46
Danke, klappt aber nicht wirklich! Das Caret bleibt sichtbar.
Ok, das Problem rührt wahrscheinlich daher, dass das Caret, wenn man die Maus bewegt, immer an die aktuelle Position gesetzt wird. Das ermöglicht es, das Wort, über dem die Maus liegt, zu erkennen. Das sichtbare Caret stört dabei nur. Siehe hier:
http://www.delphi-forum.de/viewtopic.php?t=72719&highlight=caret+++richedit
Im Momemt rufe uch ständig HideCaret auf. Das funktioniert zwar, ist aber nicht besonders schöner Code. Wenn ich nichts anderes finde, belasse ich es eben so.
galagher - Sa 20.11.10 18:53
Da kommt nur die Meldung "Ungültige Angabe: Thema
Wenn du einem normalen, gültigen Link im Forum gefolgt bist, wende dich bitte an den Webmaster."
toms - Sa 20.11.10 18:58
Probier's nochmals...
galagher - Sa 20.11.10 19:14
toms hat folgendes geschrieben : |
Probier's nochmals... |
Ok, danke, klappt jetzt. Nur, ich benutze kein normales TRichEdit, sondern ein TRxRichEdit, das kann auch Grafiken darstellen. Ich werde mir den Code jedenfalls vornehmen, vielleicht lässt sich was machen! Danke!
galagher - Sa 20.11.10 19:41
toms hat folgendes geschrieben : |
Sollte keine Rolle spielen. Einfach TRichEdit durch TRxRichEdit ersetzen. |
Stimmt, es läuft. Allerdings bewirkt die Einstellung
ShowCaret := False nichts, egal, ob im OI oder im Code. Das Caret bleibt sichtbar.
galagher - Sa 20.11.10 23:01
Hallo!
Ich habe daraus eine Komponente TRichEditPlus gemacht, erweitert um die Methode MouseUp, da beim Klicken mit der rechten Maustaste trotz
ShowCaret := False das Caret kurz aufblinkte.
@
toms:
Dazu habe ich zwei Fragen:
1. Warum hast du
uses Windows; im Abschnitt
implementation stehen und nicht im
interface?
2. Macht es einen Unterschied, ob man in der Prozedur HideTheCaret die Anweisungen
CreateCaret,
HideCaret oder
DestroyCaret verwendet? Wenn ja, welchen?
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92:
|
unit RichEditPlus;
interface
uses SysUtils, Classes, Controls, StdCtrls, ComCtrls, Messages, RxRichEd;
type TRichEditPlus = class(TRichEdit) procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; private FShowCaret: Boolean; procedure SetShowCaret(const Value: boolean); procedure WMPaint(var Message: TWMPaint); message WM_PAINT; procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LButtonDown; procedure WMKeyDown(var Message: TWMKeyDown); message WM_KeyDown; procedure HideTheCaret; protected public constructor Create(AOwner: TComponent); override; published property ShowCaret: Boolean read FShowCaret write SetShowCaret; end;
procedure Register;
implementation
uses Windows;
procedure Register; begin RegisterComponents('Samples', [TRichEditPlus]); end;
procedure TRichEditPlus.HideTheCaret; begin if not FShowCaret then CreateCaret(Handle, 0, 0, 0); end;
constructor TRichEditPlus.Create(AOwner: TComponent); begin inherited; FShowCaret := False; end;
procedure TRichEditPlus.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; if Assigned(Parent) then HideTheCaret; end;
procedure TRichEditPlus.SetShowCaret(const Value: boolean); begin FShowCaret := Value; end;
procedure TRichEditPlus.WMKeyDown(var Message: TWMKeyDown); begin inherited; if Assigned(Parent) then HideTheCaret; end;
procedure TRichEditPlus.WMLButtonDown(var Message: TWMLButtonDown); begin inherited; if Assigned(Parent) then HideTheCaret; end;
procedure TRichEditPlus.WMPaint(var Message: TWMPaint); begin inherited; if Assigned(Parent) then HideTheCaret; end;
end. |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!