1 (изменено: Mat Skywalker, 2013-06-16 16:23:12)

Тема: VBS + WSO реализация TreeView

Пытаюсь использовать такую замечательную штуку как WSO. О этой технологии тут уже писали. http://forum.script-coding.com/viewtopic.php?id=3906
Возник такой вопрос. В данном примере TreeView реализована простановка "галочек" по всем дочерним элементам дерева. Данный пример прислал мне сам автор, за что ему большое спасибо.

Здравствуйте

Инструмент для перебора есть, но нет события, которое вызывается в момент смены переключателя.
Будет добавлено в будущем.

Пока как-то так можно:

Set o = WScript.CreateObject("Scripting.WindowSystemObject")

Set f = o.CreateForm(0,0,0,0)
f.ClientWidth = 500
f.ClientHeight = 300
f.CenterControl()

Set TreeView = f.CreateTreeView(0,0,0,0) 
TreeView.Align = o.Translate("AL_CLIENT") 
TreeView.CheckBoxes = true

Set Root = TreeView.Items.Add("1")

For counter = 1 To 10
    Set Item = Root.Add(CStr(counter))
    For i = 1 To 10
        Set Item1 = Item.Add(CStr(counter)+"."+CStr(i))
    Next
Next

Root.Expand(true)

Set t = o.CreateTimer()
t.Interval = 100
t.OnExecute = GetRef("OnTimer")
t.Active = true

Sub OnTimer(Sender)
    UpdateItems TreeView.Items
End Sub

Sub InitItems(Value)
    Dim Item
    Dim SubItem
    Dim i

    Set Item = Value
    Item.UserData = Item.Checked

    If Item.Count > 0 Then
        For i = 1 To Item.Count
            Call InitItems(Item.Item(i-1))
        Next
    End If
End Sub


Sub UpdateItems(Value)
    Dim Item
    Dim SubItem
    Dim i

    Set Item = Value

    If Item.UserData <> Item.Checked Then
    Item.UserData = Item.Checked
    If Item.Count > 0 Then
        For i = 1 To Item.Count
            Item.Item(i-1).Checked = Item.Checked
        Next
    End If
    End If

    If Item.Count > 0 Then
    For i = 1 To Item.Count
        Call UpdateItems(Item.Item(i-1))
    Next
    End If
End Sub

InitItems TreeView.Items

f.Show()
o.Run()

Теперь собственно вопрос к знатокам.
Как перебрать все элементы коллекции и узнать где "галочка" стоит, а где нет?

Автоматизирую торговлю. Не 1С

2

Re: VBS + WSO реализация TreeView

Пока ничего умнее чем это не придумал:

for i=0 to Tree.Items.Count-1
if  Tree.Items(i).Checked=True then msgbox Tree.Items(i).Text
next

А вот как пройти все дерево?

Автоматизирую торговлю. Не 1С

3 (изменено: YMP, 2013-06-20 15:15:51)

Re: VBS + WSO реализация TreeView

Я не знаток этого компонента, но вот так вроде работает:


If Root.Checked Then
    MsgBox Root.Text
End If
For i = 0 To Root.Count - 1
    Set Node = Root.Item(i)
    If Node.Checked Then
        MsgBox Node.Text
    End If
    For j = 0 To Node.Count - 1
        Set Leaf = Node.Item(j)
        If Leaf.Checked Then
            MsgBox Leaf.Text
        End If
    Next
Next

4 (изменено: Mat Skywalker, 2013-06-20 16:06:04)

Re: VBS + WSO реализация TreeView

Вы забыли одну строку впереди

set root=Tree.Items

Спасибо, ваш метод работает. Но что делать если дерево имеет "ветвистость", по 5-6 вложений?

Автоматизирую торговлю. Не 1С

5

Re: VBS + WSO реализация TreeView

Но что делать если дерево имеет "ветвистость", по 5-6 вложений?

Использовать рекурсию.

6

Re: VBS + WSO реализация TreeView

Mat Skywalker пишет:

Вы забыли одну строку впереди

set root=Tree.Items

Нет, не забыл. Она ведь уже есть в примере в посте №1.

7

Re: VBS + WSO реализация TreeView

alexii пишет:

Но что делать если дерево имеет "ветвистость", по 5-6 вложений?

Использовать рекурсию.

Вооот тут то и затык. Обращаться 5-6 раз, копируя 5-6 вложеных условий, к дочерним элементам не хочется. А как построить правильно, догнать не могу. См. 1 пост.

Автоматизирую торговлю. Не 1С

8

Re: VBS + WSO реализация TreeView

Сделайте пример с нужным вам количеством уровней, и попробуем.

9

Re: VBS + WSO реализация TreeView

Вот пример, который использует рекурсию для построения дерева и для поиска отмеченных чекбоксов.


Set o = WScript.CreateObject("Scripting.WindowSystemObject")

Set f = o.CreateForm(0,0,0,0)
f.ClientWidth = 500
f.ClientHeight = 300
f.CenterControl()

Set Button = f.CreateButton(240,100,75,25,"Checked")
Button.OnClick = GetRef("ShowChecked")

Set TreeView = f.CreateTreeView(0,0,0,0) 
TreeView.Align = o.Translate("AL_CLIENT") 
TreeView.CheckBoxes = true

Set Root = TreeView.Items.Add("1")
BuildTree Root, 4, 3
Root.Expand(false)

Set t = o.CreateTimer()
t.Interval = 100
t.OnExecute = GetRef("OnTimer")
t.Active = true

