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

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
zg
zero-gravity
Posts: 5726
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 135 times
Contact:

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

Post by zg »

Latest post of the previous page:

NightRoman wrote:
Fri 29 Sep, 2017 06:23
Должен ли немодальный диалог автоматически закрываться при клике вне диалога? Сейчас закрывается. Может, это настраивается?
на DN_CONTROLINPUT с param1==-1 вернуть true.

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

zg wrote:
Fri 29 Sep, 2017 09:54
на DN_CONTROLINPUT с param1==-1 вернуть true.

Вероятно FALSE.

И при этом программно переключиться в окно под текущим*.
Хотя и это не совсем верно, ведь клик может быть в области совсем другого окна.

[*] При этом порядок окон у нас в АПИ не определён (и как по мне, то лучше обратный).
Last edited by John Doe on Fri 29 Sep, 2017 10:54, edited 2 times in total.

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

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

Post by zg »

причём тут вообще DN_CLOSE? у меня всё правильно написано.

User avatar
NightRoman
Posts: 5920
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 12 times
Been thanked: 14 times
Contact:

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

Post by NightRoman »

zg wrote:
Fri 29 Sep, 2017 09:54
на DN_CONTROLINPUT с param1==-1 вернуть true.
Частично помогает, это предотвращает закрытие. Но это буквально команда Фару "я обработал, ничего не делай", а ведь хотелось бы переключения в другое окно в данном новом случае.

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

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

Post by zg »

NightRoman wrote:
Fri 29 Sep, 2017 10:57
Частично помогает, это предотвращает закрытие. Но это буквально команда Фару "я обработал, ничего не делай", а ведь хотелось бы переключения в другое окно в данном новом случае.
1. ACTL_SETCURRENTWINDOW вроде никто не запрещает использовать.
2. это не новый случай. немодальные окна не во весь экран есть в фаре очень-очень давно. хотите чтобы переключалось мышкой, пишите вишь на мантис.

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

Ещё надо записать:
В случае немодального диалога очень уместен индикатор фоновых экранов, тот что в левом верхнем углу, тот из которого убрали диалоги в 4824. Оказывается уже.
Обработка клавиш типа AltF11 (наверно и других, в зависимости от контекста)

(это я для себя)
Last edited by John Doe on Fri 29 Sep, 2017 11:42, edited 1 time in total.

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

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

Post by zg »

John Doe wrote:
Fri 29 Sep, 2017 11:19
Туда же надо записать:
Обработка клавиш типа AltF11 (наверно и других, в зависимости от контекста)
ну вот почему туда же? вот клик вне немодального окна. это же общее отсутствие функциональности. оно и к диалогам относится, и к редакторам, и к просмотрам. altf11 — только к диалогам. зачем всё смешивать?
John Doe wrote:
Fri 29 Sep, 2017 11:19
В случае немодального диалога очень уместен индикатор фоновых экранов, тот что в левом верхнем углу, тот из которого убрали диалоги в 4824.
[?] Show background screens number

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

zg wrote:
Fri 29 Sep, 2017 11:32
зачем всё смешивать?
"Туда же" это на мантис.
Я уже сам заметил двусмысленность, и исправил пост.

Update
0003518: Клик за пределами (немодального) окна
0003520: Индикатор фоновых экранов (для диалогов)
Last edited by John Doe on Sun 08 Oct, 2017 17:21, edited 1 time in total.

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

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 ]           ║
╚════════════════════════════════════════════════════════════════════════╝
(Стек будет когда скачаю pdb)
Last edited by John Doe on Fri 29 Sep, 2017 12:10, edited 1 time in total.

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

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

Post by zg »

проверяли бы для начала на обычном диалоге:

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)
всё то же самое.

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

>(Стек будет когда скачаю pdb)
В стеке ничего не показывает всё равно.

Минимальную последовательность воспроизведения не скажу, но вот такая есть.

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.

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

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

Post by zg »

если эту закомментировать строку, то у меня падать перестаёт. насколько я понимаю (возможно не совсем правильно), loadfile загружает файл с новым lua_State, который сохраняется в dd->L и который же уничтожается при завершении файла. т.е. диалоговая процедура использует невалидную lua_State. но опять же, никто нам не мешает в файле создать диалог, присвоить его глобальной переменной, а уже из командной строки сделать lua:collectgarbage() и lua:far.DialogRun(...). у меня имевшийся под рукой far 4937 — упал.
в общем в дискуссию призывается Shmuel, для разъяснения для чего вообще эта странная магия с сохранением состояния в диалоге нужна.
Last edited by zg on Fri 29 Sep, 2017 14:04, edited 1 time in total.

User avatar
John Doe
Бюрократ
Posts: 12660
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 271 times

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

Post by John Doe »

Code: Select all

   DialogRun и DialogFree для такого диалога указывать не нужно. при закрытии диалог автоматически уничтожается.
Хочу прояснить для себя пару моментов (возможно упустил что-то из документации).
  1. Будет ли ошибкой после закрытия диалога попытаться использовать SendDlgMessage?
  2. Есть ли возможность узнать о том, что диалог закрыт?
    (Можно конечно в обработчике диалога устанавливать при этом флаг, но это довольно неудобно)
P.S.
Моя цель — управлять диалогом снаружи. В том числе и из far.Timer()
Last edited by John Doe on Fri 29 Sep, 2017 20:38, edited 1 time in total.

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

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

Post by zg »

John Doe wrote:
Fri 29 Sep, 2017 20:36
Будет ли ошибкой после закрытия диалога попытаться использовать SendDlgMessage?
будет то же, что SendDlgMessage для обычного диалога, которому сделали DialogFree.
John Doe wrote:
Fri 29 Sep, 2017 20:36
Есть ли возможность узнать о том, что диалог закрыт?
проверить наличие в списке окон.

User avatar
NightRoman
Posts: 5920
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 12 times
Been thanked: 14 times
Contact:

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

Post by NightRoman »

Как задать некоторые процедуры, которые выполнятся после положительного (ОК, Enter) и отрицательного (Esc, click outside) закрытия диалога? Или одну процедуру, но с параметром (как в DN_CLOSE). В настоящее время все, что приходит в голову, это само событие DN_CLOSE. С ним нет никаких проблем, кроме одной, диалог-то еще не закрыт, а это может быть нежелательно для продолжения работы с полученным результатом диалога.

Если ничего такого нет, то хотелось бы иметь некий пост-DN_CLOSE с хендлом диалога (уже невалидным, диалога больше нет, но знать-то надо для какого именно бывшего диалога это вызывается) и индексом контрола (результат закрытия).

User avatar
NightRoman
Posts: 5920
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 12 times
Been thanked: 14 times
Contact:

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

Post by NightRoman »

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

Post Reply

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