Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > VB: дерево


Автор: lorien 26.4.2005, 20:00
Помогите плиз. Надо реализовать именно на VBA кое-какой алгоритм, но не в алгоритме дело.
В общем я хочу реализовать дерево (у каждого узла может быть несколько веток)

Как это ваще на бэйсике то делать? :-/ Я на бэйсике никогда не программил - так что вообще в непонятках полных.

Автор: Naghual 26.4.2005, 20:14
При помощи классов, я думаю, будет проще, нагляднее и понятнее.

Создай класс TreeItem со всеми необходимыми свойствами.
Создай класс ItemsCollection который будет хранить в себе Collection класса TreeItem.
В класс TreeItem, добавь свойство Childrens as ItemsCollection.
А в класс ItemsCollection добавь свойство Parent as TreeItem.

Вот, примерно, и вся структура дерева.

Автор: cardinal 26.4.2005, 20:47
Откуда не помню, но вот она - структура:

Автор: lorien 26.4.2005, 23:55
А где можно почитать про ООП в VB6 ?
Чё-то не получается.
Сделал класс:
Код

Public parent As Tree
Public label As String
Public Childs As Collection

Public Function Show()
    Dim str As String
    For Each child In Childs
        str = str & child.Show()
    Next
Show = str
End Function

Потом в таком коде вылазит ошибка:
Код

Dim head As New Tree

Sub Test3()
    head.label = "1"
    Dim item As New Tree
    item.label = "33"
    head.Childs.Add(item, "33")  'Тут вылазит ошибка Object variable or With block variable not set (Error 91)
    MsgBox head.Show
End Sub


Пардон, если там полная фигня, ну не работал я раньше с VB...

Автор: Naghual 27.4.2005, 09:17
Вероятнее всего, у тебя не проинициализированна Childs.
Тебе в VB или VBA нужно?

Автор: lorien 27.4.2005, 09:42
А разве есть разница? Я тут скачал. "vb and vba in a nutshell" о'рейли.. Вроде проясняться стало всё... Хотя там тоже что-то про ООП мало написано, а может и писать то нечего? %-)
Я не понял как конструктор сделать...
Код
 Вероятнее всего, у тебя не проинициализированна Childs.

Да, ты прав. Всё заработало после замены public Childs As Collection на public Childs as new Collection

Автор: Naghual 27.4.2005, 09:57
Цитата
А разве есть разница?

Да есть. И принципиальная.
Хотя, для твоего вопроса наверное таки нет разницы. smile

Автор: Exception 27.4.2005, 10:04
Вообще-то VB 6/VBA не особо оопэшные. Для таких целей больше подходит VB .NET (если под дотнет) или C++ / Delphi. Просто если тебе нужно наследование и все такое... конструкторы, деструкторы...

Автор: lorien 27.4.2005, 10:45
Мне ничего не нужно. Просто написать эту программу и забыть VB как страшный сон. Я фрилансер и зачем-то поставил бид на проект на VB.

Автор: lorien 27.4.2005, 14:06
Хочу рекурсивную процедуру написать. Передаю в процедуру объекта, а басик ругаецца:
Код

Set node = New Tree
node.label = records(1).value
buffer.add records(1).value
For Each link In records(1).links
    node.Childs.add link
Next
    
test (node)

Object doesn't support this property or method

Как передавать объекты в процедуры?

Автор: Naghual 27.4.2005, 14:28
Нужно смотреть что такое link и что такое links.
Да и вообще, мало информации. Кто тебя знает, что ты там за дерево наваял.
Добавлено @ 14:31
И потом. Функция Add у тебя параметризованная - к примеру Function Add(Caption as String, Key as String).
Создай дополнительную функцию:
Function AddObject(ChildNode as Tree)


Автор: lorien 27.4.2005, 15:42
Так там всё страшно, я уже всё понял и осознал.
Скажите теперь лучше как можно коллекцию скопировать?

Автор: Exception 27.4.2005, 15:45
Поконкретнее можешь?

Автор: Naghual 27.4.2005, 16:03
Передачей параметру функции объявленного ByVal.

Автор: cardinal 27.4.2005, 19:36
Модератор: Пожалуйста, один топик - один вопрос.
Правила форума: http://forum.vingrad.ru/index.php?s=&act=SR&f=27

Автор: lorien 1.5.2005, 08:39
Ты хочешь чтобы я засорил форум кучей чайниковых вопросов, что ли?
Код
 Передачей параметру функции объявленного ByVal. 

Неа, коллекция изменяется.Вот пример
Код

Sub test()
    Dim buffer As New Collection
    buffer.add 13, "13"
    Call test2(buffer)
    Dim str As String
    For Each item In buffer
        str = str & item & ","
    Next
    MsgBox str
End Sub

Sub test2(ByVal buffer As Collection)
    buffer.add 666, "666"
End Sub

Получим сообщение "13,666"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)