Обработчики событий: запуск макросов по событиям

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Обработчики событий: запуск макросов по событиям

Post by John Doe »

Реализован запуск макросов по событиям (build 3157+), документация тут:

Данная статья в MacroAPI manual весьма лаконична, т.к. ссылается на LuaFAR manual, который в свою очередь ссылается на Far PluginAPI.
Скакать между различными файлами документации по меньшей мере неудобно (edit: уже появились гиперссылки, стало намного лучше).
Чтобы облегчить усвоение и без того непростого и фрагментированного материала я скомпоновал для себя информацию в одном месте.
  • result = export.ProcessViewerEvent (ViewerID, Event)
  • result = export.ProcessEditorEvent (EditorID, Event, Param)

    result = editor.SubscribeChangeEvent (EditorId, Subscribe)
  • result = export.ProcessEditorInput (Rec)
    Rec: table InputRecord
  • ret = export.ProcessDialogEvent (Event, Param)
Важно: Ограничения в использовании некоторых функций

Примеры обработчиков событий в готовых макросах:

Основная тема: LuaMacro — Lua как язык макросов
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by John Doe »

Latest post of the previous page:

А какой диалог вы так автоматизируете?

P.S.
Исправил на [code2]
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by John Doe »

И насколько я понимаю, return false смысла делать явно нет.
Другое дело когда надо чтобы событие дальше не передавалось, тогда возвращаем true.
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

Re: Запуск макросов по событиям (build 3157+)

Post by 2useven10 »

всё тот же - смена кодировки через Shift-F4 :bojan:
этот фрагмент выбирает [Reload] после смены кодировки.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by John Doe »

Надо попробовать.
А почему решили через события, а не обычным макросом?
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

Re: Запуск макросов по событиям (build 3157+)

Post by 2useven10 »

обычный макрос там тоже есть...
не умею нормально дождаться завершения выбора кодировки.
цикл GetKey(); Keys('AKey) работает криво и буква 'P' в левом верхнем углу раздражает.
да и просто хотелось попробовать работу с эвентами...
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by John Doe »

Попробовать это да.
Но имхо там где можно (полноценно) обойтись без событий - стоит обходиться.

Цикл "GetKey(); Keys('AKey)" конечно не очень красив, но вполне может работать прямо.
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

Re: Запуск макросов по событиям (build 3157+)

Post by 2useven10 »

CtrlBreak и выбор в меню мышкой работают ?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by John Doe »

CtrlBreak пока "централизовано" не обрабатывается, но в цикле можно проверять самостоятельно.
В целом не очень красиво, но что-то можно спрятать в функции.

Что касается мышки, то я обычно её игнорирую, поэтому сходу не скажу (SUSim наверно знает).
Хотя на самом деле не всегда важно как выбран пункт меню.

В общем без текста макроса сложно сказать.
User avatar
SUSim
Posts: 1633
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 25 times

Re: Запуск макросов по событиям (build 3157+)

Post by SUSim »

прерывание циклов по мышке тоже легко сделать...
но вот как прервать макрос с рекурсией без перезагрузки фара не знаю :(
SimSU ··· ·· -- ··· ··-
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

Re: Запуск макросов по событиям (build 3157+)

Post by 2useven10 »

у меня в простом цикле:
  1. local mm, keys = mmode(1, 0), nil
  2.  
  3. while Menu.Value ~= "" do
  4.  
  5.   keys = mf.waitkey(); Keys(keys) -- ? CtrlBreak & LMB click doesn't work here
  6.  
  7. end
  8.  
  9. mmode(1, mm)
не работает выбор мышкой пункта меню.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Запуск макросов по событиям (build 3157+)

Post by Shmuel »

В до-Lua Фаре (2796) клик мышкой тоже в этом случае не работает, но CtrlBreak прерывает макрос.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by John Doe »

Возможно ли реализовать запрет вывода во время обработки события?
far.MacroPost("Keys'Esc'",F.KMFLAGS_DISABLEOUTPUT) - работает как надо
far.SendDlgMessage(Param.hDlg,F.DM_CLOSE) - вызывает видимое мелькание, и mmode(1,1) не действует
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Запуск макросов по событиям (build 3157+)

Post by Shmuel »

John Doe wrote:Возможно ли реализовать запрет вывода во время обработки события?
Наверное, возможно.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Запуск макросов по событиям (build 3157+)

Post by Shmuel »

Не связано с закончившейся ломкой API, но тем не менее тоже ломающее изменение (ломает только события, обрабатывающие EE_CHANGE, надеюсь почти ни у кого их пока нет).

Code: Select all

shmuel 23.04.2013 18:01:28 +0200 - build 137

1. LuaFAR: экспортируемая функция ProcessEditorEventW теперь соответствует двум Lua-функциям:
       a) export.ProcessEditorChange - если параметр Event==EE_CHANGE;
       b) export.ProcessEditorEvent - для остальных значений параметра Event.
   Это изменение - продолжение билда 136.

2. В макросах-событиях добавилась группа: group="EditorChange".
Теперь LuaFAR-плагины (включая LuaMacro) не будут вносить существенного замедления при массовых заменах в редакторе, если нет загруженных событий типа group="EditorChange".
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by John Doe »

Мануал:

Code: Select all

result = export.ProcessEditorEvent (EditorID, Event, Param)

Parameters:
  EditorID: integer
  Event:    integer
  Param:    integer
Писание: http://api.farmanager.com/ru/structures ... tinfo.html

Насколько я могу судить, ни при одном типе события (кроме EE_CHANGE) обработчик не получает в этом параметре ничего полезного.
EE_CLOSE Параметр Param указывает на переменную, содержащую значение EditorID закрываемого редактора.
EE_READ Param = NULL.
EE_SAVE Param = NULL.
EE_REDRAW Param указывает на константу EEREDRAW_ALL.
EE_KILLFOCUS Param указывает на переменную, содержащую значение EditorID редактора, теряющего фокус.
EE_GOTFOCUS Param указывает на переменную, содержащую значение EditorID редактора, получающего фокус.

Т.е. либо NULL (EE_READ и EE_SAVE), либо значение константа (EE_REDRAW), либо значение совпадает с первым параметром (EE_CLOSE, EE_KILLFOCUS и EE_GOTFOCUS).

Или я что-то упускаю, или параметр лишний.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Запуск макросов по событиям (build 3157+)

Post by t-rex »

Ну а завтра добавится какое то значение, и что, опять менять всё?
Post Reply

Return to “Обсуждение макросов”