AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Funktion erstellen

Ein Thema von -lx- · begonnen am 21. Jan 2006 · letzter Beitrag vom 22. Jan 2006
 
Christian Seehase
(Co-Admin)

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

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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz