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

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

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

см. PFC dropdown search service. n_cst_dwsrv_dropdownsearch.
в двух словах
обработка на editchanged и itemchanged
поиск подходящего значения в dddw
SetText + SelectText.
...
Рейтинг: 0 / 0
27.12.2006, 08:44
    #34226710
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким символам в DDDW
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
29.12.2006, 11:21
    #34232267
Ru78
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким символам в DDDW
Спасибо за подробный ответ! Экспериментирую. Подскажите еще, пожалуйста, как в itemchanged получить набираемую подстроку(текст), т.к. параметр data возвращает хранящийся в поле dddw идентификатор.
...
Рейтинг: 0 / 0
09.01.2007, 15:57
    #34243265
Ru78
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким символам в DDDW
Уважаемый Spas2001, прошу Вашей помощи по скрипту! В событии itemchanged в параметре data получаю код строки с набираемыми символами, а не сами набираемые символы (ls_searchtext = data). (Т.е. получаю значение из datacolumn, а не из displaycolumn.) Соответсвенно и определяется не кол-во набранных символов, а длина кода (li_searchtextlen = Len (ls_searchtext)).
Подскажите, пожалуйста, как получить значение (набор символов) для дальнейшего поиска в displaycolumn. заранее спасибо.
...
Рейтинг: 0 / 0
09.01.2007, 16:10
    #34243317
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким символам в DDDW
Воспользуйтесь функцией Find
И еще одно замечание - это вставляется в editchanged
...
Рейтинг: 0 / 0
12.01.2007, 16:10
    #34252323
Ru78
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким символам в DDDW
Spas2001, спасибо! В editchanged все работает!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
28.01.2009, 11:26
    #35782096
_serjj_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким символам в DDDW
ПБ 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
25.09.2009, 14:36
    #36217382
Badger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким символам в DDDW
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
25.09.2009, 14:47
    #36217428
Badger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по нескольким символам в DDDW
Ой забыл, а то ошибку выдает :) не забудте завести переменную в Invstance Variables

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


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