01.02.2009, 23:23 | #1 |
Участник
|
Потеря фокуса при вызове формы поиска
Добрый день!
Столкнулся с проблемой: в форме SalesTable при использовании стандартного поиска из контекстного меню после возникновении на экране стандартной формы поиска (SysFormSearch) она теряет фокус. Фокус переходит обратно на форму SalesTable. Эффект наблюдаю только в одном из приложений (DAX 4.0). Такое ощущение, что эффект возникает в том случае, когда сразу нажимаешь правую кнопку мыши на некоторой строке формы заказы, в контекстном меню выбираешь поиск. При этом сама выбранная строка формы не обновилась. Выпадает форма поиска, сразу после этого она теряет фокус. А выбранная строка формы заказы обновляется (актуализируется). Как можно попробовать полечить? В каком направлении копать? Или версия ядра виновата?
__________________
Paul_ST |
|
01.02.2009, 23:36 | #2 |
Участник
|
Может кто-то изменил форму SysFormSearch?
|
|
01.02.2009, 23:57 | #3 |
Участник
|
Исключено. Форма только на sys
__________________
Paul_ST |
|
02.02.2009, 00:45 | #4 |
Administrator
|
А форму SalesTable? Если она изменена - то попробуйте повторить ситуацию, удалив с нее все изменения. Встречался я с тем, что могут перекрыть всякие методы типа lostFocus и все такое
__________________
Возможно сделать все. Вопрос времени |
|
02.02.2009, 01:58 | #5 |
Участник
|
Да, уже попробовал!
Удивительное дело, но в SalesLin_ds.active() присутствовала незамысловатая строка - управление видимостью группы на одной из вкладок нижней части (относящейся к датасорсу SalesLine) в зависимости от Salesline.SalesType. Закомментировав эту строку, обнаружил исчезновение проблемы. Группа, о которой идет речь, без подводных камней. ПРосто два дополнительных поля из SalesLine. В чем здесь может быть дело?
__________________
Paul_ST |
|
02.02.2009, 09:13 | #6 |
Участник
|
Что похожее было
Багофича в закупке
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
03.06.2009, 10:27 | #7 |
Участник
|
Ax 4.0
Такая же фигня - во всех формах со строками, если в строке присутствует метод active, в котором меняется видимость элемента формы, то при вызове формы фильтра, форма забирает фокус на себя. Кто-нибудь решал данную проблему? |
|
02.03.2011, 16:15 | #8 |
Участник
|
В DAX2009 такая же проблемма на форме SalesTable и вся беда в том что форма модифицирована и прилично и в методе active видимость кнопок регулируется.
Решения пока нет? |
|
03.03.2011, 09:55 | #9 |
Участник
|
Все дело оказалось в контроле StatikText, при получении текста он меняет свой размер и забирает фокус. Заменил его на StringEdit и поставил фиксированный размер и все заработало.
|
|
|
За это сообщение автора поблагодарили: Logger (1). |
03.03.2011, 11:30 | #10 |
Участник
|
|
|
03.03.2011, 13:32 | #11 |
Участник
|
Если имеется в виду поле в форме поиска, то в Ax4.0 оно уже как раз StringEdit, а вовсе не StaticText, и ошибка есть.
|
|
03.03.2011, 15:57 | #12 |
Участник
|
Сама форма поиска тут не при чём. Суть проблемы кроится в контекстном меню грида, а точнее в опции LinkType Delayed связанного источника данных. Это опция разрешает системе ждать некоторое время перед посылкой запроса на выборку связанных данных. Это сделано для того, что бы увеличить производительность при быстром движении курсора по гриду (система на всякий случай ждёт а вдруг курсор пойдёт дальше, зачем тогда зря выбирать связанные данные). Система выжидает подобный таймаут при активации строки правой кнопкой мыши так же как и при левой. Вот и получается что контекстное меню уже открыто, а выборка данных связанного датасурса ещё не произошла. Только после выбора пункта меню управление возвращается к форме где происходят все нужные действия по отображению связанных данных. И если, например, в событии active связанного источника данных находится код, который изменяет дизайн фрмы, то это вызывает переход фокуса.
Как мне видится, решить проблему можно только если принудительно заставить систему игнорировать опцию Delayed при правом клике. Но как это сделать? |
|
|
За это сообщение автора поблагодарили: Zabr (7). |
03.03.2011, 17:55 | #13 |
Участник
|
Наверное, danket имел ввиду, что на форму SalesTable был вынесен какой-то информационный StaticText , который в методе Active datasourca принимал определенную value(). Что-то наподобе второго caption. Заменив StaticText на StringEdit проблему решил. AX2009
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 03.03.2011 в 18:03. |
|
05.03.2011, 13:10 | #14 |
NavAx
|
Обычно помогает вот что:
1. Убрать установки visible с active или заменить на enabled. 2. Никаких обновлений "левых" полей/надписей(StaticText) на active - все на display методах. Ну, или как описано - замена на StringEdit.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
09.03.2011, 12:37 | #15 |
Участник
|
Кажется, понял причину проблемы потери фокуса окна поиска в формах "SalesTable" и "PurchTable"
Проблема там вызвана, судя по всему, функциональностью формата адресов доставки, которая используется в локализации Аксапта. Каждый раз, при отрабатывании метода active источника данных формы происходит "перерисовывание" контролов на закладке "Адрес". При этом обновление контролов происходит как в самом заказе, так и в строках заказа (даже если у вас отключен конфигурационный ключ "TradeMultiShipTo" - "Несколько получателей", и закладка "Адрес" в строках - не видима!). Именно в полях адреса имеется контрол "StaticText" который "забирает" фокус. Решить проблему можно таким способом. 1. Если вы не используется функциональность "Несколько получателей" - лучше всего вообще отключить функциональность Адресов для строк заказа (закупки). (или "повесить" туда конфигурационный ключ "TradeMultiShipTo") class FormRunListener_Address_RU X++: public static container addressInfo(Args _args) ... case formstr(SalesTable) : return [[#HeaderDeliveryAddress, tablenum(AddressMap)]]; ... X++: public void pageActivated() { SysSetupFormRun SysSetupFormRun = element; ; SysSetupFormRun.active_W(); super(); } class Info: X++: void formNotify(FormRun formRun,FormNotify event) ... // <GEEU> if (SysDictClass::is(formRun, classnum(SysSetupFormRun))) { // исправить ошибку потери фокуса при открытии окна поиска, перерисовка происходит при активации tabPage if (formRun.name() == FormStr(PurchTable) || formRun.name() == FormStr(SalesTable)) break; // <-- sysSetupFormRun = formRun; sysSetupFormRun.active_W(); } // </GEEU> ... (Так как больше не происходит лишних действий по обновлению полей адреса) |
|
09.03.2011, 13:29 | #16 |
Участник
|
Судя по тому что у меня в четверке нет класса FormRunListener_Address_RU - это рецепт для Ax2009 ?
|
|
09.03.2011, 13:40 | #17 |
Участник
|
Цитата:
В предыдущих версиях идея примерно была та же. Группа полей адреса "перерисовывается" каждый раз при активации новой записи. В версии 4 не видел, но наверное там работает та же система что и в версии 3.0. Попробуйте перенести код (ниже) (из метода Active) в метод pageActivated X++: if(isConfigurationkeyEnabled(configurationkeynum(RAddress)) && ret) addressEngine_RU.afterDataSourceActive(); |
|
09.03.2011, 13:53 | #18 |
Участник
|
|
|
09.03.2011, 14:01 | #19 |
Участник
|
Не знаю как в версии 4,0 но может быть и там могут быть поля адресов как в заказе, так и в строках заказа, поэтому метод active нужно отключать в 2-х местах сразу, для обоих источников данных ...
Но так или иначе, поля с адресами - это не единственная возможная причина потери фокуса. Могут быть и другие (свои кастомизации, или еще что...) |
|
|
За это сообщение автора поблагодарили: Logger (3). |
03.08.2022, 14:22 | #20 |
Участник
|
Решил проверить одну догадку и вроде как помогло.
В init() формы поиска SysFormSearch получаю ссылку на вызвавшую её форму и блокирую её перерисовку методом lock() AOT\Forms\SysFormSearch X++: void init() { // KSM 03.08.2022 -->> fix "Потеря фокуса при вызове формы поиска" FormDataSource fds; ; fds = this.args().record().dataSource(); caller = fds.formRun(); caller.lock(); // KSM 03.08.2022 <<-- fix "Потеря фокуса при вызове формы поиска" _dataset = element.args().dataset(); super(); } Переменная caller типа FormRun объявлена в ClassDeclaration. Но оно вроде как и без этого само восстанавливается, потому как ещё до закрытия формы поиска видно как на заднем плане перерисовывается основная форма, но к потери фокуса это уже не приводит. Вуаля, форма поиска больше не теряет фокус там где раньше теряла. |
|
|
За это сообщение автора поблагодарили: Pustik (7), Logger (10). |
Теги |
ax4.0, sysformsearch, поиск, фокус, форма |
|
|