Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
Здравствуйте.
Как показали тесты, те значения списка DI_LISTBOX, которые не видны из-за фильтрации, имеют Flags=0x800000. Я посмотрел: такой флаг есть в группе диалоговых флагов (DIF_*), но почему-то нету в группе флагов списка LIF_*. Не могли бы Вы добавить (дать ему имя)? Я понимаю, что это - совершенно необязательно, но так как-то логичнее будет. В этом случае становится возможным организовать то, что в некоторых СУБД называется RYO-Filter (Roll-Your-Own Filter).
Как показали тесты, те значения списка DI_LISTBOX, которые не видны из-за фильтрации, имеют Flags=0x800000. Я посмотрел: такой флаг есть в группе диалоговых флагов (DIF_*), но почему-то нету в группе флагов списка LIF_*. Не могли бы Вы добавить (дать ему имя)? Я понимаю, что это - совершенно необязательно, но так как-то логичнее будет. В этом случае становится возможным организовать то, что в некоторых СУБД называется RYO-Filter (Roll-Your-Own Filter).
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
О каком флаге речь?buniak_a_h wrote: ↑Sun 19 Jan, 2020 23:41 посмотрел: такой флаг есть в группе диалоговых флагов (DIF_*)
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
DIF_LISTTRACKMOUSEINFOCUS . Флаг не имеет отношения к фильтрации, но по значению именно он устанавливается для строк, отфильтрованных "стандартным" фильтром.
Я проверил: можно в структуре FarListItem указать
Flags=F.DIF_LISTTRACKMOUSEINFOCUS
- и это автоматически скрывает строку в DI_LISTBOX-е.Т.е. на самом деле получается два способа скрывать строки списка: LIF_HIDDEN и DIF_LISTTRACKMOUSEINFOCUS . Это очень удобно, просто немного напрягает, что у DIF_LISTTRACKMOUSEINFOCUS нет имени, предназначенного именно для использования в
FarListItem.Flags
; поэтому значение 0x800000 кажется чем-то временным, ненадёжным. Хочется как-то зафиксировать статус-кво.
Last edited by buniak_a_h on Mon 20 Jan, 2020 10:01, edited 2 times in total.
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
На самом деле я, возможно, недостаточно аргументировал желание иметь для 0x800000 имя.
Например, по кнопке надо "отметить все" (т.е. пробежаться по всем видимым строкам и установить флаг LIF_CHECKED). Вот как определить, отфильтрована строка или нет? Самый простой способ - в цикле по всем строкам выдать DM_LISTGETITEM и проанализировать Flags на 0x800000. Просто сравнивать с DIF_LISTTRACKMOUSEINFOCUS как-то некрасиво: все флаги в этом поле начинаются с LIF, а единственный этот - либо без имени, либо вообще из другого набора флагов … Чисто эстетически некомфортно …
Например, по кнопке надо "отметить все" (т.е. пробежаться по всем видимым строкам и установить флаг LIF_CHECKED). Вот как определить, отфильтрована строка или нет? Самый простой способ - в цикле по всем строкам выдать DM_LISTGETITEM и проанализировать Flags на 0x800000. Просто сравнивать с DIF_LISTTRACKMOUSEINFOCUS как-то некрасиво: все флаги в этом поле начинаются с LIF, а единственный этот - либо без имени, либо вообще из другого набора флагов … Чисто эстетически некомфортно …
Last edited by buniak_a_h on Mon 20 Jan, 2020 10:15, edited 1 time in total.
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
Фильтр меню использует отдельный приватный флаг для предотвращения коллизий с элементами, скрытыми вручную.
Не изменяйте и не закладывайтесь на 0x800000 и любые другие недокументированные флаги во избежание недоразумений и потери данных.
Любой недокументированный флаг может изменить поведение на что угодно в любой момент.
Не изменяйте и не закладывайтесь на 0x800000 и любые другие недокументированные флаги во избежание недоразумений и потери данных.
Любой недокументированный флаг может изменить поведение на что угодно в любой момент.
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
Я понимаю. Именно поэтому и прошу "закрепить" этот флаг в документации. Что плохого в том, что у юзера появляется два механизма сокрытия строк? Зато какие перспективы RYO-фильтра …DrKnS wrote: ↑Mon 20 Jan, 2020 10:44 Фильтр меню использует отдельный приватный флаг для предотвращения коллизий с элементами, скрытыми вручную.
Не изменяйте и не закладывайтесь на 0x800000 и любые другие недокументированные флаги во избежание недоразумений и потери данных.
Любой недокументированный флаг может изменить поведение на что угодно в любой момент.
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
Флаг - это детали реализации.
При фильтрации флагом помечаются скрытые пункты и одновременно с этим изменяются внутренние флаги и счетчики меню.
Одной установки флага недостаточно для фильтрации элемента.
Устанавливая флаг вручную вы ломаете инвариант, со всеми вытекающими.
При фильтрации флагом помечаются скрытые пункты и одновременно с этим изменяются внутренние флаги и счетчики меню.
Одной установки флага недостаточно для фильтрации элемента.
Устанавливая флаг вручную вы ломаете инвариант, со всеми вытекающими.
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
Вообще-то, достаточно. Возможно, недостаточно для корректного ведения внутренних счётчиков и признаков (например, при выключении фильтра функцией
Menu.Filter(0,0)
записи, скрытые таким некорректным образом, не становятся видимыми), но можно же в документации написать предупреждение на эту тему. Типа изменять не рекомендуется (на свой страх и риск, администрация ответственности не несёт). Ну или юзер сам должен восстановить отметки.Конечно, корректнее было бы добавить вариант вызова Menu.Filter с номером (номерами) строк, которые надо скрыть / показать независимо от Menu.FilterStr, но это уже работа другого порядка трудоёмкости. Хотя я уже писал, что - увы! - невозможно определить, что включён режим фильтрации, пока строка не задана. Ни одного ответа на сообщение не получено …
Спасибо, ответили …
Last edited by buniak_a_h on Mon 20 Jan, 2020 11:40, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
Т.е. вы хотите добиться, чтобы чтобы фильтр по RAlt не фильтровал сами разделители (элементы с флагом LIF_SEPARATOR).buniak_a_h wrote: ↑Sun 19 Jan, 2020 23:41 при этом фильтр не должен распространяться на разделители (они должны быть видны независимо от наложенного фильтра, если есть неотфильтрованные подстроки).
- buniak_a_h
- Posts: 4262
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка
Ну, это тоже. Одна из возможностей, открываемых при RYO-фильтрах.
В данном конкретном скрипте я перехватываю RAlt и CtrlAltF, запоминаю признак режима фильтрации и при нажатии на
/.|Space|BACKSLASH/
(одиночный символ) сам фильтрую, если (мой) режим фильтрации включён. При этом не затрагиваются строки, "спрятанные" при сворачивании раздела. При выключении режима фильтрации а пробегаю по всем строкам и гашу 0x800000; при этом строки, спрятанные вследствие "сворачивания", не проявляются. С другой стороны, если установлен RYO-фильтр, то при распахивании узла видны становятся только те строки, которые удовлетворяют фильтру. Т.е. автоматически реализуются два независимых механизма сокрытия строк.Можно, конечно, этот вопрос обойти, добавив в таблицы, описывающие строки списка, заведомо неподдерживаемые поля типа ['_Filtered_'] и ['_Collapsed_'], отслеживать их изменение и устанавливать флаг LIF_HIDDEN, если установлен хотя бы один из указанных полей. Просто это более трудоёмко…
Last edited by buniak_a_h on Mon 20 Jan, 2020 15:02, edited 2 times in total.