Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.11.2014, 17:54
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию Сортировка в ListView WinApi

Здравствуйте.
Как организовать сортировку по клику по колонкам?
Искал в инете, но толкового ни чего не неашел(быть может, искал плохо).
Встречается либо код на С, либо VCL(Аналогичное у меня есть).
Никак не соображу.
Подскажите пожалуйста.
Ответить с цитированием
  #2  
Старый 23.11.2014, 18:20
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

LVM_SORTITEMS
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 23.11.2014, 18:32
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Я так понимаю SendMessage(LV, LVM_SORTITEMS, 0, 0) ?
Ответить с цитированием
  #4  
Старый 23.11.2014, 18:37
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

LVM_SORTITEMS
Цитата:
wParam = (WPARAM) (LPARAM) lParamSort;
lParam = (LPARAM) (PFNLVCOMPARE) pfnCompare;

Parameters

lParamSort

Application-defined value that is passed to the comparison function.

pfnCompare

Pointer to the application-defined comparison function. The comparison function is called during the sort operation each time the relative order of two list items needs to be compared.

Return Values

Returns TRUE if successful or FALSE otherwise.

Remarks

The comparison function has the following form:

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,
LPARAM lParamSort);

The lParam1 parameter is the 32-bit value associated with the first item being compared; and the lParam2 parameter is the value associated with the second item. These are the values that were specified in the lParam member of the items' LV_ITEM structure when they were inserted into the list. The lParamSort parameter is the same value passed to the LVM_SORTITEMS message.
The comparison function must return a negative value if the first item should precede the second, a positive value if the first item should follow the second, or zero if the two items are equivalent.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 23.11.2014, 19:14
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Попытался переделать

Код:
if(nmhdr->code == LVN_COLUMNCLICK)
{
    NM_LISTVIEW *pnm;
    pnm = (NM_LISTVIEW *) lParam; // заполняем структуру NM_LISTVIEW
    
    // сортируем
    ListView_SortItems(pnm->hdr.hwndFrom, // идентификатор окна List View
             CompareListViewProc, // указатель на функцию сравнения
             (LPARAM) (pnm->iSubItem)); // если в функцию сравнения нужно передать какое либо значение, этот параметр для этого. я тут передаю просто номер столбца
    break;
int CALLBACK CompareListViewProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    CHAR Buff1[1024]={0};
    CHAR Buff2[1024]={0};
    LPSTR lpStr1, lpStr2;
    INT iNum1=0, iNum2=0;
    INT iResult, iIndex=0;
 
    LVFINDINFO ItemInfo;
 
    ItemInfo.flags=LVFI_PARAM;
    // копируешь в буфера сравниваемые строки 
    ItemInfo.lParam=lParam1;
    iIndex=ListView_FindItem(hWndListView, -1, &ItemInfo);
    ListView_GetItemText(hWndListView, iIndex, (int)lParamSort, Buff1, sizeof(Buff1));
    lpStr1=Buff1;
 
    ItemInfo.lParam=lParam2;
    iIndex=ListView_FindItem(hWndListView, -1, &ItemInfo);
    ListView_GetItemText(hWndListView, iIndex, (int)lParamSort, Buff2, sizeof(Buff2));
    lpStr2=Buff2;
    
    if(lpStr1 && lpStr2)
    {
        switch(lParamSort) 
        {
            // тут по номеру столбца, делается сравнение
            case 0:
            case 4:
                iResult=strcmpi(lpStr1, lpStr2);
                break;
            
            case 1:
            case 2:
            case 3:
                iNum1 = atoi(lpStr2);
                iNum2 = atoi(lpStr1);
                iResult = iNum2 - iNum1;
                
                break;
 
            default:
                iResult=0;
                break;
        }
    }
    // возврат результата сравнения
    return(iResult);
}


Вот что получилось(в моем Listview 7 колонок):

Код:
LVN_COLUMNCLICK : ListView_SortItems(LV, @CompareFunc, PNMLISTVIEW(lParam).iSubItem);


function CompareFunc(LPARAM1, LPARAM2, lParamSort: Cardinal): Integer; stdcall;
var
  Buff1, Buff2 : array[0..1024] of Char;
   lpStr1, lpStr2 : string;
   iNum1, iNum2, iResult, iIndex : Integer;
   ItemInfo : LV_FINDINFO;
begin


    ItemInfo.flags := LVFI_PARAM;
    // копируешь в буфера сравниваемые строки
    ItemInfo.lParam := lParam1;
    iIndex := ListView_FindItem(LV, -1, &ItemInfo);
    ListView_GetItemText(LV, iIndex, lParamSort, Buff1, sizeof(Buff1));
    lpStr1 := Buff1;

    ItemInfo.lParam := lParam2;
    iIndex := ListView_FindItem(lParamSort, -1, &ItemInfo);
    ListView_GetItemText(lParamSort, iIndex, lParamSort, Buff2, sizeof(Buff2));
    lpStr2 := Buff2;

  //  if(lpStr1 and lpStr2) then

        case (lParamSort)  of

            // тут по номеру столбца, делается сравнение
           //  0:
             0..7:
                iResult := lstrcmp(PChar(lpStr1), PChar(lpStr2));
              //  break;

          //  case 1:
         //   case 2:
         {    3:
                iNum1 = atoi(lpStr2);
                iNum2 = atoi(lpStr1);
                iResult = iNum2 - iNum1;

                break;

            default:  }

              //  break;

    // возврат результата сравнения

        end;  // iResult:=0;
    Result := (iResult);
