Страница: 1 |
Страница: 1 |
Вопрос: Навигация по списку
Добавлено: 03.01.07 23:50
Автор вопроса: pstrkim
Подскажите как написать программу навигации по списку
с вводом символов с клавиатуры. Нашел один вариант, но он начинает ввод только с буквы "A":
Dim sLstSearch As String
Dim CurrentLetter As String
Dim sWaitForLetter As String
Dim dbBiblio As Database
Dim sSQL As String
Dim rs As DAO.Recordset
Private Sub Form_Load()
sWaitForLetter = ""
CurrentLetter = ""
Set dbBiblio = OpenDatabase("C:\Databases\BIBLIO.mdb")
sSQL = "SELECT Name FROM Publishers ORDER BY Name" 'WHERE Name LIKE '" & CurrentLetter & "*' ORDER BY Name"
Set rs = dbBiblio.OpenRecordset(sSQL)
While Not rs.EOF
lstSearch.AddItem rs.Fields("Name")
rs.MoveNext
Wend
rs.Close
Me.Caption = lstSearch.ListCount & " records loaded"
End Sub
Function SearchListBox(lstX As Control, KeyAscii As Integer)
Dim nSearchPos As Integer
Dim nSearchLen As Integer
Dim nResult As Integer
If CurrentLetter = "" Then
CurrentLetter = "A"
Else
CurrentLetter = Chr(Asc(CurrentLetter) + 1)
End If
nSearchPos = lstX.ListIndex
nSearchLen = Len(sLstSearch)
sWaitForLetter = ""
If KeyAscii = vbKeyBack Then
nSearchPos = 0
If nSearchLen > 0 Then sLstSearch = Left$(sLstSearch, _
nSearchLen - 1)
End If
KeyAscii = Asc(UCase$(Chr$(KeyAscii)))
If nSearchLen = 0 And KeyAscii > Asc(CurrentLetter) Then
lstX.ListIndex = lstX.ListCount - 1
sWaitForLetter = Chr$(KeyAscii)
Exit Function
End If
If KeyAscii >= Asc("A") And KeyAscii <= Asc("Z") Then
sLstSearch = sLstSearch & Chr$(KeyAscii)
End If
lblSrchtext = sLstSearch
nSearchLen = Len(sLstSearch)
While nSearchPos < lstX.ListCount
nResult = StrComp(sLstSearch, UCase$(Left$(lstX.List(nSearchPos), nSearchLen)))
If nResult <= 0 Then
lstX.ListIndex = nSearchPos
SearchListBox = 0
Exit Function
End If
nSearchPos = nSearchPos + 1
Wend
End Function
Private Sub lstSearch_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Exit Sub
End If
KeyAscii = SearchListBox(Me.ActiveControl, KeyAscii)
End Sub
Что нужно сделать?
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #1
Добавлено: 04.01.07 07:09
Смотри-ка, и на этом форуме он тоже не пользуется тегами оформления кода.
Видать, такой он и есть.
Номер ответа: 2
Автор ответа:
Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #2
Добавлено: 04.01.07 11:36
Я не все понял что ты хочеш, но может так будет проще.
If KeyAscii = 13 Then
Exit Sub
End If
CurrentLetter = Chr(KeyAscii)
End Sub
Номер ответа: 3
Автор ответа:
pstrkim
Вопросов: 13
Ответов: 16
Профиль | | #3
Добавлено: 04.01.07 13:17
Как ими пользоваться?
Номер ответа: 4
Автор ответа:
pstrkim
Вопросов: 13
Ответов: 16
Профиль | | #4
Добавлено: 04.01.07 13:22
Нет, стандартно список ищет значение только по первому введенному символу, а нужно чтобы при вводе символов с клавиатуры они запоминались и поиск производился по ближайшему совпадению с несколькими введеными симовлами(ну как в 1С в справочниках например)
Номер ответа: 5
Автор ответа:
pstrkim
Вопросов: 13
Ответов: 16
Профиль | | #5
Добавлено: 04.01.07 14:37
Теперь отформатировал:
Dim sLstSearch As String 'Строка поиска
Dim CurrentLetter As String 'Загруженная в список буква
Dim sWaitForLetter As String 'Выбранная, но не загруженная буква
Dim dbBiblio As Database 'База данных
Dim sSQL As String 'Строка набора записей
Dim rs As DAO.Recordset 'Набор записей
'Загрузка формы
Private Sub Form_Load()
sWaitForLetter = ""
CurrentLetter = ""
'Выполняем запрос к БД и заполняем список lstSearch
Set dbBiblio = OpenDatabase("C:\Databases\BIBLIO.mdb"
sSQL = "SELECT Name FROM Publishers ORDER BY Name" 'WHERE Name LIKE '" & CurrentLetter & "*' ORDER BY Name"
Set rs = dbBiblio.OpenRecordset(sSQL)
While Not rs.EOF
lstSearch.AddItem rs.Fields("Name"
rs.MoveNext
Wend
rs.Close
Me.Caption = lstSearch.ListCount & " records loaded"
End Sub
'Функция поиска слова в списке
Function SearchListBox(lstX As Control, KeyAscii As Integer)
Dim nSearchPos As Integer
Dim nSearchLen As Integer
Dim nResult As Integer
nSearchPos = lstX.ListIndex
nSearchLen = Len(sLstSearch)
sWaitForLetter = ""
'Проверяем не нажата ли клавиша <BACKSPACE>
If KeyAscii = vbKeyBack Then
nSearchPos = 0
If nSearchLen > 0 Then sLstSearch = Left$(sLstSearch, _
nSearchLen - 1)
End If
'Преобразуем введеный символ в верхний регистр
KeyAscii = Asc(UCase$(Chr$(KeyAscii)))
'Если нажата буква 'X', а данные введены только до 'C', ждем...
If nSearchLen = 0 And KeyAscii > Asc(CurrentLetter) Then
lstX.ListIndex = lstX.ListCount - 1
sWaitForLetter = Chr$(KeyAscii)
Exit Function
End If
'Добавляем в строку поиска новый символ
If KeyAscii >= Asc("A" And KeyAscii <= Asc("Z" Then
sLstSearch = sLstSearch & Chr$(KeyAscii)
End If
'Отображаем строку поиска
lblSrchtext = sLstSearch
'Пересчитываем длину
nSearchLen = Len(sLstSearch)
'Простой поиск - сравниваем каждый элемент со строкой поиска
While nSearchPos < lstX.ListCount
nResult = StrComp(sLstSearch, UCase$(Left$(lstX.List(nSearchPos), nSearchLen)))
If nResult <= 0 Then
lstX.ListIndex = nSearchPos
SearchListBox = 0
Exit Function
End If
nSearchPos = nSearchPos + 1
Wend
End Function
'Нажатие клавиши в списке
Private Sub lstSearch_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Exit Sub
End If
KeyAscii = SearchListBox(Me.ActiveControl, KeyAscii)
End Sub
Номер ответа: 6
Автор ответа:
Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #6
Добавлено: 04.01.07 15:21
Извени не видел 1С, но думаю вот тебе примерчик накатал может поможет.
Создай проект и кинь один TextBox
Listbox и попробуй введи слова из листа
#If Win32 Then ' 32-разрядная версия VB
Private Const LB_FINDSTRING = &H18F
Private Declare Function SendMessage Lib _
"user32" Alias "SendMessageA" (ByVal hwnd _
As Long, ByVal wMsg As Long, ByVal wParam _
As Long, lParam As _
Any) As Long
#Else ' 16-разрядная версия VB
Private Const WM_USER = &H400
Private Const LB_FINDSTRING = (WM_USER + 16)
' ***************************************есть или нет для команд1
Private Declare Function SendMessage Lib _
"User" (ByVal hwnd As Integer, ByVal wMsg _
As Integer, ByVal wParam As Integer, lParam _
As Any) As Long
#End If
Private Sub Form_Load()
With List1
.AddItem "МП-Ком правда"
.AddItem "Мой додыр"
.AddItem "Мяу"
.AddItem "Московская правда"
.AddItem "Московский комсомолец"
.AddItem "Московские новости"
End With
End Sub
Private Sub Text1_Change()
Dim pos As Long
List1.ListIndex = SendMessage(List1.hwnd, _
LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
If List1.ListIndex = -1 Then
pos = Text1.SelStart
Else
Номер ответа: 7
Автор ответа:
Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #7
Добавлено: 04.01.07 20:49
Блин при копировании упустил окончаниее.
Праздники сам понимаешь.
Вот код полностью надеюсь.
#If Win32 Then ' 32-разрядная версия VB
Private Const LB_FINDSTRING = &H18F
Private Declare Function SendMessage Lib _
"user32" Alias "SendMessageA" (ByVal hwnd _
As Long, ByVal wMsg As Long, ByVal wParam _
As Long, lParam As _
Any) As Long
#Else ' 16-разрядная версия VB
Private Const WM_USER = &H400
Private Const LB_FINDSTRING = (WM_USER + 16)
' ***************************************есть или нет для команд1
Private Declare Function SendMessage Lib _
"User" (ByVal hwnd As Integer, ByVal wMsg _
As Integer, ByVal wParam As Integer, lParam _
As Any) As Long
#End If
Private Sub Form_Load()
With List1
.AddItem "МП-Ком правда"
.AddItem "Мой додыр"
.AddItem "Мяу"
.AddItem "Московская правда"
.AddItem "Московский комсомолец"
.AddItem "Московские новости"
End With
End Sub
Private Sub Text1_Change()
Dim pos As Long
List1.ListIndex = SendMessage(List1.hwnd, _
LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
If List1.ListIndex = -1 Then
pos = Text1.SelStart
Else
pos = Text1.SelStart
Text1.Text = List1
Text1.SelStart = pos
Text1.SelLength = Len(Text1.Text) - pos
End If
End Sub
Номер ответа: 8
Автор ответа:
pstrkim
Вопросов: 13
Ответов: 16
Профиль | | #8
Добавлено: 04.01.07 21:12
Спасибо тебе большое за пример. Он сработал даже без окончания! Я честно говоря в такие дебри (Windows API) еще не залезал. Очень познавательно.
Но я уже разобрался со своим вариантом. В общем у меня поиск работает при вводе слова непосредственно в лист, а внизу листа в надписи появляются введенные буквы.
Номер ответа: 9
Автор ответа:
Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #9
Добавлено: 04.01.07 21:20
Очень рад за тебя. Нестыдно спросить если незнаеш стыдно неузнать если есть возможность.
Удачи...