Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как самому определить метод сортировки TStringList?

01.01.2007
{ 
 
Suppose you have a TListBox containing some date values.
 
If you want to sort the dates by setting the "Sorted"
  property to
"True" you will see that the dates are not sorted correctly:
 
 
12.03.2003
 
13.03.2003
 
29.01.2003
 
30.03.2003
 
 
Now what you can do is to is create a TStringlist, Assign the listbox.Items
  property to it
, sort the stringlist using CustomSort,
 
then Assign it back to listbox.items.
}
 
 
 
function CompareDates(List: TStringList; Index1, Index2: Integer): Integer;
 
var
   d1
, d2: TDateTime;
 
begin
   d1
:= StrToDate(List[Index1]);
   d2
:= StrToDate(List[Index2]);
   
if d1 < d2 then
     
Result := -1
   
else if d1 > d2 then Result := 1
   
else
     
Result := 0;
 
end;
 
 procedure TForm1
.Button1Click(Sender: TObject);
 
var
   sl
: TStringList;
 
begin
   sl
:= TStringList.Create;
   
try
     
// listbox1.Sorted := False !
    sl
.Assign(listbox1.Items);
     sl
.CustomSort(CompareDates);
     listbox1
.Items.Assign(sl);
   
finally
     sl
.Free
   
end;
 
end;
 
 
end.
 
 
 
{********************************************************************}
 
{ To sort Integer values:}
 
 
function CompareInt(List: TStringList; Index1, Index2: Integer): Integer;
 
var
   d1
, d2: Integer;
   r1
, r2: Boolean;
 
   
function IsInt(AString : string; var AInteger : Integer): Boolean;
   
var
     
Code: Integer;
   
begin
     
Val(AString, AInteger, Code);
     
Result := (Code = 0);
   
end;
 
 
begin
   r1
:=  IsInt(List[Index1], d1);
   r2
:=  IsInt(List[Index2], d2);
   
Result := ord(r1 or r2);
   
if Result <> 0 then
   
begin
     
if d1 < d2 then
       
Result := -1
     
else if d1 > d2 then
       
Result := 1
     
else
     
Result := 0;
   
end else
   
Result := lstrcmp(PChar(List[Index1]), PChar(List[Index2]));
 
end;
 
 procedure TForm1
.Button1Click(Sender: TObject);
 
var
   sl
: TStringList;
 
begin
   sl
:= TStringList.Create;
   
try
     
// listbox1.Sorted := False;
    sl
.Assign(listbox1.Items);
     sl
.CustomSort(CompareInt);
     listbox1
.Items.Assign(sl);
   
finally
     sl
.Free;
   
end;
 
end;

Взято с сайта: https://www.swissdelphicenter.ch