Страница: 1 |
Страница: 1 |
Вопрос: Типчик
Добавлено: 26.09.04 21:14
Автор вопроса: Neco | Web-сайт:
Привет, фанаты VB!
Буду краток.
Мне нужен такой тип:
Private Type tFolder
fFolders() As tFolder
End Type
Но так не канает. Что делать?
Как вы понимаете мне нужно где-то хранить дерево папок. В TreeView оно хранится в Node'ах, а мне что делать. Пишу класс для работы с файлами и если просто все папки хранить в массиве (т.е. и пути к ним) то либо получится очень большой массив (оперативку жрать будет) либо очень замысловатый алгоритм запоминания (медленно).
Так что ж делать-то?
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #1
Добавлено: 27.09.04 00:13
Ха, шесть хитов и ни одного ответа.
Интересно sne уже тыкал?... 8)
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 27.09.04 01:33
Так они у тебя уже и так храняться в TreeView. Зачем их ещё дублировать.
А по поводу типа, ты сам хоть понял что написал?
Тип tFolder, который содержит массив типов tFolder. Это нонсенс. Или по словам Микрософта - это "Круговые зависимости между пользовательскими типами".
Вот так попробуй:
Private Type tFolder2
fFolders() As String
End Type
Private Type tFolder
fFolders() As tFolder2
End Type
Private Sub Form_Load()
 im tf1 As tFolder
ReDim tf1.fFolders(0)
ReDim tf1.fFolders(0).fFolders(0)
tf1.fFolders(0).fFolders(0) = "Hello World!"
MsgBox tf1.fFolders(0).fFolders(0)
End Sub
Номер ответа: 3
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #3
Добавлено: 27.09.04 17:48
Вб не поддерживает рекурсивные типы +)
Номер ответа: 4
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #4
Добавлено: 27.09.04 18:03
А кто поддерживает?
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 27.09.04 22:03
Нет, я еще не тыкал ) Я на работе или на учебе был
но раз ткнул, то скажу, что для этого некоторые господа придумали использовать VB'шные классы...
Я же для этого создал одномерный массив определенного типа и добавил пару функция для удобного перехода/поиска между нодами... За подробностями см. API TreeView контрол в примерах )
Надеюсь что хоть чем-то помог
Номер ответа: 6
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #6
Добавлено: 27.09.04 23:12
2CyRax:
>> Так они у тебя уже и так храняться в TreeView. Зачем их ещё дублировать.
Они у меня не хранятся. 8)
У меня вообще TreeView нет. Я просто для примера сказал, чтобы все поняли о чём речь: ведь все же создавали нод в ноде, который уже нод другого нода и т.д.....
А вот как это повторить без контрола?
В чём прикол. Зачем мне нужен именно тип: чтобы сохранять дерево было удобно.
Dim n as tFolder
Set n=New tFolder
subFillFolder
subOpenFile 1
Put #1,1,n
subCloseFile
Set n=Nothing
И всё. И считывать потом также.
А твои два типа совсем не решают задачи. Мне нужна именно круговая зависимость (и не надо думать, что я не пытался обмануть VB перед тем, как задать вопрос), а мне говорят "низя-а-а-а-а". А я говорю "а почему вон TreeView делает?". И тишина....
Всем спасибо. Счас гляну контрол sne (надеюсь он в исходниках) и буду считать, что вопрос закрыт.
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 28.09.04 08:45
ясно дело что в исходниках, по другому и быть не может
Я попросту предлагаю создать структуру с каким-нить ID и/или параметром вложенности...
Номер ответа: 8
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #8
Добавлено: 28.09.04 11:57
2CyRax
С, С++
Номер ответа: 9
Автор ответа:
boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #9
Добавлено: 28.09.04 13:28
Neco, можно сделать то что ты просишь, через классы.
Пример,
класс:
[CODE]Public Name As String
Public ChildFolder As Folder
Public NextFolder As Folder
[/CODE]
и в коде выглядит так:
[CODE]Dim root As New Folder
Dim Doc As New Folder
root.Name = "c:\"
Doc.Name = "documents"
Set root.ChildFolder = Doc
Debug.Print root.Name
Debug.Print root.ChildFolder.Name
[/CODE]
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 28.09.04 16:22
Neco,
На самом деле то что ты видишь в TreeView - это интерфейс. Способ отображения совершенно отличен от способа хранения.
Ветви хранятся вперемежку в том порядке, в котором ты их добавлял. Только каждая ветвь - это структура (тип), содержащая уникальный логический номер и логический номер своего родителя.
Примерно так:
Root (hRoot=0)
Node1 (hNode=1, hParent=0)
SubNode1 (hSubNode=2, hParent=1)
SubNode2 (hSubNode=3, hParent=1)
Node2 (hNode=4, hParent=0)
TreeView проходит все ноды в цикле и строит из них дерево.
В модуле класса можно записать так:
[CODE] 'Модуль класса
Public Name As String
Public Handle As Long
Public Parent As Long [/CODE]
Для хранения можно использовать коллекцию. Если нужен пример работы с коллекцией, то могу написать. Или поищи на моём сайте.
Причём преимущество коллекции в том, что ты можешь сортировать прямо при добавлении. Коллекция позволяет вставку между элементами.
С массивом такое можно проделать только с помощью CopyMemory.
Номер ответа: 11
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #11
Добавлено: 28.09.04 17:14
Массивом и типом можно ограничиться, конечно:
Type Node
Key As Long
Text As String
Rel As Long
img1 As Byte
img2 As Byte
img3 As Byte
' ...
End Type
Dim Nodes() As Node
и динамически заполняешь массив, работаешь с ним (сколько шишек себе набьешь, я молчу, т.к. это не есть хороший способ...)
Лучше создать класс, как было сказано выше. А ещё можно создать Disconnected Recordset и работать с деревом как с базой данных: SQL приветствуется...
Номер ответа: 12
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #12
Добавлено: 29.09.04 12:45
Делфи помоему ещё такую штуку поддерживает только помоему сама выделяет память ... под новый кусок... ну делфи это делфи... кто знает тот поправит может
Номер ответа: 13
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #13
Добавлено: 07.10.04 11:24
2 CyRax:
> А кто поддерживает?
VB, начиная с версии 7.0. Вот пример:
Public Structure Test
Dim Children() As Test
End Structure
Соответственно, для сохранения в файл этой структуры можно
использовать сериализацию.