AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.02.2009, 23:23   #1  
Paul_ST is offline
Paul_ST
Участник
 
144 / 11 (1) +
Регистрация: 26.11.2003
Адрес: Екатеринбург
Потеря фокуса при вызове формы поиска
Добрый день!
Столкнулся с проблемой: в форме SalesTable при использовании стандартного поиска из контекстного меню после возникновении на экране стандартной формы поиска (SysFormSearch) она теряет фокус. Фокус переходит обратно на форму SalesTable.
Эффект наблюдаю только в одном из приложений (DAX 4.0).
Такое ощущение, что эффект возникает в том случае, когда сразу нажимаешь правую кнопку мыши на некоторой строке формы заказы, в контекстном меню выбираешь поиск. При этом сама выбранная строка формы не обновилась. Выпадает форма поиска, сразу после этого она теряет фокус. А выбранная строка формы заказы обновляется (актуализируется).

Как можно попробовать полечить? В каком направлении копать? Или версия ядра виновата?
__________________
Paul_ST
Старый 01.02.2009, 23:36   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Может кто-то изменил форму SysFormSearch?
Старый 01.02.2009, 23:57   #3  
Paul_ST is offline
Paul_ST
Участник
 
144 / 11 (1) +
Регистрация: 26.11.2003
Адрес: Екатеринбург
Исключено. Форма только на sys
__________________
Paul_ST
Старый 02.02.2009, 00:45   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,324 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
А форму SalesTable? Если она изменена - то попробуйте повторить ситуацию, удалив с нее все изменения. Встречался я с тем, что могут перекрыть всякие методы типа lostFocus и все такое
__________________
Возможно сделать все. Вопрос времени
Старый 02.02.2009, 01:58   #5  
Paul_ST is offline
Paul_ST
Участник
 
144 / 11 (1) +
Регистрация: 26.11.2003
Адрес: Екатеринбург
Да, уже попробовал!
Удивительное дело, но в SalesLin_ds.active() присутствовала незамысловатая строка - управление видимостью группы на одной из вкладок нижней части (относящейся к датасорсу SalesLine) в зависимости от Salesline.SalesType.
Закомментировав эту строку, обнаружил исчезновение проблемы. Группа, о которой идет речь, без подводных камней. ПРосто два дополнительных поля из SalesLine.
В чем здесь может быть дело?
__________________
Paul_ST
Старый 02.02.2009, 09:13   #6  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Что похожее было
Багофича в закупке
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 03.06.2009, 10:27   #7  
Shchennikov is offline
Shchennikov
Участник
 
1 / 10 (1) +
Регистрация: 31.10.2007
Ax 4.0
Такая же фигня - во всех формах со строками, если в строке присутствует метод active, в котором меняется видимость элемента формы, то при вызове формы фильтра, форма забирает фокус на себя. Кто-нибудь решал данную проблему?
Старый 02.03.2011, 16:15   #8  
danket is offline
danket
Участник
 
7 / 11 (1) +
Регистрация: 24.12.2010
В DAX2009 такая же проблемма на форме SalesTable и вся беда в том что форма модифицирована и прилично и в методе active видимость кнопок регулируется.
Решения пока нет?
Старый 03.03.2011, 09:55   #9  
danket is offline
danket
Участник
 
7 / 11 (1) +
Регистрация: 24.12.2010
Все дело оказалось в контроле StatikText, при получении текста он меняет свой размер и забирает фокус. Заменил его на StringEdit и поставил фиксированный размер и все заработало.
За это сообщение автора поблагодарили: Logger (1).
Старый 03.03.2011, 11:30   #10  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от danket Посмотреть сообщение
Все дело оказалось в контроле StatikText, при получении текста он меняет свой размер и забирает фокус. Заменил его на StringEdit и поставил фиксированный размер и все заработало.
Можно ли чуть по подробнее с конкретным примером (из формы SalesTable) ?
Старый 03.03.2011, 13:32   #11  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от danket Посмотреть сообщение
Все дело оказалось в контроле StatikText, при получении текста он меняет свой размер и забирает фокус. Заменил его на StringEdit и поставил фиксированный размер и все заработало.
Если имеется в виду поле в форме поиска, то в Ax4.0 оно уже как раз StringEdit, а вовсе не StaticText, и ошибка есть.
Старый 03.03.2011, 15:57   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Сама форма поиска тут не при чём. Суть проблемы кроится в контекстном меню грида, а точнее в опции LinkType Delayed связанного источника данных. Это опция разрешает системе ждать некоторое время перед посылкой запроса на выборку связанных данных. Это сделано для того, что бы увеличить производительность при быстром движении курсора по гриду (система на всякий случай ждёт а вдруг курсор пойдёт дальше, зачем тогда зря выбирать связанные данные). Система выжидает подобный таймаут при активации строки правой кнопкой мыши так же как и при левой. Вот и получается что контекстное меню уже открыто, а выборка данных связанного датасурса ещё не произошла. Только после выбора пункта меню управление возвращается к форме где происходят все нужные действия по отображению связанных данных. И если, например, в событии active связанного источника данных находится код, который изменяет дизайн фрмы, то это вызывает переход фокуса.

Как мне видится, решить проблему можно только если принудительно заставить систему игнорировать опцию Delayed при правом клике. Но как это сделать?
За это сообщение автора поблагодарили: Zabr (7).
Старый 03.03.2011, 17:55   #13  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от danket Посмотреть сообщение
Все дело оказалось в контроле StatikText, при получении текста он меняет свой размер и забирает фокус. Заменил его на StringEdit и поставил фиксированный размер и все заработало.
Наверное, danket имел ввиду, что на форму SalesTable был вынесен какой-то информационный StaticText , который в методе Active datasourca принимал определенную value(). Что-то наподобе второго caption. Заменив StaticText на StringEdit проблему решил. AX2009
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 03.03.2011 в 18:03.
Старый 05.03.2011, 13:10   #14  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Обычно помогает вот что:
1. Убрать установки visible с active или заменить на enabled.
2. Никаких обновлений "левых" полей/надписей(StaticText) на active - все на display методах. Ну, или как описано - замена на StringEdit.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
Старый 09.03.2011, 12:37   #15  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Кажется, понял причину проблемы потери фокуса окна поиска в формах "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)]];
...
2. Перенести "обновление" полей адреса из метода active источника данных, например, в метод активации закладки "адрес" формы "заказы"
X++:
public void pageActivated()
{
    SysSetupFormRun SysSetupFormRun = element;
    ;
    SysSetupFormRun.active_W();

    super();
}
и отключить его для метода active :
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  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Судя по тому что у меня в четверке нет класса FormRunListener_Address_RU - это рецепт для Ax2009 ?
Старый 09.03.2011, 13:40   #17  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от Zabr Посмотреть сообщение
Судя по тому что у меня в четверке нет класса FormRunListener_Address_RU - это рецепт для Ax2009 ?
Да, решение для Ax2009.

В предыдущих версиях идея примерно была та же. Группа полей адреса "перерисовывается" каждый раз при активации новой записи.

В версии 4 не видел, но наверное там работает та же система что и в версии 3.0.
Попробуйте перенести код (ниже) (из метода Active) в метод pageActivated
X++:
    if(isConfigurationkeyEnabled(configurationkeynum(RAddress)) && ret)
        addressEngine_RU.afterDataSourceActive();
Старый 09.03.2011, 13:53   #18  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от someOne Посмотреть сообщение
В версии 4 не видел, но наверное там работает та же система что и в версии 3.0.
Как-то по-другому, даже комментирование целиком методов salestable.active() , purchtable.active() не помогает, фокус пропадает как и прежде.
Старый 09.03.2011, 14:01   #19  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Не знаю как в версии 4,0 но может быть и там могут быть поля адресов как в заказе, так и в строках заказа, поэтому метод active нужно отключать в 2-х местах сразу, для обоих источников данных ...

Но так или иначе, поля с адресами - это не единственная возможная причина потери фокуса. Могут быть и другие (свои кастомизации, или еще что...)
За это сообщение автора поблагодарили: Logger (3).
Старый 03.08.2022, 14:22   #20  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Решил проверить одну догадку и вроде как помогло.

В 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();
}
В методе сlose() на всякий случай делаю caller.ulock().
Переменная caller типа FormRun объявлена в ClassDeclaration.
Но оно вроде как и без этого само восстанавливается, потому как ещё до закрытия формы поиска видно как на заднем плане перерисовывается основная форма, но к потери фокуса это уже не приводит.

Вуаля, форма поиска больше не теряет фокус там где раньше теряла.
За это сообщение автора поблагодарили: Pustik (7), Logger (10).
Теги
ax4.0, sysformsearch, поиск, фокус, форма

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Потеря активного буфера записи при вызове super() в update() таблицы TasmanianDevil DAX: Администрирование 13 01.10.2008 11:36
Создание Lookup формы Maxim Gorbunov DAX: База знаний и проекты 9 26.06.2007 16:44
Критическая ошибка при вызове ранее настроенной формы tolstjak DAX: Администрирование 5 11.04.2007 09:51
Сохранение строки закупки - потеря фокуса? andy239 DAX: Программирование 6 22.01.2006 12:33
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:39.