Как в макросе дождаться окончания работы с меню и узнать результ

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
2useven10
Posts: 5231
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 315 times

Как в макросе дождаться окончания работы с меню и узнать результ

Post by 2useven10 »

Как в макросе дождаться окончания работы с меню и узнать результат (выбран элемент или нажат Esc, CtrlBreak, клик вне области меню) ?
Собственно пытался средствами малой механизации из ShiftF4 в редакторе сделать выбор кодовой страницы с перезагрузкой файла. Макрос пока , что непонятно:
1) как понять что работает меню ?
Area.Current не помогает. Единственное что нашёл - непустое Menu.Value
2) как 'проиграть' выполнение меню ?
в приведённом макросе проглатываются CtrlBreak и выбор элемента кликом мыши
3) как узнать был ли выбран элемент ?
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Far 3: Как теперь работать с макросами?

Post by SUSim »

Что то напутано local mm, keys = Menu.Value, mmode(1, 0), nil
да и вообще попроще надо :)
SimSU ··· ·· -- ··· ··-
2useven10
Posts: 5231
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 315 times

Re: Far 3: Как теперь работать с макросами?

Post by 2useven10 »

да в присваивании были остатки от экспериметов, поправил.
но вопросы не снимаются.
в 'попроще' нельзя выбрать 'Default', и будет некорректная работа в случае 'far /e ...'
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Far 3: Как теперь работать с макросами?

Post by SUSim »

А в far /e и так не работает ShiftF4, да и в любом модальном режиме тоже... в таком режиме вообще макрос не надо запускать:
condition = function() return band(Editor.State, 0x800) == 0 end;

что значит нельзя выбрать дефаулт?

По моему мы не в той теме обсуждаем.
А то что Area в выпадающем списке остаётся Dialog, так это везде так - баг ли это я для себя не решил...
SimSU ··· ·· -- ··· ··-
2useven10
Posts: 5231
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 315 times

Re: Far 3: Как теперь работать с макросами?

Post by 2useven10 »

макрос здесь только для примера. его обсуждать совершенно незачем.
меня интересуют только ответы на 3 моих вопроса.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Far 3: Как теперь работать с макросами?

Post by John Doe »

И всё равно тема не та.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Выполнение команд FAR в модальном режиме.

Post by Max Rusov »

Можно ли как нибудь в макросе реализовать такое поведение:

1. Запустить стандартное действие FAR над файлами, например, удаление: Keys("F8")
2. Дождаться его завершения, вместе со всеми диалогами подтверждения, если они были
3. Продолжить исполнение макроса.

?
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Выполнение команд FAR в модальном режиме.

Post by John Doe »

В таких случаях сейчас принято крутить пустой цикл с подходящим условием.
Например условием может выступать макрообласть (Shell)
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Выполнение команд FAR в модальном режиме.

Post by Max Rusov »

Так просто зависает.
  1. Macro
  2.  
  3. {
  4.  
  5.   description="Test"; area="Shell"; key="ShiftF8";
  6.  
  7.  
  8.  
  9.   action=function()
  10.  
  11.     Keys("F8")
  12.  
  13.  
  14.  
  15.     while not Area.Shell do
  16.  
  17.     end
  18.  
  19.  
  20.  
  21.     far.Message("Done")
  22.  
  23.   end;
  24.  
  25. }
Может в цикле нужно что-то вызвать?
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Re: Выполнение команд FAR в модальном режиме.

Post by John Doe »

Да, я неверно выразился.
В цикле должно быть чтение клавиш (mf.waitkey) и их выполнение (Keys)

P.S.
flags="EnableOutput";

P.P.S.
Ранее неоднократно обсуждалось, хотел объединить но не смог придумать хорошее название для темы
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Выполнение команд FAR в модальном режиме.

Post by Max Rusov »

Да, так, вроде работает. Спасибо.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Выполнение команд FAR в модальном режиме.

Post by Max Rusov »

John Doe wrote:Ранее неоднократно обсуждалось, хотел объединить но не смог придумать хорошее название для темы
Да, я помню, что что-то было, но FAR меняется, может появилось более "прямое" решение...
Shmuel
Posts: 6836
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Выполнение команд FAR в модальном режиме.

Post by Shmuel »

Есть ещё такой вариант, иногда может пригодиться для простых случаев:
  1. Keys("F8")
  2.  
  3. far.Timer(100,
  4.  
  5.   function(h)
  6.  
  7.     if h.Closed then return end
  8.  
  9.     if Area.Shell then
  10.  
  11.       h:Close()
  12.  
  13.       far.Message("Done")
  14.  
  15.     end
  16.  
  17.   end)
Плюс: нормально работает мышь с диалогами.
Минус: код обработчика таймера - это уже не макрос, соответственно, действуют ограничения на вызов определённых функций (Keys, print, etc.). Эти ограничения можно обойти, применив far.MacroPost.
Post Reply

Return to “Нужна помощь”