12.01.2011, 11:33 | #1 |
Участник
|
Выйти из ячейки грида после двойного клика
Если выбрать ячейку грида не одинарным кликом, а двойным, то она также как и при одинарном клике получает фокус и переходит в режим редактирования. Но вот если после этого попытаться перейти к другой ячейке (кликнуть по другой ячейке), то после первой попытки фокус не переместиться, а останется на прежней ячейке и только после повторного клика можно будет выбрать другую ячейку.
Особенно это раздражает, когда перед тем как перейти на новую ячейку, пользователь прокручивает грид на несколько экранов. Тогда вместо выбора новой ячейки, система отбрасывает фокус к старой позиции. И приходится заново прокручивать грид. Конечно в большинстве случаев двойной щелчок не задействован, но что делать если он нужен? Можно ли как-нибудь победить стандартное поведение грида? P.S.: Да, забыл написать: AX2009 Последний раз редактировалось S.Kuskov; 12.01.2011 в 11:46. |
|
12.01.2011, 11:43 | #2 |
Участник
|
В Axapta 3 SP1 я такого нюанса не заметил - фокус перемещается сразу на новую ячейку, даже после двойного клика по "предыдущей". Быть может в более поздних версиях по-другому.
__________________
С уважением, Александр. |
|
12.01.2011, 17:56 | #3 |
Участник
|
Создал баг, правда его Sevirity/Priority очень низкий, поэтому в АХ6 очень врядли пофиксят.
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
13.01.2011, 11:42 | #4 |
Участник
|
Проведя ряд экспериментов установил, что двойной клик по ячейке грида меняет состояние не отдельной ячейки а грида в целом. Т.к. состояние это не сбрасывается после перехода к другим ячейкам при момощи навигационных клавиш, и даже после потери гридом фокуса.
Так же не важно вошли ли вы в ячейку двойным кликом или потом сделали двойной щелчёк в уже активной ячейке. Грид также перейдёт в описываемое состояние. Я смог найти только один способ выхода из этого состояния - это лишний(холостой) щелчёк мыши. Который, при большом желании, можно сгенерировать и искуственно. Я пока так и поступил: X++: WinAPI::SendMessageEx(Grid.hwnd(), #WM_LBUTTONDOWN, 1, 1); WinAPI::SendMessageEx(Grid.hwnd(), #WM_LBUTTONUP, 1, 1); |
|
14.01.2011, 08:36 | #5 |
Участник
|
А можно поподробнее, где это все надо и как написать? Нас такое поведение грида тоже раздражает.
|
|
14.01.2011, 09:21 | #6 |
Участник
|
Как поймать двойной клик это вообще отдельная песня . Этот вопрос стоит отдельной темы для обсуждения. Но только давайте определимся. Если двойной клик у вас не задействован, и вопросом вы интересуетесь на всякий случай, что бы перестраховаться, а вдруг пользователь нажмёт, то тогда поверьте овчинка выделки не стоит (проще научить пользователя не нажимать). Но если вы интересуетесть этой проблемой из-за того, что у вас уже висит какое-то действие на этом событии. Тогда там то и сгенерируйте те самые WM_LBUTTONDOWN и WM_LBUTTONUP.
P.S.: Если я не удовлетворил вашего любопытства, спрашивайте я попробую ответить на конкретные вопросы. К сожалению в общем виде этот вопрос не имеет простого ответа. |
|
14.01.2011, 09:27 | #7 |
Участник
|
Я так понимаю общего решения нет. Рассматриваются частные случаи. Эх блин. Конечно, под каждым контролом ставить кусок кода, это лучше застрелиться.
|
|
14.01.2011, 09:33 | #8 |
Участник
|
Просто у нас некоторые пользователи научены двойной щелчок использовать для того, чтобы сразу выделить содержимое ячейки, потом скопировать его в буфер и далее использовать по назначению. Это достаточно неприятно, когда покидаешь ячейку только со 2-ой попытки.
|
|
14.01.2011, 09:46 | #9 |
Участник
|
Если хотите заморочится, то при помощи formRun.installMessageProc() перехватывайте событие #WM_LBUTTONDBLCLK всех контролов лежащих на гриде плюс самого грида. И в нём реализуйте дополнительное нажатие. В большинстве случаев этого достаточно.
|
|
|
За это сообщение автора поблагодарили: Pustik (2). |
14.01.2011, 13:12 | #10 |
Участник
|
Заморачиваться особенно не пришлось
в классе 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); } 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). |