Автор: Ramazan
Дата сообщения: 11.06.2009 12:05
		RS85 
 Функция CompareProc - callback-функция, которая возвращает результат сравнения двух элементов списка: -1, если первый элемент должен быть расположен выше, 0, если на одном уровне (без разницы, в каком порядке), +1, если второй элемент должен быть выше. Непосредственно ее вызывать не нужно, ее адрес должен быть передан в метод CustomSort у списка (ListView), а собственно сортировку выполняет уже CustomSort. 
 Можно вызвать и ListView.CustomSort(nil, 0), в этом случае необходимо определить обработчик OnCompare (см. текст [more=тестового модуля] 
  
  
 unit Unit16; 
  
 interface 
  
 uses 
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
   Dialogs, ComCtrls, ImgList, StdCtrls; 
  
 type 
   TForm16 = class(TForm) 
     ListView: TListView; 
     ImageList: TImageList; 
     btn: TButton; 
     procedure btnClick(Sender: TObject); 
     procedure ListViewCompare(Sender: TObject; Item1, Item2: TListItem; Data: 
         Integer; var Compare: Integer); 
   private 
     { Private declarations } 
   public 
     { Public declarations } 
   end; 
  
 var 
   Form16: TForm16; 
  
 implementation 
  
 {$R *.dfm} 
  
 function CompareProc(Item1, Item2: Integer; Data: Integer): Integer; stdcall; 
 begin 
   if TListItem(Item1).ImageIndex = TListItem(Item2).ImageIndex then 
     Result := AnsiCompareText(TListItem(Item1).Caption, TListItem(Item2).Caption) 
   else 
     // Предполагается, что ImageIndex папки равен 0 
     if TListItem(Item1).ImageIndex = 0 then Result := -1 else Result := +1; 
 end; 
  
 procedure TForm16.btnClick(Sender: TObject); 
 begin 
   ListView.CustomSort(CompareProc, 0); 
 end; 
  
 procedure TForm16.ListViewCompare(Sender: TObject; Item1, Item2: TListItem; 
     Data: Integer; var Compare: Integer); 
 begin 
   if Item1.ImageIndex = Item2.ImageIndex then 
     Compare := AnsiCompareText(Item1.Caption, Item2.Caption) 
   else 
     if Item1.ImageIndex = 0 then Compare := -1 else Compare := +1; 
 end; 
  
 end. 
 [/more])