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

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

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

Post by buniak_a_h » Fri 21 Jul, 2017 19:17

Здравствуйте!
Делаю диалог настройки, и в нём (по кнопке) - сервис ввода клавиши. По аналогии с
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: 713
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 31 times
Been thanked: 5 times

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

Post by sToLp » Fri 21 Jul, 2017 19:48

Посмотрите там в конце поста.

buniak_a_h
Posts: 313
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 34 times
Been thanked: 4 times
Contact:

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

Post by buniak_a_h » Fri 21 Jul, 2017 20:04

sToLp wrote:
Fri 21 Jul, 2017 19:48
Посмотрите там в конце поста.
Увы! Если Вы имеете в виду после
когда можно просто:
, то там точно такая же ситуация: после срабатывания waitkey вызывается диалоговое окно (в данном случае - prompt. При этом окно от Far.Message закрывается. Если Вы имели в виду нечто другое, то не могли бы Вы процитировать?

User avatar
sToLp
Posts: 713
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 31 times
Been thanked: 5 times

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

Post by sToLp » Fri 21 Jul, 2017 23:00

Я предположил, что Вы хотите сделать что-то типа .

buniak_a_h
Posts: 313
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 34 times
Been thanked: 4 times
Contact:

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

Post by buniak_a_h » Fri 21 Jul, 2017 23:39

sToLp wrote:
Fri 21 Jul, 2017 23:00
Я предположил, что Вы хотите сделать что-то типа
Переполнение стека при Keys"Esc"
На самом деле я поборол так:
  1. local F = far.Flags
  2.  
  3. local function _InKey()
  4.  local Res
  5.  local w,h=Far.Width,Far.Height
  6.  local function _handl(hndl, Msg, _, _)
  7.   if Msg == F.DN_DRAWDIALOGDONE then
  8.    Res = mf.key(mf.waitkey(0,1))
  9.    hndl:send(F.DM_CLOSE)
  10.   end
  11.  end
  12.  local l,t=math.floor((w-6)/2),math.floor((h-5)/2)
  13.  local r,b=l+6,t+5
  14.  far.Dialog('', l,t,r,b, nil,
  15.   {
  16.     {F.DI_DOUBLEBOX, 0,0,7,6, 0,0,0,           0, ''},
  17.     {F.DI_TEXT,      1,3,6,3, 0,0,F.CENTERTEXT,0, 'Жми'},
  18.   }, F.DIF_CENTERGROUP, _handl
  19.  )
  20.  return Res
  21. end
  22.  
  23. Macro {
  24.     area = "Common"; --"Shell";
  25.     key = 'CtrlAltF12';
  26.     description = 'Тест waitkey';
  27.     flags = "EnableOutput";
  28.     action = function()
  29.      local function _handl(hDlg, Msg, ItemId, _)
  30.       if Msg == F.DN_BTNCLICK and ItemId==2 then
  31.        far.SendDlgMessage(hDlg, F.DM_SETTEXT, 1, _InKey())
  32.       end
  33.      end
  34.      far.Dialog('', 1,1,50,10, nil,
  35.       {
  36.         {F.DI_EDIT, 3,3,30,3, 0, "", 0, 0, ''},
  37.         {F.DI_BUTTON, 40,3,45,3, 0,0,0, F.DIF_BTNNOCLOSE, "Key"},
  38.         {F.DI_BUTTON, 25,5,30,5, 0,0,0,0, "Ok"}
  39.       }, 0, _handl
  40.      )
  41.     end
  42. }
  43.  
Last edited by buniak_a_h on Fri 21 Jul, 2017 23:39, edited 1 time in total.

User avatar
sToLp
Posts: 713
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 31 times
Been thanked: 5 times

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

Post by sToLp » Sat 22 Jul, 2017 00:03

На мой скромный взгляд — ужас как сложно.
Было бы хорошо, если бы опытные мэтры подсказали бы как проще.

buniak_a_h
Posts: 313
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 34 times
Been thanked: 4 times
Contact:

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

Post by buniak_a_h » Sat 22 Jul, 2017 00:14

sToLp wrote:
Sat 22 Jul, 2017 00:03
На мой скромный взгляд — ужас как сложно.
Было бы хорошо, если бы опытные мэтры подсказали бы как проще.
Ну да, я об этом и писал. Идею Вы поняли? Нужна функция, вывешивающая приглашение к нажатию, ждущая это нажатие, снимающая объявление и возвращающая имя нажатой клавиши. На самом деле в моём коде это делает кусок local function _InKey(). Остальное - антураж, демонстрирующий, для чего это нужно. На самом деле диалог настроек ещё больше - там настраиваются несколько кнопок.

User avatar
HaRT
Moderator
Posts: 8048
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

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

Post by HaRT » Sat 22 Jul, 2017 02:32

Не знаю конкретно насчёт закрыть, но вот тут и кнопкосочетание получается, и окошко на экране не остаётся, и код простой и небольшой.
Фар есть инструмент, а не нянька. © 2009 DrKnS

buniak_a_h
Posts: 313
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 34 times
Been thanked: 4 times
Contact:

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

Post by buniak_a_h » Sat 22 Jul, 2017 02:57

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.  local Res
  3.  local h,ww=Far.Height,_s:len()+4
  4.  local function _handl(hndl, Msg1, _, _)
  5.   if Msg1 == F.DN_DRAWDIALOGDONE then
  6.    Res = mf.key(mf.waitkey(0,1))
  7.    hndl:send(F.DM_CLOSE)
  8.   end
  9.  end
  10.  local t=h-6
  11.  local b=t+4
  12.  far.Dialog('', -1,t,ww,b, nil,
  13.   {
  14.     {F.DI_DOUBLEBOX, 0,0,ww+1, 5, 0,0,0,           0, ''},
  15.     {F.DI_TEXT,      2,2,ww-2, 2, 0,0,F.CENTERTEXT,0, _s},
  16.   }, F.DIF_CENTERGROUP, _handl
  17.  )
  18.  return Res
  19. end -- _InKey
Всего-то 19 строк...
Сама функция из макроса (action=funcion()...end) - та же, что в моём примере. Возможно, проблема в нём, но он уж совсем тривиальный!..

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

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

Post by zg » Sat 22 Jul, 2017 19:06

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

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

buniak_a_h
Posts: 313
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 34 times
Been thanked: 4 times
Contact:

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

Post by buniak_a_h » Sat 22 Jul, 2017 19:33

zg wrote:
Sat 22 Jul, 2017 19:06
почему не так:<...>
Спасибо. Так действительно выглядит логичнее. Просто для того, чтоб так написать, надо знать сообщения с параметрами и функцию far.InputRecordToName. Перебирать все сообщения я не стал: нашёл первое подходящее. Да и делал по образу и подобию функций, написанных John Doe, SimSU и Smuel, а там везде используется mf.waitkey
Но! Сути практически не меняет. Вместо faf.Message() приходится своё окошко рисовать.

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

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

Post by zg » Sun 23 Jul, 2017 10:45

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

Code: Select all

far.Message("\n\n","Press key","")
res=mf.waitkey()
far.AdvControl("ACTL_REDRAWALL")

buniak_a_h
Posts: 313
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 34 times
Been thanked: 4 times
Contact:

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

Post by buniak_a_h » Sun 23 Jul, 2017 16:46

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: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

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

Post by Shmuel » Sun 23 Jul, 2017 17:08

Да, документация несовершенна. Однако все ею недовольные могут поучаствовать своим трудом и временем в её улучшении.
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)? Эти функции там очень даже описаны.

buniak_a_h
Posts: 313
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 34 times
Been thanked: 4 times
Contact:

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

Post by buniak_a_h » Sun 23 Jul, 2017 17:47

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, а в нём, как раз, описания библиотеки нету.

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

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

Post by Shmuel » Sun 23 Jul, 2017 17:56

buniak_a_h wrote:
Sun 23 Jul, 2017 17:47
Документацию в формате CHM прочитать невозможно
Это как понимать? Я вроде читаю, и ничего.
buniak_a_h wrote:
Sun 23 Jul, 2017 17:47
формат "заточен" на поиск конкретного описания конкретной функции или имени
Простой поиск regex в этом мануале немедленно выдаёт все вхождения.

Post Reply

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