Немодальный диалог

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Немодальный диалог

Post by NightRoman »

Latest post of the previous page:

Еще лучше было бы, если такой пост-DN_CLOSE вызывался с уже закрытым (не виден, убран из списков окон), но еще не разрушенным диалогом, чтобы можно было получить текущие данные). Жить без этого, впрочем, можно, в DN_CLOSE надо сохранить данные еще живого диалога на потом. Но вот без самого пост-DN_CLOSE (с убитым или живым диалогом, неважно) непонятно пока, как быть.
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 »

zg wrote: Fri 29 Sep, 2017 20:57
John Doe wrote: Fri 29 Sep, 2017 20:36Будет ли ошибкой после закрытия диалога попытаться использовать SendDlgMessage?
будет то же, что SendDlgMessage для обычного диалога, которому сделали DialogFree.
Что если (по дополнительному флагу) не освобождать диалог, а требовать явного DialogFree?
zg wrote: Fri 29 Sep, 2017 20:57
John Doe wrote: Fri 29 Sep, 2017 20:36Есть ли возможность узнать о том, что диалог закрыт?
проверить наличие в списке окон.
Это ещё более громозко, чем установка флага в обработчике диалога..
Имеет ли шанс виш на мантисе о функции проверки валидности хэндла?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Немодальный диалог

Post by NightRoman »

В примере ниже (PowerShellFar) немодальный диалог используется для показа прогресса. Работает. Но приходится вызывать
ACTL_REDRAWALL ($Far.UI.Redraw()), иначе диалог не отрисовывается, ни при открытии, ни при обновлении данных. Так и должно быть?

Code: Select all

$dialog = $Far.CreateDialog(-1, -1, 52, 4)
$t1 = $dialog.AddText(1, 1, 50, 'Progress')
$t2 = $dialog.AddText(1, -1, 50, '')
$dialog.Open()
1..9 | .{process{
    $t2.Text += $_
    $Far.UI.Redraw()
    Start-Sleep 1
}}
$dialog.Close()
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 »

Сомневаюсь что должно.

Code: Select all

local id = win.Uuid"45B09D0D-6AE8-416C-BB5A-F5FA7B5CC430"
local F = far.Flags
local function Progress(text,title)
  local len = text:len()
  local items = {
    --[[01]]  {F.DI_SINGLEBOX,0,0,len+2,3,0,0,0,0,title},
    --[[02]]  {F.DI_TEXT,     1,1,0,0,0,0,0,0,text},
  }
  local flags = F.FDLG_NONMODAL
  return far.DialogInit(id,-1,-1,len+2,3,len,items,flags)
end

local hDlg = Progress(" ")
for i=1,5 do
  --hDlg:send"DM_REDRAW"
  win.Sleep(500)
  hDlg:send("DM_SETTEXT",2,i)
end
Тут то же самое, без DM_REDRAW не отображается.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Немодальный диалог

Post by NightRoman »

DM_REDRAW получше будет (спасибо за напоминание, добавил в Фарнет). Но хорошо бы без этого, если это возможно.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Немодальный диалог

Post by NightRoman »

Придумал, как обойтись без предложенного пост-DM_CLOSE. В имеющемся DM_CLOSE формируем работу и засылаем Фару с ACTL_SYNCHRO. Когда Фар получит управление, он закроет диалог и уже потом вызовет нашу работу. Неочевидно, может, но работоспособно.
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 »

NightRoman wrote: Sat 30 Sep, 2017 13:27Неочевидно, может, но работоспособно.
Не очевидней ли всё будет, если немодальный диалог будет освобождаться по DialogFree, как и обычный?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Немодальный диалог

Post by NightRoman »

Непонятно, как это с моему случаю относится. Вот форма (немодальный диалог). Юзер жмет ОК. Мне надо что-то сделать, когда форма закроется. Кто и когда в этом сценарии должен вызывать DialogFree?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Немодальный диалог

Post by NightRoman »

В принципе, немодальные процессы обычно и устроены на "продолжениях" (continuation). Так что решение с ACTL_SYNCHRO вполне вписывается. Меня, вроде, устраивает. Неочевидно, да. Но решение найдено, задокументирую, подумаю, какие хелперы в Фарнет добавить.
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 »

NightRoman wrote: Sat 30 Sep, 2017 14:56 решение с ACTL_SYNCHRO вполне вписывается.
А есть уверенность, что в момент, когда ваш код получит управление, диалог ещё не будет освобождён фаром?
По факту и в моих экспериментах непосредственно после закрытия всё было в порядке, но после разъяснения у меня уверенность пропала.
NightRoman wrote: Sat 30 Sep, 2017 14:52Непонятно, как это с моему случаю относится.
Это будет гарантировать, что диалог в вашем распоряжении, пока вы его явно не освободите.

Edit
Впрочем, я действительно не сразу вас понял , ACTL_SYNCHRO вам требуется для того чтобы запустить действие после закрытия диалога, а данные из него вы можете и DN_CLOSE собрать.
Last edited by John Doe on Sat 30 Sep, 2017 15:52, edited 1 time in total.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Немодальный диалог

Post by Shmuel »

zg wrote: Fri 29 Sep, 2017 14:02в общем в дискуссию призывается Shmuel, для разъяснения для чего вообще эта странная магия с сохранением состояния в диалоге нужна
Можно было бы и без магии (сделать правку в luaplug.c), но это поломает существующие плагины. Сейчас из luaplug.c в LF_DlgProc всегда передаётся основной lua_State* плагина (что нехорошо, но оставлено так, чтобы не поломать API). Но есть сценарии, когда можно использовать дополнительные независимые lua_State - например, используя библиотеку rings. Вот здесь употреблять в диалоговой процедуре основной lua_State нельзя - не будет работать и будет падать.
Last edited by Shmuel on Sat 30 Sep, 2017 17:20, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Немодальный диалог

Post by zg »

Shmuel wrote: Sat 30 Sep, 2017 17:18Вот здесь употреблять в диалоговой процедуре основной lua_State нельзя - не будет работать и будет падать.
как было — тоже падало. до 619 выполнить
lua:@test.lua
lua:collectgarbage()
lua:far.DialogRun(DDD)
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Немодальный диалог

Post by Shmuel »

zg wrote: Sat 30 Sep, 2017 17:36как было — тоже падало
А разве кто-то спорит?
P.S. В сценарии с независимыми lua_State и раньше не падало. В сценарии с макросами - падало, но это не было никому известно до последнего времени. Твой фикс починил сценарий с макросами, но поломал сценарий с независимыми lua_State. Поэтому пришлось сделать по-другому.
Last edited by Shmuel on Sat 30 Sep, 2017 17:49, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Немодальный диалог

Post by zg »

а можно пример, как внутри rings.new():dostring обращаться к фаровским библиотекам?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Немодальный диалог

Post by Shmuel »

Пожалуйста. Только библиотека немножко патченая мной.
rings.7z
(6.1 KiB) Downloaded 108 times
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 »

В мануале есть пример, но сказано
After replacing the standard Lua 5.1 DLL with one from LuaJIT 2.0, this example has stopped working. The issue is investigated.
Post Reply

Return to “Разработка плагинов”