Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поиск в Дереве. / 12 сообщений из 12, страница 1 из 1
23.05.2004, 13:52:00
    #32529616
Benzin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
Можно ли сделать поиск в Дереве созданном кодом(без таблицы)?
Искать надо имя узла(св-во Node.Text) по заданному значению. Если можно, то помогите с кодом - только-только начал постигать этот элемент.
...
Рейтинг: 0 / 0
23.05.2004, 14:01:24
    #32529623
Shuhard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
жди понедельника
...
Рейтинг: 0 / 0
23.05.2004, 14:50:52
    #32529654
Jem
Jem
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Function  FindNode(byval MyText as string)
Dim  NodeX as Node

For Each Nodex in Me.TreeView.Nodes
          If Nodex.Text=MyText then
                Nodex.Expanded = True
                Nodex.Selected = True
                Me.TreeView.DropHighlight = Me.TreeView.SelectedItem
          end if
Next Nodex

End Function
...
Рейтинг: 0 / 0
23.05.2004, 15:29:06
    #32529667
Benzin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
Сделал немного по-другому, учитывая, что строка поиска может быть короче. Используя тот же синтаксис:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Function  FindNode(byval MyText as string) As String
Dim  NodeX as Node

For Each Nodex in Me.TreeView.Nodes
          If Left(Nodex.Text, Len(MyText)) = MyText then
                Nodex.Selected = True
                FindNode = Nodex.Key
                Exit Function
          end if
Next Nodex

End Function
А вот как осуществить "Найти далее"?
...
Рейтинг: 0 / 0
23.05.2004, 16:12:21
    #32529684
Jem
Jem
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
А это чего значит?
Код: plaintext
If Left(Nodex.Text, Len(MyText)) = MyText 
авторучитывая, что строка поиска может быть короче
Может так:
Код: plaintext
 If Nodex.Text like "*" & MyText & "*" then

авторА вот как осуществить "Найти далее"?
Запоминай уже найденные значения Nodex.Key в публичной переменной типа массив. И при поиске проверяй нет ли найденного Nodex.Key в массиве ключей, если все что удалось найти уже было найденно ранее очищай переменную.
Вообще у тебя что-то не так. Загони лучше значения для дерева в таблицы (раз оно такое здоровое что нужен поиск) и осуществляй поиск внутри таблицы через (к примеру) рекордсет.
Там проверяй сколько похожих записей в таблице, и если RecordCount>1 тогда имеет смысл "искать далее" если =1 то все что можно нашли, если Bof and Eof тогда ничего не найденно. Ну в этом духе короче.
...
Рейтинг: 0 / 0
23.05.2004, 16:23:38
    #32529689
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
2 Jem:
Левая звездочка вроде лишняя...
...
Рейтинг: 0 / 0
23.05.2004, 16:49:15
    #32529693
Jem
Jem
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
2 Владимир Саныч.
Да ладно не помешает
...
Рейтинг: 0 / 0
23.05.2004, 18:05:36
    #32529721
Benzin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
А значит это следующее:
Если первые n-знаков в имени узла, где n равно длине заданного слова, равны по содержанию заданному слову, то это то, что ты ищешь.
Почему-то мне Like не нравиться, может из-за того, что надо добавлять всю эту конкатенацию, может еще почему...
А левая звездочка, действительно, не нужна, иначе будет применено условие "совпадение с любой частью", что совсем не нужно.
Насчет таблицы для Дерева я уже подумываю, пока не понял как это сделать лучше - базу хотят переделать для работы нескольких пользователей(файл-сервер) и, если каждому организовывать локальную табл Дерево, то как они будут видеть результат работы друг-друга?
...
Рейтинг: 0 / 0
23.05.2004, 19:10:22
    #32529746
Jem
Jem
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
авторчто надо добавлять всю эту конкатенацию

авторсовпадение с любой частью
Я просто предложил более универсальный алгоритм поиска.
пользователь не обязан помнить в каком порядке идут слова в тексте узла, также можно ввести просто часть слова.
авторорганизовывать локальную табл Дерево, то как они будут видеть результат работы друг-друга?
Никак, дерево в любом сучаи придется перестраивать, будь то локальная таблица или связанная. Я вообще не понимаю зачем в тривью отображать те уровни ерархии которые часто подвергаются редактированию, что в конечном счете требует перезагрузки дерева.
Ну хотя не хочется лезть в дебри, это тема отдельного топика.
...
Рейтинг: 0 / 0
23.05.2004, 19:38:31
    #32529756
