Latest post of the previous page:
Именно, спасибо.
Почему-то в экшне по ивенту не работает
if Dlg.Id == far.Guids.HardSymLinkId then
, хотя по хоткею та же самая строчка работает.far.Message
вообще валит фар в ивенте
Latest post of the previous page:
Именно, спасибо.
if Dlg.Id == far.Guids.HardSymLinkId then
, хотя по хоткею та же самая строчка работает.far.Message
вообще валит фар в ивентеПопробуйте заменить "прямой" вызов
far.Message
на "отложенный" типа mf.postmacro(far.Message, …)
.Попробовал. Валится. После закрытия окна эксепшна и до того, как сам фар закроется, окошко видно, что появилось.
win.Uuid(far.Guids.HardSymLinkId)
использовать. Сдается мне, что Dlg из LuaMacro и Dlg = far.SendDlgMessage(Param.hDlg, F.DM_GETDIALOGINFO)
- две большие разницы. А где про вторую почитать?Есессно. Dlg из LuaMacro - это таблица, содержащая 8 полей, а Param.hDlg - хендлер диалога. Т.е. тот объект, который может выполнять метод send.
Я не про хендл, а про Dlg, который через этот хендл получается в вышеприведенном примере
far.SendDlgMessage(Param.hDlg, F.DM_GETDIALOGINFO)
возвращает таблицу {Id=… , Owner=…}win.Uuid(…)
). Ну или наоборот …Я ж написал, что с этим я уже разобрался.
Alt
+F7
). Если напрямую не получится использовать, посмотрите как пример. Если я правильно понял, что Вас интересует…Code: Select all
local F = far.Flags
local HardSymLinkId = win.Uuid(far.Guids.HardSymLinkId)
Event {
id = "834AF84F-D1AB-49B9-8E0E-09053BCB91DE";
group = "DialogEvent";
description = "Select symlink by default in Alt+F6 dialog";
condition = function(Event, Param)
local doact = false
if Event==F.DE_DLGPROCINIT and Param.Msg==F.DN_INITDIALOG then
local Dlg = Param.hDlg:send(F.DM_GETDIALOGINFO)
doact = Dlg and Dlg.Id==HardSymLinkId
end
return doact
end;
action = function(Event, Param)
local CBID = 0
for a = 1, math.huge do
local Item = Param.hDlg:send("DM_GETDLGITEM", a)
if not Item then break end
if Item[1] == F.DI_COMBOBOX then
if CBID == 0 then
CBID = a
else
CBID = 0
break
end
end
end
if CBID == 0 then
far.Message("Must be exactly one ComboBox!", "Wrong dialog!")
else
Param.hDlg:send(F.DM_LISTSETCURPOS, CBID, {SelectPos=3})
end
end;
}
У вас, кстати, цикл подсчета кол-ва элементов можно упразднить. Count особо и не нужен (а если нужен - можно посчитать сразу в основном цикле).
Исторически сложилось. Я получал Count по
Dlg.ItemCount
- что-то там не срослось. Правда не для диалогов, а для меню (которые, как оказалось, тоже диалоги) Поэтому чтоб не ломать то, что уже работает, просто вычисляю Count и делаю цикл до него.я так понимаю, вы используете в обработчике событий диалогов безусловно far.Message. far.Message — это тоже диалог и для него тоже приходят события. заведите хотя бы глобальный флаг.
Ясно.