powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Поиск по нескольким символам в DDDW
11 сообщений из 11, страница 1 из 1
Поиск по нескольким символам в DDDW
    #34225498
Ru78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поиск по нескольким символам в стандартном DDDW осуществляется, если набирать эти символы достаточно быстро. При медленном наборе поиск осуществляется по одному символу. Подскажите, пожалуйста, можно ли как-то повлиять на это время? Или придется свое окно с поиском подставлять в событии pbm_dwndropdown? Заранее спасибо.
...
Рейтинг: 0 / 0
Поиск по нескольким символам в DDDW
    #34226016
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDDW рисуется через стандартный системный LISTBOX. И таймаут между кнопками, чтобы они обработались как группа, задается глобально для всей ОС. Так что проще всего рисовать собственное окошко на pbm_dwndropdown.

Лично я, последнее время, стандартные dddw использую только если количество строк в dddw не превышает десятка и никогда не меняется. Для больших списков всегда рисую собственное окошко. Удобнее получается :)

---
http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Поиск по нескольким символам в DDDW
    #34226098
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проще ли? дело вкуса.

см. PFC dropdown search service. n_cst_dwsrv_dropdownsearch.
в двух словах
обработка на editchanged и itemchanged
поиск подходящего значения в dddw
SetText + SelectText.
...
Рейтинг: 0 / 0
Поиск по нескольким символам в DDDW
    #34226710
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ls_searchtext = data
li_searchtextlen = Len (ls_searchtext)


ls_dddw_displaycol = dwo.dddw.displaycolumn
ls_findexp = "Lower (Left (" + ls_dddw_displaycol + ", " + &
String (li_searchtextlen) + ")) = '" + Lower (ls_searchtext) + "'"

ll_dddw_rowcount = dwc.rowcount()
ll_findrow = dwc.Find (ls_findexp, 0, ll_dddw_rowcount)
// Determine if a match was found on the dddw.
lb_matchfound = (ll_findrow > 0)
Примерно так
// Set the found text if found on the dddw.
if lb_matchfound then
// Get the text found.
ls_foundtext = dwc.GetItemString (&
ll_findrow, ls_dddw_displaycol)
End If
// For either dddw or ddlb, check if a match was found.
If lb_matchfound Then
// Set the text.
post SetText (ls_foundtext)

// Determine what to highlight or where to move the cursor..
if li_searchtextlen = len(ls_foundtext) THEN
// Move the cursor to the end
post SelectText (Len (ls_foundtext)+1, 0)
else
// Hightlight the portion the user has not actually typed.
post SelectText (li_searchtextlen + 1, Len (ls_foundtext))
end if
end if
...
Рейтинг: 0 / 0
Поиск по нескольким символам в DDDW
    #34232267
Ru78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подробный ответ! Экспериментирую. Подскажите еще, пожалуйста, как в itemchanged получить набираемую подстроку(текст), т.к. параметр data возвращает хранящийся в поле dddw идентификатор.
...
Рейтинг: 0 / 0
Поиск по нескольким символам в DDDW
    #34243265
Ru78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый Spas2001, прошу Вашей помощи по скрипту! В событии itemchanged в параметре data получаю код строки с набираемыми символами, а не сами набираемые символы (ls_searchtext = data). (Т.е. получаю значение из datacolumn, а не из displaycolumn.) Соответсвенно и определяется не кол-во набранных символов, а длина кода (li_searchtextlen = Len (ls_searchtext)).
Подскажите, пожалуйста, как получить значение (набор символов) для дальнейшего поиска в displaycolumn. заранее спасибо.
...
Рейтинг: 0 / 0
Поиск по нескольким символам в DDDW
    #34243317
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воспользуйтесь функцией Find
И еще одно замечание - это вставляется в editchanged
...
Рейтинг: 0 / 0
Поиск по нескольким символам в DDDW
    #34252323
Ru78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Spas2001, спасибо! В editchanged все работает!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Поиск по нескольким символам в DDDW
    #35782096
_serjj_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПБ 10.2.1 - 9914

скрипт юзера spas2001 пробовал использовать, но обнаружил в нем один недостаток - все хорошо находится, но childdw выпадающий не прокручивается до найденной строки.

