Mit SynEdit.Lines
- muss jede Zeile einzeln ge-add-et werden.
- wird der undo/redo buffer zurück-gesetzt.
SynEdit.Lines ist zum einmaligem initialisieren am Anfang.
Kannst du nicht eine temp StringList benutzen, der du per .Text den String cs zuweist. Im nächsten Schritt durchläufst du die Stringliste Zeile für Zeile und hängst jede an die Lines des SynEdit:
procedure TForm1.Button1Click(Sender: TObject);
var
L: TStrings;
i: Integer;
lc: Integer;
begin
L := TStringList.Create;
try
L.Text := cs;
if L.Count = 0 then
exit;
// Sonderbehandlung bis zum ersten Linebreak in cs: direkt an die letzte Zeile im SynEdit anhängen
lc := SynEdit1.Lines.Count - 1;
SynEdit1.Lines[lc] := SynEdit1.Lines[lc] + L[0];
// alle folgenden Zeilen als neue Zeilen ins SynEdit anhängen
for i:= 1 to L.Count-1 do
SynEdit1.Lines.Add(L[i]);
finally
L.Free;
end;
end;
Ich habe die Temporäre StringList in den Classen Kopf verschoben.
Es reicht, wen man diesen einmal im Constructer erzeugt. Im Destructer wird der Speicher wieder frei gegeben.
Sogar der AutoScroll scheint zu funktionieren. Wenigstens mit Linux, mit Windows nicht getestet.
Die Nummer die man im Text sieht, sind nur zur Kontrolle.
Siehe Anhang.
Mathias hat geschrieben:Ist es möglich in SynEdit jedem Zeichen eine andere Farbe zu zuordnen ?
Leider nicht.
Verschiedene Möglichkeiten:
Eigener Highlighter => Beispiel auf der Wiki
Oder SynAnySyn Highlighter => Vorsicht: Langsam.
Markup: TSynEditMarkupHighlightAll / TSynEditMarkupHighlightAllMulti
Man kann einzelnen Wörern/WortGruppen/WortTeilen/... (solange alles in einer Zeile) Farben zuweisen.
Kannst du nicht eine temp StringList benutzen, der du per .Text den String cs zuweist. Im nächsten Schritt durchläufst du die Stringliste Zeile für Zeile und hängst jede an die Lines des SynEdit:
procedure TForm1.Button1Click(Sender: TObject);
var
L: TStrings;
i: Integer;
lc: Integer;
begin
L := TStringList.Create;
try
L.Text := cs;
if L.Count = 0 then
exit;
// Sonderbehandlung bis zum ersten Linebreak in cs: direkt an die letzte Zeile im SynEdit anhängen
lc := SynEdit1.Lines.Count - 1;
SynEdit1.Lines[lc] := SynEdit1.Lines[lc] + L[0];
// alle folgenden Zeilen als neue Zeilen ins SynEdit anhängen
for i:= 1 to L.Count-1 do
SynEdit1.Lines.Add(L[i]);
finally
L.Free;
end;
end;
Ich musste die Funktion noch ein wenig modifizieren. Wen man SynEdit1.Clear macht, führte dies zum Absturz.
Ich habe eine Prüfung eingebaut, jetzt schein es zu funktionieren.
SLCount := SynEdit1.Lines.Count - 1;
if SLCount < 1 then begin
SynEdit1.Lines.Add(TempSL[0]);
end else begin
SynEdit1.Lines[SLCount] := SynEdit1.Lines[SLCount] + TempSL[0];
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Noch etwas musste ich einbauen. Es wurde das letzte LineEnding verschluckt.
Ich manche eine einfache Prüfung, ob das letzte Zeichen im Puffer zu einem LineEnding gehört.
Perfekt ist es aber immer noch nicht. Wen der Zufall es will, und der Puffer am Ende genau zwischen dem 13 und 10 abschneidet, gibt es ein Doppel LineEnding.
rocedure TSerial_Monitor_Form.Timer1Timer(Sender: TObject);
var
bufCount, SLCount, i: integer;
begin
Timer1.Enabled := False;
try
bufCount := SerReadTimeout(SerialHandle, ReadBuffer, Length(ReadBuffer) - 1, SpinEdit_TimeOut.Value);
if bufCount > 0 then begin
ReadBuffer[bufCount] := 0;
TempSL.Text := PChar(@ReadBuffer[0]);
SLCount := SynEdit1.Lines.Count - 1;
if SLCount < 1 then begin
SynEdit1.Lines.Add(TempSL[0]);
end else begin
SynEdit1.Lines[SLCount] := SynEdit1.Lines[SLCount] + TempSL[0];
end;
for i := 1 to TempSL.Count - 1 do begin
SynEdit1.Lines.Add(TempSL[i]);
end;
if ReadBuffer[bufCount - 1] in [10, 13] then begin // neu
SynEdit1.Lines.Add('');
end;
if CheckBox_AutoScroll.Checked then begin
SynEdit1.CaretY := SynEdit1.Lines.Count;
end;
end;
finally
Timer1.Enabled := True;
end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Da werde ich wohl nicht drum kommen.
Ich werde die Zeichen manuell suchen und dann Block für Blöck in die SynEdit schreiben.
Dafür kann ich auf die temporäre Stringlist verzichten.
Mit