Latest post of the previous page:
причём тут вообще DN_CLOSE? у меня всё правильно написано.Немодальный диалог
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Немодальный диалог
Частично помогает, это предотвращает закрытие. Но это буквально команда Фару "я обработал, ничего не делай", а ведь хотелось бы переключения в другое окно в данном новом случае.
- zg
- zero-gravity
- Posts: 6034
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Немодальный диалог
1. ACTL_SETCURRENTWINDOW вроде никто не запрещает использовать.NightRoman wrote: ↑Fri 29 Sep, 2017 10:57Частично помогает, это предотвращает закрытие. Но это буквально команда Фару "я обработал, ничего не делай", а ведь хотелось бы переключения в другое окно в данном новом случае.
2. это не новый случай. немодальные окна не во весь экран есть в фаре очень-очень давно. хотите чтобы переключалось мышкой, пишите вишь на мантис.
- John Doe
- Бюрократ
- Posts: 13849
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
Ещё надо записать:
В случае немодального диалога очень уместен индикатор фоновых экранов, тот что в левом верхнем углу, тот из которого убрали диалоги в 4824. Оказывается уже.
Обработка клавиш типа AltF11 (наверно и других, в зависимости от контекста)
(это я для себя)
В случае немодального диалога очень уместен индикатор фоновых экранов, тот что в левом верхнем углу, тот из которого убрали диалоги в 4824. Оказывается уже.
Обработка клавиш типа AltF11 (наверно и других, в зависимости от контекста)
(это я для себя)
Last edited by John Doe on Fri 29 Sep, 2017 11:42, edited 1 time in total.
- zg
- zero-gravity
- Posts: 6034
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Немодальный диалог
ну вот почему туда же? вот клик вне немодального окна. это же общее отсутствие функциональности. оно и к диалогам относится, и к редакторам, и к просмотрам. altf11 — только к диалогам. зачем всё смешивать?
[?] Show background screens number
- John Doe
- Бюрократ
- Posts: 13849
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
"Туда же" это на мантис.
Я уже сам заметил двусмысленность, и исправил пост.
Update
0003518: Клик за пределами (немодального) окна
0003520: Индикатор фоновых экранов (для диалогов)
Last edited by John Doe on Sun 08 Oct, 2017 17:21, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13849
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
Code: Select all
local id = win.Uuid"45B09D0D-6AE8-416C-BB5A-F5FA7B5CC430"
local F = far.Flags
local items = {
--[[01]] {F.DI_TEXT,1,1,0,0,0,0,0,0,"test"},
}
local flags = "FDLG_NONMODAL"
hDlg = far.DialogInit (id,-1,-1,6,3,HelpTopic,items,flags,function(hDlg,Msg,Param1,Param2)
if Msg==F.DN_CONTROLINPUT and Param1==-1 then
local wi = far.AdvControl(F.ACTL_GETWINDOWINFO)
far.AdvControl(F.ACTL_SETCURRENTWINDOW,wi.Pos-1)
return 1
end
return
end)
Жму F12, возвращаюсь в диалог.
Теперь любое движение мыши вызывает уход диалога в фон (срабатывает обработчик).
Если исхитриться и кликнуть в диалоге, то эффект пропадает.
И падает периодически, последовательность ещё не нашёл.
Code: Select all
╔══════════════════════════ Exception occurred ══════════════════════════╗
║ Exception: Access violation (write to 0x01AAAB40) ║
║ Address: 0x66F935FB lua_pushlightuserdata ║
║ Function: main ║
║ Module: C:\APPs\Far3\Far.exe ║
╟────────────────────────────────────────────────────────────────────────╢
║ { Terminate Far } [ Stack ] [ Minidump ] [ Ignore ] ║
╚════════════════════════════════════════════════════════════════════════╝
Last edited by John Doe on Fri 29 Sep, 2017 12:10, edited 1 time in total.
- zg
- zero-gravity
- Posts: 6034
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Немодальный диалог
проверяли бы для начала на обычном диалоге:
всё то же самое.
Code: Select all
local id = win.Uuid"45B09D0D-6AE8-416C-BB5A-F5FA7B5CC430"
local F = far.Flags
local items = {
--[[01]] {F.DI_TEXT,1,1,0,0,0,0,0,0,"test"},
}
local flags = 0
hDlg = far.DialogInit (id,-1,-1,6,3,HelpTopic,items,0,function(hDlg,Msg,Param1,Param2)
if Msg==F.DN_CONTROLINPUT and Param1==-1 then
local wi = far.AdvControl(F.ACTL_GETWINDOWINFO)
far.Show('hit')
return 1
end
return
end)
far.DialogRun(hDlg)
far.DialogFree(hDlg)
- John Doe
- Бюрократ
- Posts: 13849
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
>(Стек будет когда скачаю pdb)
В стеке ничего не показывает всё равно.
Минимальную последовательность воспроизведения не скажу, но вот такая есть.
Запускаю вышеприведённый макрос из файла
Далее играюсь с диалогом, увожу его в фон, и некоторое время фар не трогаю (или работаю с другой копией).
В итоге фар или сам падает, или после того как я вернусь в него и нажму CtrlTab.
Edit
Есть и минимальная последовательность.
Если не упал сразу, то повторить.
В стеке ничего не показывает всё равно.
Минимальную последовательность воспроизведения не скажу, но вот такая есть.
Code: Select all
far.exe /p%FARHOME%\Plugins /m
Code: Select all
lua:@crash.lua
В итоге фар или сам падает, или после того как я вернусь в него и нажму CtrlTab.
Edit
Есть и минимальная последовательность.
Code: Select all
CtrlTab
lua:collectgarbage()
CtrlTab
Last edited by John Doe on Fri 29 Sep, 2017 12:51, edited 1 time in total.
- zg
- zero-gravity
- Posts: 6034
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Немодальный диалог
если эту закомментировать строку, то у меня падать перестаёт. насколько я понимаю (возможно не совсем правильно), loadfile загружает файл с новым lua_State, который сохраняется в dd->L и который же уничтожается при завершении файла. т.е. диалоговая процедура использует невалидную lua_State. но опять же, никто нам не мешает в файле создать диалог, присвоить его глобальной переменной, а уже из командной строки сделать lua:collectgarbage() и lua:far.DialogRun(...). у меня имевшийся под рукой far 4937 — упал.
в общем в дискуссию призывается Shmuel, для разъяснения для чего вообще эта странная магия с сохранением состояния в диалоге нужна.
в общем в дискуссию призывается Shmuel, для разъяснения для чего вообще эта странная магия с сохранением состояния в диалоге нужна.
Last edited by zg on Fri 29 Sep, 2017 14:04, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13849
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Немодальный диалог
Code: Select all
DialogRun и DialogFree для такого диалога указывать не нужно. при закрытии диалог автоматически уничтожается.
- Будет ли ошибкой после закрытия диалога попытаться использовать SendDlgMessage?
- Есть ли возможность узнать о том, что диалог закрыт?
(Можно конечно в обработчике диалога устанавливать при этом флаг, но это довольно неудобно)
Моя цель — управлять диалогом снаружи. В том числе и из far.Timer()
Last edited by John Doe on Fri 29 Sep, 2017 20:38, edited 1 time in total.
- zg
- zero-gravity
- Posts: 6034
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Немодальный диалог
будет то же, что SendDlgMessage для обычного диалога, которому сделали DialogFree.
проверить наличие в списке окон.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Немодальный диалог
Как задать некоторые процедуры, которые выполнятся после положительного (ОК, Enter) и отрицательного (Esc, click outside) закрытия диалога? Или одну процедуру, но с параметром (как в DN_CLOSE). В настоящее время все, что приходит в голову, это само событие 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:
Немодальный диалог
Еще лучше было бы, если такой пост-DN_CLOSE вызывался с уже закрытым (не виден, убран из списков окон), но еще не разрушенным диалогом, чтобы можно было получить текущие данные). Жить без этого, впрочем, можно, в DN_CLOSE надо сохранить данные еще живого диалога на потом. Но вот без самого пост-DN_CLOSE (с убитым или живым диалогом, неважно) непонятно пока, как быть.
- John Doe
- Бюрократ
- Posts: 13849
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 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()