| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			StringEdit == Динамическая строка поиска
			 
			
			Здравствуйте коллеги.  
		
		
		
		
		
		
			Вопрос в следующем, загорелось мне сделать в аксапте всплывающее окошко для выбора пользователя системы. Стандартное показалось жутко неудобным, решил его доработать. Пожелания: 
 С первым и последним пунктом сложностей не возникло. А вот во втором все сделал с фильтрацией по modify() на StringEdit. Но не очень удобно, надо набирать текст и нажимать кнопку отфильтровать, или куда то переключиться, но окно лукап, поэтому вроде как не совсем удобно. Решил обновлять перечень записей при изменении значения в StringEdti. Попробовал завязаться на метод changeText(), но после того как он отрабатывает делаю executeQuery по источнику и фокус возвращается обратно на StringEdit c выделением всего текста. Выходит набрал букву, записи отфильтровались, текст в StringEdit выделился целиком, набираешь следующую все что было до этого стирается и имеем новый фильтр из последней буквы. Как можно победить сие? Ну и вопрос в догоночку, никто не знает лукап для ввода времени)?  
		
				__________________ 
		
		
		
		
	Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.  
			 | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 
			
			а чем неподходит стандартный поиск в текстовом поле в звездочках? 
		
		
		
		
		
		
			(а*, или *а, или *а*) 
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ну собственно я так и делаю, введенный текст накладываю как фильтр *а*. Хотелось сделать имитацию быстрого поиска.
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.  
			 | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Британский учённый 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У меня не получилось победить эту проблему, никак выделение не хотело убираться из кода, только руками. Даже винапи не помог.  
		
		
		
		
		
		
			Пришлось оставить эту идею... 
				__________________ 
		
		
		
		
	Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Для того чтобы избежать выделения всего текста фильтра после changeText() нужно перекрыть метод enter на контроле: 
		
		
		
		
		
		
		
	public void enter() {; super(); this.setSelection( strlen(this.text()), strlen(this.text())); }  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Link (2). | |
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Все получилось) Спасибо за советы. Перекрыл два метода и все заработало. 
		
		
		
		
		
		
			X++: public void textChange() { ; super(); [lastPosFrom, lastPosTo] = this.getSelection(); userInfo_ds.executeQuery(); } X++: public void enter() { super(); this.setSelection(lastPosFrom, lastPosTo); } 
				__________________ 
		
		
		
		
	Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.  
			 | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А механизм SearchMode = "Search On Typing" вам не подходит?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: KingPeas (1). | |
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Натыкался при поиске, но так и не понял как работает данная настройка.  
		
		
		
			Поэкспериментировал, ищется запись если контрол связан с источником данных и ищет по начальному значению с переходом к данной записи без удаления из списка других записей. Добавил к себе на форму, может кому тоже так будет удобней). Я себе ставил задачу поиск по части текста с фильтрацией количества записей, поэтому это несколько другое Приложил результат, может кому пригодиться. В верху кнопка очистка фильтра, два фильтра по коду и по имени, список пользователей и внизу две кнопки выбрать себя и отмена. Выбор из списка по двойному клику. 
				__________________ 
		
		
		
		
		
			Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.  
			Последний раз редактировалось KingPeas; 28.02.2012 в 09:08.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Британский учённый 
		
			
	 | 
	
	
	
		
		
		
		 
			
			К сожалению эта функция не работает так, как хотелось бы. Даже казалось бы в таком простом случае, как поиск по ключу, который не редактируется, этот вариант уже не будет работать.  
		
		
		
		
		
		
			К тому же очень удобно иметь возможность поиска по любому участку искомой строки и самому определять логику поиска. 
				__________________ 
		
		
		
		
	Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			По моему для поиска по фамилии в карточке вполне подходит) Я использовал оба метода)
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.  
			 | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Боец 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Добавлю полезную фичу ) 
		
		
		
		
		
		
		
	Для своего поискового поля отлавливайте нажатия клавиш ArrowUp\Down. Набрав часть имени в фильтре и получив по маске несколько строк результата, у вас дополнительно появится возможность клавишами вверх\вниз спозиционироваться на нужную строку. Это очень очень удобно для привыкших работать с клавиатурой. для этого вам понадобится ф-я element.installMessageProc(): метод init() формы: X++: public void init() { super(); this.installMessageProc(#WM_KEYDOWN, editfilterControlName.hWnd(), identifierstr(onEventKeyDown)); } X++: void onEventKeyDown(anyType _a = '', anyType _b = '', anyType _vkKey = '', anyType _d = '', anyType _e = '', anyType _f = '') { ; switch (_vkKey) { case #arrowUp: table_ds.prev(); break; case #arrowDown: table_ds.next(); break; default: break; } } http://earlionakru.blogspot.com/2009_02_01_archive.html Где же это поле?! (Form digger)  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: KingPeas (2), S.Kuskov (5). | |
| 
			
			 | 
		#12 | 
| 
			
			 Британский учённый 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
А вот быстрый поиск по части строки это то что нужно, теперь можно снабдить пользователей нормальными фильтрами!  
		
				__________________ 
		
		
		
		
	Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Британский учённый 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от DSPIC
			 
 
			Пример можно посмотреть: 
		
	http://earlionakru.blogspot.com/2009_02_01_archive.html Где же это поле?! (Form digger) Есть желание прикрутить ее функционал к поисковой строке табакса, и сделать её умной, что бы искала по активной форме и по части строки   Как только появится время займусь. Буду делать плагином.
		
				__________________ 
		
		
		
		
	Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от DSPIC
			 
 
			Добавлю полезную фичу ) 
		
	Для своего поискового поля отлавливайте нажатия клавиш ArrowUp\Down. Набрав часть имени в фильтре и получив по маске несколько строк результата, у вас дополнительно появится возможность клавишами вверх\вниз спозиционироваться на нужную строку. Это очень очень удобно для привыкших работать с клавиатурой. для этого вам понадобится ф-я element.installMessageProc(): метод init() формы: X++: public void init() { super(); this.installMessageProc(#WM_KEYDOWN, editfilterControlName.hWnd(), identifierstr(onEventKeyDown)); } X++: void onEventKeyDown(anyType _a = '', anyType _b = '', anyType _vkKey = '', anyType _d = '', anyType _e = '', anyType _f = '') { ; switch (_vkKey) { case #arrowUp: table_ds.prev(); break; case #arrowDown: table_ds.next(); break; default: break; } } http://earlionakru.blogspot.com/2009_02_01_archive.html Где же это поле?! (Form digger) 
				__________________ 
		
		
		
		
	Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.  
			 | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Поля сохраняются и восстанавливаются через xSysLastValue)
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
		
			Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.  
			Последний раз редактировалось KingPeas; 29.02.2012 в 22:40.  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Добавил на форму галочку для отлючения автоматического сохранения настроек. 
		
		
		
			В первом поле можно набирать для быстрого поиска код пользователя, во втором наименование. При этом внизу автоматически идет сортировка по набранному тексту *текст*. При помощи стрелок вверх и вниз перемещаться по списку оставаясь в поле поиска и выбирать текущую запись для передачи по Enter. Для сброса фильтра используется кнопка рядом с полями. Выбор из списка может быть выполнен мышкой, двойным кликом по записи в таблице. Также внизу присутствует три кнопки для выбора себя (как сегодня в выборе даты), текущей записи и отказаться от выбора. Если отмечен признак Помнить то текущие настройки сохраняются для формы при закрытии и при повторном вызове будут восстановлены. 
				__________________ 
		
		
		
		
	Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.  
			 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Dino (0). | |
| Теги | 
| поиск, фильтр | 
| 
	
	 | 
	
		
  |