Как закрыть диалог far.Message без кнопок

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by buniak_a_h »

Здравствуйте!
Делаю диалог настройки, и в нём (по кнопке) - сервис ввода клавиши. По аналогии с
John Doe wrote: Mon 13 Jun, 2016 12:25

Code: Select all

lua:far.Message("\n\n","Press key",""); far.Message(mf.waitkey(),"Press key")
НО! В этом примере far.Message вызывается без кнопок, а закрывается при следующем вызове (который уже с кнопкой). Аналогично в макросе SimSU.Common.KeyName.lua. А мне нужно, чтобы после нажатия клавиши просто закрывалось окно с просьбой нажать кнопку (введённое значение после проверки заносится в элемент DI_EDIT исходного диалога).
Но... Очень длинный путь. Может, кто знает, как это сделать проще?
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Как закрыть диалог far.Message без кнопок

Post by sToLp »

Посмотрите там в конце поста.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by buniak_a_h »

sToLp wrote: Fri 21 Jul, 2017 19:48Посмотрите там в конце поста.
Увы! Если Вы имеете в виду после
когда можно просто:
, то там точно такая же ситуация: после срабатывания waitkey вызывается диалоговое окно (в данном случае - prompt. При этом окно от Far.Message закрывается. Если Вы имели в виду нечто другое, то не могли бы Вы процитировать?
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Как закрыть диалог far.Message без кнопок

Post by sToLp »

Я предположил, что Вы хотите сделать что-то типа .
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by buniak_a_h »

sToLp wrote: Fri 21 Jul, 2017 23:00Я предположил, что Вы хотите сделать что-то типа
Переполнение стека при Keys"Esc"
На самом деле я поборол так:
  1. local F = far.Flags
  2.  
  3.  
  4.  
  5. local function _InKey()
  6.  
  7.  local Res
  8.  
  9.  local w,h=Far.Width,Far.Height
  10.  
  11.  local function _handl(hndl, Msg, _, _)
  12.  
  13.   if Msg == F.DN_DRAWDIALOGDONE then
  14.  
  15.    Res = mf.key(mf.waitkey(0,1))
  16.  
  17.    hndl:send(F.DM_CLOSE)
  18.  
  19.   end
  20.  
  21.  end
  22.  
  23.  local l,t=math.floor((w-6)/2),math.floor((h-5)/2)
  24.  
  25.  local r,b=l+6,t+5
  26.  
  27.  far.Dialog('', l,t,r,b, nil,
  28.  
  29.   {
  30.  
  31.     {F.DI_DOUBLEBOX, 0,0,7,6, 0,0,0,           0, ''},
  32.  
  33.     {F.DI_TEXT,      1,3,6,3, 0,0,F.CENTERTEXT,0, 'Жми'},
  34.  
  35.   }, F.DIF_CENTERGROUP, _handl
  36.  
  37.  )
  38.  
  39.  return Res
  40.  
  41. end
  42.  
  43.  
  44.  
  45. Macro {
  46.  
  47.     area = "Common"; --"Shell";
  48.  
  49.     key = 'CtrlAltF12';
  50.  
  51.     description = 'Тест waitkey';
  52.  
  53.     flags = "EnableOutput";
  54.  
  55.     action = function()
  56.  
  57.      local function _handl(hDlg, Msg, ItemId, _)
  58.  
  59.       if Msg == F.DN_BTNCLICK and ItemId==2 then
  60.  
  61.        far.SendDlgMessage(hDlg, F.DM_SETTEXT, 1, _InKey())
  62.  
  63.       end
  64.  
  65.      end
  66.  
  67.      far.Dialog('', 1,1,50,10, nil,
  68.  
  69.       {
  70.  
  71.         {F.DI_EDIT, 3,3,30,3, 0, "", 0, 0, ''},
  72.  
  73.         {F.DI_BUTTON, 40,3,45,3, 0,0,0, F.DIF_BTNNOCLOSE, "Key"},
  74.  
  75.         {F.DI_BUTTON, 25,5,30,5, 0,0,0,0, "Ok"}
  76.  
  77.       }, 0, _handl
  78.  
  79.      )
  80.  
  81.     end
  82.  
  83. }
  84.  
  85.  
Last edited by buniak_a_h on Fri 21 Jul, 2017 23:39, edited 1 time in total.
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Как закрыть диалог far.Message без кнопок

Post by sToLp »

На мой скромный взгляд — ужас как сложно.
Было бы хорошо, если бы опытные мэтры подсказали бы как проще.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by buniak_a_h »

sToLp wrote: Sat 22 Jul, 2017 00:03На мой скромный взгляд — ужас как сложно.
Было бы хорошо, если бы опытные мэтры подсказали бы как проще.
Ну да, я об этом и писал. Идею Вы поняли? Нужна функция, вывешивающая приглашение к нажатию, ждущая это нажатие, снимающая объявление и возвращающая имя нажатой клавиши. На самом деле в моём коде это делает кусок local function _InKey(). Остальное - антураж, демонстрирующий, для чего это нужно. На самом деле диалог настроек ещё больше - там настраиваются несколько кнопок.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Как закрыть диалог far.Message без кнопок

Post by HaRT »

Не знаю конкретно насчёт закрыть, но вот тут и кнопкосочетание получается, и окошко на экране не остаётся, и код простой и небольшой.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by buniak_a_h »

HaRT wrote: Sat 22 Jul, 2017 02:32Не знаю конкретно насчёт закрыть, но вот тут и кнопкосочетание получается, и окошко на экране не остаётся, и код простой и небольшой.
Да, когда вся функция action выполняет только waitkey, и после этого заканчивает работать, у меня тоже окошко far.Message закрывается. Проблема как раз возникает, когда из готового (довольно большого, назову его "старый") диалога надо по нажатию бутона вывесить приглашение, а введённый ключ поместить в поле ввода. Если для приглашения вызывать far.Message, то оно не закрывается, пока мышкой не ткнёте в "старый" диалог. При этом "кнопка" MSClick не заносится (что правильно!). Если "старому" диалогу выдать сообщение DM_SETFOCUS, то закрываются оба (и far.Message, и "старый" диалог).
В принципе, функция получилась довольно компактная. После небольшой переделки получилось так:
  1. local function _InKey(_s)
  2.  
  3.  local Res
  4.  
  5.  local h,ww=Far.Height,_s:len()+4
  6.  
  7.  local function _handl(hndl, Msg1, _, _)
  8.  
  9.   if Msg1 == F.DN_DRAWDIALOGDONE then
  10.  
  11.    Res = mf.key(mf.waitkey(0,1))
  12.  
  13.    hndl:send(F.DM_CLOSE)
  14.  
  15.   end
  16.  
  17.  end
  18.  
  19.  local t=h-6
  20.  
  21.  local b=t+4
  22.  
  23.  far.Dialog('', -1,t,ww,b, nil,
  24.  
  25.   {
  26.  
  27.     {F.DI_DOUBLEBOX, 0,0,ww+1, 5, 0,0,0,           0, ''},
  28.  
  29.     {F.DI_TEXT,      2,2,ww-2, 2, 0,0,F.CENTERTEXT,0, _s},
  30.  
  31.   }, F.DIF_CENTERGROUP, _handl
  32.  
  33.  )
  34.  
  35.  return Res
  36.  
  37. end -- _InKey
Всего-то 19 строк...
Сама функция из макроса (action=funcion()...end) - та же, что в моём примере. Возможно, проблема в нём, но он уж совсем тривиальный!..
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by zg »

почему не так:

Code: Select all

 local function _handl(hndl, Msg1, _, Param2)
  if Msg1 == F.DN_CONTROLINPUT then
   Res=far.InputRecordToName(Param2)
   hndl:send(F.DM_CLOSE)
  end
 end
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by buniak_a_h »

zg wrote: Sat 22 Jul, 2017 19:06почему не так:<...>
Спасибо. Так действительно выглядит логичнее. Просто для того, чтоб так написать, надо знать сообщения с параметрами и функцию far.InputRecordToName. Перебирать все сообщения я не стал: нашёл первое подходящее. Да и делал по образу и подобию функций, написанных John Doe, SimSU и Smuel, а там везде используется mf.waitkey
Но! Сути практически не меняет. Вместо faf.Message() приходится своё окошко рисовать.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by zg »

или почему не так?

Code: Select all

far.Message("\n\n","Press key","")
res=mf.waitkey()
far.AdvControl("ACTL_REDRAWALL")
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by buniak_a_h »

zg wrote: Sun 23 Jul, 2017 10:45или почему не так?

Code: Select all

<...>
far.AdvControl("ACTL_REDRAWALL")
Вот это, видимо, как раз и есть ответ на самый первый мой вопрос - как закрыть окошко far.Message-а. Я ещё не попробовал, но если получится - это именно то, что я спрашивал.
Кстати, читая энциклопедию до такого не додуматься:
ACTL_REDRAWALL - Перерисовка всех окон Far Manager.
И из чего тут видно, что окно, созданное функцией far.Message, закроется?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Как закрыть диалог far.Message без кнопок

Post by Shmuel »

Да, документация несовершенна. Однако все ею недовольные могут поучаствовать своим трудом и временем в её улучшении.
buniak_a_h wrote: Sun 23 Jul, 2017 16:46в документации: написано, что некоторые функции при переходе на Lua перенесены в таблицу mf (расшифровывается как "macro FAR)
Можно спросить, где это написано (со ссылочкой или с указанием названия статьи в мануале)?
buniak_a_h wrote: Sun 23 Jul, 2017 16:46А описания функций таблицы regex я вообще не нашёл!
А вы вообще мануал LuaFAR читали (находится в %FARHOME%\Encyclopedia)? Эти функции там очень даже описаны.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Как закрыть диалог far.Message без кнопок

Post by buniak_a_h »

Shmuel wrote: Sun 23 Jul, 2017 17:08Можно спросить, где это написано (со ссылочкой или с указанием названия статьи в мануале)?
Извините, только вчера прочитал эту фразу в каком-то топике, открывшемся при поиске. Форум очень древний, посвящённый то ли переходу с FAR2 на FR3, то ли обоснованию, почему именно Lua. Теперь уже не найти. Если бы знал - обязательно запомнил бы. Ну не сам же я придумал расшифровку mf!
Shmuel wrote: Sun 23 Jul, 2017 17:08А вы вообще мануал LuaFAR читали
Я, естественно, весь подряд мануал в форме CHM не читал. Документацию в формате CHM прочитать невозможно, формат "заточен" на поиск конкретного описания конкретной функции или имени.
А так...Если знаешь, что искать, сначала ищешь простым файловым поиском, чтобы определить, в какой из мануалов надо идти. А потом уже искать в нём. Увы! Файловый поиск слова regex выдаёт только FarEncyclopedia.ru.chm, а в нём, как раз, описания библиотеки нету.
Post Reply

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