TStrings.BeginUpdate/EndUpdate
werden nur die Ereignisse OnChanging
und OnChanged
verbieten. Es hat keinen Einfluss auf die interne Bearbeitung der Änderungen am Inhalt selbst.
TMemo.Lines
wird von TMemoStrings
implementiert, die den Textinhalt im Window-Steuerelement selbst speichert. Also BeginUpdate/EndUpdate
ist hier ziemlich nutzlos.
Sie können bessere Ergebnisse erhalten, indem eine lokale TStringList
Instanz verwendet wird, und mit Hilfe der Text
Eigenschaft der Daten von TMemo
zu TStringList
und zurück zu kopieren. Die Eigenschaft ist die effizienteste Möglichkeit, auf den gesamten Inhalt einer TMemo
gleichzeitig zuzugreifen.
lst := TStringList.Create;
try
lst.Text := Memo1.Lines.Text;
for I := 0 to lst.Count - 1 do begin
lst[I] := SomeTrim(lst[I]);
end;
Memo1.Lines.Text := lst.Text;
finally
lst.Free;
end;
Hinweis: erwähnen Einige Kommentare Assign
anstelle der Text
Eigenschaft zu verwenden, wenn der Inhalt von und zu dem Memo zu kopieren: Assign
ist in diesem Fall wesentlich langsamer aufgrund einer internen Optimierung der Text
Eigenschaft für TMemoLines
. Getter und Setter dieser Eigenschaft greifen direkt auf das Windows-Steuerelement mit einer einzigen WM_GETTEXT/WM_SETTEXT-Nachricht zu, während Assign
eine EM_GETLINE-Nachricht pro Zeile zum Lesen und eine Sequenz von EM_LINEINDEX, EM_SETSEL, EM_LINELENGTH und EM_REPLACESEL pro Zeile zum Schreiben verwendet. Ein einfacher Timing-Test zeigt, dass der obige Code ungefähr 600 ms benötigt, während das Ersetzen der Zuweisungen durch Assign
Aufrufe mehr als 11 Sekunden benötigt!
Schlechter Benutzer, der eine solche Notiz scrollen wird. – Victoria
PS: Die aktuelle Lösung besteht darin, die Zeilen einer TStringList zuzuordnen, sie zu verarbeiten und sie wieder in das Memo einzufügen. Aber ich bin immer noch neugierig, warum BeginUpdate nicht funktioniert. – Ampere
@Victoria - Der Benutzer wird diese Zeilen dort platzieren. Normalerweise erwarte ich unter 100 Zeilen. Ich wollte testen, was mit 100000 passiert. Und das passiert. – Ampere