Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Вам не хватает чего-то в Far? Вы считаете, что вашу идею стоит услышать? Пишите сюда.
Post Reply
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by buniak_a_h »

Здравствуйте.
Как показали тесты, те значения списка DI_LISTBOX, которые не видны из-за фильтрации, имеют Flags=0x800000. Я посмотрел: такой флаг есть в группе диалоговых флагов (DIF_*), но почему-то нету в группе флагов списка LIF_*. Не могли бы Вы добавить (дать ему имя)? Я понимаю, что это - совершенно необязательно, но так как-то логичнее будет. В этом случае становится возможным организовать то, что в некоторых СУБД называется RYO-Filter (Roll-Your-Own Filter).
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by John Doe »

buniak_a_h wrote: Sun 19 Jan, 2020 23:41 посмотрел: такой флаг есть в группе диалоговых флагов (DIF_*)
О каком флаге речь?
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by buniak_a_h »

John Doe wrote: Mon 20 Jan, 2020 09:49 О каком флаге речь?
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.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by buniak_a_h »

На самом деле я, возможно, недостаточно аргументировал желание иметь для 0x800000 имя.
Например, по кнопке надо "отметить все" (т.е. пробежаться по всем видимым строкам и установить флаг 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.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by DrKnS »

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

Не изменяйте и не закладывайтесь на 0x800000 и любые другие недокументированные флаги во избежание недоразумений и потери данных.
Любой недокументированный флаг может изменить поведение на что угодно в любой момент.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by buniak_a_h »

DrKnS wrote: Mon 20 Jan, 2020 10:44 Фильтр меню использует отдельный приватный флаг для предотвращения коллизий с элементами, скрытыми вручную.

Не изменяйте и не закладывайтесь на 0x800000 и любые другие недокументированные флаги во избежание недоразумений и потери данных.
Любой недокументированный флаг может изменить поведение на что угодно в любой момент.
Я понимаю. Именно поэтому и прошу "закрепить" этот флаг в документации. Что плохого в том, что у юзера появляется два механизма сокрытия строк? Зато какие перспективы RYO-фильтра …
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by DrKnS »

Флаг - это детали реализации.
При фильтрации флагом помечаются скрытые пункты и одновременно с этим изменяются внутренние флаги и счетчики меню.
Одной установки флага недостаточно для фильтрации элемента.
Устанавливая флаг вручную вы ломаете инвариант, со всеми вытекающими.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by buniak_a_h »

DrKnS wrote: Mon 20 Jan, 2020 11:06 Одной установки флага недостаточно для фильтрации элемента.
Вообще-то, достаточно. Возможно, недостаточно для корректного ведения внутренних счётчиков и признаков (например, при выключении фильтра функцией 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.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by John Doe »

buniak_a_h wrote: Sun 19 Jan, 2020 23:41 при этом фильтр не должен распространяться на разделители (они должны быть видны независимо от наложенного фильтра, если есть неотфильтрованные подстроки).
Т.е. вы хотите добиться, чтобы чтобы фильтр по RAlt не фильтровал сами разделители (элементы с флагом LIF_SEPARATOR).
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Добавить (дать имя) флаг LIF_FILTERED (== 0x800000) для отфильтрованных значений списка

Post by buniak_a_h »

John Doe wrote: Mon 20 Jan, 2020 14:41 Т.е. вы хотите добиться, чтобы чтобы фильтр по RAlt не фильтровал сами разделители (элементы с флагом LIF_SEPARATOR).
Ну, это тоже. Одна из возможностей, открываемых при 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.
Post Reply

Return to “Предложения и идеи”