mal wieder brauche ich einen Denkanstoß. Ich muss die Länge eines Texts in einem TMemo kontrollieren, und zwar in Bytes, nicht in Characters, weil der Text später in eine Datei mit fester Blockgröße eingepasst werden muss. MaxLength im Memo zählt aber nur Zeichen, und die können 1 - 4 Bytes lang werden. Umlaute haben z.B. 2 Bytes. Siehe Beispielprojektchen: MaxLength steht auf 60, gebe ich 60 Umlaute ein, bekomme ich 120 Bytes zurück. Blöd.
Ich habe dann versucht, dagegen zu halten:
Code: Alles auswählen
procedure TForm1.Memo1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
var
x:integer;
begin
if UTF8Key < #32 then exit; // pass through control characters
x := length(UTF8Key);
If Memo1.GetTextLen + x > Memo1.MaxLength then UTF8Key := #0; // ignore this character
end;
Aber keine Lösung ohne neues Problem: das funktioniert leider nicht mit der Zwischenablage. Fülle ich die Zwischenablage z.B. mit einem japanischen Text (von hier: https://www.branah.com/japanese), kommen - da japanische Zeichen mit 3 Bytes codiert werden - 180 Bytes ins Memo geflogen. Die werden richtig angezeigt, aber das hilft mir nicht, sobald ich das Memo wegspeichern möchte bekomme ich ein Problem. Dann abhacken oder das Speichern verweigern ist natürlich möglich, begeistert mich aber natürlich nicht.
Wie kann ich das Problem lösen, die Länge schon bei der Eingabe zu beschränken?
HG, Armin.
P.S: Ich habe natürlich versucht, die Memo1.PasteFromClipboard Methode *irgendwie* durch eine eigene zu ersetzen, die Idee ist naheliegend: erst ins Clipboard schauen wie lang der Text dort ist, und dann entweder *irgendwie* abhacken, oder den Paste verweigern wenn es sich nicht mehr ausgeht. Hab ich leider nicht hinbekommen. Ich habe den Code mit dem ich es versucht habe mal im Projekt stehen lassen, mal sehen wie weit ich von der Lösung entfernt war
