Registriert seit: 18. Mär 2005
1.682 Beiträge
Delphi 2006 Enterprise
|
Re: Natürliche Sortierung
19. Jun 2005, 17:10
Hallo,
so, ich hatte etwas Zeit und hab das hier zustande gebracht:
Delphi-Quellcode:
function Compare(List: TStringList; Index1, Index2: Integer): Integer;
var
Start1, Start2: Integer;
S1, S2: String;
N1, N2: Boolean;
Item1, Item2: String;
function IsDigit(C: Char): Boolean;
begin
Result := (C in ['0'..'9']);
end;
function GetNext(S: String; var Start: Integer; var IsNumber: Boolean): String;
var
StringLaenge: Integer;
C, Laenge: Integer;
begin
Result := '';
StringLaenge := Length(S);
if Start > StringLaenge then
Exit;
// Beginnt eine Zahl?
IsNumber := IsDigit(S[Start]);
Laenge := 1;
for C := Start + 1 to StringLaenge do
begin
// Weiterhin eine Zahl/ein Wort?
if IsDigit(S[C]) = IsNumber then
Inc(Laenge)
else
Break;
end;
Result := Copy(S, Start, Laenge);
Inc(Start, Laenge);
end;
begin
Result := 0;
Item1 := List[Index1];
Item2 := List[Index2];
// Beide gleich -> Raus hier
if Item1 = Item2 then
Exit;
Start1 := 1;
Start2 := 1;
// Alle Teile durchgehen
repeat
// Teile holen
S1 := GetNext(Item1, Start1, N1);
S2 := GetNext(Item2, Start2, N2);
// Haben wir zwei Zahlen?
if N1 and N2 then
begin // Ja -> Zahlen Vergleichen
Result := StrToInt(S1) - StrToInt(S2);
end else
begin // Nein -> Normaler Stringvergleich
if List.CaseSensitive then
Result := AnsiCompareStr(S1, S2)
else
Result := AnsiCompareText(S1, S2);
end;
until (Result <> 0) or
(Start1 > Length(Item1)) or
(Start2 > Length(Item2));
end;
Gruß
xaromz
|
|
Zitat
|