19.05.2006, 10:14 | #1 |
Участник
|
Автоматический поиск строки в форме подбора
Всем привет. Нужен совет начинающему программисту.
При работе с журналом LedgerJournalTable когда создаем строки (LedgerJournalTrans) при выборе типа счета (корсчета) "Главная книга" открывается форма подбора счета из плана счетов. Мне необходимо сделать так, чтобы в форме подбора при наборе первых цифр кода счета курсор автоматически перемещался на первую найденную строку с таким кодом. Данный механизм например реализован в ОСВ, когда в критериях назначаем фильтр по счетам. Только я не смог разобраться, как это сделано в этом запросе. Возможно данная тема уже не раз освещалась на форуме, только я не смог найти. Если не трудно, пришлите ссылку на обсуждение вопроса, либо кусочек кода с пояснениями Заранее благодарен! |
|
19.05.2006, 10:34 | #2 |
Участник
|
Извините, не понял, что такое OCВ. Быстрый поиск в lookup'е реализуется классом TableLookup_RU, конкретно методом WaitAndSearch. См. также Выбор набора полей из lookup, там этот вопрос затрагивался.
Тем не менее должен предостеречь - набор каждого нового символа заставляет систему перестраивать range и посылать запрос к базе данных, поэтому решение с быстрым поиском может быть не совсем удачным с точки зрения производительности в целом. Не стоит вставлять его во все возможные lookup'ы. |
|
19.05.2006, 11:00 | #3 |
Участник
|
Наврал немного. В стандартном лукапе, через SysTableLookup поиск по ключевому полю также осуществляется, но только для данных, уже "отобранных" клиентом, закэшировавшихся. (грубо - тех, которые видит пользователь в открывшейся форме).
|
|
19.05.2006, 12:00 | #4 |
Member
|
Цитата:
Сообщение от YoYo
...
Мне необходимо сделать так, чтобы в форме подбора при наборе первых цифр кода счета курсор автоматически перемещался на первую найденную строку с таким кодом. ...
__________________
С уважением, glibs® |
|
19.05.2006, 13:12 | #5 |
Модератор
|
Цитата:
Сообщение от glibs
А вы переключитесь на закладку По типу счета ([Ctrl] + [Tab]). Там работает стандартный поиск в lookup.
\Forms\LedgerAccountLookup\Methods\run() Код: if (callerControl.text() && callerControl.hasChanged()) { filterLookup = true; LedgerTableAccountType_ds.autoSearch(false); TmpLedgerTable_ds.autoSearch(false); }
__________________
-ТСЯ или -ТЬСЯ ? |
|
19.05.2006, 13:41 | #6 |
Участник
|
Цитата:
Сообщение от YoYo
Нужен совет начинающему программисту.
Цитата:
Сообщение от YoYo
При работе с журналом LedgerJournalTable когда создаем строки (LedgerJournalTrans) при выборе типа счета (корсчета) "Главная книга" открывается форма подбора счета из плана счетов. Мне необходимо сделать так, чтобы в форме подбора при наборе первых цифр кода счета курсор автоматически перемещался на первую найденную строку с таким кодом.
|
|
19.05.2006, 13:53 | #7 |
Участник
|
Цитата:
Сообщение от Волчара
А программировать то может ни чего и не надо?
Это само собой. Но нами здесь движет уже скорее академический интерес 2Vadik: Что-то никакого эффекта запрет autoserach не дает. Можно вообще условие if снять - все равно на закладке "По типу счета" поиск производится, а на закладке "По типу разноски" - нет. Теперь и я запутался. Еще посмотрю код. |
|
19.05.2006, 18:13 | #8 |
Участник
|
Может это не ваша ситуация
На форме используется один буфер для поиска по AutoSearch. Этот буфер сбрасывается при нажатии на управляющие кнопки или при смене фокуса контрола, по которому идет поиск. Если же выбирать закладки при помощи мыши, то этот буфер не сбрасывается и при попытке начать поиск в новом датасоурсе на самом деле ищется не вновь набираемый текст, а добавляется к уже записанному в буфере. Обойти этот эффект можно нажатием на управляющие кнопки (стрелки) или переключением с помощью CTRL+TAB. Можно так же программным способом при помощи WinApi. Вот пример для этой формы X++: void tabChanged(int _from, int _to) { #define.EM_SETSEL(0x00B1) #define.VK_RIGHT(39) #winapi ; super(_from, _to); switch (_to) { case 1: element.selectMode(element.control(Control::tmpLedgerTable_AccountNum)); winapi::sendMessageEx(element.control(Control::tmpLedgerTable_AccountNum).hWnd(), #WM_KEYDOWN, #VK_RIGHT, 0); winapi::sendMessageEx(element.control(Control::tmpLedgerTable_AccountNum).hWnd(), #EM_SETSEL, 0, -1); break; case 2: element.selectMode(element.control(Control::LedgerTableAccountType_AccountNum)); winapi::sendMessageEx(element.control(Control::LedgerTableAccountType_AccountNum).hWnd(), #WM_KEYDOWN, #VK_RIGHT, 0); winapi::sendMessageEx(element.control(Control::LedgerTableAccountType_AccountNum).hWnd(), #EM_SETSEL, 0, -1); break; } }
__________________
Axapta v.3.0 sp5 kr2 |
|
24.05.2006, 11:22 | #9 |
Участник
|
Эх, спасибо ребята :)
Сейчас буду обрабатывать полученную информацию и смотреть как лучше. А академический интерес - это верно, он зачастую присутствует да и разве можно научиться чему-нибудь не попробовав?
Всем спасибо большое за ответы!!!!
__________________
Всему свой час и Время каждому из дней! Родиться - время, время - жить и умирать. Швырять камнями, но затем и собирать... Молчать есть время, говорить с Душой своей... |
|
13.07.2010, 15:43 | #10 |
Участник
|
ds_AutoSearch(false), tabChanged
На форме используется один буфер для поиска по AutoSearch. Этот буфер сбрасывается при нажатии на управляющие кнопки или при смене фокуса контрола, по которому идет поиск.
Если же выбирать закладки при помощи мыши, то этот буфер не сбрасывается и при попытке начать поиск в новом датасоурсе на самом деле ищется не вновь набираемый текст, а добавляется к уже записанному в буфере. Обойти этот эффект можно нажатием на управляющие кнопки (стрелки) или переключением с помощью CTRL+TAB. Можно так же программным способом при помощи WinApi. Вот пример для этой формы X++: void tabChanged(int _from, int _to) { #define.EM_SETSEL(0x00B1) #define.VK_RIGHT(39) #winapi ; super(_from, _to); switch (_to) { case 1: element.selectMode(element.control(Control::tmpLedgerTable_AccountNum)); winapi::sendMessageEx(element.control(Control::tmpLedgerTable_AccountNum).hWnd(), #WM_KEYDOWN, #VK_RIGHT, 0); winapi::sendMessageEx(element.control(Control::tmpLedgerTable_AccountNum).hWnd(), #EM_SETSEL, 0, -1); break; case 2: element.selectMode(element.control(Control::LedgerTableAccountType_AccountNum)); winapi::sendMessageEx(element.control(Control::LedgerTableAccountType_AccountNum).hWnd(), #WM_KEYDOWN, #VK_RIGHT, 0); winapi::sendMessageEx(element.control(Control::LedgerTableAccountType_AccountNum).hWnd(), #EM_SETSEL, 0, -1); break; } } ЗДРАВСТВУЙТЕ ВСЕМ ЭТО НЕ РАБОТАЕТ - "буфер для поиска по AutoSearch" не сбрасывается |
|