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

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 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 как язык макросов
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

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

Post by gotar »

Latest post of the previous page:

John Doe wrote:* новое поле 'group', может иметь следующие значения: 'EditorEvent', 'ViewerEvent', 'DialogEvent', 'ExitFAR'
.
a) Для group = "EditorEvent", "ViewerEvent" и "EditorInput" проверяется соответствие поля "filemask" (если оно указано) имени файла
.
Эти две строки противоречат друг другу. Какие существуют дополнительные группы кроме EditorInput? Можно ли привести список полей, обрабатываемых Event?
group, condition, action, priority, filemask - еще что? Вроде бы было еще поле description, оно как-то используется в событиях? name="Read" и EE_READ - это одно и тоже?
Пример

Code: Select all

* Пример:
      Event {
        group="EditorEvent"; name="Read"; flags="DisableOutput";
        action=function() ...... end;
      }
соответствует действительности? Меня смущает поле name.
Last edited by gotar on Sat 16 Mar, 2013 16:00, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

gotar wrote:
John Doe wrote:* новое поле 'group', может иметь следующие значения: 'EditorEvent', 'ViewerEvent', 'DialogEvent', 'ExitFAR'
.
a) Для group = "EditorEvent", "ViewerEvent" и "EditorInput" проверяется соответствие поля "filemask" (если оно указано) имени файла
.
Эти две строки противоречат друг другу. Какие существуют дополнительные группы кроме EditorInput? Можно ли привести список полей, обрабатываемых Event?
group, condition, action, name, priority - еще что? Вроде бы было еще поле description, оно как-то используется в событиях? Что решили: priority -это число или функция? name="Read" и EE_READ - это одно и тоже?
1. Не вижу там противоречия, просто в первой цитате пропущена одна группа (добавлю сейчас)
2. Нет дополнительных групп, все группы равноправны
3. Всё как в макросах
- description присутствует (но нигде пока не фигурирует)
- priority число, condition функция (если она вернёт число - оно может быть использовано в качестве priority)
4. name не существует (к сожалению). Пример исправлю.
Возможно стоит добавить ссылки на другие примеры.
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

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

Post by gotar »

Сколько всего групп существует? Что нибудь про СonsoleInput можете сказать? description присутствует в теле функции AddEvent, но непонятно планируется его где нибудь использовать. far.Flags.EE_READ является заменой name="Read"?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Шапка исправлена.
Основной источник информации - changelog плагина, как видите там пока ни слова о СonsoleInput.
Description можно будет использовать, когда [если] будет реализована возможность доступа к загруженным макросам/событиям.

EE_READ это флаг. Проверка параметра Event на соответствие флагам заменяет бывшее поле name.
В случае DialogEvent и EditorInput всё несколько сложнее
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

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

Post by gotar »

Description можно будет использовать, когда [если] будет реализована возможность доступа к загруженным макросам/событиям
Разве эта возможность не реализована? А как help показывает список загруженных макросов?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Это кажется ваше сообщение http://forum.farmanager.com/viewtopic.p ... 23#p105323
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

zg wrote:
John Doe wrote:Что касается кэширования Id диалога: Dlg.Id ведь бесплатно даётся?
с какой стати? как минимум не дешевле DM_GETDIALOGINFO, а то и дороже.
Как выяснилось, Dlg.Id значительно дешевле, а значит его использование в обработчиках событий оправдано.

А может стоит добавить в определение событий отдельное поле для фильтрации диалогов по id?
2useven10
Posts: 5211
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

Как можно решить простейшую задачу - в диалоге с известным ID всегда нажимать нужную кнопку?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Как-то так:

Code: Select all

local F = far.Flags
local Id =  --подставить нужный Id
Event{ group="DialogEvent"; 
  condition=function(Event,Param) 
    return Param.Msg==F.DN_ENTERIDLE and Dlg.Id==Id
  end; 
  action=function(Event,Param)
    --посылаем сообщение для нажатия кнопки
  end
}
Смотря ещё что происходит по нажатию кнопки, можно и зависнуть (Ctrl-Break не работает)
В зависимости от задачи можно привязаться к другому событию или добавить условий.
2useven10
Posts: 5211
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

работает, но появляется диалог, пауза и нажатие.
хочется, чтобы нажатие было без паузы и показа диалога.
Last edited by 2useven10 on Tue 02 Apr, 2013 03:32, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Без паузы - привязаться к другому событию.
Писание подскажет, или можно понаблюдать как-то так: http://forum.farmanager.com/viewtopic.p ... 27#p105127
(естественно msgbox нарушает естественный ход событий)

Что касается отрисовки, то я знаю только mmode(1,x), но на 90% уверен что не сработает.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

2useven10 wrote:работает, но появляется дилог, пауза и нажатие.
хочется, чтобы нажатие было без паузы и показа диалога.
Тут бы помогло наличие события PreShow (или типа того). Я подобные вещи предлагал в смежной теме.
Фар есть инструмент, а не нянька. © 2009 DrKnS
2useven10
Posts: 5211
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

вроде бы так работает:
  1. Event {
  2.  
  3.   group="DialogEvent";
  4.  
  5.  
  6.  
  7.   condition = function(Event,Param)
  8.  
  9.     return Param.Msg == F.DN_DRAWDIALOG and Dlg.Id == Dialog_GUID
  10.  
  11.   end;
  12.  
  13.  
  14.  
  15.   action = function(Event, Param)
  16.  
  17.     far.SendDlgMessage(Param.hDlg, F.DM_CLOSE, ButtonId, 0);
  18.  
  19.     return false
  20.  
  21.   end;
  22.  
  23. }
Last edited by John Doe on Tue 02 Apr, 2013 15:04, edited 1 time in total.
Reason: [codebox=lua file=untitled.lua]
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

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

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

Post by John Doe »

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

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

Post by 2useven10 »

всё тот же - смена кодировки через Shift-F4 :bojan:
этот фрагмент выбирает [Reload] после смены кодировки.
Post Reply

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