SynEdit GutterClick

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Ally
Beiträge: 294
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

SynEdit GutterClick

Beitrag von Ally »

Wie kann ich in

Code: Alles auswählen

procedure TfrmMain.SynEditGutterClick(Sender: TObject; X, Y, Line: Integer; mark: TSynEditMark);
herausfinden ob ich in den linken oder rechten Gutter geklickt habe?

Benutzeravatar
Zvoni
Beiträge: 468
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: SynEdit GutterClick

Beitrag von Zvoni »

Seit wann hat TSynEdit zwei Gutters?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Ally
Beiträge: 294
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: SynEdit GutterClick

Beitrag von Ally »

Seit Menschen gedenken. :)

Schau dir mal die rechte Seite des Quelltexteditors von Lazarus an. Dort sind die Markierungen für geänderte Zeilen, Stopmarken usw.
Das ist der RightGutter.

Benutzeravatar
Zvoni
Beiträge: 468
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: SynEdit GutterClick

Beitrag von Zvoni »

Wirst du mir zeigen müssen, wo das sein soll
Unbenannt.PNG
Unbenannt.PNG (75.19 KiB) 203 mal betrachtet
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 468
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: SynEdit GutterClick

Beitrag von Zvoni »

OK, hab was gefunden.

Der Gutter hat anscheinend eine "Side"-Property
property Side:TSynGutterSide read FSide;

mit Type
TSynGutterSide = (gsLeft, gsRight);
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

martin_frb
Beiträge: 597
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: SynEdit GutterClick

Beitrag von martin_frb »

SynEdit.OnGutterClick is älter als der 2te Gutter. OnGutterClick wird nur vom linken Gutter .aufgerufen.

Ansonsten kann man (im OI, oder Code)

Code: Alles auswählen

SynEdit1.RightGutter.OnGutterClick := 
Ferner hat jeder "GutterPart" ein eigenes OnGutterClick (Parts können auch im OI bearbeitet werden).

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

Re: SynEdit GutterClick

Beitrag von theo »

Ally hat geschrieben: Do 30. Okt 2025, 17:20 herausfinden ob ich in den linken oder rechten Gutter geklickt habe?
Naja, mit dem Parameter X solltest du das doch unterscheiden können?
Grob, zum veranschaulichen der Idee:

Code: Alles auswählen

procedure TForm1.SynEdit1GutterClick(Sender: TObject; X, Y, Line: integer;
  mark: TSynEditMark);
begin
  If X > (SynEdit1.Width div 2) then
    Caption:='Rechts' else Caption:='Links';
end;

Benutzeravatar
Ally
Beiträge: 294
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: SynEdit GutterClick

Beitrag von Ally »

Danke für eure Antworten.

@Zvoni
Wirst du mir zeigen müssen, wo das sein soll
Schau dir mal den Bereich zwischen dem Textfenster und dem vertikalen Scrollbalken an.


@martin_frb
OnGutterClick wird nur vom linken Gutter aufgerufen.
Sicher? Im angehängten Beispiel wird OnGutterClick auch bei einem Klick in den rechten Gutter ausgelöst. :shock:

Code: Alles auswählen

SynEdit1.RightGutter.OnGutterClick :=
Danke, das schaue ich mir mal näher an.


@theo
Danke, ist zwar etwas um die Ecke programmiert :) , probiere ich aber auch mal aus.


----------------------------------------------------------------------------------------------------------
Hintergrund:
Ich möchte bei eine Klick in den linken Gutter die komplette Zeile mit Zeilenumbruch markieren.
mit

Code: Alles auswählen

Gutter.MouseActions.AddCommand(emcSelectLine, True, mbXLeft, ccSingle, cdUp, [], [], emcoSelectLineFull);
wird zwar der gesamte Text in der Zeile markiert, aber nicht der Zeilenumbruch.

