Den Folding-Status von SynEdit wiederherstellen
Den Folding-Status von SynEdit wiederherstellen
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?
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?
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: Den Folding-Status von SynEdit wiederherstellen
Hier im englischen Forum hatte jemand die gleiche Frage: https://forum.lazarus.freepascal.org/in ... ic=26748.0
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 586
- 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
FoldState sollte genau das tun. Und tut es auch in der IDE.
Re: Den Folding-Status von SynEdit wiederherstellen
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.
Das ist bei mir nicht der Fall. Aber die Zuweisung des gespeicherten Foldstates hat halt keine Wirkung.
Re: Den Folding-Status von SynEdit wiederherstellen
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;
-
- Beiträge: 586
- 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
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().
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().
-
- Beiträge: 586
- 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
Oder setze einen Breakpoint in
function TSynEditFoldExportStream.VerifyChecksum: Boolean;
und sieh ob es True liefert
function TSynEditFoldExportStream.VerifyChecksum: Boolean;
und sieh ob es True liefert
Re: Den Folding-Status von SynEdit wiederherstellen
Deine Vermutung war richtig, Veryfychecksum liefert false zurück.
Re: Den Folding-Status von SynEdit wiederherstellen
Der gespeicherte Text (für 2 Foldings) sieht so aus:
T5iG0#vH T3@g08m
(ein führendes Leerzeichen, ist das richtig?)
T5iG0#vH T3@g08m
(ein führendes Leerzeichen, ist das richtig?)
-
- Beiträge: 586
- 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
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.
Da der Text in XML packbar ist, versuche einfach in mit <> einzukapseln. Diese dann nach dem lesen wieder entfernen.
Re: Den Folding-Status von SynEdit wiederherstellen
Danke, mit SynEdit.Afterloadfromfile (vor Zuweisung des gesicherten Wertes an Synedit.Foldstate) funktioniert es!
Hatte den Hinweis gestern überlesen.

Hatte den Hinweis gestern überlesen.

-
- Beiträge: 586
- 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
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.
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.