Benzin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
У меня названия узлов - фамилии людей, согласись - пытаясь найти, скажем, "Ованесов" и введя условие "ова", я при таком универсальном алгоритме могу получить и Петр ова , и Иван ова , и т.п.
Насчет частого редактирования Дерева(в смысле добавления новых узлов/удаления старых) это я погорячился - данные довольно статичные.
----------------------------------
А вот сейчас пытаюсь создать таблицу по Дереву - не выходит. Точнее сама таблица создается, но пустая, а заполняться не хочет. Подскажите, ведь есть, небось, отработанная процедура.
...
Рейтинг: 0 / 0
29.07.2004, 16:16:18
    #32627609
Март
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
Jem
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Function  FindNode(byval MyText as string)
Dim  NodeX as Node

For Each Nodex in Me.TreeView.Nodes
          If Nodex.Text=MyText then
                Nodex.Expanded = True
                Nodex.Selected = True
                Me.TreeView.DropHighlight = Me.TreeView.SelectedItem
          end if
Next Nodex

End Function


Я тоже заинтересовался этим постом и использовал Me.TreeView.DropHighlight = Me.TreeView.SelectedItem для выделения нода, но потом если я перемещаюсь по дереву, то все время возращаюсь на этот нод.
...
Рейтинг: 0 / 0
30.07.2004, 09:27:10
    #32628527
Хвост
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в Дереве.
Если я вник в суть предыдущих постов, то поиск подобным образом будет не удобен юзеру, так как, если дерево отсортировано, то по нажатию "Найти далее" - юзер будет скакать по нодам взад-вперед аки горный козел. Правда ничто не мешает искать в отсортированном запросе :). Но я сделал для себя (размер дерева позволяет - не более 500 нод) отсортированый по имени ноды массив (с Key'ями нод), по которому и ищется последовательно ноды. Выбор данного сопособа целиком и полностью не правильный :) - но у меня несколько деревьев - лень было для каждого писать процедуры поиска - а так получается универсально и быстро. Но все же лучше через запросы/процедуры - и красивей и удобней, да и универсально сделать то же можно, никто не мешает :)

Код: 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.
Private Sub FindWord(strWhatFind As String)

    Dim i As Long
    Dim strNameNode As String     'имя ноды
 


    For i = LBound(arrNames,  1 ) + NodeID To UBound(arrNames,  1 )

         ''    For i = NodeID To lngCount - 1    ' последовательный перебор всех элементов, если есть сохраненое значение последненго найденного элемента - то с него
 
        strNameNode = arrNames(i,  0 )


        Select Case grFind.Value
            Case  1      ' сначала слова
 

                If InStr( 1 , strNameNode, strWhatFind, vbTextCompare) =  1  Then
                    tv.Nodes.Item(CStr(arrNames(i,  1 ))).Selected = True
                    Call Forms(Me.OpenArgs).ctlTV_NodeClick(tv.Nodes.Item(CStr(arrNames(i,  1 ))))
                    NodeID = i +  1 
                    GoTo ext
                End If

            Case  2      ' с любой частью
 
                If InStr( 1 , strNameNode, strWhatFind, vbTextCompare) >=  1  Then
                    tv.Nodes.Item(CStr(arrNames(i,  1 ))).Selected = True
                    Call Forms(Me.OpenArgs).ctlTV_NodeClick(tv.Nodes.Item(CStr(arrNames(i,  1 ))))

                    NodeID = i +  1 
                    GoTo ext
                End If
            Case  3      ' только слово целиком
 
                If StrComp(strNameNode, strWhatFind, vbTextCompare) =  0  Then
                    tv.Nodes.Item(CStr(arrNames(i,  1 ))).Selected = True
                    Call Forms(Me.OpenArgs).ctlTV_NodeClick(tv.Nodes.Item(CStr(arrNames(i,  1 ))))

                    NodeID = i +  1 
                    GoTo ext
                End If
            Case Else
                Beep

                GoTo ext
        End Select



    Next i

     'Поиск окончен
 
    If NodeID <>  0  Then
        MsgBox " со всем ничего не найдено,", vbInformation, Me.Form.Caption
    Else
        MsgBox "Больше ничего не найдено!", vbInformation, Me.Form.Caption
    End If
    NodeID =  0 

ext:

End Sub 

arrNames - двумерный Public массив с именем и ключом ноды, массив можно создавать и сортировать в момент создания дерева либо в момент открытия формы Поиск (у меня так). В момент заполнения массива не забыть сделать Trim.

Call Forms(Me.OpenArgs).ctlTV_NodeClick(tv.Nodes.Item(CStr(arrNames(i, 1)))) - это просто вызов функции из формы на котром ростет дерево (там просто отображается с листвью доп. информация) - можно заменить на Selected/Expanded = true

grFind.Value - 3 флажка на форме поиска: толко сначала слова, с лбой частью слова, слово целиком
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поиск в Дереве. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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