If I call ReWrap followed by UnWrap, fRealLineNumber is cleared:
procedure TSynEditStringWrappingList.ListCleared(Sender: TObject);
begin
Finalize(fRealLineNumber);
fMaxRealLine:= -1;
end;
Because is
procedure TSynEditStringWrappingList.UnWrap;
var
st:TStrings;
l:integer;
begin
//undo wrapping, restoring lines to real lines
st := TStringList.Create;
try
for l:=0 to RealCount-1 do
st.Add(RealLine[l]);
fSynStrings.Assign(st);//<---HERE!
finally
st.Free;
end;
end;
Because fSynStrings has handler:
- Assign causes old fSynStrings is cleared, call first
procedure TSynEditStringsLinked.Clear;
begin
fSynStrings.Clear;
end;
and fSynStrings.Clear also clears fRealLineNumber.
fSynStrings.Clear on destroy should clear fRealLineNumber but not on assing, how distinguish situation od Assign to not destroy fRealLineNumber , better without modification unit unit LazSynEditText but only unit synedittextwrapper ?
Solution:
for l:=0 to RealCount-1 do
st.Add(RealLine[l]);
fSynStrings.Assign(st);
LinesChanged(fSynStrings, 0, fSynStrings.Count); //<---Added
But is problem:
procedure TSynEditStringWrappingList.LineCountChanged(Sender: TSynEditStrings;
AIndex, ACount: Integer);
var
i, hrl,rn: Integer;
begin
if (not fEnabled) then exit; <--not enabled!
Problem is because is not Enabled because
FWrappedLinesView.Enabled := eoWordWrap in fOptions2;
two solutions:
- remove line if (not fEnabled) then exit ?
- or in TSynEditStringWrappingList.LineCountChanged move code to other method,
and will
procedure TSynEditStringWrappingList.LineCountChanged(Sender: TSynEditStrings;
AIndex, ACount: Integer);
var
i, hrl,rn: Integer;
begin
if fEnabled then otherMethod(...)
end;
and otherMethod will called after assign?
The second is more better.
ALSO:
procedure TSynEditStringWrappingList.ReWrap;
var
l, hrl:integer;
begin
//foces wrapping and joining of every line
Inc(FWrappingCount);
try
if High(fRealLineNumber) < 0 then begin
SetLength(fRealLineNumber,fSynStrings.Count);
for l:= 0 to High(fRealLineNumber) do
fRealLineNumber[l] := l;
hrl := High(fRealLineNumber);
if hrl >= 0 then
fMaxRealLine:=fRealLineNumber[hrl]
else
fMaxRealLine:= -1;
end;
Lines #12 to #16 must be added