mschnell hat geschrieben:theo hat geschrieben:Gerade bei pos() oder posex() kommt es doch eigentlich gar nicht drauf an.
n := pos('B', 'ÄB'); ==> n=3 ==> ?????
-Michael
Na und? Mach ein Real-Life Beispiel. Wenn lilebor zählen will, wie oft ein String vorkommt -> kein Problem.
Wenn er den String ersetzen will (obwohl es dafür bessere Prozeduren gäbe) -> kein Problem.
Du bringst immer ziemlich künstliche Beispiele. Wer will schon wirklich wissen, bei welchem Byte ein Zeichen steht? (ausser du?
Das ist doch auch nur eine Konvention.
Wie du vllt. weisst, versuche ich seit Jahr und Tag einen Rich-Editor zu schreiben. (Wird wahrsch. auch noch Jahre und Tage dauern

Ich habe den auch anfänglich mit intern WideString gebastelt. Das ist ja auch kein Problem, man muss nur bei TextOut und KeyPress umwandeln.
Kürzlich habe ich den ganzen Krempel in ein paar Stunden auf intern UTF-8 umgeschrieben (Um Speicher und Umwandlungen zu sparen)
Eigentlich waren das nur ein paar wenige Funktionen.
Das einzige was ich neu erfinden musste war diese Funktion:
Code: Alles auswählen
function UTF8CharLenAtBytePos(p: PChar; BytePos: integer): byte;
var i: integer;
begin
inc(p, BytePos);
Result := UTF8CharacterStrictLength(p);
if Result > 0 then exit;
if BytePos > 5 then i := 5 else i := BytePos;
while i > 0 do
begin
dec(p);
Result := UTF8CharacterStrictLength(p);
if Result > 0 then exit;
dec(i);
end;
Result := 0;
end;
..um bei einem Cursor-Left die Anfangsposition des UTF-8 Buchstabens zu finden.
Wie du dir vielleicht vorstellen kannst, ist ein Rich-Text Editor so ziemlich die maximale Anforderung an dieses Thema.
Muss man doch immerhin z.B. die Cursor Position mit dem zugrundeliegenden UTF-8 Text synchronisieren.
Aber irgendwie ist das alles halb so wild. Zwei drei Funktionen und das klappt.
Geschwindigkeit ist overall eher besser.