1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
//------------------------------------------------------------------------------
procedure TScriptForm.LoadMemoFromStrings(AStrings: TStrings);
var
Chrono: System.Diagnostics.TStopwatch;
I, CurrentLine, NewLine, NewLineCount, LoginLine, LogoutLine: Integer;
Line, LinePrior: string;
Caret, CaretPrior: Integer;
begin
Chrono := System.Diagnostics.TStopwatch.StartNew();
pnlActions.Enabled := False;
memoScript.ReadOnly := True;
try
memoScript.Lines.BeginUpdate();
try
memoScript.Lines.Clear();
Caret := 0;
CaretPrior := 0;
CurrentLine := -1;
LoginLine := -1;
LogoutLine := -1;
for I := 0 to AStrings.Count - 1 do
begin
Line := AStrings[I];
if LoginLine < 0 then
if StartsText('[Login]', Line) then
LoginLine := I;
if LogoutLine < 0 then
if StartsText('[Logout]', Line) then
LogoutLine := I;
NewLine := -1;
try
NewLine := memoScript.Lines.Add(Line);
except
on E: EOutOfResources do // 'RichEdit line insertion error'
begin
memoScript.SelStart := Caret;
memoScript.SelLength := Length(Line);
memoScript.SelAttributes.Color := clMaroon;
memoScript.SelLength := 0;
end;
end;
// Attention, c'est sur la Ligne L que l'on détecte si la Ligne précédente a été découpée sur plusieurs lignes.
if (NewLine >= 0) and (NewLine <> CurrentLine + 1) then
begin
NewLineCount := NewLine - CurrentLine;
memoScript.SelStart := CaretPrior;
memoScript.SelLength := Length(LinePrior);
memoScript.SelAttributes.Color := clRed;
memoScript.SelLength := 0;
end;
CaretPrior := Caret;
Inc(Caret, Length(Line) + 1); // + 1 pour le Char CRLF
CurrentLine := NewLine;
LinePrior := Line;
if not ByteBool(I) then
begin
edScriptFileName.EditLabel.Caption := Format('Script file : %d Lines load in %d ms, waiting ...', [memoScript.Lines.Count, Chrono.ElapsedMilliseconds]);
Application.ProcessMessages();
end;
end;
if LogoutLine >= 0 then
begin
// Recalage à cause des lignes trop longues
LogoutLine := LogoutLine + memoScript.Lines.Count - AStrings.Count;
for I := memoScript.Lines.Count - 1 downto LogoutLine + 1 do
begin
// Caret a été calculé ci-dessus durant le remplissage
Line := memoScript.Lines[I];
Dec(Caret, Length(Line) + 1); // + 1 pour le Char CRLF
memoScript.SelStart := Caret;
memoScript.SelLength := Length(Line);
if memoScript.SelAttributes.Color <> clMaroon then
memoScript.SelAttributes.Color := clWebOrange;
end;
end;
if LoginLine >= 0 then
begin
Caret := 0;
for I := 0 to LoginLine - 1 do
begin
Line := memoScript.Lines[I];
memoScript.SelStart := Caret;
memoScript.SelLength := Length(Line);
if memoScript.SelAttributes.Color <> clMaroon then
memoScript.SelAttributes.Color := clWebOrange;
Inc(Caret, Length(Line) + 1); // + 1 pour le Char CRLF
end;
end;
finally
memoScript.Lines.EndUpdate();
end;
edScriptFileName.EditLabel.Caption := Format('Script file : %d Lines load in %d ms', [memoScript.Lines.Count, Chrono.ElapsedMilliseconds]);
if memoScript.Lines.Count <> AStrings.Count then
MessageDlg('Lignes de longueur excessive détectées', mtWarning, [mbOK], 0);
finally
memoScript.ReadOnly := False;
pnlActions.Enabled := True;
end;
end; |
Partager