Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.114 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Eigene Funktion erstellen

  Alt 22. Jan 2006, 16:23
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat