снова TreeView

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

снова TreeView

Сообщение Chuvak » 01.04.2003 (Вт) 10:42

проблема такая:
1). надо сохранить информацию из TreeView в файл в таком формате
(подуровни сдвинуты [Tab]'ами).

Код: Выделить всё
NodeOne
    UnderNodeOne_One
    UnderNodeOne_Two
        UnderNodeOne_Two_One
NodeTwo
    UnderNodeTwo_One
NodeThree
    UnderNodeThree_One
    UnderNodeThree_Two
        UnderNodeThree_Two_One
        UnderNodeThree_Two_Two
    UnderNodeThree_Three
NodeFour
    UnderNodeFour_One
    UnderNodeFour_Two


2). необходимо загрузить из файла в TreeView

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 01.04.2003 (Вт) 10:51

Ну сохранение примерно так:



sub savetree(level as long, lwhat as node)

dim obj as node

set obj = lwhat

do until obj is nothing

print #1,string(chr(9),level) & obj.text

if obj.children>0 then call savetree(level+1,obj,child)

set obj = obj.next

loop

end sub



Ну и вызываешь ее типа savetree 0,mytree.nodes(1) и все.



Ну а загрузку я думаю по аналогии сам напишешь.

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 01.04.2003 (Вт) 11:14

сохранение я по-своему сделал, а вот с загрузкой какие-то гоны получаются

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 01.04.2003 (Вт) 11:24

Какие именно? Хоть бы код что ли запостил ;)

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 01.04.2003 (Вт) 11:30

код сохранения поболее, но без рекурсии (не очень люблю рекурсию- "с детства это")

Код: Выделить всё
Private Sub Command1_Click()
  Dim outData, level As String
  Dim n As Node
  Dim i As Integer
  Open "qwerty" For Output As #1
  For Each n In TV.Nodes
    level = Chr(9)
    For i = 1 To Len(n.FullPath)
      If Mid(n.FullPath, i, 1) = "\" Then
        level = level + Chr(9)
      End If
    Next i
    outData = level + n
    Print #1, outData
  Next n
  Close
End Sub


ну и загрузку хотелось бы без рекурсии

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 01.04.2003 (Вт) 12:27

А тенбе обязательно в текстовик это хранить? Может, лучше XML? Тогда все получается очень просто ;)

И чем тебе рекурсия не нравится?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 01.04.2003 (Вт) 12:32

вот примерчик сохранения содержимого TreeView в файл и восстановления его из файла.
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.04.2003 (Ср) 9:09

Когда передо мной встала такая проблема, я немного поэкспериментировал, и вот что получилось.

Тезис первый
Для добавления нода не первого уровня нужно указать код его родителя.
Тезис второй
Если пробежать по коллекции нодов с помощью For Each, то сначала будут последовательно вызываться все ноды сначала первого уровня, затем все ноды второго уровня и т.д.

Из этих тезисов следует, что для сохранения дерева нужно сначала определить пользовательский тип

Код: Выделить всё
Type NodeData
  Text As String
  Key As String
  ParentKey as String
End Type


а затем простым циклом For Each сделать этим нодам Put в файл Random доступа.

При загрузке же дерева - просто чтение Get'ом. Отсутствие ошибки присваивания дочки несуществующему ноду гарантируется тезисом 2.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 02.04.2003 (Ср) 11:10

to RayShade

если не в облом, напиши загрузку с рекурсией данных из файла в формате, приведенным в начальном сообщении

goro
Постоялец
Постоялец
 
Сообщения: 494
Зарегистрирован: 03.12.2002 (Вт) 11:45
Откуда: Украина, Запорожье

Сообщение goro » 02.04.2003 (Ср) 20:32

RayShade писал(а):А тенбе обязательно в текстовик это хранить? Может, лучше XML? Тогда все получается очень просто ;)
И чем тебе рекурсия не нравится?

Если сможешь напиши как с XML работать. Мне тоже интересно.
ПРЕВЕД

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 03.04.2003 (Чт) 9:56

В двух словах это описать не получится.

Можно почитать в MSDN в разделе Microsoft XML 3.0 - XML Developer's Guide статью XML DOM User Guide



Ну и вопросы задавайте что непонятно будет ;)

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 10.04.2003 (Чт) 6:27

to RayShade

ну все-таки напиши загрузку по аналогии твоего метода сохранения

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 15.04.2003 (Вт) 5:58

ПАМАГИТЕ, ПЛИЗ, ГОРЮ

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 15.04.2003 (Вт) 10:12

Так можно
Код: Выделить всё
  Dim s As String, ss() As String
  Dim n As Node, indent As Integer

Сохранение.
Код: Выделить всё
    Open "qwerty" For Output As #1
      For Each n In TreeView1.Nodes
        ss = Split(n.FullPath, TreeView1.PathSeparator)
        Print #1, String(UBound(ss) + 1, Chr(9)) & n.Text
      Next n
    Close #1

Восстановление
Код: Выделить всё
    TreeView1.Nodes.Clear
    Open "qwerty" For Input As #1
      Do While Not EOF(1)
        Line Input #1, s
        ss = Split(s, Chr(9))
        If n Is Nothing Then
          indent = 1
          Set n = TreeView1.Nodes.Add(, , , ss(UBound(ss)))
        ElseIf indent = UBound(ss) Then
          Set n = TreeView1.Nodes.Add(n.Index, tvwNext, , ss(UBound(ss)))
        ElseIf indent < UBound(ss) Then
          indent = UBound(ss)
          Set n = TreeView1.Nodes.Add(n.Index, tvwChild, , ss(UBound(ss)))
        ElseIf UBound(ss) < i Then
          Do While UBound(ss) < i
            Set n = n.Parent
            indent = indent - 1
          Loop
          Set n = TreeView1.Nodes.Add(n.Index, tvwNext, , ss(UBound(ss)))
        End If
      Loop
    Close #1
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 15.04.2003 (Вт) 10:39

я так понял "i" - это "indent", да?

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 16.04.2003 (Ср) 11:51

в принцине всё ништяк, но появилась другая проблема:
у меня есть какое-то дерево в treeview, каждый узел имеет индекс (1-самый верхний, 2-следующий и т.д.). Во время работы мне необходимо перемещать узлы. В результате получается, что узел с индексом = 1 оказывается где-то внизу. И когда происходит сохранение, то в файл сохраняются узлы последовательно по значениям индексов. В результате все мои перемещения узлов оказываются напрасными. Вопрос: можно ли чего сделать с этим?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 68

    TopList