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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ListView с фильтром как в explorer'е в Win7? Как сделать ListView со своим фильтром? 
:(
    Опции темы
Mr_Devil
  Дата 30.10.2012, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите как сделать такой фильтр?
Листаю MSDN, но пока безрезультатно.

Присоединённый файл ( Кол-во скачиваний: 68 )
Присоединённый файл  ListView.png 38,38 Kb
PM MAIL ICQ   Вверх
DarkProg
Дата 30.10.2012, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

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



Я бы посоветовал посмотреть в сторону DevExpress или TMS у них возможно есть готовые решения.

По сути это похоже на PopupMenu с нарисованными на ней элементами.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Mr_Devil
Дата 30.10.2012, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Что-то я сомневаюсь, что Explorer писали на сторонних компонентах.
Хотелось бы всетаки решение на WinAPI.
PM MAIL ICQ   Вверх
DarkProg
Дата 30.10.2012, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

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



Цитата(Mr_Devil @  30.10.2012,  14:00 Найти цитируемый пост)
Что-то я сомневаюсь, что Explorer писали на сторонних компонентах.

Не ну никто не запрещает допиливать имеющиеся под конкретные задачи, вот ребята в микрософте и допилили то что было.


Цитата(Mr_Devil @  30.10.2012,  14:00 Найти цитируемый пост)
Хотелось бы всетаки решение на WinAPI

С этим, к сожалению, не помогу.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Ne1tr1n0
Дата 31.10.2012, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А это и не ListView в Explorer'e. Это нечто под названием DirectUIHWND. Что это такое, и как реализовано, хз, не копался во внутренностях, но вроде статьи какие-то видел на том же СodeProject'e или где-то ещё. Тебе нужен точно такой же список (отображающий файлы на диске, с возможностью фильтрации)? Посмотри компоненты JamShellBrowser, там есть компонент JamSystemShellView, делает то, что тебе надо. Ну и другие компоненты можно посмотреть. Если всё же надо сделать это с помощью ListView, то придется вручную отрисовывать Header у ListView, рисовать DropDown-кнопку (по всей видимости используя темы), отслеживать клики в нужных областях (если в районе DropDown'a то показывать соответствующую менюшку (её наверное придется делать отдельной формой), после нее сортировать итемы, или какие-то скрывать. В общем достаточно много работы.
PM MAIL   Вверх
Mr_Devil
Дата 31.10.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем так, господа. Стрелочку (SplitButton), при нажатии на которую должно появляться выпадающее меню, мне получить удалось. Она нажимается, но пока ничего не происходит smile
SplitButton можно увидеть только в Win Vista и выше.
Делается это так:
Код

var
  lvHeader: HWND;
  iHDItem: HD_ITEM;
begin
  lvHeader := SendMessage(lvTable.Handle, LVM_GETHEADER, 0, 0); // получаем HWND Хэдера нашего ListView
  iHDItem.Mask := HDI_FORMAT;
  iHDItem.fmt := HDF_STRING OR HDF_SPLITBUTTON;
  SendMessage(lvHeader, HDM_SETITEM, 0, LPARAM(@iHDItem));
end;

lvTable - это самый обычный ListView. ViewStyle должен быть vsReport.
HD_ITEM - Содержит информацию для айтема хэдера. Здесь написано что там есть и для чего.
WPARAM (у нас он 0) - это номер айтема в хэдере, к которому нужно "применить" параметры из HD_ITEM.

Про Header Control написано вот тут. И в частности про HDM_SETITEM вот здесь.

При установке флага HDF_SPLITBUTTON - The item displays a split button. The HDN_DROPDOWN notification is sent when the split button is clicked. HDN_DROPDOWN notification sent by a header control to its parent (т.е. нашему ListView) when the drop-down arrow on the header control is clicked.
В ListView есть такой LVN_COLUMNDROPDOWN notification code.

Буду копать дальше smile


PM MAIL ICQ   Вверх
Mr_Devil
Дата 23.11.2012, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попробовал я получать этот LVN_COLUMNDROPDOWN

Код

    procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;

....

procedure TForm1.WMNotify(var Message: TWMNotify);
var
  iRect: TRect;
begin
  inherited;
  if Message.NMHdr.code = LVN_COLUMNDROPDOWN then
  begin
    SendMessage(lvHeader, HDM_GETITEMRECT, PNMListView(Message.NMHdr).iSubItem, LPARAM(@iRect));
    Dec(iRect.Right, 16);
    Winapi.Windows.ClientToScreen(lvHeader, iRect.BottomRight);
    PopupMenu1.Popup(iRect.Right, iRect.Bottom);
  end;
end;


Меню вываливается где надо, но есть один очень неприятный недостаток. ListView из Delphi VCL (Delphi XE2) не знает ничего про флаг HDF_SPLITBUTTON и при любых манипуляциях с хедером (например, изменение размера колонки), он его сбрасывает :(
Как вариант, можно создать ListView в рантайме на WinAPI, без использования VCL, но так не интересно smile

Это сообщение отредактировал(а) Mr_Devil - 23.11.2012, 09:11
PM MAIL ICQ   Вверх
Mr_Devil
Дата 23.11.2012, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Установка атрибутов колонкам хэдера.
Код

procedure TForm1.SetUpColumns;
var
  iHDItem: _HD_ITEMW;
  i: Integer;
begin
  iHDItem.Mask := HDI_FORMAT;
  iHDItem.fmt :=  HDF_SPLITBUTTON;
  for i := 0 to ListView1.Columns.Count - 1 do
    SendMessage(lvHeader, HDM_SETITEM, i, LPARAM(@iHDItem));
end;

Получилось как-то так:
user posted image
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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