Den Folding-Status von SynEdit wiederherstellen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Den Folding-Status von SynEdit wiederherstellen

Beitrag von harrybonn »

Ich verwende in meinem Pascal Editor die SynEdit-Komponente mit dem TSnyPasSyn (Lazarus 2.08).

Ich dachte, wenn ich

SynEdit.Foldstate des aktuellen Synedits in eine Datei speichere und später, nach erneutem Laden der Text-Datei, SynEdit.Foldstate den gepspeicherten Wert zuweise, dass dann der vor dem Speichern vorhandene Foldstatus wieder hergestellt würde.

Leider ist das nicht der Fall.

Wie kann man das bewirken?

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: Den Folding-Status von SynEdit wiederherstellen

Beitrag von sstvmaster »

Hier im englischen Forum hatte jemand die gleiche Frage: https://forum.lazarus.freepascal.org/in ... ic=26748.0
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: Den Folding-Status von SynEdit wiederherstellen

Beitrag von martin_frb »

FoldState sollte genau das tun. Und tut es auch in der IDE.

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: Den Folding-Status von SynEdit wiederherstellen

Beitrag von harrybonn »

Ja danke, das hatte ich auch schon per Google-Suche gefunden. Der Thread gibt aber leider keine Antwort auf meine Frage, dieser User hatte wohl das Problem, dass Getfoldstate einen leeren Wert zurücklieferte.

Das ist bei mir nicht der Fall. Aber die Zuweisung des gespeicherten Foldstates hat halt keine Wirkung.

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: Den Folding-Status von SynEdit wiederherstellen

Beitrag von harrybonn »

So sieht der Code bei mir aus (slExpand.text hat den richtigen Inhalt und die passende Text-Datei wurde zuvor in SynEdit geladen):

Code: Alles auswählen

procedure Tchild_Source.SaveFoldings(FileName: string);
begin
  slExpand.clear;
  slExpand.text := AdvMemo1.FoldState;
  slExpand.SaveToFile(FileName);
end;

procedure Tchild_Source.RestoreFoldings(FileName: String);
begin
  if FileExists (FileName) then begin
    cf.Down := True;
    slExpand.LoadFromFile(FileName);
    try
      AdvMemo1.FoldState := Trim (slExpand.text);
    except
    end;
  end;
end; 

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: Den Folding-Status von SynEdit wiederherstellen

Beitrag von martin_frb »

Hast du im Debugger den Text vor dem speichern, mit dem text nach dem Trim verglichen?
Könnte die Stringlist, oder das Trim irgendwas verändern?


Wenn RestoreFolding aufgerufen wird:
- Ist der Text geladen
- Der Highlighter gesetzt
- Und SynEdit NICHT in BeginUpdate ?
- SynEdit hat ein Handle, und ist sichtbar (Visible = true)

Der Highlighter muss so dem Zeitpunkt gescannt haben. sonst kann der FoldState nicht gesetzt werden.

Finde "ScanRanges" und setze einen Breakpoint. Wird es vor dem Foldstate, aber nach dem setzten des Textes ausgeführt?

Versuch vor dem "Foldstate:=" einen Aufruf von AfterLoadFromFile().

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: Den Folding-Status von SynEdit wiederherstellen

Beitrag von martin_frb »

Oder setze einen Breakpoint in
function TSynEditFoldExportStream.VerifyChecksum: Boolean;

und sieh ob es True liefert

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: Den Folding-Status von SynEdit wiederherstellen

Beitrag von harrybonn »

Deine Vermutung war richtig, Veryfychecksum liefert false zurück.

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: Den Folding-Status von SynEdit wiederherstellen

Beitrag von harrybonn »

Der gespeicherte Text (für 2 Foldings) sieht so aus:

T5iG0#vH T3@g08m

(ein führendes Leerzeichen, ist das richtig?)

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: Den Folding-Status von SynEdit wiederherstellen

Beitrag von martin_frb »

Es ist recht lange her das ich daran gearbeitet habe, aber ein schneller Blick und es sieht so aus als ob Spaces im String enthalten sein können. Auch am Anfang.

Da der Text in XML packbar ist, versuche einfach in mit <> einzukapseln. Diese dann nach dem lesen wieder entfernen.

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: Den Folding-Status von SynEdit wiederherstellen

Beitrag von harrybonn »

Danke, mit SynEdit.Afterloadfromfile (vor Zuweisung des gesicherten Wertes an Synedit.Foldstate) funktioniert es!
Hatte den Hinweis gestern überlesen.
:)

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: Den Folding-Status von SynEdit wiederherstellen

Beitrag von martin_frb »

Ja, da ist ein kleiner Bug.

AfterLoadFromFile stellt sicher, das Foldstate gespeichert wird und zur rechten Zeit ausgeführt wird.

Nur FoldState funktioniert nur, wenn SynEdit bereits alle anderen benötigten Events abgearbeitet hat.

Am besten im Bugtracker (mit den 2 Zeilen Text ^^^) eintragen.

Antworten