lm:post Keys "F9 c a"
(язык интерфейса английский, должен открыться список ассоциаций)В результате плагин падает.
lm:post Keys "F9 c a"
(язык интерфейса английский, должен открыться список ассоциаций)По всей видимости, param.hDlg валиден только на время обработки события (это предположение, не утверждение). Прямой вызов far.SendDlgMessage, то-есть производимый до выхода из ф-ции обработчика, к падению не приводит. А вызов mf.postmacro приводит к отложенному вызову far.SendDlgMessage, производимому уже после выхода из ф-ции обработчика. Никто не гарантировал, что param.hDlg будет валиден и после выхода из ф-ции обработчика.John Doe wrote:В результате плагин падает.
Проблема не возникает в других меню кроме File associationsShmuel wrote:По всей видимости, param.hDlg валиден только на время обработки события (это предположение, не утверждение).
Возникает и при вызове макросом диалога LF History. Думаю, найдутся и другие примеры.John Doe wrote:Проблема не возникает в других меню кроме File associations
Для воспроизведения обязательно использовать макрос lm:post
Во всех прочих случаях проблем с param.hDlg нет.
Code: Select all
local hDlg = far.AdvControl(F.ACTL_GETWINDOWINFO).Id
if hDlg ~= param.hDlg then mf.beep() end
Ранее в параллельной теме писалось что хэндл это адрес диалога в памяти.Shmuel wrote:По всей видимости, param.hDlg валиден только на время обработки события
во время выполнения макроса "f9 c a" появляется 2 диалога. первый — выпадающее меню. mf.postmacro — асинхронна и к моменту её выполнения, первого диалога уже нет.John Doe wrote:Ранее[/url] в параллельной теме писалось что хэндл это адрес диалога в памяти.
Непонятно как адрес уже открытого диалога может меняться с ходом времени.
Например, Фар может поддерживать список хэндлов незакрытых диалогов. При каждом вызове SendDlgMessage, проверять, находится ли переданный хэндл в списке.John Doe wrote:Осталось выяснить можно ли как-то избежать падения при попытке использования неверного hDlg?
John Doe wrote:Действительно.
Осталось выяснить можно ли как-то избежать падения при попытке использования неверного hDlg?
Приведенная функция не учитывает диалоги, которые не являются окнами в данный момент, то-есть вызывалась функция DialogRun, но не вызывалась DialogFree.zg wrote:function IsDlgValid(hdlg)
Code: Select all
local items = {{"DI_EDIT",1,3,10,3, 0,0,0,0,"text"}}
local h = far.DialogInit ("",-1,-1,40,10,nil,items)
for k=1,3 do
far.DialogRun(h)
far.Message(IsDlgValid(h))
end
far.DialogFree(h)