Показать сообщение отдельно
  #7  
Старый 24.11.2014, 17:35
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Здравствуйте.
А в
Код:
LVN_COLUMNCLICK : ListView_SortItems(LV, @CompareFunc, PNMLISTVIEW(lParam).iSubItem);
оставить так(3 параметр?)?

Код:
LVSize: Integer;   
isSorted: Boolean;

Где они еще используются?
isSorted - прямая, обратная сортировка.
LVSize = я так понимаю, клик по SubItem.

Забыл: У меня только строки.

Кликаю по колонке №0- - нет сотировки. Кликаю по любой другой -- сортирует по №0.
что не так?

заполняю:
Код:
var
 item : tLVITEM;
...


for zz := 0 to 10 do
          begin
            FillChar(item, sizeof(item), 0 );
                  item.mask := LVIF_TEXT;
                  item.iItem := ListView_GetItemCount(lv);
                  item.pszText := PChar(inttostr(zz));            
                  ListView_InsertItem(LV, Item);
                  for b := 1 to 7 do
                    begin
                      item.iSubItem := b;
                      item.pszText  := PChar(nttostr(random(100)));
                      ListView_SetItem(LV, item);
                    end;
          end;

Код:
LVN_COLUMNCLICK:
            begin
              if (LVSize = PNMLISTVIEW(lParam).iSubItem) then // Если это та же самая колонка - меняем направление сортировки
                isSorted := not isSorted
              else                                             // иначе - прямая сортировка
                isSorted := False;
              LVSize := PNMLISTVIEW(lParam).iSubItem;

              ListView_SortItems(LV, @CompareFunc, PNMLISTVIEW(lParam).iSubItem);
            end;

Код:
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(LV, lParam1, 0), LV_GetItemText(LV, lParam2, 0));
  end
  else if Column = LVSize + 1 then
  {begin
    try
      Size1 := StrToInt(Copy(LV_GetItemText(LV, lParam1, Column), 1, Pos(' ', LV_GetItemText(LV, lParam1, Column)) - 1));
      Size2 := StrToInt(Copy(LV_GetItemText(LV, lParam2, Column), 1, Pos(' ', LV_GetItemText(LV, lParam2, Column)) - 1));
      Result := Size1 - Size2;
    except
      Result := 0;
    end;
  end
  else }
  begin
    St1 := LV_GetItemText(LV, lParam1, Column);
    St2 := LV_GetItemText(LV, lParam2, Column);
    Result := AnsiCompareText(St1, St2);
    if (St1 = '') or (St2 = '') then
      Result := 0;
  end;  //  SetWindowText(Form, IntToStr(LVSize)); }

  if isSorted then
    Result := Result
  else
    Result := -Result;
end;
Ответить с цитированием