Странное поведение DN_INITDIALOG в зависимости от возврата

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
NightRoman
Posts: 6150
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 29 times
Been thanked: 60 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by NightRoman »

Странное поведение DN_INITDIALOG в зависимости от возврата

Энциклопедия:

Code: Select all

Return
TRUE - если процедура обработки диалога изменила данные.
FALSE - изменений не было.
...
Если изменения были и обработчик диалога вернул системе значение FALSE, то изменённые данные не будут восприняты.
Пример 1, скрипт на FarNet.PowerShellFar:

Code: Select all

$dialog = $Far.CreateDialog(-1, -1, 52, 3)
$edit = $dialog.AddEdit(1, 1, 50, '')
$dialog.add_Initialized({
	$_.Ignore = $false     # DN_INITDIALOG will return TRUE ("changed")
	$edit.Text = 'my edit' # yes, the text is set
	$edit.Line.Caret = 3   # no, not changed
})
$null = $dialog.Show()
показывает, что TRUE работает как бы только частично (текст был применен, но каретка не установлена)

Пример 2, скрипт на FarNet.PowerShellFar:

Code: Select all

$dialog = $Far.CreateDialog(-1, -1, 52, 3)
$edit = $dialog.AddEdit(1, 1, 50, '')
$dialog.add_Initialized({
	$_.Ignore = $true      # DN_INITDIALOG will return FALSE ("not changed")
	$edit.Text = 'my edit' # yes, the text is set
	$edit.Line.Caret = 3   # yes, it is changed
})
$null = $dialog.Show()
показывает что-то странное, изменения должны бы быть проигнорированы, но вместо этого вдруг все "работают" (и текст применен, и каретка установлена).

Как понимать? Что-то не так в энциклопедии или Фаре, или у меня в FarNet?
(Я честно подебажил и убедился в возвращаемых значениях, как описано выше).
User avatar
NightRoman
Posts: 6150
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 29 times
Been thanked: 60 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by NightRoman »

Хотелось бы какой-то отклик, а то думается, может, заинтересованные лица просто не видели?
User avatar
buniak_a_h
Posts: 3557
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 182 times
Been thanked: 526 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by buniak_a_h »

NightRoman, наверное, многих (по себе сужу) отпугивает (а) использование FarNet.PowerShellFar - не самый популярный инструмент и (б) противоречие заголовка и содержания. Отсеять часть причин легко: напишите скрипт без использования FarNet.PowerShellFar.
Из своего опыта (просто макросы) могу сказать следующее: в обработчике событий диалога (а также в ивентах) часто использую обработку DN_INITDIALOG, внутри которого выдаю месседж DM_SETTEXT (и подобные) и возвращаю nil! - и новые данные принимаются. Возможно, посылка месседжа, меняющего содержимое поля, не считается изменением данных; возможно, имеется в виду прямая запись в массив Items (передающийся far.DialogInit-у). Но проверить легче Вам самому. Избавьтесь от FarNet.PowerShellFar, напишите небольшой тестовый скрипт на lua - и сразу узнаете, неправильно обрабатывается DN_INITDIALOG или неправильно используется FarNet.PowerShellFar
Last edited by buniak_a_h on Fri 25 Feb, 2022 02:06, edited 3 times in total.
User avatar
NightRoman
Posts: 6150
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 29 times
Been thanked: 60 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by NightRoman »

buniak_a_h, спасибо. Если вы заинтересованное лицо, не поможете мне с написанием такого скрипта? Я не силен в луа и трудно найти время для изучения только для доказательства, что что-то не так в Фаре или энц. Но время на баг репорт и описание деталей для воспроизведения у меня нашлось. Если моим способом не воспроизводится - так можно и написать.

"Возможно, посылка месседжа, меняющего содержимое поля, не считается изменением данных;" -- это либо противоречит энц., либо энц. следует это оговорить.

И особенно странно с установкой каретки в поле ввода - результат прямо противоположный описанию энц.
User avatar
buniak_a_h
Posts: 3557
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 182 times
Been thanked: 526 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by buniak_a_h »

NightRoman wrote: Fri 25 Feb, 2022 09:25 Если вы заинтересованное лицо
Не, я просто пенсионер
NightRoman wrote: Fri 25 Feb, 2022 09:25 не поможете мне с написанием такого скрипта
Запростяк! Ловите.
User avatar
buniak_a_h
Posts: 3557
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 182 times
Been thanked: 526 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by buniak_a_h »

NightRoman, так что получается, что действительно не все данные игнорируются. Вы правы.
Shmuel
Posts: 6531
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 445 times

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by Shmuel »

Формально, это баг. Но (на мой взгляд) баг в совершенно ненужной фиче.
buniak_a_h wrote: Fri 25 Feb, 2022 13:12 if not Ign then return end
Эта строчка никогда не сработает (согласно документации).
User avatar
buniak_a_h
Posts: 3557
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 182 times
Been thanked: 526 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by buniak_a_h »

Shmuel wrote: Fri 25 Feb, 2022 13:51 Формально, это баг. Но (на мой взгляд) баг в совершенно ненужной фиче.
Согласен. Если не хочешь, чтоб что-то менялось - просто не меняй!
Shmuel wrote: Fri 25 Feb, 2022 13:51
buniak_a_h wrote: Fri 25 Feb, 2022 13:12 if not Ign then return end
Эта строчка никогда не сработает (согласно документации).
Ну да, надо было
if Ign < 0 then return end
Ошибся. Просто логика отказа разная у разных функций. InputBox, Show, Menu возвращают nil, а Message - исключение :sad:
Last edited by buniak_a_h on Fri 25 Feb, 2022 14:26, edited 1 time in total.
User avatar
NightRoman
Posts: 6150
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 29 times
Been thanked: 60 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by NightRoman »

Спасибо всем за участие. Это полезный прогресс, для всех.

Хотелось бы и разработчиков послушать. Что рекомендуется плагинам? Всегда возвращать FALSE? (не и конечно "не хочешь, не меняй")
Shmuel
Posts: 6531
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 445 times

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by Shmuel »

NightRoman wrote: Fri 25 Feb, 2022 16:02 Что рекомендуется плагинам? Всегда возвращать FALSE?
Например, подход Луафара такой:
Если обработчик в скрипте не вернул ничего (или вернул nil), то Луафар вызывает DefDlgProc, и Фару возвращается то, что она возвращает.
User avatar
NightRoman
Posts: 6150
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 29 times
Been thanked: 60 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by NightRoman »

Буду всегда возвращать результат DefDlgProc.

Энциклопеция пишет дезинформацию, кого это касается.
Shmuel
Posts: 6531
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 445 times

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by Shmuel »

NightRoman, только пожалуйста имейте в виду, что я не истина в последней инстанции.
Вроде за много лет этот способ не проявил каких-то побочных эффектов, но сказать, что он однозначно верный, я не могу.
Кроме того, DefDlgProc у меня вызывается только если скрипт уклонился вернуть что-либо значимое. Если же не уклонился, то тут начинается песня - обработка в зависимости от типа Message.
User avatar
NightRoman
Posts: 6150
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 29 times
Been thanked: 60 times
Contact:

Странное поведение DN_INITDIALOG в зависимости от возврата

Post by NightRoman »

Shmuel, спасибо, да, все понимаю, этот шаг - это мое решение, чем оно мотивировано - не важно. Перевожу - вашей вины нет :)
У меня есть тесты, у меня есть ежедневное использование в огромном количестве своих тулзов. Если что-то не так, я узнаю до "публикации", с которой не тороплюсь.
Post Reply

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