|  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 | 
|  |