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

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

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

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

Свойства

Все меню

Menu.Id
string
строковое представление идентификатора текущего меню в формате "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" (см. GUID объектов)
Menu.Value
string
содержимое текущего пункта меню (см. также Menu.GetValue)

Меню выбора диска

Drv.ShowMode
number

информация, отображаемая в меню выбора дисков; набор битовых флагов:

0x00000001
тип дисков
0x00000002
сетевые имена (и пути, ассоциированные с SUBST-дисками)
0x00000004
метки дисков
0x00000008
тип файловой системы
0x00000010
общее и свободное место на дисках
0x00000100
общее и свободное место отображается в виде десятичной дроби
0x00000020
параметры сменных носителей
0x00000040
подключаемые модули (плагины)
0x00000080
параметры оптических дисков
0x00000200
параметры сетевых дисков
Drv.ShowPos
number
для какой панели вызвано меню выбора диска: 1 — для левой (Alt+F1), 2 — для правой (Alt+F2).

Функции

Pos=Object.CheckHotkey(S[,StartPos])

Функция позволяет проверить и получить позицию элемента, для которого назначена горячая клавиша S.

Если S — пустая строка, то функция вернёт позицию элемента, для которого горячие клавиши не назначены.

Если не задать StartPos, то поиск осуществляется с начала.

Работает как в меню, так и в диалогах.

Если текущий элемент диалога — открытый список, то функция работает не с диалогом, а с этим списком.

Возвращает позицию найденного элемента. 0 — ничего не найдено, -1 — функция вызвана не из меню/диалога/списка.

Например:

В меню вызова плагинов (F11) плагину S&R назначена горячая клавиша 7.

Следующая последовательность макрокоманд для редактора вызовет плагин (если хоткей назначен) или стандартный диалог поиска (если хоткей не назначен):

Macro {
  description="Продолжить поиск/замену в обратном направлении [S&R]";
  area="Editor"; key="AltF7";
  action=function()
    Keys("F11")
    if Object.CheckHotkey("7")~=0 then
      Keys("7 1")
    else
      Keys("Esc AKey")
    end
  end;
}
S=Object.GetHotkey([Pos])

Возвращает горячую клавишу S для пункта меню с номером Pos.

Если Pos не указан, или равен 0 — подразумевается текущий пункт.

Если горячая клавиша для пункта меню не задана, то возвращается пустая строка ("").

В случае ошибки (не меню; нет хоткея; Pos больше чем количество пунктов меню) также возвращается пустая строка.

N=Menu.Filter([Action[,Mode]])

Выполняет операции фильтрации (RAlt/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 band(Menu.ItemStatus(),0x00000002) then
  mf.msgbox("Selected", unicode.utf8.char(rshift(Menu.ItemStatus(),16)))
else
  mf.msgbox("Not Selected")
end

Функция работает со всеми пунктами меню, в том числе с теми, которые в данный момент не отображаются (скрытые пункты учитываются в позиции).

Если текущий “объект” не меню или позиция Pos невалидна (меньше 0 или больше количества пунктов в меню), то функция возвращает значение -1 (все биты установлены).

Pos=Menu.Select(S[,Mode[,Dir]])

В меню позиционирует курсор на первый пункт, содержащий подстроку S.

Поиск регистронезависим.

Если такого пункта нет, то ничего не делает.

Поиск подстроки ведётся в зависимости от указанного режима Mode:

0
полное совпадение
1
совпадение с началом строки
2
совпадение с концом строки
3
присутствие подстроки S в пункте меню

Если параметр Mode не указан, подразумевается полное совпадение.

Параметр Dir задаёт направление поиска:

0
от начала в конец списка пунктов меню
1
от текущей позиции в начало
2
от текущей позиции в конец списка

Возвращает позицию пункта меню (если найден), 0 — ошибка при позиционировании (нет пункта или пункт задисаблен), -1 — функция вызвана не для меню.

Keys("F11")
if Menu.Select("Advanced compare",0)>0 then
  Keys("Enter")
end

Замечания

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


Смотрите также:

Примеры