powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как отчистить TreeView в конструкторе
10 сообщений из 10, страница 1 из 1
Как отчистить TreeView в конструкторе
    #32394921
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во время работы TreeView нахватал внутрь всякий мусор.
Открываеш форму в конструкторе ,
а в контроле уже есть дерево из шальных старых данных.
Приходится при открытии делать .Nodes.Clear
Как отчистить его от мусора,
чтобы бри открытии был пустой без Nodes.Clear?
...
Рейтинг: 0 / 0
Как отчистить TreeView в конструкторе
    #32395026
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я эту проблему тоже решаю подобным образом, правда почему-то Nodes.Clear визуально отрабатывает медлено - сейчас пользуюсь такой функцией - нареканий
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub ClearTreeViewNodes()
    Dim hItem As Long
    Dim hWnd As Long

    hWnd = ctlTV.hWnd
    ' lock the window update to avoid flickering
    SendMessageLong hWnd, WM_SETREDRAW, False, CLng(0)

    ' clear the treeview
    Do
        hItem = SendMessageLong(hWnd, TVM_GETNEXTITEM, TVGN_ROOT, CLng( 0 ))
        If hItem <=  0  Then Exit Do
        SendMessageLong hWnd, TVM_DELETEITEM, CLng( 0 ), hItem
    Loop

    ' unlock the window
    SendMessageLong hWnd, WM_SETREDRAW, True, CLng( 0 )
End Sub
...
Рейтинг: 0 / 0
Как отчистить TreeView в конструкторе
    #32395512
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за пример, беру на вооружение ;)

Что интересно
Код: plaintext
1.
2.
3.
4.
    Do
        hItem = SendMessageLong(hWnd, TVM_GETNEXTITEM, TVGN_ROOT, CLng( 0 ))
        If hItem <=  0  Then Exit Do
        SendMessageLong hWnd, TVM_DELETEITEM, CLng( 0 ), hItem
    Loop


отрабатывает также, а то и быстрее, чем

Код: plaintext
1.
#define TreeView_DeleteAllItems(hwnd) \
    (BOOL)SND(hwnd, TVM_DELETEITEM,  0 , (LPARAM)TVI_ROOT)


Аналог этого макроса и используется в Nodes.Clear
Так, что цикл можно смело выбросить.

PS. а почему CLng(0) вместо 0&, хотя это наверное дело привычки.
...
Рейтинг: 0 / 0
Как отчистить TreeView в конструкторе
    #32395549
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Shkurenko Alexander

Мне и самому интересно - почему быстрей (скорей всего из-за отключения пересовки - экспереминтировать было лень - при Nodes.Clear на 200 ветках было явно заметна перерисовка - после удаления каждой записи - если хочешь - попробуй - расскажешь)

а Clng(0) потому, что IDE VBA мне ставит не &0, a &O0 -и причем тут восьмиричный формат?

==
нечто подобное есть и для ЛистВью
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub ClearListView()
    Dim hItem As Long
    Dim hWnd As Long

    hWnd = ctlList.hWnd
    ' lock the window update to avoid flickering
    SendMessageLong hWnd, WM_SETREDRAW, False, CLng(0)

    SendMessageLong hWnd, LVM_DELETEALLITEMS, CLng(0), CLng(0)   

    ' unlock the window
    SendMessageLong hWnd, WM_SETREDRAW, True, CLng( 0 )
End Sub
...
Рейтинг: 0 / 0
Как отчистить TreeView в конструкторе
    #32395565
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
померил -по времени на моих данных - одна фигня - но процедурка Shkurenko Alexander короче - оставлю ее :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub ClearTreeViewNodes()
    Dim hItem As Long
    Dim hWnd As Long
    'Dim t As Long
    't = timeGetTime
    hWnd = ctlTV.hWnd
    ' lock the window update to avoid flickering
    SendMessageLong hWnd, WM_SETREDRAW, False, CLng(0)

    ' clear the treeview
    SendMessageLong hWnd, TVM_DELETEITEM, CLng( 0 ), TVGN_ROOT

    ' unlock the window
    SendMessageLong hWnd, WM_SETREDRAW, True, CLng(0)

    'Debug.Print timeGetTime - t
End Sub
...
Рейтинг: 0 / 0
Как отчистить TreeView в конструкторе
    #32395583
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SV>Мне и самому интересно - почему быстрей (скорей всего из-за отключения пересовки - экспереминтировать было лень - при Nodes.Clear на 200 ветках было явно заметна перерисовка - после удаления каждой записи - если хочешь - попробуй - расскажешь)

А чего пробовать, вот это должно работать почти, столь же быстро, как и твой код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    SendMessage hwnd, WM_SETREDRAW, False,  0 &

    'Call SendMessage(TreeView3.hwnd, TVM_DELETEITEM,  0 &, TVI_ROOT)
    TreeView3.Nodes.Clear
    
    SendMessage hwnd, WM_SETREDRAW, True,  0 &
    Call InvalidateRect(TreeView3.hwnd,  0 &, True)



SV>а Clng(0) потому, что IDE VBA мне ставит не &0, a &O0 -и причем тут восьмиричный формат?
А я и не знаю причём восмеричный :)
Заметь я написал 0& . & - это символ объявления типа Long, % - Integer и т.д.
...
Рейтинг: 0 / 0
Как отчистить TreeView в конструкторе
    #32395596
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Заметь я написал 0&. & - это символ объявления типа Long, % - Integer и т.д.
Шит. Точно
...
Рейтинг: 0 / 0
Как отчистить TreeView в конструкторе
    #32395686
Alex112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант с какого-то западного сайта. Не помню какого. Node'ы удаляются снизу вверх ...

Unfortunately, as VB loops through the TreeView's nodes and removes them, it also repaints the control to reflect the remaining nodes. This behavior slows down the process considerably.

What's needed is a way to prevent the TreeView from repainting itself as it removes the nodes. Fortunately, the Windows API provides a great way to do just that. The SendMessage() function supports the WM_SETREDRAW message. With this message, your code can dictate whether a window should redraw (repaint) itself. Pass in True (or 1 in API parlance) to allow the window to repaint, or False (0) to prevent it. With the addition of the API to our code, the clear procedure now looks like this:

Private Const WM_SETREDRAW = &HB
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Sub TrvwClear()
Dim x As Integer
With TreeView1
SendMessage .hwnd, WM_SETREDRAW, 0, 0
For x = .Nodes.Count To 1 Step -1
.Nodes.Remove x
Next x
SendMessage .hwnd, WM_SETREDRAW, 1, 0
End With
End Sub

This combination of the API and reverse deletion provides the quickest way to clear the TreeView control.
...
Рейтинг: 0 / 0
Как отчистить TreeView в конструкторе
    #32395759
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Senin Viktor
только сейчас заметил твой пост

SendMessageLong hWnd, TVM_DELETEITEM, CLng(0), TVGN_ROOT
а должно быть
SendMessageLong hWnd, TVM_DELETEITEM, CLng(0), TVI_ROOT

а лучше не извращаться, а использовать
.Nodes.Clear

я замерил - по скортости одинаково. Вся соль в перерисовке.
...
Рейтинг: 0 / 0
Как отчистить TreeView в конструкторе
    #32395767
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Shkurenko Alexander
>а лучше не извращаться, а использовать
.Nodes.Clear

Согласен полностью :)

(а TVGN_ROOT=0, но это дела меняет)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как отчистить TreeView в конструкторе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]