Hi,
also ihr kennt sicher das Problem, dass immer mal wieder auftritt, dass man Strings nach bestimmten Trennzeichen Trennen muss. Als ich heute morgen kam mir die Frage, wieso nicht eine allgemeine Funktion schreiben, die all diese Problemstellungen erschlägt.
Hier kommt der Code:
Delphi-Quellcode:
{-----------------------------------------------------------------------------
Description: Zerteilt einen String; Zerteilung erfolgt anhand von
Teilstrings, die nicht mit ausgegeben werden
Author: Alexander Roth
Procedure: DivideList
Arguments: s:string; const Separator, DivideList:TStrings
-----------------------------------------------------------------------------}
procedure DivideList(s:string; const Separator, DivideList:TStrings);
function FindNext:TPoint; // sucht den als ersten vorkommenden Seperator
var i:integer;
tempstelle:integer;
schongefunden:boolean; // führe ich ein, damit er auf jeden Fall
// die 1. Fundstelle aufschreibt
begin
schongefunden:=false;
result.y:=0;
result.x:=0;
for i:=0 to Separator.Count-1 do begin
tempstelle:=pos(Separator.Strings[i], s);
//schreibt die als nächstes kommende Trennzeichenstelle auf
if (tempstelle > 0)
and ((tempstelle < result.y) or not schongefunden) then
// es darf niemals sein dass er eine stelle
// aufschreibt die nicht da ist
begin
schongefunden:=true;
result.y:=tempstelle;
result.x:=i;
end;
end;
end;
var tempS:string;
find:TPoint; // y = Fundstelle, x = Index des Separators;
// hier habe ich keinen eigenen Typ gewählt,
// der übersichtlicher wäre, um die Implementierung des
// Codes einfacher zu gestalten
begin
if assigned(Separator) and assigned(DivideList) then
begin
if (s <> '') and (Separator.Count > 0) then // falls man irgendwelche
// schrottige Angaben gemacht hat
// wird man hier rausgeworfen
begin
find:=FindNext;
while (find.y > 0) and (length(s) > 0) do
begin
tempS:=copy(s, 1, find.Y-1);
if length(tempS) > 0 then
DivideList.Append(tempS);
delete(s, 1, find.y-1 + length(Separator[find.x]));
find:=FindNext;
end;
if length(s) > 0 then
DivideList.Append(s);
end;
end;
end;
Eine klitzekleine Procedur um den Code zu testen:
Delphi-Quellcode:
procedure DemoDivideString;
const s = ',;,hallo|;guda,ggt;ds|gh,d;,;;;,f;,g,';
var StrList, NewList:TStringlist;
i:integer;
begin
StrList:=TStringlist.Create;
NewList:=TStringlist.Create;
try
StrList.Append(',');
StrList.Append(';');
StrList.Append('|');
DivideString(s, StrList, NewList);
for i :=0 to NewList.Count-1 do
ShowMessage(
NewList.Strings[i]+#13+
inttostr(length(NewList.Strings[i]))
);
finally
NewList.free;
StrList.free;
end;
end;
Ich bin sicher ich habe den ein oder anderen Fehler übersehen, oder hätte das ein oder andere eleganter/sicherer gestalten können.
Gruß Alexander
PS: Bitte verzeiht mir meine Deutsch Englisch Mischung
, aber ich versuche halt so viel wie möglich in Englisch zu machen, gebrauche aber dann doch hin und wieder Deutsche Begriffe.
[edit=Matze]Überarbeitete Version von omata eingefügt. Mfg, Matze[/edit]
[edit=JasonDX] Auf Wunsch von Alexander eine korrigierte Version eingefuegt. Mfg, JasonDX[/edit]
[edit=CalganX]Auf Wunsch nochmal eine Korrektur eingefügt. Mfg, CalganX[/edit]