Ich habe mir da selbst etwas gebastelt das den Job erledigt. Aber dazu muss ich halt wissen in welchen Gutter geklickt wurde.
Dateianhänge
project1.zip
(7.32 KiB) 78-mal heruntergeladen

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

Re: SynEdit GutterClick

Beitrag von theo »

Ally hat geschrieben: Fr 31. Okt 2025, 12:24 @theo
Danke, ist zwar etwas um die Ecke programmiert :) ,
Finde ich nicht so schlimm.
Du kannst es ja so machen:

Code: Alles auswählen

procedure TForm1.SynEdit1GutterClick(Sender: TObject; X, Y, Line: integer;
  mark: TSynEditMark);
begin
    If X < TSynGutter(Sender).Width then
      ...
end;  

Benutzeravatar
Ally
Beiträge: 294
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: SynEdit GutterClick

Beitrag von Ally »

Hallo theo,

dein zweiter Lösungsvorschlag funktioniert irgendwie nicht so richtig. :( :)
Aber dein erster funktioniert prima. :D
Ich habe ihn mal ins Testprogramm eingebaut.

Vielen Dank noch mal

project1.zip
(7.45 KiB) 70-mal heruntergeladen

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

Re: SynEdit GutterClick

Beitrag von theo »

Ally hat geschrieben: Fr 31. Okt 2025, 16:23 dein zweiter Lösungsvorschlag funktioniert irgendwie nicht so richtig. :( :)
Wieso?
Sagt doch jeweils, wo das Problem liegt (aka Fehlermeldung).
"funktioniert irgendwie nicht so richtig." ist nicht hilfreich. :wink:

martin_frb
Beiträge: 597
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: SynEdit GutterClick

Beitrag von martin_frb »

Ally hat geschrieben: Fr 31. Okt 2025, 12:24 @martin_frb
OnGutterClick wird nur vom linken Gutter aufgerufen.
Sicher? Im angehängten Beispiel wird OnGutterClick auch bei einem Klick in den rechten Gutter ausgelöst. :shock:
Argh... Da sollte eigentlich nicht sein...

Weil

Code: Alles auswählen

procedure TCustomSynEdit.SetOnGutterClick(const AValue : TGutterClickEvent);
begin
  FLeftGutter.OnGutterClick := AValue; // Todo: the IDE uses this for the left gutter only
end;
OnGutterClick wird exquisit NUR dem linkem zugewiesen. Das ist ein einfacher forwarder....

Aber, (muss noch testen / nur aus oberflächlichen Code review)

Beide Gutter, arbeiten intern mit "MouseActions", und beide Gutter lösen dann intern eine emcOnMainGutterClick Aktion aus...

Und der linke Gutter feuert sein OnGutterClick event, auch dann wenn der rechte die Aktion eingeleitet hat.... => Das ist falsch.

----

SynEdit.Gutter.OnGutterClick muss geändert werden, und darf nur für den linken Gutter feuern.

Muss dann mal schauen, entweder
- SynEdit.OnGutterClick bleibt forwarder (wie ursprünglich geplant)
- SynEdit.OnGutterClick wird ein eigens event, und feuert (weiter) für beide

SynEdit.On

martin_frb
Beiträge: 597
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: SynEdit GutterClick

Beitrag von martin_frb »

"Sender" is entsprechend auch IMMER der linke Gutter. Selbst bei einem Click in den rechten Gutter.

martin_frb
Beiträge: 597
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: SynEdit GutterClick

Beitrag von martin_frb »


Benutzeravatar
Ally
Beiträge: 294
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: SynEdit GutterClick

Beitrag von Ally »

@theo
wie fast immer: Der Fehler sitzt vor dem Bildschirm. :)
In den uses fehlte ganz einfach SynGutter. - Funktioniert also auch.

@martin_frb
Vielen Dank fürs drüber schauen.
Und ganz nebenbei mal vielen Dank für deine Großartige Arbeit an SynEdit, Lazarus usw.

Antworten