Einzelnen Beitrag anzeigen

TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.876 Beiträge
 
Delphi 12 Athens
 
#26

Re: String zerlegen

  Alt 15. Mai 2006, 08:45
Ok, hier kommt der Code nochmal kommentiert:

Delphi-Quellcode:
function DoValueList (ZeiKett:string) : TStringList;
// ****************************************************************************
// Auflösen einer Zeichenkette des Formates "NAME1=WERT1 NAME2=WERT2
// NAME3=WERT3 ......"
// in eine StringList
// ****************************************************************************
// erstellt von Thomas Breitkreuz
// email: [email]tbreitkreuz@breitkreuz-datentechnik.de[/email]
// Codeschnippsel zur Benutzung für Jedermann freigegeben
// ****************************************************************************
var
  s : String;
  i : integer;
begin
  s := ZeiKett;
  Result := TSTringList.Create;
  // ausführen, solange NAME=VALUE - Paare vorhanden sind (diese werden wärend
  // der Bearbeitung laufend aus der Zeichenkette gelöscht
  while pos ('=', s) > 0 do
  begin
    i := Length (s);
    // vom Ende des Strings an solange zurückgehen, bis ein = Zeichen ohne
    // führendes Leerzeichen gefunden wird, es wird davon ausgegangen, daß
    // das = Zeichen dem NAME unmittelbar folgt, dadurch können auch
    // = Zeichen in den Values vorhanden sein, sofern ein Leerzeichen vorgesetzt
    // ist
    while (s[i] <> '=') or (s [i-1] = ' ') do dec (i);
    // nun wird von dem gefundenen = Zeichen aus das nächste Leerzeichen bzw.
    // der Anfang der Zeichenkette gesucht, es wird davon ausgegangen, daß
    // jedem NAME, der nicht am Anfang der Zeichenkette steht, ein Leerzeichen
    // vorausgeht
    while ((i > 0) and (s [i] <> ' ') ) do dec (i);
    // Jetzt wird das gefundene NAME=VALUE-Paar als ersten Eintrag in die
    // Resultliste eingefügt
    Result.Insert(0, Trim(copy (s, i+1, Length (s))));
    // und dann aus der Zeichenkette gelöscht
    delete (s, i +1, Length (s));
    // sollte vor dem ersten NAME=VALUE-Paar noch etwas stehen, so wird dies
    // hier ausgeschnitten und unter dem NAME "$$$TRAILER$$$" in die Resultliste
    // eingefügt
    if (i = 0) and (Length (s) > 0) then
    begin
      Result.Insert(0, '$$$TRAILER$$$=' + Trim (s);
      s := '';
    end;
  end;
end;
Beim Kommentieren ist mir noch eine Unzulänglichkeit aufgefallen: Die Funktion verharrte in einer Endlosschleife, wenn am Anfang der Zeichenkette ein ' =' vor einem "NAME=" vorkam.
Deshalb habe ich noch den Trailer eingeführt.

Ich hoffe, meine Erklärungen sind ausreichend, ansonsten bitte nachfragen.

btw: Hat einer ne Idee, unter welchem Titel man das in die Codelib stellen könnte?

Gruß

Thomas
[Edit] Delphi-Kommentar korrigiert [/Edit]
Thomas Breitkreuz
  Mit Zitat antworten Zitat