TreeView & XML

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

TreeView & XML

Сообщение natcap » 17.08.2003 (Вс) 17:59

У меня 2 вопроса (просьба нае бить ногами, если они уже у вас оскомину набили :oops: )

1. Пытаюсь удалить Ноду из XML и получаю ошибку :(
удаляю так:

Код: Выделить всё
Node.parentNode.removeChild (Node)


При этом ошибка как если нода пустая, так и если есть все, что положено (атрибуты, дети, текст)
Как удалить эти... Ноды????

2. Как содержимое XML отобразить в TreeView?
Последний раз редактировалось natcap 18.08.2003 (Пн) 10:43, всего редактировалось 1 раз.
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

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

Сообщение RayShade » 18.08.2003 (Пн) 10:04

Второй вопрос неясен абсолютно.

А насчет первого.... А какая ошибка-то? :?

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 18.08.2003 (Пн) 10:38

1 дает ошибку 438: Object dosn't support this property or method

2 есть хмл например такой:
<design>мой дизайн
<css>0</css>
<top>1</menu_top>
<middle>1</menu_middle>
<bottom>1</menu_bottom>
<left>1</menu_left>
<right>1</menu_right>
<zagol>1</zagol>
</design>

мне надо получить дерево

мой дизайн
0
1
1
1
1
1
1

при чем если есть у нод параметры, то как-то сохранить и их
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

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

Сообщение RayShade » 18.08.2003 (Пн) 11:38

1. Текст ошибки говорит сам за себя ;) Неверный тип объекта у тебя. То есть не поддерживается им метод removeChild

2. Ну примерно так:

Код: Выделить всё
Private Sub BuildTree(oElement As IXMLElement, sParentID As String)
Dim sNodeLabel As String
Dim sNodeKey As String
Dim oChild As IXMLElement2
Static iParentID As Integer 'this is used to generate sequential unique IDs
'first check element type.
'If its an element, we add it as a node
'If its just text, we add it as an extension to the parent's text
If oElement.Type = XMLELEMTYPE_ELEMENT Then
    sNodeLabel = BuildNodeLabel(oElement)
    iParentID = iParentID + 1
    sNodeKey = "Node-" & CStr(iParentID)
    If (Not oElement.Parent Is Nothing) And (sParentID <> "") Then
        tvwXML.Nodes.Add sParentID, tvwChild, sNodeKey, sNodeLabel
    Else
        tvwXML.Nodes.Add , , sNodeKey, sNodeLabel
    End If
    If Not (oElement.children Is Nothing) Then
        For Each oChild In oElement.children
            BuildTree oChild, sNodeKey
        Next oChild
    End If
ElseIf oElement.Type = XMLELEMTYPE_TEXT And sParentID <> "" Then
    tvwXML.Nodes(sParentID).Text = tvwXML.Nodes(sParentID).Text + ": " + oElement.Text
End If

End Sub

Private Function BuildNodeLabel(oElement As IXMLElement) As String
Dim oAttrib As IXMLAttribute

BuildNodeLabel = oElement.tagName
If Not (oElement.Attributes Is Nothing) Then
    BuildNodeLabel = BuildNodeLabel + " ("
    For Each oAttrib In oElement.Attributes
        BuildNodeLabel = BuildNodeLabel + oAttrib.Name + "=" + oAttrib.Value + ", "
    Next oAttrib
    BuildNodeLabel = Left$(BuildNodeLabel, Len(BuildNodeLabel) - 2)
    BuildNodeLabel = BuildNodeLabel + ")"
End If

End Function


Это я давно еще где то нашел пример, вот только не помню где :)

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 18.08.2003 (Пн) 11:48

Хм.. что-то я видимо совсем тормоз...
1. Как же мне все же удалить эту идиотскую ноду?????
пишу вот так:

Код: Выделить всё
Public NodeList As msxml2.IXMLDOMNodeList
Public Node As msxml2.IXMLDOMNode
Public xmlSource As New msxml2.DOMDocument30

    Set NodeList = xmlSource.getElementsByTagName("test")
    For i = 0 To NodeList.length - 1
        Set Node = NodeList.Item(i)
        Node.parentNode.removeChild (Node)
    Next i


Ну что тут что может не поддерживать? Когда мне все методы и свойства сам ВБ выдает?

2. а как этот код связан с TreeView?
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

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

Сообщение RayShade » 18.08.2003 (Пн) 13:06

1. Хм... странно... Надо подумать :?





2. tvwXML это имя TreeView в котором все строится.

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 18.08.2003 (Пн) 13:16

Так с 1 разобралась...

Если написать
Код: Выделить всё
Node.parentNode.removeChild (Node)

То лезет ошибка, а если

Код: Выделить всё
Node.parentNode.removeChild Node

То все ок... в общем... БРЕЕЕЕЕЕЕЕЕЕЕД!!!!!

А еще такой вопрос...
Как мне сделать перетаскивание нодов внутри дерева? Т.е. я беру ноду, тащу, отпускаю и она встраивается в то место, где я ее отпустила. А еще как то же самое сделать но из ListView. Т.е. Я беру что-то в листвью и перетаскиваю в тривью, а он встраивается в место, где я его отпустила.
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

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

Сообщение RayShade » 18.08.2003 (Пн) 13:56

Ничего не бред. Когда ты делаешь со скобками, то метод возвращает ссылку на удаленный объект. А когда просто так - то удаляет и все.



А перетаскивание делается обработкой событий oledrag****

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 18.08.2003 (Пн) 14:06

А, ПОНЯЛА :)))))


А то что OleDrag это понятно.. а вот как отследить где мышка тормознула????
как поймать ту ноду, над которой остановились? А если надо не дочерним перетаскиваемую сделать а вклинить между другими? как узнать между какими он остановился, а главное как вставить ноду?

и еще такой вопрос, как мне при перетаскивании сделать так, чтобы человек видел, что летит ну например как в виндах? Тащишь а там видна строка заголовка того объекта который ты тащишь
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

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

Сообщение RayShade » 18.08.2003 (Пн) 15:47

Код: Выделить всё
Private Sub tvXML_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)




Это событие вызывается когда нода дропается. С помощью tvXML.HitTest (x,y) выясняется куда ее дропают. Дальше дело техники - tvXML.Nodes.Add с флагами по вкусу (tvwNext, tvwChild и так далее - подробно смотри хелп).



То, как будет выглядеть курсор при перетаскивании - дело сугубо личное. Есть CreateDragImage. Вызывается в событии начала таскания некоего объекта. То есть в OLESetData & OLEStartDrag.


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

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

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

    TopList