Sub BuildTree(Root, Levels, Items)
    If Levels > 0 Then
        For i = 1 To Items
            Set Node = Root.Add(Root.Text & "." & CStr(i))
            BuildTree Node, Levels - 1, Items
        Next
    End If
End Sub

Sub ShowChecked(Sender)
    List = ""
    EnumChecked Root, List
    MsgBox List
End Sub

Sub EnumChecked(Root, List)
    If Root.Checked Then
        List = List & vbCrLf & Root.Text
    End If
    For i = 0 To Root.Count - 1
        Set Node = Root.Item(i)
        EnumChecked Node, List
    Next
End Sub

Sub OnTimer(Sender)
    UpdateItems TreeView.Items
End Sub

Sub InitItems(Value)
    Dim Item
    Dim SubItem
    Dim i

    Set Item = Value
    Item.UserData = Item.Checked

    If Item.Count > 0 Then
        For i = 1 To Item.Count
            Call InitItems(Item.Item(i-1))
        Next
    End If
End Sub

Sub UpdateItems(Value)
    Dim Item
    Dim SubItem
    Dim i

    Set Item = Value

    If Item.UserData <> Item.Checked Then
    Item.UserData = Item.Checked
    If Item.Count > 0 Then
        For i = 1 To Item.Count
            Item.Item(i-1).Checked = Item.Checked
        Next
    End If
    End If

    If Item.Count > 0 Then
    For i = 1 To Item.Count
        Call UpdateItems(Item.Item(i-1))
    Next
    End If
End Sub

InitItems TreeView.Items

f.Show()
o.Run()

10

Re: VBS + WSO реализация TreeView

Спасибо, ваше решение очень мне помогло. Но возник еще один "нубский" вопрос: как теперь проставить чекбоксы, считав данные из файла?
Допустим у меня есть текстовый файл со списком отмеченных позиций, как на них проставить галочки?

Автоматизирую торговлю. Не 1С

11 (изменено: Mat Skywalker, 2013-08-15 08:37:58)

Re: VBS + WSO реализация TreeView

Написал такой код. Не работает

Set o = WScript.CreateObject("Scripting.WindowSystemObject")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set f = o.CreateForm(0,0,0,0)
f.ClientWidth = 500
f.ClientHeight = 300
f.CenterControl()

Set Button = f.CreateButton(240,100,75,25,"Checked")
Button.OnClick = GetRef("ShowChecked")

Set Button2 = f.CreateButton(240,140,75,25,"Save")
Button2.OnClick = GetRef("SaveChecked")

Set Button3 = f.CreateButton(240,180,75,25,"Load")
Button3.OnClick = GetRef("LoadChecked")

Set TreeView = f.CreateTreeView(0,0,0,0) 
TreeView.Align = o.Translate("AL_CLIENT") 
TreeView.CheckBoxes = true

Set Root = TreeView.Items.Add("1")
BuildTree Root, 4, 3
Root.Expand(false)

Set t = o.CreateTimer()
t.Interval = 100
t.OnExecute = GetRef("OnTimer")
t.Active = true

Sub BuildTree(Root, Levels, Items)
    If Levels > 0 Then
        For i = 1 To Items
            Set Node = Root.Add(Root.Text & "." & CStr(i))
            BuildTree Node, Levels - 1, Items
        Next
    End If
End Sub

Sub ShowChecked(Sender)
    List = ""
    EnumChecked Root, List
    MsgBox List
End Sub

Sub SaveChecked(Sender)
Set txtFile = objFSO.CreateTextFile("d:\tree.txt", true, true)
    List = ""
    EnumChecked Root, List
    txtFile.write List
End Sub

Sub LoadChecked(Sender) ' Загружаем сохраненные строки
Set txtFile = objFSO.OpenTextFile("d:\tree.txt", 1)
txtFile.SkipLine
Do Until txtFile.AtEndOfStream ' Тут вызываем функцию для поиска по дереву
LoadCheck Root, List, txtFile.ReadLine
loop

End Sub

Sub EnumChecked(Root, List)
    If Root.Checked Then
        List = List & vbCrLf & Root.Text
    End If
    For i = 0 To Root.Count - 1
        Set Node = Root.Item(i)
        EnumChecked Node, List
    Next
End Sub

Sub LoadCheck(Root, List, treetext) ' Рекурсивный поиск и сравнение. Результата не дает =(
    If Root.Checked=false and Root.Text=treetext Then
       Root.Checked=True
    End If
    For i = 0 To Root.Count - 1
        Set Node = Root.Item(i)
        LoadCheck Node, List,  treetext
    Next
End Sub

Sub OnTimer(Sender)
    UpdateItems TreeView.Items
End Sub

Sub InitItems(Value)
    Dim Item
    Dim SubItem
    Dim i

    Set Item = Value
    Item.UserData = Item.Checked

    If Item.Count > 0 Then
        For i = 1 To Item.Count
            Call InitItems(Item.Item(i-1))
        Next
    End If
End Sub

Sub UpdateItems(Value)
    Dim Item
    Dim SubItem
    Dim i

    Set Item = Value

    If Item.UserData <> Item.Checked Then
    Item.UserData = Item.Checked
    If Item.Count > 0 Then
        For i = 1 To Item.Count
            Item.Item(i-1).Checked = Item.Checked
        Next
    End If
    End If

    If Item.Count > 0 Then
    For i = 1 To Item.Count
        Call UpdateItems(Item.Item(i-1))
    Next
    End If
End Sub

InitItems TreeView.Items

f.Show()
o.Run()
Автоматизирую торговлю. Не 1С

12

Re: VBS + WSO реализация TreeView

В чем моя ошибка?

Автоматизирую торговлю. Не 1С