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

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

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

Post by buniak_a_h » Tue 05 Nov, 2019 19:44

Здравствуйте, уважаемые знатоки!
У меня такая проблема:
Установлен плагин 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: 12457
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 188 times

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

Post by John Doe » Tue 05 Nov, 2019 19:48

Код полностью, пожалуйста

User avatar
zg
zero-gravity
Posts: 5610
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 100 times
Contact:

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

Post by zg » Tue 05 Nov, 2019 19:59

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

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.

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

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

Post by buniak_a_h » Tue 05 Nov, 2019 20:54

zg, спасибо. Это не ответ на вопрос, но решение проблемы. Насколько я понимаю, возврат nil продолжает обработку (в т.ч. плагином), любое другое значение - останавливает. К сожалению, в документации не написано, что означает "0" и какие вообще могут быть альтернативы. А когда альтернативы не перечислены, создаётся впечатление, что от возврата ничего не зависит.

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

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

Post by buniak_a_h » Tue 05 Nov, 2019 20:56

John Doe wrote:
Tue 05 Nov, 2019 19:48
Код полностью, пожалуйста
ClickToTitleDir-1.4.6.7z

User avatar
zg
zero-gravity
Posts: 5610
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 100 times
Contact:

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

Post by zg » Tue 05 Nov, 2019 21:08

buniak_a_h wrote:
Tue 05 Nov, 2019 20:54
Это не ответ на вопрос
события можно перехватывать в трёх разных местах. DlgSelect перехватывает DN_GOTFOCUS на уровне DefDlgProc, это правильно, т.е. он осознанно влияет только на те диалоги, которые не обрабатывают DN_GOTFOCUS. при возврате nil DefDlgProc вызывается, при любом другом значении — нет, это есть в справке. сейчас фар не проверяет, что вернуло DN_GOTFOCUS, но в будущем может и начать, поэтому лучше возвращать 0, как написано в документации.

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

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

Post by buniak_a_h » Tue 05 Nov, 2019 21:13

zg, это я всё понял. Изначально вопрос-то был в другом: не как запретить обработку, а почему изменение после DM_SETSELECTION(…, {BlockType=0}) не отображается на экране. Вот эту логику понять хотел…

User avatar
zg
zero-gravity
Posts: 5610
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 100 times
Contact:

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

Post by zg » Tue 05 Nov, 2019 21:33

потому что DN_DRAWDLGITEMDONE вызывается внутри процедуры отрисовки диалога, когда любые перерисовки диалога игнорируются.

buniak_a_h
Posts: 1100
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 36 times
Contact:

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

Post by buniak_a_h » Wed 06 Nov, 2019 00:47

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

Post Reply

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