Тогда по этому рецепту:
http://manuals.sybase.com/onlinebooks/group-pb/pbg0900e/pfcug/@Generic__BookTextView/4819;pt=4572;lang=ru
попробовал настроить поиск, оказалось, что он прокручивает выпадающий список до нужной строки, но в самой строке поиска добавленная часть текста не выделяется и в итоге при вводе второго символа в строку он просто вставляется между первым введенным и добавленной ранее строкой, и , естесственно, ничего не находит.

Подскажите, плиз, в чем может быть дело и есть ли в этом ПФЦ-сервисе в 10 версии ошибка, в 7-ой версии ПБ я этот сервис использовал и все работало нормально.
...
Рейтинг: 0 / 0
Поиск по нескольким символам в DDDW
    #36217382
Фотография Badger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001ls_searchtext = data
li_searchtextlen = Len (ls_searchtext)
....
спасибо за идею, надоели PFC немног переписал и вот что получилось, может кому и пригодится...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
////////////////////////////////////////////////////////////////////////
//						
//     Создал новое событие :  ue_dddwfind(dwobject, string)     которое находится на dw_1
//						
//    Описание  :  быстрый поиск по dddw, дописывает в конец слова, то что находит в dddw списке.
// 		Вызов этого EVENT ue_dddwfind() происходит из EVENT editchanged() например так:
/*
                          string               ls_pole
                          ls_pole              = dwo.Name
                          choose case ls_pole
                          case 'city' /*  'city' название поля DataWindow у которое есть выпадающий список - dddw */
                          if Len (data) >  0  then
                                   EVENT POST ue_dddwfind(dwo, data)
                          end if
                          END CHOOSE
*/		
//						
//     История :   25 . 09 . 2009  - Андрей, создание
//					
//   Аргументы :	adwo      - dwobject 
//		as_data  - string (строка только что введенных данных)
//						
//  Возвращает :  (None)
//						
//////////////////////////////////////////////////////////////////////////

integer                  li_lentext   
long                      ll_findrow   
string                    ls_dddw_column   
string                    ls_foundtext   
string                    ls_searchtext   
DataWindowChild     ldddw_child

If   IsNull(adwo)   or   Not   IsValid(adwo)   Then   Return   
 
ls_searchtext   	=   as_data   
li_lentext   		=   Len   (ls_searchtext) 

/* Проверки нужно ли вообще что то искать */
If  (li_lentext   <   Len(is_textprev) and li_lentext >  1 )   or   &   
	(Lower   (ls_searchtext)   =   Lower   (is_textprev))   Then   
	is_textprev   =   ''   
	Return     
End   If   

is_textprev   =   ls_searchtext   

/* Непосредственно сам поиск по dddw */
if GetChild (adwo.Name, ldddw_child) =  1  then 
		ls_dddw_column   =   adwo.dddw.displaycolumn   /* название отображаемой в dddw */
		/* Собираем строку поиска столько символом сколько у нас введено */
		ls_searchtext   =   "lower (left ("   +   ls_dddw_column   +   ",   "   +  &
		String (li_lentext) + "))  =  '"   +   Lower   (ls_searchtext)   +   "'"   

		/* Поиск по dddw */
		ll_findrow   =   ldddw_child.Find   (ls_searchtext,    1 ,   ldddw_child.rowcount() )   

		/* Устанавливаем найденное значение */
		if   ll_findrow  >   0   then  ls_foundtext = ldddw_child.GetItemString ( ll_findrow, ls_dddw_column)
		if   ll_findrow  >   0   then  SetText   (ls_foundtext)   
		
		/* если значение найдено, то подсвечиваем недописанный текст иначе ставим курсор в конец строки */
		if   li_lentext   =   len(ls_foundtext)   THEN   	
				SelectText   (Len   (ls_foundtext) +  1 ,    0 )   	
		else  
				SelectText   (li_lentext   +    1 ,   Len   (ls_foundtext))   
		end if
end if    

...
Рейтинг: 0 / 0
Поиск по нескольким символам в DDDW
    #36217428
Фотография Badger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой забыл, а то ошибку выдает :) не забудте завести переменную в Invstance Variables

string is_textprev
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Поиск по нескольким символам в DDDW
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]