Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Значок направления сортировки в ListView, как его туда добавить? 
V
    Опции темы
v258
Дата 13.2.2017, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 19.7.2005
Где: Краснодарский кра й

Репутация: 2
Всего: 2



Делаю программу, в которой получаю список файлов в ListView. Сделал в числе прочего сортировку по столбцам в режиме vsReport. Все работает, но встал вопрос - как добавить в заголовок столбца иконку стрелочки, указывающей направление сортировки. ListView.Columns[0].ImageIndex не подходит, т.к. уже подключен imageList с системными иконками для отображения значков файлов. Добавить в него свои иконки не получится, т.к. его содержимое меняется динамически в процессе работы программы. 

Как быть?
PM MAIL WWW   Вверх
v258
Дата 14.2.2017, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 19.7.2005
Где: Краснодарский кра й

Репутация: 2
Всего: 2



Мда, Винград уже не тот...  smile 

Для интересующихся рассказываю, как можно сделать - нужно подключить отдельный imagelist для заголовков
Код

procedure SetHeaderImages(ListView: TCustomListView;
  Images: TCustomImageList);
var
  wnd : HWND;
begin
  wnd := FindWindowEx(ListView.Handle,0,'SysHeader32',nil);
  if wnd <> 0 then
  begin
    Header_SetImageList(wnd,Images.Handle);
  end;
end;

функция Header_SetImageList прописана в модуле CommCtrl

Взято отсюда - http://vicking.narod.ru/articles/listview.htm

Это сообщение отредактировал(а) v258 - 14.2.2017, 15:32
PM MAIL WWW   Вверх
-Сергей-
Дата 12.4.2017, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 2.8.2003
Где: Россия

Репутация: нет
Всего: 1



Удалите пожалуйста этот пост.

Это сообщение отредактировал(а) -Сергей- - 12.4.2017, 20:36
--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет".
PM MAIL WWW ICQ MSN   Вверх
v258
Дата 12.4.2017, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 19.7.2005
Где: Краснодарский кра й

Репутация: 2
Всего: 2



Почему? Решение вопроса не приветствуется? 
PM MAIL WWW   Вверх
ZBugz
Дата 13.4.2017, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 631
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(v258 @ 12.4.2017,  20:46)
Почему? Решение вопроса не приветствуется?

Это он наверное запостил не туда, вот и просит удалить свой пост.
А решение хорошее  smile 
PM MAIL   Вверх
-Сергей-
Дата 13.4.2017, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 2.8.2003
Где: Россия

Репутация: нет
Всего: 1



Да, это я не туда запостил.
Кстати, заголовок не так обычно находят. Для этого есть специальное сообщение LVM_GETHEADER. Можно воспользоваться функцией ListView_GetHeader, которая его и отсылает.
Можно еще обойтись без Imagelist, устанавливать системный значок сортировки, но придется писать больше кода.  Есть один нюанс, при изменении размера столбца иконка слетает. Чтобы этого не произошло надо отловить HDN_ENDTRACK который приходит с WM_NOTIFY, сабклассим ListView и перекрываем WMNotify.
Возьмите на вооружение:
Код

uses ... CommCtrl, XPMan;

type
  TListView = class(ComCtrls.TListView)
  private
    FHeaderHandle: HWND;
    procedure WMNotify(var AMessage: TWMNotify); message WM_NOTIFY;
  protected
    procedure CreateWnd; override;
  end;
...
const
  LVS_EX_DOUBLEBUFFER = $10000;
  LVS_EX_BORDERSELECT = $8000;
  HDF_SORTUP = $0400;
  HDF_SORTDOWN =$0200;
...
procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
var
  Header: HWND;
  Item: THDItem;
  I: Integer;
begin
  Header := ListView_GetHeader(ListView1.Handle);
  ZeroMemory(@Item, SizeOf(Item));
  Item.Mask := HDI_FORMAT;
  Header_GetItem(Header, Column.Index, Item);

  if (Item.fmt and HDF_SORTUP) = HDF_SORTUP then
  begin
    Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN); // remove both flags
    for I := 0 to ListView1.Columns.Count - 1 do Header_SetItem(Header, i, Item);
    Item.fmt := Item.fmt or HDF_SORTDOWN; //include the sort descending flag
    Header_SetItem(Header, Column.Index, Item);
  end
  else
  if (Item.fmt and HDF_SORTDOWN) = HDF_SORTDOWN then
  begin
    Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN); //remove both flags
    for I := 0 to ListView1.Columns.Count - 1 do Header_SetItem(Header, i, Item);
    Item.fmt := Item.fmt or HDF_SORTUP; //include the sort ascending flag
    Header_SetItem(Header, Column.Index, Item);
  end
  else
  begin
    Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN); //remove both flags
    for I := 0 to ListView1.Columns.Count - 1 do Header_SetItem(Header, i, Item);
    Item.fmt := Item.fmt or HDF_SORTDOWN; //include the sort ascending flag
    Header_SetItem(Header, Column.Index, Item);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  dwStyle: DWORD;
begin
  dwStyle:= ListView_GetExtendedListViewStyle(ListView1.Handle);
  dwStyle:= dwStyle or LVS_EX_DOUBLEBUFFER;
  ListView_SetExtendedListViewStyle(ListView1.Handle, dwStyle);
end;

{ TListView }

procedure TListView.CreateWnd;
begin
  inherited;
  FHeaderHandle := ListView_GetHeader(Handle);
end;

procedure TListView.WMNotify(var AMessage: TWMNotify);
begin
  case AMessage.NMHdr.code of
    HDN_ENDTRACKA, HDN_ENDTRACKW: AMessage.Result := 0;
  else
    inherited;
  end;
end;


Это сообщение отредактировал(а) -Сергей- - 13.4.2017, 18:55
--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1136 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.