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=0then 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:=1to L.Count-1do 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=0then 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:=1to L.Count-1do 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.
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.
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