Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Типчик Добавлено: 26.09.04 21:14  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 
Привет, фанаты VB!
Буду краток.
Мне нужен такой тип:

Private Type tFolder
    fFolders() As tFolder
End Type

Но так не канает. Что делать?
Как вы понимаете мне нужно где-то хранить дерево папок. В TreeView оно хранится в Node'ах, а мне что делать. Пишу класс для работы с файлами и если просто все папки хранить в массиве (т.е. и пути к ним) то либо получится очень большой массив (оперативку жрать будет) либо очень замысловатый алгоритм запоминания (медленно).
Так что ж делать-то?

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #1
Добавлено: 27.09.04 00:13
Ха, шесть хитов и ни одного ответа.
Интересно sne уже тыкал?... 8)

Ответить

Номер ответа: 2
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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()
 ;Dim 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-сайт: mudator.by.ru
 Профиль | | #3
Добавлено: 27.09.04 17:48
Вб не поддерживает рекурсивные типы +)

Ответить

Номер ответа: 4
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #4
Добавлено: 27.09.04 18:03
 А кто поддерживает?

Ответить

Номер ответа: 5
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 27.09.04 22:03
Нет, я еще не тыкал :)) Я на работе или на учебе был :)
но раз ткнул, то скажу, что для этого некоторые господа придумали использовать VB'шные классы...

Я же для этого создал одномерный массив определенного типа и добавил пару функция для удобного перехода/поиска между нодами... За подробностями см. API TreeView контрол в примерах :))

Надеюсь что хоть чем-то помог ;)

Ответить

Номер ответа: 6
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #7
Добавлено: 28.09.04 08:45
ясно дело что в исходниках, по другому и быть не может ;)

Я попросту предлагаю создать структуру с каким-нить ID и/или параметром вложенности...

Ответить

Номер ответа: 8
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #8
Добавлено: 28.09.04 11:57
2CyRax

С, С++

Ответить

Номер ответа: 9
Автор ответа:
 boevik



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: mudator.by.ru
 Профиль | | #12
Добавлено: 29.09.04 12:45
Делфи помоему ещё такую штуку поддерживает только помоему сама выделяет память ... под новый кусок... ну делфи это делфи... кто знает тот поправит может

Ответить

Номер ответа: 13
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #13
Добавлено: 07.10.04 11:24
2 CyRax:
> А кто поддерживает?
VB, начиная с версии 7.0. Вот пример:

Public Structure Test
Dim Children() As Test
End Structure

Соответственно, для сохранения в файл этой структуры можно
использовать сериализацию.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам