Автор: 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])