Moin Helmi,
zu dem hier
Delphi-Quellcode:
SetLength(S_Text, length(Text));
S_Text := '';
fällt mir leider nur ein Wort ein: Sinnbefreit
Ist nicht böse gemeint, denn schliesslich kann man nicht alles wissen.
Durch das SetLength sorgst Du dafür, dass S_Text soviele Zeichen aufnehmen kann, wie Text lang ist, und mit S_Text := '' bringst Du die Länge wieder auf 0.
So wie Du es geschrieben hast (immer das jeweilige Zeichen zum Ergebnisstring addieren) könntest Du SetLength also weglassen...
ABER:
Da Quell- und Zielstring auch nach dem Ersetzen der Zeichen gleich lang sind, solltest Du besser auf das S_Text := '' verzichten, und die Ersetzung anders lösen (auch wenn Deine Lösung wohl schon merklich schneller sein dürfte als die Variante mit StringReplace), Du kannst nämlich einfach die Zeichen, die unverändert bleiben sollen direkt an den Index im Zielstring schreiben, aus dem Du sie aus dem Quellstring gelesen hast.
Ausserdem ist es ungünstig jedesmal in einer Schleife den gesamten String der zu ersetzenden Zeichen durchzugehen, vermutlich wäre hier sogar die Verwendung von Pos schneller. Ich würde es allerdings mit Case lösen:
Delphi-Quellcode:
var
i: Integer;
S_Text: String;
begin
SetLength(S_Text, length(Text));
for i := 1 to length(Text) do begin
case Text[i] of
'ä' : S_Text[i] := chr($84);
'ö' : S_Text[i] := chr($94);
//... usw. bis 'µ', dann
else S_Text[i] := Text[i];
end;
end;
Serial.TransmittText(S_Text);
end;
Über die Reihenfolge musst Du Dir keine Gedanken machen, dass sortiert der Compiler schon so, dass die Case-Anweisung möglichst schnell durchlaufen wird.
Mit ein wenig mehr Aufwand könnte man das Ganze auch für Ersetzungen umbauen, die nicht 1:1 sind.