Latest post of the previous page:
@2useven10Code: Select all
zg 17.10.2014 04:06:40 +0200 - build 4138
1. ACTL_GETWINDOWINFO возвращает все окна в порядке текущего z-order'а.
Не документировано, но пока так.
Latest post of the previous page:
@2useven10Code: Select all
zg 17.10.2014 04:06:40 +0200 - build 4138
1. ACTL_GETWINDOWINFO возвращает все окна в порядке текущего z-order'а.
Я попробовал добавить в диалог элемент, который может получать фокус (конкретно - кнопку). Но, как выяснилось, диалог не получает событий от мыши и клавиатуры, пока не закончится цикл. Более того! ФАР, похоже, не получает прерываний (как если бы цикл выполнялся в главном потоке). А как организовать "фоновое"выполнение цикла? Надо делать coroutine и т.д.?John Doe wrote: ↑Sat 30 Sep, 2017 09:24 Сомневаюсь что должно.Тут то же самое, без DM_REDRAW не отображается.Code: Select all
--здесь был Ваш пример
FarDialog (closed)
.1. Обработчик вызывается. Проверено в немодальном вариантеJohn Doe wrote: ↑Tue 06 Nov, 2018 09:19 buniak_a_h, вы неправильно тестируете, и соответственно делаете преждевременные выводы.
Для начала стоит посмотреть вызывается ли обработчик, и с какими параметрами.
Для этого удобно использовать win.OutputDebugString.
В конкретном данном случае вы ошиблись с параметрами функции-обработчика, должно быть так: https://api.farmanager.com/ru/defs/dlgproc.html
_,
, но на работу это не повлияет - проверено в другом скрипте.В нём тоже:
Code: Select all
local function DlgProc(hDlg,Msg,Param1,Param2) -- JD: правильные аргументы
if Msg==F.DN_CLOSE then cont=false end -- BAX, при закрытии диалога выставляю признак, что цикл можно снимать
end
return far.DialogInit(id,-1,-1,len,4,len,items,flags, DlgProc)
end
Code: Select all
local hDlg = Progress(" ")
local i = 1
far.Timer(500,function(t)
i = i+1
if not cont or i>20 then t:Close(); return end
hDlg:send("DM_SETTEXT",2,i)
end)
Вы пробовали?
Спасибо, попробую...
У timer object-а, видимо, должен быть метод типа Free() ? Ведь надо как-то его останавливать после закрывания диалога...timer = far.Timer (interval, handler [, ...])
Returns:
timer : userdata (timer object), or nil
Разумеется.
В мануале всё есть.buniak_a_h wrote: ↑Tue 06 Nov, 2018 14:18 В мануале упомянут timer:Close(), но это не ответ. Хотелось бы описание типа с перечислением доступных методов и пропертей...
Поправка: этого достаточно для демонстрации, что желаемое вами достижимо, но не гарантирую, что код полный.
Заменил. (обработчик, не far.Timer!) Есессно, ничего не заработало.
Из этого разве не следует что вы должны заменить и свой цикл моим таймером?
Code: Select all
local id = win.Uuid"45B09D0D-6AE8-416C-BB5A-F5FA7B5CC430"
local F = far.Flags
local timer
local function Progress(text,title)
local len = math.max(10,text:len()+2)
local items = {
--[[01]] {F.DI_SINGLEBOX,0,0,len,4,0,0,0,0,title},
--[[02]] {F.DI_TEXT, 1,1,0,0,0,0,0,F.DIF_CENTERGROUP,text},
--[[03]] {F.DI_BUTTON, -1,2,-1,2,0,0,0,F.DIF_CENTERGROUP,"Ok"},
}
local flags = F.FDLG_NONMODAL
return far.DialogInit(id,-1,-1,len,4,len,items,flags,function(hDlg,Msg)
if Msg==F.DN_CLOSE then timer:Close() end
end)
end
local hDlg = Progress(" ")
local i = 0
timer = far.Timer(500,function(t)
i = i+1
if i>20 then t:Close(); return end
hDlg:send(F.DM_SETTEXT,2,i)
end)
Я же про обработчик писал, что он не влияет. А что таймер поможет - я просто тогда не пробовал.