SynEdit Highlighter -> Benachrichtigung beim Löschen von Zeilen

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

SynEdit Highlighter -> Benachrichtigung beim Löschen von Zeilen

Beitrag von TBug »

Hallo zusammen,

ich habe mal wieder ein kleines bzw. eigentlich grosses Problem.

Es existiert ein von TSynCustomFoldHighlighter abgeleiteter Highlighter mit einer von TSynHighlighterRangeList abegeleiteter RangeList.

Ich suche jetzt bereits 10 Tage nach einer Möglichkeit den Highlighter oder die Rangelist automatisch zu benachrichtigen, falls Zeilen im SynEdit gelöscht werden. Ich hätte zwar die Möglichkeit das SynEdit zu erweitern, damit es beim Löschen von Zeilen prüft, ob meine HighLighter-Klasse Zugewiesen ist und dann dem Highlighter mitteilt, dass Zeilen gelöscht werden, was aber zur Folge hötte, dass mein HighLighter immer nur zusammen mit dem erweiterten SynEdit korrekt funktionieren würde. Dies sollte aber nicht Sinn der Sache sein!

Der Vorfahre TSynHighlighterRangeList der RangeList bietet zwar die Prozedur DeletedLines, welche ich überschreiben könnte, wird aber erst zu spät aufgerufen, da dann die Zeilen und die Ranges bereits gelöscht sind.

TSynEditStorageMem ein Vorfahre von TSynHighlighterRangeList bietet die Prozedur DeleteRows an, welche aber nicht aufgerufen wird wenn es sich um eine RangeList handelt. Somit fällt diese Mögichkeit auch flach.

Ich benötige diese Benachrichtigung bevor dir Ranges der gelöschten Zeilen gelöscht sind, da hier Speicherlecks bekomme, da meine Ranges aus einem Record mit mehrere "Arrays of Record" bestehen.


Hat jemand eine Idee?

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: SynEdit Highlighter -> Benachrichtigung beim Löschen von Zeilen

Beitrag von sstvmaster »

LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

martin_frb
Beiträge: 572
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 Highlighter -> Benachrichtigung beim Löschen von Zeilen

Beitrag von martin_frb »

Code: Alles auswählen

  TSynHighlighterRangeList = class(TSynManagedStorageMem)
...
  protected
    procedure LineTextChanged(AIndex: Integer; ACount: Integer = 1); override;
    procedure InsertedLines(AIndex, ACount: Integer); override;
    procedure DeletedLines(AIndex, ACount: Integer); override;
Diese setzen normalerweise: FNeedsReScanStartIndex und FNeedsReScanEndIndex.

Damit hat der HL eigentlich alles was er braucht (brauchen sollte).

Sonst kann man natürlich eine abgeleitete Class erstellen.

-----
SynEdit ruft dann FHighlighter.ScanRanges; auf.

Achtung, derzeit ist das quasi nach jeder Änderung. Aber das kann sich ändern.
Der Aufruf könnte zum Beispiel unterlassen werden, wenn die geänderten Textzeilen alle hinter der letzten sichtbaren Zeile sind => weil dann sollten Sie keinen Einfluss auf die aktuelle Anzeige haben. Es reicht dann ein Update wenn die Zeilen angezeigt werden sollen.... (Oder der SynEdit ist insgesamt gerade nicht sichtbar).


------------- EDIT
Habe den wichtigen Teil überlesen....
zu spät aufgerufen, da dann die Zeilen und die Ranges bereits gelöscht sind.

martin_frb
Beiträge: 572
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 Highlighter -> Benachrichtigung beim Löschen von Zeilen

Beitrag von martin_frb »

Der Range sollte folgende Methoden aufgerufen kriegen:

procedure Move(AFrom, ATo, ALen: Integer); virtual;
procedure SetCount(const AValue: Integer); virtual;

Aber das ist ein internes Detail.
In der fernen Zukunft könnte sich das ändern.

------------
Könnte sogar sein das sub-HL im Multi-HL bereits anders behandelt werden.

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: SynEdit Highlighter -> Benachrichtigung beim Löschen von Zeilen

Beitrag von TBug »

Hallo zusammen,
martin_frb hat geschrieben:
Sa 11. Feb 2023, 16:59
procedure Move(AFrom, ATo, ALen: Integer); virtual;
Ja, "Move" wird auch aufgerufen, aber nicht, wenn die letzte Zeile gelöscht wird.

Ich bin gerade mit dem Debugger am Testen, ob ich aus den übergebenen Parametern von "Move" und "DeletedLines" etwas sinnvolles zusammenbasteln kann. Allerdings zeichnet es sich bereits ab, dass ich die Pointer auf die Arrays der letzten Range zwischenspeichern muss, damit ich diese beim Löschen von Zeilen ordnungsgemäß freigeben kann.

Das Ganze ist etwas komplizierter, denn beim Löschen einer mehrzeiligen Selektion wird Move und dann zweimal DeletedLines aufgerufen. Ausserdem ändern sich die Array-Adressen auch ständig, durch die Übergabe der neuen Ranges wenn Zeilen angehangen werden und wenn sich der eingegebene Text ändert und dadurch die Arrays in der Länge geändert werden müssen.

Daher ist jeder kleinste Hinweis oder jede Idee sehr hilfreich.

Antworten