end;

Поправте пожалуйста, а то чертовщина какято тварится(вроде строки бегают, но не так как надо).
Ответить с цитированием
  #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 в.д.
Ответить с цитированием
  #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;

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

Выклади свой проект.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 25.11.2014, 01:10
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Оставил тока ListView.
Код:
program Project1;

uses
  Windows, Messages, CommCtrl, SysUtils;

var
   WndClassEx : TWndClassEx;
   Form, LV : hwnd;
   MMsg: Msg;
   item : tLVITEM;
   LVSize: Integer;
   isSorted: Boolean;

Const
  LVID = 13;

function LV_GetItemText(hList : HWND; Index, SubItem : Integer) : String;
var
  Buf : array [0..MAX_PATH] of Char;
begin
  ZeroMemory(@Buf, SizeOf(Buf));
  ListView_GetItemText(hList, Index, SubItem, Buf, SizeOf(Buf));
    if Buf[0] <> #0 then
      Result := Buf;
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;

Function WinProc(Forma: hwnd; Msg:  UINT; wparam: WParam; LParam: LPARAM): lresult; Stdcall;
Var
  lvc	: TLVColumn;
  I, zz, B	: Integer;
  rect : TRect;
Begin
  Result := 0;
  Case Msg Of
    WM_GETMINMAXINFO:
      begin
        PMinMaxInfo(LParam)^.ptMinTrackSize := Point(300, 300);
      end;

    WM_CREATE:
      begin
        GetClientRect(Forma, Rect);
        LV :=CreateWindowEx(WS_EX_CLIENTEDGE,'SysListView32', '1', WS_CHILD or WS_VISIBLE or LVS_REPORT or LVS_SHOWSELALWAYS or LVS_SINGLESEL
               , 0, 35, Rect.Right ,Rect.Bottom - 105,Forma, LVID, HInstance, nil);

        SendMessage(lv, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT or LVS_EX_GRIDLINES or LVS_EX_INFOTIP);

         lvc.fmt := LVCFMT_CENTER;
        lvc.mask := LVCF_TEXT or LVCF_WIDTH;
          lvc.pszText := '0';
          lvc.cx := 250;
          lvc.iSubItem := 0;
          ListView_InsertColumn(lv, 0, lvc);

          lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM;
          lvc.pszText := '1';
          lvc.cx := 60;
          lvc.iSubItem := 1;
          ListView_InsertColumn(LV, 1, lvc);

          lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM;
          lvc.pszText := '2';
          lvc.cx := 50;
          lvc.iSubItem := 2;
          ListView_InsertColumn(LV, 2, lvc);

          lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM;
          lvc.pszText := '3';
          lvc.cx := 100;
          lvc.iSubItem := 3;
          ListView_InsertColumn(LV, 3, lvc);

          lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM;
          lvc.pszText := '4';
          lvc.cx := 100;
          lvc.iSubItem := 4;
          ListView_InsertColumn(LV, 4, lvc);

          lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM;
          lvc.pszText := '5';
          lvc.cx := 100;
          lvc.iSubItem := 5;
          ListView_InsertColumn(LV, 5, lvc);

          lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM;
          lvc.pszText := '6';
          lvc.cx := 100;
          lvc.iSubItem := 6;
          ListView_InsertColumn(LV, 6, lvc);

          lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM;
          lvc.fmt := LVCFMT_LEFT;
          lvc.pszText := '7';
          lvc.cx := LVSCW_AUTOSIZE_USEHEADER;//250;
          lvc.iSubItem := 7;
          ListView_InsertColumn(LV, 7, lvc);
      end;

    WM_SIZE: 
    Begin
      GetClientRect(Form, Rect);
      SetWindowPos(LV, 0, 0, 35, Rect.Right, Rect.Bottom - 82, SWP_NOZORDER); 
      SendMessage(LV, LVM_SETCOLUMNWIDTH, 7, LVSCW_AUTOSIZE_USEHEADER);
    End;

   WM_NOTIFY:
    begin
      if PNMHDR(lParam).hwndFrom = LV then
        case {PNMHDR}PNMLISTVIEW(lParam)^.hdr.code of
          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;
        end;
    end;

    WM_SHOWWINDOW:
      begin
        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(inttostr(random(100)));
                      ListView_SetItem(LV, item);
                    end;
          end;
      end;

    WM_DESTROY:
      begin
        PostQuitMessage(0);
      end;
    Else
      Result := DefWindowProc(Forma, Msg, WParam, LParam);
  End;
End;

