Originally Posted by
GolezTrol
En als er ook tekst bij staat, dan kun je CustomSort gebruiken met
GTSmartCompare gebruiken. De inspringing laat wat te wensen over, maar dat is te wijten aan een highlighter die niet zo forward compatible is. Excuses daarvoor.
Delphi Code:
function GTSmartCompare(List: TStringList; Index1, Index2: Integer): Integer;
procedure ExtractPart(var s: string; out Result: string; out Numbers: Boolean);
var
n: integer;
begin
Numbers := False;
n := 1;
while (s[n] in ['0'..'9']) and (n <= Length(s)) do
Inc(n);
{ if n > 1 dan stonden er cijfers aan't begin }
if n > 1 then
begin
Result := Copy(s, 1, n - 1);
Delete(s, 1, n - 1);
Numbers := True;
end //if
else
begin
{ Geen cijfers }
n := 1;
while (not (s[n] in ['0'..'9']) ) and (n <= Length(s)) do
Inc(n);
if n > 1 then
begin
Result := Copy(s, 1, n - 1);
Delete(s, 1, n - 1);
end
end; //else
end; //ExtractPart()
function CompareNextPart(var s1, s2: string): Integer;
var
n1, n2: Boolean;
p1, p2: string;
begin
{ Knipt elke keer het volgende stukje om te vergelijken }
ExtractPart(s1, p1, n1);
ExtractPart(s2, p2, n2);
{ Allebei getallen? Dan numeriek vergelijken, anders alfabetisch }
if n1 and n2 then
Result := StrToInt(p1) - StrToInt(p2)
else
Result := StrIComp(PChar(p1), PChar(p2));
end; //CompareNextPart()
var
str1, str2, ext1, ext2: string;
begin
Result := 0;
{ Voor 'normaal' vergelijken
str2 := List[Index1];
str2 := List[Index2];
Voor vergelijken van bestandsnamen }
ext1 := ExtractFileExt(List[Index1]);
ext2 := ExtractFileExt(List[Index2]);
str1 := ChangeFileExt(List[Index1], '');
str2 := ChangeFileExt(List[Index2], '');
//msg := str1 + '; ' + str2;
while (str1 <> '') and (str2 <> '') and (Result = 0) do
Result := CompareNextPart(str1, str2);
{ De vergelijking heeft geen verschillen gevonden op numeriek vlak,
dus checken we nog een keer op de 'normale' manier. }
if Result = 0 then
Result := StrIComp(PChar(List[Index1]), PChar(List[Index2]));
{ Nog steeds geen verschillen? Dan hakken de extenties de knoop door }
if Result = 0 then
Result := StrIComp(PChar(ext1), PChar(ext2));
end; //GTSMartCompare
Zo dus? In jouw code zag ik een aantal ends teveel en ook een aantal keer "endelse", ken ik dat nog niet of was de code niet op fouten gecontroleerd?
Bookmarks