Не перерисовывается DI_EDIT после сброса Selection Topic is solved

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Не перерисовывается DI_EDIT после сброса Selection

Post by buniak_a_h »

Здравствуйте, уважаемые знатоки!
У меня такая проблема:
Установлен плагин DlgSelect (делает SelectAll при переходе на DI_EDIT в диалоге). Мне нужно эту отметку снять.
Как показали эксперименты, ни при DN_UNUTDIALOG, ни при DN_GOTFOCUS отметка ещё не сделана, а вот в DN_DRAWDLGITEMDONE - уже есть. Дальше делаю так:

Code: Select all

   if hDlg:send(F.DM_GETSELECTION, Pth).BlockType ~= F.BTYPE_NONE then
    hDlg:send(F.DM_SETSELECTION, Pth, {BlockType = F.BTYPE_NONE} )
   end
Как показывает дальнейшая проверка, отметка снимается. Если в этот момент вызвать far.Show, то это видно. Но если не переключать фокус, то на экране ничего не меняется (как будто текст отмечен). Пробовал: far.AdvControl("ACTL_REDRAWALL"), hDlg:send(F.DM_REDRAW) и даже fat.Text() - ничего не помогает. Как сделать, чтоб на экране было видно, что отметка снята?
P/S про Keys"End" я знаю - вызывает вылет.
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Не перерисовывается DI_EDIT после сброса Selection

Post by John Doe »

Код полностью, пожалуйста
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Не перерисовывается DI_EDIT после сброса Selection

Post by zg »

диалог же ваш?
тогда в диалоговой процедуре:

Code: Select all

if msg==F.DN_GOTFOCUS then
  return 0
end
update: в принципе сейчас работает с любым вариантом возврата, кроме nil, но по документации надо 0 возвращать.
Last edited by zg on Tue 05 Nov, 2019 20:03, edited 2 times in total.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Не перерисовывается DI_EDIT после сброса Selection

Post by buniak_a_h »

zg, спасибо. Это не ответ на вопрос, но решение проблемы. Насколько я понимаю, возврат nil продолжает обработку (в т.ч. плагином), любое другое значение - останавливает. К сожалению, в документации не написано, что означает "0" и какие вообще могут быть альтернативы. А когда альтернативы не перечислены, создаётся впечатление, что от возврата ничего не зависит.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Не перерисовывается DI_EDIT после сброса Selection

Post by buniak_a_h »

John Doe wrote: Tue 05 Nov, 2019 19:48 Код полностью, пожалуйста
ClickToTitleDir-1.4.6.7z
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Не перерисовывается DI_EDIT после сброса Selection

Post by zg »

buniak_a_h wrote: Tue 05 Nov, 2019 20:54Это не ответ на вопрос
события можно перехватывать в трёх разных местах. DlgSelect перехватывает DN_GOTFOCUS на уровне DefDlgProc, это правильно, т.е. он осознанно влияет только на те диалоги, которые не обрабатывают DN_GOTFOCUS. при возврате nil DefDlgProc вызывается, при любом другом значении — нет, это есть в справке. сейчас фар не проверяет, что вернуло DN_GOTFOCUS, но в будущем может и начать, поэтому лучше возвращать 0, как написано в документации.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Не перерисовывается DI_EDIT после сброса Selection

Post by buniak_a_h »

zg, это я всё понял. Изначально вопрос-то был в другом: не как запретить обработку, а почему изменение после DM_SETSELECTION(…, {BlockType=0}) не отображается на экране. Вот эту логику понять хотел…
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Не перерисовывается DI_EDIT после сброса Selection

Post by zg »

потому что DN_DRAWDLGITEMDONE вызывается внутри процедуры отрисовки диалога, когда любые перерисовки диалога игнорируются.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

Не перерисовывается DI_EDIT после сброса Selection

Post by buniak_a_h »

Спасибо. Я думал, …DONE говорит о том, что обработка закончилась. Т.е. событие DN_DRAWDLGITEMDONE посылается после выхода из обработки. Ну, ясно. Тему можно закрыть.
Post Reply

Return to “Нужна помощь”