Latest post of the previous page:
Еще лучше было бы, если такой пост-DN_CLOSE вызывался с уже закрытым (не виден, убран из списков окон), но еще не разрушенным диалогом, чтобы можно было получить текущие данные). Жить без этого, впрочем, можно, в DN_CLOSE надо сохранить данные еще живого диалога на потом. Но вот без самого пост-DN_CLOSE (с убитым или живым диалогом, неважно) непонятно пока, как быть.Немодальный диалог
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
Что если (по дополнительному флагу) не освобождать диалог, а требовать явного DialogFree?
Это ещё более громозко, чем установка флага в обработчике диалога..
Имеет ли шанс виш на мантисе о функции проверки валидности хэндла?
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Немодальный диалог
В примере ниже (PowerShellFar) немодальный диалог используется для показа прогресса. Работает. Но приходится вызывать
ACTL_REDRAWALL ($Far.UI.Redraw()), иначе диалог не отрисовывается, ни при открытии, ни при обновлении данных. Так и должно быть?
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()
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
Сомневаюсь что должно.
Тут то же самое, без DM_REDRAW не отображается.
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
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Немодальный диалог
DM_REDRAW получше будет (спасибо за напоминание, добавил в Фарнет). Но хорошо бы без этого, если это возможно.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Немодальный диалог
Придумал, как обойтись без предложенного пост-DM_CLOSE. В имеющемся DM_CLOSE формируем работу и засылаем Фару с ACTL_SYNCHRO. Когда Фар получит управление, он закроет диалог и уже потом вызовет нашу работу. Неочевидно, может, но работоспособно.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
Не очевидней ли всё будет, если немодальный диалог будет освобождаться по DialogFree, как и обычный?
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Немодальный диалог
Непонятно, как это с моему случаю относится. Вот форма (немодальный диалог). Юзер жмет ОК. Мне надо что-то сделать, когда форма закроется. Кто и когда в этом сценарии должен вызывать DialogFree?
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Немодальный диалог
В принципе, немодальные процессы обычно и устроены на "продолжениях" (continuation). Так что решение с ACTL_SYNCHRO вполне вписывается. Меня, вроде, устраивает. Неочевидно, да. Но решение найдено, задокументирую, подумаю, какие хелперы в Фарнет добавить.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
А есть уверенность, что в момент, когда ваш код получит управление, диалог ещё не будет освобождён фаром?
По факту и в моих экспериментах непосредственно после закрытия всё было в порядке, но после разъяснения у меня уверенность пропала.
Это будет гарантировать, что диалог в вашем распоряжении, пока вы его явно не освободите.
Edit
Впрочем, я действительно не сразу вас понял , ACTL_SYNCHRO вам требуется для того чтобы запустить действие после закрытия диалога, а данные из него вы можете и DN_CLOSE собрать.
Last edited by John Doe on Sat 30 Sep, 2017 15:52, edited 1 time in total.
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Немодальный диалог
Можно было бы и без магии (сделать правку в 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.
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Немодальный диалог
как было — тоже падало. до 619 выполнить
lua:@test.lua
lua:collectgarbage()
lua:far.DialogRun(DDD)
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Немодальный диалог
А разве кто-то спорит?
P.S. В сценарии с независимыми lua_State и раньше не падало. В сценарии с макросами - падало, но это не было никому известно до последнего времени. Твой фикс починил сценарий с макросами, но поломал сценарий с независимыми lua_State. Поэтому пришлось сделать по-другому.
Last edited by Shmuel on Sat 30 Sep, 2017 17:49, edited 1 time in total.
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Немодальный диалог
а можно пример, как внутри rings.new():dostring обращаться к фаровским библиотекам?
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
В мануале есть пример, но сказано
After replacing the standard Lua 5.1 DLL with one from LuaJIT 2.0, this example has stopped working. The issue is investigated.