Страница: 1 |
Привет. Есть дерево, содержащее примерно 3500 узлов. Его нужно очистить. Nodes.Clear очищает дерево за 1-2 минуты...Что самое интересное, заполняется дерево быстро - около секунды, а вот с очиткой непонятные проблемы. Подскажите, пожалуйста, способы более быстрой очистки TreeView. И есть ещё один вопрос: можно ли на время очистки отключить прорисовку у компонента TreeView или всего приложения?
Интересно, а как ты очищаешь дерево? Treeview1.Nodes.Clear - очищает все ноды сразу. Я пробовал очищать дерево двумя способами: 1-ый - Nodes.Clear, 2-ой - написал свою рекурсивную процедуру. Большой разницы между ними нет, и то и другое работает медленно. Мне как раз нужно очистить все дерево. У меня есть две классификации товаров - по поставщикам ("Весна", "Калина" и т.д.) и по назначению (зубн. пасты, стир. порошки и т.д.). Нужно иметь возможность быстро переключаться из одной классификации в другую. Для этого нужно быстро очищать дерево. И вот тут неожданно возникла проблема Я попробовал - не работает Дерево не очищается, потому что lNodeHandle = SendMessageLong(tvHwnd, TVM_GETNEXTITEM, TVGN_ROOT, CLng(0)) всегда возвращает ноль, независимо от того, пустое дерево или нет.... Может константы криво объявил? Private Const TV_FIRST As Long = &H1100 Так работает .... Только все равно медленно.... Чуть-чуть быстрее чем Clear, но все равно медленно... Напиши мне еще значение константы WM_SETREDRAW... Мне кажется, обновление все таки не отключается. Держи: Private Const WM_SETREDRAW As Long = &HB Класс! Просто супер! Скорость супер! Спасибо большущее > Нужно иметь возможность быстро переключаться из одной классификации в другую. Для этого нужно быстро очищать дерево. Зачем? Создай несколько деревьев и меняй ZOrder... Деревья большие, поэтому не хочется постоянно хранить их в памяти. К тому же, теперь проблем с деревьями нет Я бы порекомендовал сменить SelectedItem на корневой: Set TreeView1.SelectedItem = TreeView1.Nodes(1).Root Страница: 1 |
Вопрос: Быстрая очистка TreeView
Добавлено: 17.02.04 11:26
Автор вопроса: Атос
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #1
Добавлено: 17.02.04 12:12
Номер ответа: 2
Автор ответа:
Атос
Вопросов: 2
Ответов: 7
Профиль | | #2
Добавлено: 17.02.04 12:19
Номер ответа: 3
Автор ответа:
Gloom
Вопросов: 0
Ответов: 36
Профиль | | #3
Добавлено: 17.02.04 14:01
Private Sub ClearTreeView(ByVal tv As TreeView)
Dim tvHwnd As Long
Dim lNodeHandle As Long
tvHwnd = tv.hwnd
SendMessageLong tvHwnd, WM_SETREDRAW, CLng(0), CLng(0)
Do
lNodeHandle = SendMessageLong(tvHwnd, TVM_GETNEXTITEM, TVGN_ROOT, CLng(0))
If lNodeHandle > 0 Then
SendMessageLong tvHwnd, TVM_DELETEITEM, CLng(0), lNodeHandle
Else
Exit Do
End If
Loop
SendMessageLong tvHwnd, WM_SETREDRAW, CLng(1), CLng(0)
End Sub
Номер ответа: 4
Автор ответа:
Атос
Вопросов: 2
Ответов: 7
Профиль | | #4
Добавлено: 17.02.04 14:54
Номер ответа: 5
Автор ответа:
Gloom
Вопросов: 0
Ответов: 36
Профиль | | #5
Добавлено: 17.02.04 15:40
Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10)
Private Const TVM_DELETEITEM As Long = (TV_FIRST + 1)
Private Const TVGN_ROOT As Long = &H0
Номер ответа: 6
Автор ответа:
Атос
Вопросов: 2
Ответов: 7
Профиль | | #6
Добавлено: 17.02.04 15:48
Номер ответа: 7
Автор ответа:
Gloom
Вопросов: 0
Ответов: 36
Профиль | | #7
Добавлено: 17.02.04 15:50
Номер ответа: 8
Автор ответа:
Атос
Вопросов: 2
Ответов: 7
Профиль | | #8
Добавлено: 17.02.04 15:57
Номер ответа: 9
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #9
Добавлено: 17.02.04 20:20
Номер ответа: 10
Автор ответа:
Атос
Вопросов: 2
Ответов: 7
Профиль | | #10
Добавлено: 18.02.04 09:54
Номер ответа: 11
Автор ответа:
OAN
Вопросов: 2
Ответов: 17
Профиль | | #11
Добавлено: 23.02.04 20:15
TreeView1.Nodes.Clear