Procedure WinMain;
Begin
  FillChar(WndClassEx, SizeOf(TWndClassEx), 0);
  WndClassEx.cbSize := SizeOf(TWndClassEx);
  WndClassEx.lpszClassName := 'APIWindow';
  WndClassEx.style := CS_HREDRAW Or CS_VREDRAW;
  WndClassEx.hInstance := HInstance;
  WndClassEx.lpfnWndProc := @WinProc;
  WndClassEx.cbClsExtra := 0;
  WndClassEx.cbWndExtra := 0;
  WndClassEx.hIcon := LoadIcon(HInstance, MakeIntResource('MAINICON'));
  WndClassEx.hIconSm := LoadIcon(HInstance, MakeIntResource('MAINICON'));
  WndClassEx.hCursor := LoadCursor(0, IDC_ARROW);
  WndClassEx.hbrBackground := COLOR_BTNFACE + 1;
  WndClassEx.lpszMenuName := NIL;

  If RegisterClassEx(WndClassEx) = 0 Then
    MessageBox(0, 'Невозможно зарегистрировать класс окна1', 'Ошибка', MB_OK Or MB_ICONHAND)
  Else
  Begin

    Form := CreateWindowEx(0, WndClassEx.lpszClassName, '123', WS_OVERLAPPEDWINDOW, 500,100, 420, 400,  0, 0, HInstance, NIL);
    If Form = 0 Then
      MessageBox (0, 'Окно1 не создалось!',  'Ошибка', MB_OK Or MB_ICONHAND)
    Else
    Begin
      ShowWindow (Form, SW_SHOWNORMAL);

      While GetMessage(MMsg, 0, 0, 0) Do
      Begin
        TranslateMessage(MMsg);
        DispatchMessage(MMsg);
      End;
      Halt(MMsg.WParam);
    End;
  End;
End;

begin
  WinMain;
end.

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

Лучше бы конечно архивом было выложить, но сойдёт и так.

Примерно так:
Вложения
Тип файла: rar stalker.rar (14.7 Кбайт, 7 просмотров)
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 01.12.2014 в 04:53.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Stalker2-42 (25.11.2014)
  #11  
Старый 25.11.2014, 17:39
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Спасибо. SortItems проигнорировал. А про UpdateParam вообще не додумался бы.
Я ваш должник.

Еще вопрос, все про ту же сортировку(ОНА РАБОТАЕТ), В частности про направление сортировки столбцов:

Код:
procedure SortItems(hList : HWND; Column : Integer);
var
  hHeader : HWND;
  Item    : THDITEM;
  I       : Integer;
  St	  : String;
begin
 .....
  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;
end;

bmArUp и bmArDn ??????
Уж простите дурака . Хотелось бы до конца доделать, а то сортировка по какому столбцу и в каком направление, непонятно.

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

Сначала я поставил битмапы, затем убрал. Теперь придётся вновь добавить.

Архив обновлён.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 26.11.2014 в 01:14.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Stalker2-42 (26.11.2014)
  #13  
Старый 26.11.2014, 21:03
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Здравствуйте. Все прекрасно работает. Спасибо.
Ответить с цитированием
  #14  
Старый 01.12.2014, 00:41
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Код:
procedure SortItems(hList : HWND; Column, bmArUp, bmArDn : Integer);
var
  hHeader : HWND;
  Item, ItemA    : THDITEM;
  I       : Integer;
  St	  : String;
  bm      : Integer;
begin
 // hLV := hList;

  St := '';
  for I := 0 to ListView_GetItemCount(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;


    FillChar(ItemA, SizeOf(ThdItem), 0);
  ItemA.Mask := HDI_FORMAT;
  if (not Header_GetItem(hHeader, Column, ItemA)) then
    Exit;
 //  ItemA.mask := HDI_FORMAT;
   ItemA.fmt := ItemA.fmt and not (HDF_BITMAP or HDF_SORTUP or HDF_SORTDOWN);



  for I := 0 to ListView_GetItemCount(hList) - 1 do
    begin
      if I <> Column then
        bm := 0
      else
      begin
        if isSorted then
         // bm := bmArUp
         begin
            ItemA.mask := ItemA.Mask or HDI_BITMAP;
            ItemA.fmt  := ItemA.fmt or HDF_SORTUP ;//Header_SetItem(hHeader, Column, Item);
           // ItemA.hbm  := bmp;
          end
        else
         // bm := bmArDn;
          begin
            ItemA.mask := ItemA.Mask or HDI_BITMAP;
            ItemA.fmt  := ItemA.fmt or HDF_SORTDOWN ;
          //  Item.hbm  := bmp;
          end;
      end;  Header_SetItem(hHeader, Column, ItemA);
      //DrawColumnImage(hHeader, I, bm);SetWindowText(form, IntToStr(bm));
    end;

  if Column <> -1 then
    ListView_SortItems(hList, @CompareFunc, MAKELONG(Column, ord(isSorted)));
end;

как можно исравить? И сделать как в проводнике(стрелочки)?
Ответить с цитированием
  #15  
Старый 01.12.2014, 00:51
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Свой код я ещё писал под Win98, поэтому нужно полистать MSDN.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter