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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.01.2011, 11:33   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Выйти из ячейки грида после двойного клика
Если выбрать ячейку грида не одинарным кликом, а двойным, то она также как и при одинарном клике получает фокус и переходит в режим редактирования. Но вот если после этого попытаться перейти к другой ячейке (кликнуть по другой ячейке), то после первой попытки фокус не переместиться, а останется на прежней ячейке и только после повторного клика можно будет выбрать другую ячейку.

Особенно это раздражает, когда перед тем как перейти на новую ячейку, пользователь прокручивает грид на несколько экранов. Тогда вместо выбора новой ячейки, система отбрасывает фокус к старой позиции. И приходится заново прокручивать грид.

Конечно в большинстве случаев двойной щелчок не задействован, но что делать если он нужен? Можно ли как-нибудь победить стандартное поведение грида?

P.S.: Да, забыл написать: AX2009

Последний раз редактировалось S.Kuskov; 12.01.2011 в 11:46.
Старый 12.01.2011, 11:43   #2  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
В Axapta 3 SP1 я такого нюанса не заметил - фокус перемещается сразу на новую ячейку, даже после двойного клика по "предыдущей". Быть может в более поздних версиях по-другому.
__________________
С уважением, Александр.
Старый 12.01.2011, 17:56   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Создал баг, правда его Sevirity/Priority очень низкий, поэтому в АХ6 очень врядли пофиксят.
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 13.01.2011, 11:42   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Проведя ряд экспериментов установил, что двойной клик по ячейке грида меняет состояние не отдельной ячейки а грида в целом. Т.к. состояние это не сбрасывается после перехода к другим ячейкам при момощи навигационных клавиш, и даже после потери гридом фокуса.

Так же не важно вошли ли вы в ячейку двойным кликом или потом сделали двойной щелчёк в уже активной ячейке. Грид также перейдёт в описываемое состояние.

Я смог найти только один способ выхода из этого состояния - это лишний(холостой) щелчёк мыши. Который, при большом желании, можно сгенерировать и искуственно. Я пока так и поступил:
X++:
WinAPI::SendMessageEx(Grid.hwnd(), #WM_LBUTTONDOWN, 1, 1);
WinAPI::SendMessageEx(Grid.hwnd(), #WM_LBUTTONUP, 1, 1);
Старый 14.01.2011, 08:36   #5  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
А можно поподробнее, где это все надо и как написать? Нас такое поведение грида тоже раздражает.
Старый 14.01.2011, 09:21   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Pustik Посмотреть сообщение
А можно поподробнее, где это все надо и как написать?
Как поймать двойной клик это вообще отдельная песня . Этот вопрос стоит отдельной темы для обсуждения. Но только давайте определимся. Если двойной клик у вас не задействован, и вопросом вы интересуетесь на всякий случай, что бы перестраховаться, а вдруг пользователь нажмёт, то тогда поверьте овчинка выделки не стоит (проще научить пользователя не нажимать). Но если вы интересуетесть этой проблемой из-за того, что у вас уже висит какое-то действие на этом событии. Тогда там то и сгенерируйте те самые WM_LBUTTONDOWN и WM_LBUTTONUP.

P.S.: Если я не удовлетворил вашего любопытства, спрашивайте я попробую ответить на конкретные вопросы. К сожалению в общем виде этот вопрос не имеет простого ответа.
Старый 14.01.2011, 09:27   #7  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Я так понимаю общего решения нет. Рассматриваются частные случаи. Эх блин. Конечно, под каждым контролом ставить кусок кода, это лучше застрелиться.
Старый 14.01.2011, 09:33   #8  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Просто у нас некоторые пользователи научены двойной щелчок использовать для того, чтобы сразу выделить содержимое ячейки, потом скопировать его в буфер и далее использовать по назначению. Это достаточно неприятно, когда покидаешь ячейку только со 2-ой попытки.
Старый 14.01.2011, 09:46   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Если хотите заморочится, то при помощи formRun.installMessageProc() перехватывайте событие #WM_LBUTTONDBLCLK всех контролов лежащих на гриде плюс самого грида. И в нём реализуйте дополнительное нажатие. В большинстве случаев этого достаточно.
За это сообщение автора поблагодарили: Pustik (2).
Старый 14.01.2011, 13:12   #10  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Заморачиваться особенно не пришлось
в классе SysSetupFormRun описываем переменную
X++:
// This is a framework class. Customizing this class may cause problems with future upgrades to the software.
public class SysSetupFormRun extends FormRun
{
    SysWorkflowFormControls     workflowControls;
    // <GEEU>
    // Event listeners list
    List listeners_W;
    // </GEEU>
    // kos глюк выхода из ячейки грида после двойного клика
    int Gridhwnd;
    // kos глюк выхода из ячейки грида после двойного клика
затем в этом классе создаем метод

X++:
void catchMessage(int _hwnd, int _message, int _wParam, int _lParam, int _px, int _py)
{
    /*
    #define.WM_LBUTTONDOWN   (0x0201)
    #define.WM_LBUTTONUP     (0x0202)
    #define.WM_LBUTTONDBLCLK (0x0203)
    */
    #WinAPI
    ;

    WinAPI::SendMessageEx(Gridhwnd, #WM_LBUTTONDOWN, 1, 1);
    WinAPI::SendMessageEx(Gridhwnd, #WM_LBUTTONUP, 1, 1);

}
и теперь в этом классе перекрываем метод selectControl и прописываем

X++:
public boolean selectControl(FormControl _control)
{
    boolean ret;
    /*
    #define.WM_LBUTTONDOWN   (0x0201)
    #define.WM_LBUTTONUP     (0x0202)
    #define.WM_LBUTTONDBLCLK (0x0203)
    */
    #WinAPI;

    ret = super(_control);
    // kos глюк выхода из ячейки грида после двойного клика
    if (_control)
    {
        switch (_control.handle())
        {
            case classnum(FormGridControl):
            Gridhwnd = _control.hWnd();
            break;
            case classnum(FormStringControl):
            case classnum(FormRealControl):
            case classnum(FormIntControl):
            case classnum(FormInt64Control):
            case classnum(FormDateControl):
            case classnum(FormTimeControl):
            case classnum(FormDateTimeControl):
            case classnum(FormComboBoxControl):
            this.installMessageProc(#WM_LBUTTONDBLCLK, _control.hWnd(), "catchMessage");
            break;
            default:
            break;
        }
    }
    // kos глюк выхода из ячейки грида после двойного клика

    return ret;
}
Заработало корректно во всех местах.
За это сообщение автора поблагодарили: SIrina (1), S.Kuskov (2).
Теги
syssetupformrun

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
EP AX2009: сохранить параметры грида (фильтр, позиционирование) caper DAX: Программирование 9 01.04.2010 09:16
Суммовые после списания со склада Ann DAX: Функционал 1 26.10.2004 14:33
Обработка событий ячейки грида simply DAX: Программирование 2 24.05.2004 15:36
Буферные ячейки на складе - зачем? renat DAX: Функционал 16 01.04.2004 20:22
Сколько раз вызывается DataMethod поля грида при инициализации этого грида? storer DAX: Программирование 2 18.11.2003 14:03

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:41.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.