# Свойства и функции для работы с меню и списками

К меню относятся следующие области: прочие меню (`Menu`), основное меню (`MainMenu`), меню пользователя (`UserMenu`), меню выбора диска (`Disks`).

Под списками понимается: список автодополнения (`AutoCompletion`), и различные открытые списки в диалогах (`Dialog`) - List box / Combo box / History.

Далее в тексте "меню" и "списки" не разделяются, и упоминаются под общим названием "меню".

## Свойства

Все меню
Оператор | Тип | Описание
--- | --- | ---
Menu.Value | String | содержимое текущего пункта меню (см. также menu.getvalue())
Menu.Info.Id | String | строковое представление идентификатора текущего меню
Меню выбора диска
Оператор | Тип | Описание
Drv.ShowPos | Number | для какой панели вызвано меню выбора диска: 1 - для левой (`Alt`+`F1`), 2 - для правой (`Alt`+`F2`).
Drv.ShowMode | Number | информация, отображаемая в меню выбора дисков; набор битовых флагов:
Флаги | Описание
--- | ---
0x00000001 | тип дисков
0x00000002 | сетевые имена (и пути, ассоциированные с SUBST-дисками)
0x00000004 | метки дисков
0x00000008 | тип файловой системы
0x00000010 | общее и свободное место на дисках
0x00000100 | общее и свободное место отображается в виде десятичной дроби
0x00000020 | параметры сменных носителей
0x00000040 | подключаемые модули (плагины)
0x00000080 | параметры оптических дисков
0x00000200 | параметры сетевых дисков

## Функции

Функция | Описание
--- | ---
Pos=checkhotkey(S[,StartPos]) | Функция позволяет проверить и получить позицию элемента, для которого назначена горячая клавиша S. Если S - пустая строка, то функция вернёт позицию элемента, для которого горячие клавиши не назначены. Если не задать StartPos, то поиск осуществляется с начала. Работает как в меню, так и в диалогах. Если текущий элемент диалога - открытый список, то функция работает не с диалогом, а с этим списком. Возвращает позицию найденного элемента. 0 - ничего не найдено, -1 - функция вызвана не из меню/диалога/списка. Например: В меню вызова плагинов (`F11`) плагину S&R назначена горячая клавиша '7'. Следующая последовательность макрокоманд для редактора вызовет плагин (если хоткей назначен) или стандартный диалог поиска (если хоткей не назначен):
    F11 $if (checkhotkey("7")) 7 1 $else Esc AltF7 $end
S=gethotkey([Pos]) | Возвращает горячую клавишу S для пункта меню с номером Pos. Если Pos не указан, или равен 0 - подразумевается текущий пункт. Если горячая клавиша для пункта меню не задана, то возвращается пустая строка (""). В случае ошибки (не меню; нет хоткея; Pos больше чем количество пунктов меню) также возвращается пустая строка.
N=menu.filter([Action[,Mode]]) | Выполняет операции фильтрации (`Ctrl`+`Alt`+`F`).
Action | Описание
--- | ---
0 | включение фильтра
Mode | Описание
--- | ---
-1 | (по умолчанию) вернуть 1 если фильтр уже включен, 0 - фильтр выключен
0 | выключить фильтр
1 | включить фильтр, если фильтр уже включен - ничего не делает
1 | фиксация текста фильтра (`Ctrl`+`Alt`+`L`)
Mode | Описание
--- | ---
-1 | (по умолчанию) вернуть 1 если текст фильтра зафиксирован, 0 - фильтр можно менять с клавиатуры
0 | отменить фиксацию фильтра
1 | зафиксировать фильтр
2 | вернуть 1 если фильтр включен и строка фильтра не пуста
3 | вернуть количество отфильтрованных (невидимых) строк
4 | (по умолчанию) подправить высоту списка под количество элементов
Если фильтрация недоступна (не меню; не список) возвращает -1. Если код возврата специально не оговорен, в случае успеха возвращает 1, в случае ошибки 0.
S=menu.filterstr([Action[,S]]) | Выполняет операции со строкой фильтра (`Ctrl`+`Alt`+`F`).
Action | Описание
--- | ---
0 | (по умолчанию) вернуть текущую строку, если фильтр включен
1 | установить (заменить) в фильтре строку S Если фильтр не был включен - включает его, режим фиксации не трогается, но игнорируется. Возвращает предыдущее значение строки фильтра
S=menu.getvalue([Pos]) | Возвращает текст пункта меню с номером Pos. Если текущий "объект" не меню или позиция Pos не валидна (меньше 0 или больше количества пунктов в меню), то возвращается пустая строка. Если Pos не указан или равен 0, то действие аналогично применению Menu.Value. Позиция меню не меняется.
b=menu.itemstatus([Pos]) | Возвращает в младшем слове набор битовых флагов - состояние пункта меню с номером Pos (текущая позиция - Pos=0 или не указан):
Флаги | Описание
--- | ---
0x00000001 | Признак активности пункта меню. Только один пункт может быть активным.
0x00000002 | Признак отмеченного пункта меню. Перед текстом будет отображаться метка выбора.
0x00000004 | Пункт меню отображается как разделитель.
0x00000008 | Пункт меню недоступен
0x00000010 | Если флаг установлен, то пункт меню доступен в навигации, но не доступен для выбора.
0x00000020 | Если флаг установлен, то пункт меню не выводится на экран.
В старшем слове - код символа пометки (`U+XXXX`). Если выставлен флаг `0x00000002` и старшее слово равно 0, то Far использует символ пометки `U+221A`. Если выставлен флаг `0x00000002` и старшее слово не равно 0, то Far использует символ пометки из старшего слова.
    $If(menu.itemstatus() & 0x00000002)
        msgbox("Selected", chr(menu.itemstatus()>>16))
    $Else
        msgbox("Not Selected")
    $End
Функция работает со всеми пунктами меню, в том числе с теми, которые в данный момент не отображаются (скрытые пункты учитываются в позиции). Если текущий "объект" не меню или позиция Pos невалидна (меньше 0 или больше количества пунктов в меню), то функция возвращает значение -1 (все биты установлены).
Pos=menu.select(S[,Mode[,Dir]]) | В меню позиционирует курсор на первый пункт, содержащий подстроку S. Поиск регистронезависим. Если такого пункта нет, то ничего не делает. Поиск подстроки ведётся в зависимости от указанного режима Mode:
Mode | Описание
--- | ---
0 | полное совпадение
1 | совпадение с началом строки
2 | совпадение с концом строки
3 | присутствие подстроки S в пункте меню
Если параметр Mode не указан, подразумевается полное совпадение. Параметр Dir задаёт направление поиска:
Dir | Описание
--- | ---
0 | от начала в конец списка пунктов меню
1 | от текущей позиции в начало
2 | от текущей позиции в конец списка
Возвращает позицию пункта меню (если найден), 0 - ошибка при позиционировании (нет пункта или пункт задисаблен), -1 - функция вызвана не для меню.
    F11 $if(menu.select("Advanced compare",0) > 0) Enter $end

### Замечания

Пункты меню нумеруются начиная с 1. В нумерацию также включаются разделители и заблокированые пункты меню.
Смотрите также:
Примеры