Moin -lx-,
sollte Dir jetzt auffallen, dass die Performance nicht sonderlich ist, kannst Du die Konvertierung auch zweistufig machen.
Durch das ständige anfügen von Zeichen an einen String wird oft auch ständig neuer Speicher angefordert, und das bisherige Ergebnis umkopiert.
Wenn Du erst die erforderliche Länge ermittelst, dann einen entsprechend grossen Buffer für das Ergebnis einrichtest, und dann erst das Ergebnis ermittelst kannst Du (hängt auch vom jeweilige Umfang des Textes ab), die Geschwindigkeit erhöhen.
Das nur als Info am Rande, mit einem kleinen Beispiel, da ich mir vorstellen kann, dass es für den Anfang sonst schwer nachvollziehbar ist:
Delphi-Quellcode:
function Konvert(const AsValue : string) : string;
// AsValue statt Text, da dies als häufig verwendeter Name
// für eine Eigenschaft zu Verwechslungen führen kann
var
sResult : string;
iCount : integer;
iIndex : integer;
pPos : PChar;
begin
Result := '';
if AsValue = '' then exit;
iCount := 0;
for iIndex := 1 to length(AsValue) do begin
case AsValue[iIndex] of
'ä' : inc(iCount,6); // um 6 erhöhen, da ä sechs Zeichen lang ist
'Ä' : inc(iCount,6);
// usw.
else inc(iCount); // wenn es kein Sonderzeichen ist, wird es direkt übernommen, also nur +1
end;
end;
SetLength(sResult,iCount+1); // Es werden iCount Zeichen benötigt
// +1, da die im Folgende benutzte Funktion
// am Ende noch eine #00 hinzufügt
pPos := @sResult[1];
for iIndex := 1 to length(AsValue) do begin
case AsValue[iIndex] of
'ä' : pPos := StrLCopy(pPos,PChar('ä'),6)+6; // +6, um auf die nächst Position zu kommen
'Ä' : pPos := StrLCopy(pPos,PChar('Ä'),6)+6;
else pPos := StrLCopy(pPos,@AsValue[iIndex],1)+1;
end;
end;
Result := sResult;
end;
Das nur als Beispiel, denn mit festen Werten sollte man tunlichst nicht arbeiten (z.B. 'ä', 'ä' usw.) damit man diese Daten dann ein einer zentralen Stelle ändern kann, und um Tippfehler zu vermeiden.
Man könnte so die Konfiguration für die Konvertierung auch in einer Konfigurationsdatei halten, und kann so die Umwandlung ergänzen/ändern, ohne das Programm anfassen zu müssen.
Wie gesagt, dass nur als zusätzliche Info, die "einfache" Variante sollte auch erst einmal genügen.
Nur solltest Du eben nicht direkt mit Result arbeiten, sondern einer Hilfsvariablen, die dann das Ergebnis aufnimmt, und zum Schluss an Result zugewiesen wird.
@Corelgott,
Zitat von
Corelgott:
StringReplace hat aber den Vorteil, dass man nicht jedes Zeichen einzeln durchgehen muss...
dafür ist es dann aber verhältnismässig resourcenfressend
Damit muss man den Komfort dann eben "bezahlen".
Zitat von
Corelgott:
Aber ich persönlich finde es dennoch unschön, "im Ergebnis" herrum zu rechnen.
Das wollte ich auch zum Ausdruck gebracht haben.
Zugegeben, die Verwendung von Exit widerspricht dem Prinzip, dass eine Funktion nur einen Ein- und einen Ausgang haben soll, es kann aber
IMHO dennoch die Lesbarkeit verbessern.