Пытаюсь в ивенте найти кнопку по умолчанию, используя Dlg.GetValue(i,9) - для всех i эта функция возвращает 0. Это я что-то делаю не так, или ошибочка/недочёт? Вот скрипт, иллюстрирующий сказанное:
local F = far.Flags
local CopyReadOnlyId = win.Uuid(far.Guids.CopyReadOnlyId)
local OkButton = 0
Event {
id = "105ABBE3-9FA7-41A8-AB20-4247A8AE7A08";
group = "DialogEvent";
description = "Тест Dlg.GetValue";
condition = function(Event, Param)
if Event == F.DE_DLGPROCINIT and Param.Msg == F.DN_INITDIALOG then
local DlgId = (Param.hDlg:send(F.DM_GETDIALOGINFO) or {}).Id
return DlgId == CopyReadOnlyId
end
end;
action = function(Event, Param)
local hDlg = Param.hDlg
if OkButton == 0 then
for i=1,Dlg.ItemCount do
--[[*D*]]win.OutputDebugString('BAX.CopyReadOnly.18: ['..i..']='..tostring(Dlg.GetValue(i,9))) -- Всегда 0 !!!
if Dlg.GetValue(i,9) == 1 then-- это НЕ РАБОТАЕТ!!!
OkButton = i
break
end
local item = hDlg:send(F.DM_GETDLGITEM, i) or {}
if item[1] == F.DI_BUTTON and band(item[9] or 0, F.DIF_DEFAULTBUTTON) == F.DIF_DEFAULTBUTTON then -- Так работает!
--[[*D*]]win.OutputDebugString('BAX.CopyReadOnly.22: i='..i) -- i=10
OkButton = i
end
end
end
--if OkButton ~= 0 then
-- Param.hDlg:send(F.DM_CLOSE, OkButton)
--end
end;
}
Как повторить:
скрипт «заточен» под диалог подтверждения переписывания R/O файлов. Соответственно:
делаете в приёмной папке файл,
2.выставляете ему флаг ReadOnly,
делаете файл с таким же именем в исходной папке,
пытаетесь скопировать его в приёмную папку (на вопрос о «переписывать ли» отвечаете "Да").
В отладочном выводе для всех i=1..14 Dlg.GetValue возвращает 0 (для i=10 должно быть 1! ). Это как-то победимо?
Last edited by buniak_a_h on Tue 13 Feb, 2024 13:24, edited 1 time in total.
Сейчас попробовал повторить данный эксперимент.
Выяснилось, что Dlg.GetValue() в данном скрипте на самом деле возвращает параметры не диалога CopyReadOnlyId, а диалога, который под ним (у которого есть прогресс-бар). Это можно увидеть, если вместо Dlg.GetValue(i,9) вызывать Dlg.GetValue(i,10).