Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Text markieren trotz HideCaret


galagher - Di 16.11.10 21:07
Titel: Text markieren trotz HideCaret
Hallo zusammen!

Ich habe eine Möglichkeit entdeckt, das Caret in einem Memo oder RichEdit zu verbergen:
http://www.delphipraxis.net/4463-blinkende-cursor-aus-memo-feld-entfernen.html

Wie kann man trotzdem noch Text markieren? Ich meine so wie in .chm-Hilfedateien!


Lannes - Sa 20.11.10 01:36

Hallo,

im RichEdit könnte das von den Schweitzern helfen:
...im RichEdit die Hintergrundfarbe einzelner Zeichen ändern? [http://www.swissdelphicenter.ch/de/showcode.php?id=1438]


galagher - Sa 20.11.10 18:13

user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
im RichEdit könnte das von den Schweitzern helfen:
...im RichEdit die Hintergrundfarbe einzelner Zeichen ändern? [http://www.swissdelphicenter.ch/de/showcode.php?id=1438]
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

user profile icontoms hat folgendes geschrieben Zum zitierten Posting springen:
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
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.


toms - Sa 20.11.10 18:50

Kannst auch mal das probieren:

http://www.delphipraxis.net/1062808-post2.html


galagher - Sa 20.11.10 18:53

user profile icontoms hat folgendes geschrieben Zum zitierten Posting springen:
Kannst auch mal das probieren:

http://www.delphipraxis.net/1062808-post2.html
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

user profile icontoms hat folgendes geschrieben Zum zitierten Posting springen:
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!


toms - Sa 20.11.10 19:17

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile icontoms hat folgendes geschrieben Zum zitierten Posting springen:
Probier's nochmals...
Ok, danke, klappt jetzt. Nur, ich benutze kein normales TRichEdit, sondern ein TRxRichEdit


Sollte keine Rolle spielen. Einfach TRichEdit durch TRxRichEdit ersetzen.


galagher - Sa 20.11.10 19:41

user profile icontoms hat folgendes geschrieben Zum zitierten Posting springen:
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.

@user profile icontoms:
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:
{
  Von TRichEdit abgeleitete Komponente, mit der man das Caret ausblenden
  kann. Der Code stammt im Wesentlichen von toms aus dem Delphi-Forum und
  wurde um die Methode MouseUp (galagher) erweitert.

  Nov. 2010
}



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;

{ TRichEditPlus }

procedure TRichEditPlus.HideTheCaret;
begin
  if not FShowCaret then
    CreateCaret(Handle, 000);
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.