Caret für eigenes Control anzeigen?

Antworten
df.id
Beiträge: 20
Registriert: Fr 23. Mai 2008, 00:29
OS, Lazarus, FPC: Windows|Linux (L 3.8.0 FPC 3.2.2)
CPU-Target: Intel
Wohnort: Münster
Kontaktdaten:

Caret für eigenes Control anzeigen?

Beitrag von df.id »

Wie kann man bei einem eigenen Control, abgeleitet TCustomControl von einen Textcursor (Caret) anzeigen?

Dieser Code funktioniert unter Windows, jedoch nicht unter Linux (GTK2) :( :

Code: Alles auswählen

LCLIntf.CreateCaret(Handle, 0, 2, CaretHeight);
 LCLIntf.SetCaretPosEx(Handle, PositionX, PositionY);
 LCLIntf.ShowCaret(Handle);
Technisch möglich ist es, da testweise verwendetes SynEdit in gleicher Umgebung funktioniert.
Control bekommt auch den Focus und reagiert sonst wie gewohnt, nur ShowCaret versagt und es wird kein Caret dargestellt.

VG
Dirk

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Caret für eigenes Control anzeigen?

Beitrag von pluto »

Am einfachsten und sichersten ist es wohl du zeichnest den Caret selbst ein. Mit MoveTo und LineTo....
MFG
Michael Springwald

martin_frb
Beiträge: 588
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Caret für eigenes Control anzeigen?

Beitrag von martin_frb »

Unter GTK wird das Caret GLAUBE ICH vom widgetset (lcl/interfaces/gtk* ) emuliert. Warum es bei dir nicht geht? Keine Ahnung.

Under Windows macht windows das, aber du hast in der gesamten Anwendung nur ein Caret. Verwenden zwei Komponenten je ein Caret, ist immer nur eins sichtbar.

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Caret für eigenes Control anzeigen?

Beitrag von theo »

Bei mir funzt das, wenn ich bei jedem Paint am Schluss ShowCaret aufrufe.
Ich weiss aber nicht, ob das der "Königsweg" ist.

Code: Alles auswählen

TTest=Class(TCustomControl)
....
  protected
     procedure Paint; override;
 
....
 
procedure TTest.Paint;
begin
  inherited Paint;
  Canvas.Brush.Color:=clyellow;
  Canvas.FillRect(0,0,200,200);
  ShowCaret(Handle);
end;

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Caret für eigenes Control anzeigen?

Beitrag von pluto »

Währe aber logisch. Denn du löscht ja den Hintergrund also auch den Caret. Also musst du ihn auch wieder neuzeichnen....
MFG
Michael Springwald

df.id
Beiträge: 20
Registriert: Fr 23. Mai 2008, 00:29
OS, Lazarus, FPC: Windows|Linux (L 3.8.0 FPC 3.2.2)
CPU-Target: Intel
Wohnort: Münster
Kontaktdaten:

Re: Caret für eigenes Control anzeigen?

Beitrag von df.id »

Danke, theo.

Das war ist Lösung (für mich).
Meine Abweichung war, dass ich SetCaret nicht innerhalb des Paint-Events (überladenes Paint oder OnPaint) ausgeführt habe, sondern vorher.
Der Windows-Implementierung des Carets war das egal.
Ich komme jetzt weiter...

martin_frb
Beiträge: 588
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Caret für eigenes Control anzeigen?

Beitrag von martin_frb »

Ah jetzt ja, faellt mir das auch wieder ein.

SynEdit, ruft nicht nur ShowCaret nach dem paint auf, sondern auch HideCaret am anfang. Schau mal auf msdn. Koennte sein das die beiden balanced sein muessen

Antworten