Дерево каталогов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Дерево каталогов

Сообщение burik » 24.06.2006 (Сб) 16:50

Сдравствуйте!

Делаю я прогу типа Explorer'а слева лежит TreeView и в нем должно быть дерево каталогов.
Подскажите пожалуйста, как сделать дерево из всех каталогов компа?

Заранее благодарен!
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 24.06.2006 (Сб) 18:02

1. С помощью FSO рекурсивно перебрать все папки. Просто, но долго.
2. Добавить только корневые папки. При клике на узле добавлять входящие папки. Сложнее, но работает быстро.
Лучший способ понять что-то самому — объяснить это другому.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 24.06.2006 (Сб) 20:31

2. Добавить только корневые папки. При клике на узле добавлять входящие папки. Сложнее, но работает быстро.
Да не думаю что сложнее, наоборот, никакой рекурсии.

К слову сказать, в Делфях есть два компонента - первый TreeView, который отображает дерево каталогов точь в точь как проводник, второй аналогичный ListView. И ведут они себя так же - Popup Menu такие же, как в Explorer, ну вообщем все одинаковое. Вот и начали меня терзать смутные сомнения, что товарищи из Borland все это ручками делали. Скорее всего это просто обертка над стандартным виндовым классом, таким же, как, например, RichEdit. Пусть меня поправят, если я ошибся...
А я все практикую лечение травами...

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 24.06.2006 (Сб) 20:46

Я делаю вторым способом, но неполучается получить имена подкаталогов.

Код: Выделить всё

Sub drivers()
Dim drivenames As String, thisdrive As String, fld As Folder, drv As Long, _ flds As String
Dim c As Long, i As Long
Dim slength As Long
drivenames = Space(255)
'получаем имена всех дисков
slength = GetLogicalDriveStrings(255, drivenames)
For c = 1 To slength Step 4  '
    thisdrive = Mid(drivenames, c, 3) 
    Set nParent = tvTreeView.Nodes.Add(, , , thisdrive, 1)
    drv = GetDriveType(thisdrive)
    If drv <> 5 And drv <> 2 Then
        Set fld = FSO.GetFolder(thisdrive)

        For i = 1 To fld.SubFolders.Count
            flds = fld.SubFolders.Item(i).Name'Вот здесь происходит ошибка
            tvTreeView.Nodes.Add nParent, , , flds, 2
        Next i

    End If
Next c
End Sub

Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2006 (Сб) 21:07

Antonariy писал(а):2. Добавить только корневые папки. При клике на узле добавлять входящие папки. Сложнее, но работает быстро.

По любому придется проходится на уровень ниже, чтобы у нодов появились значки [+].
Lasciate ogni speranza, voi ch'entrate.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 24.06.2006 (Сб) 21:15

To alibek: некоторые "нехорошие" приложения не утруждают себя этим и значки "+" есть у всех и пропадают после клика там, где их и быть недолжно :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2006 (Сб) 21:28

Некрасиво это. Поэтому мне гораздо симпатичнее Explorer, который не экономит таким образом.
Lasciate ogni speranza, voi ch'entrate.

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 24.06.2006 (Сб) 21:34

alibek
В Explorer'е тоже бывают глюки с плюсиками:(
Подпись находится в стадии разработки...

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 24.06.2006 (Сб) 22:00

Лично я буду делать, что бы плюсы были только там где надо, а при раскрытии плюса ноды нижнего уровня уже будут присутствовать, а ноды еще одного уровня добавятся. То есть всегда плюсы будут там где надо.

Только вот неполучается добавить нужные ноды(см. мое прошлое сообщение)
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 24.06.2006 (Сб) 22:21

при раскрытии плюса ноды нижнего уровня уже будут присутствовать, а ноды еще одного уровня добавятся
Не самое лучшее решение, надо сказать - будет медленно работать. Я делал по другому: если нод должен раскрываться (иметь плюсик), то нужно на уровень ниже добавлять всего один нод. При экспандинге нода-родителя нод-потомок удаляется и добавляются нужные потомки...
А я все практикую лечение травами...

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 24.06.2006 (Сб) 23:45

если нод должен раскрываться (иметь плюсик), то нужно на уровень ниже добавлять всего один нод.


Согласен. Спасибо за идею!

При экспандинге нода-родителя нод-потомок удаляется и добавляются нужные потомки...


Вот добавить нужных потомков не получается:

Код: Выделить всё
Sub Drivers()
Dim drivenames As String, thisdrive As String, fld As Folder, drv As Long, _
    flds As String, NewN As Node
Dim c As Long, i As Long  ' ñ÷åò÷èê
Dim slength As Long
drivenames = Space(255) 

slength = GetLogicalDriveStrings(255, drivenames)

For c = 1 To slength Step 4  '
    thisdrive = Mid(drivenames, c, 3) 
    Set nParent = tvTreeView.Nodes.Add(, , , thisdrive, 1)
    drv = GetDriveType(thisdrive)
    If drv <> 5 And drv <> 2 Then
        Set fld = FSO.GetFolder(thisdrive)


        For i = 1 To fld.SubFolders.Count
            flds = fld.SubFolders.Item(i).Name
            Set NewN = tvTreeView.Nodes.Add(nParent, tvwChild, , flds, 2)
        Next i


    End If
Next c
End Sub


В строке "flds = fld.SubFolders.Item(i).Name" заместо i нужно указать key, а key - это имя папки (то, что мне и нужно получить)...
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.06.2006 (Вс) 0:22

Что значит
заместо i нужно указать key
?
А я все практикую лечение травами...

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 25.06.2006 (Вс) 10:22

Sub Drivers()
Dim drivenames As String, thisdrive As String, fld As Folder, drv As Long, _
flds As String, NewN As Node
Dim c As Long, i As Long
Dim slength As Long
drivenames = Space(255)

slength = GetLogicalDriveStrings(255, drivenames)

For c = 1 To slength Step 4 '
thisdrive = Mid(drivenames, c, 3)
Set nParent = tvTreeView.Nodes.Add(, , , thisdrive, 1)
drv = GetDriveType(thisdrive)
If drv <> 5 And drv <> 2 Then
Set fld = FSO.GetFolder(thisdrive)

'Цикл от 1 до кол-ва подкаталогов
For i = 1 To fld.SubFolders.Count

'Пытаюсь получить имя папки и в качестве параметра "key"
'Указываю индекс (номер) папки, но так не работает
'Зато если указываю вкачестве параметра "key" имя папки, то все работает
flds = fld.SubFolders.Item(i).Name

Set NewN = tvTreeView.Nodes.Add(nParent,tvwChild,,flds,2)
Next i


End If
Next c
End Sub


Вообщем, как получить имена потомков?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 25.06.2006 (Вс) 11:11


burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 25.06.2006 (Вс) 11:50

Вот это дело!
Спасибо Naked!
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 25.06.2006 (Вс) 13:21

Запустил консоль управления и сразу "вспомнил", где это я так часто вижу баг с плюсиками :lol:
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!


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

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

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

    TopList