Показать сообщение отдельно
  #6  
Старый 24.11.2014, 00:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Взято из действующей программы
Код:
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;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием