22.01.2010, 10:45 | #1 |
Участник
|
А пусть он пишет "Серг" и нажимает Enter, тогда всё просто. Я недавно делал нечто похожее, только с КЛАДРом: юзер вводит часть названия улицы, скажем, "Лен", затем - Ввод, после чего ему выдаётся список улиц, начинающихся на "Лен". С Сергеичем это будет проще.
|
|
22.01.2010, 12:14 | #2 |
Administrator
|
через стандартные тексты пусть пишет
?Серг |
|
22.01.2010, 12:15 | #3 |
Участник
|
Цитата:
Сообщение от jopagames
Добрый день всем!
Но столкнулся со следующей проблемой: пока не вызвана ф-ция OnValidate() значение поля никак нельзя получить. Т.е. никак не получается как-то выделить ТОЛЬКО ТУ часть текста, которую пользователь уже успел набрать, пока не нажал Enter. Пытался вешать обработчики на всякие клавиатурные триггеры типа OnInputChange и OnAfterInput, но всё бесполезно. Может, я чего не так делаю? Кто знает как сделать - подскажите, плиз! В триггере OnInputChange нужного поля: CurrForm.SAVERECORD; Далее получения значения из поля; Тестировал с Message("Значение поля"), все работает. Значение получает после каждого ввода символа.
__________________
MBS Certified Master in Navision Developer |
|
25.01.2010, 13:16 | #4 |
Участник
|
Идея понятна. В приложения MS это, вроде как, называется автоподстановка.
Тогда, сорри... Триггер не обойдешь. Значение поля, пока не запишешь, не получишь... Как один из вариантов в табличном триггере можно использовать условие по CurrFieldNo. Только, возможно, что в вашем случае это не будет работать, как нужно.
__________________
MBS Certified Master in Navision Developer |
|
25.01.2010, 14:43 | #5 |
Участник
|
Если смущает только OnValidate таблицы, то заведите буферную переменную и поле для нее. И делайте, то что посоветовал Роман уже с этой переменной. А после того как пользователь покинет поле, залейте его содержимое в соответствующее поле таблицы и отвалидэйти.
P.S. ИМХО, это баловство. Однако в 2009 такое уже есть. Предложите перейти |
|
25.01.2010, 15:48 | #6 |
Участник
|
Цитата:
Сообщение от jopagames
Ага. И так тоже уже пробовал делать (через буферную переменную и отдельное поле для неё) Только пользователь может попытаться "покинуть" поле иначе, чем нажатием клавиши Enter. Стрелкой или табуляцией, например. В этом случае никакого Validate не происходит и значение доп.поля тоже неясное |
|
25.01.2010, 17:08 | #7 |
Участник
|
Насчет CurrFieldNo идея следующая.
Переписать триггер OnValidate таблицы следующим образом: IF CurrFieldNo = "Поле с автоподстановкой" THEN EXIT ELSE ОбработкаТриггера; В этом случае, если в форме на OnInputChange написать код: CurrForm.SAVERECORD; Далее получения значения из поля; То, по идее код в таблице на OnValidate не должен отрабатываться, а значение поля будет меняться по мере ввода цифр/букв. Таким образом, удастся избежать обработки триггера в таблице, при вводе данных в поле на форме. Но при этом код в таблице на OnValidate никогда не будет обрабатываться, если мы вводим значение в любой форме в поле "Поле с автоподстановкой". Т.е. в этом случае OnValidate в поле таблицы будет обрабатываться по конструкции типа VALIDATE("Поле с автоподстановкой", НовоеЗначение); а при вводе данных в поле OnValidate таблицы работать не будет.
__________________
MBS Certified Master in Navision Developer |
|
26.01.2010, 15:09 | #8 |
Участник
|
Если в вашем случае не поможет подобная схема, то может при решении других задач пригодится.
__________________
MBS Certified Master in Navision Developer |
|
26.01.2010, 15:37 | #9 |
Administrator
|
ClearOnLookup в конторле поменять не помогает?
при лукапе помогает... при валидейте не уверен |
|
27.01.2010, 17:12 | #10 |
Участник
|
Сделал некое подобие автоподстановки. На примере формы карточка клиента (21) и соотв. таблицы (18), автоподстановка по полю Name (Название клиента). Если находит похожее среди клиентов название, то оно подставляется в текущую карточку. Это для примера...
В таблице 18 на триггере OnValidate поля Name исправить на код Код: IF CurrFieldNo = FIELDNO(Name) THEN EXIT ELSE BEGIN IF ("Search Name" = UPPERCASE(xRec.Name)) OR ("Search Name" = '') THEN "Search Name" := Name; END; Name - OnInputChange() Код: CurrForm.SAVERECORD; Код: IF (Text = '') OR (Name = '') THEN EXIT; IF EVALUATE(l_char,Text) THEN BEGIN IF l_char = 32 THEN Text := '#'; END; IF (STRLEN(Text) = 1) THEN BEGIN IF (Text <> COPYSTR(Name,1,STRLEN(Name) - 1)) THEN Text := Name + Text ELSE IF (STRLEN(Text) = 1) AND (STRLEN(Name) = 2) THEN Text := Name + Text; END; Код: l_int := 100; Name := CONVERTSTR(Name,'#',' '); IF STRLEN(Name) > 2 THEN BEGIN l_recCustomer.SETFILTER(Name,'%1',Name + '*'); l_recCustomer.SETFILTER("No.",'<>%1',"No."); { // Автоподстановка без запуска формы > IF l_recCustomer.FINDFIRST THEN BEGIN Name := l_recCustomer.Name; CurrForm.Name.UPDATE; END; // < } IF l_recCustomer.FINDFIRST THEN BEGIN REPEAT l_int += 1; lt_recStandardText.Code := FORMAT(l_int); lt_recStandardText.Description := l_recCustomer.Name; lt_recStandardText.INSERT; UNTIL l_recCustomer.NEXT = 0; IF FORM.RUNMODAL(FORM::"Standard Text Codes", lt_recStandardText,lt_recStandardText.Description) = ACTION::LookupOK THEN VALIDATE(Name,lt_recStandardText.Description); END; END; После тестирования нашел несколько неудобств и пока один глюк (алгоритмически не удалось обойти). Глюк такой - при удалении Бэкспэйсом, когда 2 символа всего набрано, работает неправильно. Неудобство главное - поле всегда выделено, но это не мешает последовательно вводить в него символы. Все вводится.
__________________
MBS Certified Master in Navision Developer |
|