function CompareFunc(lParam1, lParam2, SortType : Longint) : Integer; stdcall;
var
lvi : LV_ITEM;
Size1,
Size2 : Integer;
Column : Word;
St1, St2 : String;
begin
Column := LOWORD(SortType);
lvi.mask := LVIF_TEXT;
if Column = 0 then
begin
Result := AnsiCompareText(LV_GetItemText(hLV, lParam1, 0), LV_GetItemText(hLV, lParam2, 0));
end
else if Column = LVSize + 1 then
begin
try
Size1 := StrToInt(Copy(LV_GetItemText(hLV, lParam1, Column), 1, Pos(' ', LV_GetItemText(hLV, lParam1, Column)) - 1));
Size2 := StrToInt(Copy(LV_GetItemText(hLV, lParam2, Column), 1, Pos(' ', LV_GetItemText(hLV, lParam2, Column)) - 1));
Result := Size1 - Size2;
except
Result := 0;
end;
end
else
begin
St1 := LV_GetItemText(hLV, lParam1, Column);
St2 := LV_GetItemText(hLV, lParam2, Column);
Result := AnsiCompareText(St1, St2);
if (St1 = '') or (St2 = '') then
Result := 0;
end;
if isSorted then
Result := Result
else
Result := -Result;
end;
procedure DrawColumnImage(hHeader : HWND; Column : Integer; bmp : Integer);
var
Item : THDITEM;
begin
FillChar(Item, SizeOf(ThdItem), 0);
Item.Mask := HDI_FORMAT;
if (not Header_GetItem(hHeader, Column, Item)) then
Exit;
if (Bmp = 0) then
begin
Item.mask := HDI_FORMAT;
Item.fmt := Item.fmt and not (HDF_BITMAP or HDF_BITMAP_ON_RIGHT);
end
else
begin
Item.mask := Item.Mask or HDI_BITMAP;
Item.fmt := Item.fmt or HDF_BITMAP or HDF_BITMAP_ON_RIGHT;
Item.hbm := Bmp;
end;
Header_SetItem(hHeader, Column, Item);
end;
procedure SortItems(hList : HWND; Column, bmArUp, bmArDn : Integer);
var
hHeader : HWND;
Item : THDITEM;
I : Integer;
St : String;
bm : Integer;
begin
hLV := hList;
St := '';
for I := 0 to LV_Count(hList) - 1 do
St := St + LV_GetItemText(hList, I, Column);
if (St = '') then
begin
hHeader := ListView_GetHeader(hList);
if (hHeader = 0) then
Exit;
DrawColumnImage(hHeader, 0, 0);
Exit;
end;
hHeader := ListView_GetHeader(hList);
if (hHeader = 0) then
Exit;
if Column = SortColumn then
isSorted := not isSorted
else
begin
SortColumn := Column;
isSorted := True;
end;
if (Column <> -1) then
begin
FillChar(Item, SizeOf(THDITEM), 0);
Item.mask := Item.mask or HDI_LPARAM;
if (not Header_GetItem(hHeader, Column, Item)) then
Exit;
Item.lParam := not Item.lParam;
Header_SetItem(hHeader, Column, Item);
end;
for I := 0 to LV_Count(hList) - 1 do
begin
if I <> Column then
bm := 0
else
begin
if isSorted then
bm := bmArUp
else
bm := bmArDn;
end;
DrawColumnImage(hHeader, I, bm);
end;
if (Column <> -1) then
ListView_SortItems(hList, @CompareFunc, MAKELONG(Column, ord(isSorted)));
end;