Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / доступ к информации ListView или TreeView через API / 24 сообщений из 24, страница 1 из 1
30.08.2004, 10:33
    #32670625
HRACH
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Скажите пожалуйста.
Каким образом можно получить доступ к информации,
хранящейся в ListView или TreeView через API, имея только Handle.

Мне интересует :
1. Как можно добавлять новый пункт в List View, имея только Handle.
2. Как можно выбрать(Select) пункт в ТreeView, имея только Handle.
...
Рейтинг: 0 / 0
30.08.2004, 12:01
    #32670854
PA
PA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
...
Рейтинг: 0 / 0
30.08.2004, 18:24
    #32672077
-HRACH-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Этот команда удаляет элемент из ListView(дескриптор=hvnd_ListView)

WW = SendMessage(hvnd_ListView, LVM_DELETEITEM, ByVal 0, ByVal 0)

??????????????????????????????????????????????????????
‘А этот код не добовляет элемент ListView.
'Подскажи пожалуста где я ошибся.
***************************************************************
Private Type LV_ITEM
mask As Long ' маска использования полей структуры LV_ITEM
iItem As Long ' номер элемента
iSubItem As Long ' номер дополнительного элемента
State As Long ' текущее состояние элемента
stateMask As Long ‘маска состояния элемента
pszText As String адрес текстового буфера
cchTextMax As Long ‘ размер текстового буфера
iImage As Long ‘номер пиктограммы элемента
lParam As Long ' 32-битовое значение, связанное с элементом
iIndent As Long
End Type

Dim TEXT As String
Dim LISTV As LV_ITEM 'Structura LV_ITEM
TEXT = String$(256, " ")
TEXT = "C:\1.wav"
LISTV.iItem = 1
LISTV.iSubItem =0
LISTV.pszText = TEXT
LISTV.cchTextMax = 8
WW = SendMessage(hvnd_ListView, LVM_INSERTITEM, ByVal 0, LISTV)
*******************************************
Всегда WW= -1
...
Рейтинг: 0 / 0
30.08.2004, 19:30
    #32672184
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Установи значение Mask:
Код: plaintext
LISTV.Mask = LVIF_TEXT  
...
Рейтинг: 0 / 0
30.08.2004, 23:17
    #32672326
СНГ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/treeview/reflist.asp

Tree-View Control Reference - MSDN Library
...
Рейтинг: 0 / 0
31.08.2004, 10:17
    #32672622
-HRACH-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
LISTV.Mask = LVIF_TEXT

Как можно определять значение LVIF_TEXT
...
Рейтинг: 0 / 0
31.08.2004, 12:37
    #32673045
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Код: plaintext
Public Const LVIF_TEXT As Long = &H1
...
Рейтинг: 0 / 0
31.08.2004, 15:48
    #32673620
_HRACH_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Дорогои МаксимВ !!!

Я посилаю код который неправилно работает,
если не трудно подскажи пожалуста где я ошибся.

В ListView-е нет элементов(пустои)

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Const LVIF_TEXT As Long = &H1
Private Type LV_ITEM
mask As Long ' маска использования полей структуры LV_ITEM
iItem As Long ' номер элемента
iSubItem As Long ' номер дополнительного элемента
State As Long ' текущее состояние элемента
stateMask As Long ' маска состояния элемента
pszText As String ' адрес текстового буфера
cchTextMax As Long ' размер текстового буфера
iImage As Long ' номер пиктограммы элемента
lParam As Long ' 32-битовое значение, связанное с элементом
iIndent Аs Long '
End Type

Private Sub LV()
Dim WW As String
Dim TEXT As String
Dim LISTV As LV_ITEM 'Structura LV_ITEM
TEXTT = "C:\1.wav"
LISTV.mask = LVIF_TEXT
LISTV.iItem = 0
LISTV.iSubItem = 0
''''''LISTV.State
''''''LISTV.stateMask
LISTV.pszText = TEXTT
LISTV.cchTextMax = 8
LISTV.iImage = 0
''''''LISTV.lParam
''''''LISTV.iIndent
WW = SendMessage(hWnd_LISTVIEW, LVM_INSERTITEM, ByVal 0, LISTV)
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Всегда WW= -1
...
Рейтинг: 0 / 0
31.08.2004, 18:44
    #32674132
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Создай стандартный exe проект. На форму кинь ListView.Name=lvwTest
Form1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Option Explicit

Private Sub Form_Load()
Dim LVI As LV_ITEM
Dim lResalt As Long
    LVI.mask = LVIF_TEXT
    LVI.pszText = "Новый элемент"
    lResalt = SendMessage(ByVal Me.lvwTest.hWnd, ByVal LVM_INSERTITEM&, ByVal  0 &, LVI)
End Sub
Module1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Option Explicit

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

 '/* структура LV_ITEM 
Public Type LV_ITEM
    mask As Long
    iItem As Long
    iSubItem As Long
    state As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    lParam As Long
    iIndent As Long
End Type

 '/* константы для LV_ITEM.Mask 
Public Const LVIF_TEXT        As Long = &H1
Public Const LVIF_IMAGE       As Long = &H2
Public Const LVIF_PARAM       As Long = &H4
Public Const LVIF_STATE       As Long = &H8
Public Const LVIF_INDENT      As Long = &H10
Public Const LVIF_NORECOMPUTE As Long = &H800

 '/* сообщения для ListView 
Public Const LVM_FIRST      As Long = &H1000               '// ListView messages 
Public Const LVM_INSERTITEM As Long = (LVM_FIRST +  7 )
...
Рейтинг: 0 / 0
02.09.2004, 14:38
    #32677622
-HRACH-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
МаксимВ!!!
Спасибо за код.
У меня 2 вопросы:

1. Ваш код отдельно работает,но когда я хочу из моей
программы добавить элемент ListView(с вашим кодом)
другово программу, то не работает.

2. Если циклическии добовляю элементи(с вашим кодом) то
программа дает Application Error.
...
Рейтинг: 0 / 0
03.09.2004, 21:35
    #32680179
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
А он и будет выдавать ошибку. Я показал для примера, что нужно обязательно устанавливать значение LV_ITEM.Mask.
Попробуй так:
Module1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Option Explicit

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

 '/* структура LV_ITEM 
Public Type LV_ITEM
    mask As Long
    iItem As Long
    iSubItem As Long
    state As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    lParam As Long
    iIndent As Long
End Type

 '/* флаги для LV_ITEM.Mask 
Public Const LVIF_TEXT        As Long = &H1
Public Const LVIF_IMAGE       As Long = &H2
Public Const LVIF_PARAM       As Long = &H4
Public Const LVIF_STATE       As Long = &H8
Public Const LVIF_INDENT      As Long = &H10
Public Const LVIF_NORECOMPUTE As Long = &H800
Public Const LVIF_DI_SETITEM As Long = &H1000

 '/* сообщения для ListView 
Public Const LVM_FIRST        As Long = &H1000               '// ListView messages 
Public Const LVN_FIRST        As Long = - 100 &                '// listview 
Public Const LVM_GETITEM      As Long = (LVM_FIRST +  5 )
Public Const LVM_INSERTITEM   As Long = (LVM_FIRST +  7 )
Public Const LVM_DELETEITEM   As Long = (LVM_FIRST +  8 )
Public Const LVM_GETHEADER    As Long = (LVM_FIRST +  31 )
Public Const LVM_SETITEMCOUNT As Long = (LVM_FIRST +  47 )
Public Const LVM_REDRAWITEMS  As Long = (LVM_FIRST +  21 )
Public Const LVM_UPDATE       As Long = (LVM_FIRST +  42 )
Public Const LVN_GETDISPINFO  As Long = (LVN_FIRST -  50 )

Public Const LVSICF_NOINVALIDATEALL As Long = &H1
Public Const LVSICF_NOSCROLL        As Long = &H2
Form1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Explicit

Private Sub Command1_Click()
Dim LVI As LV_ITEM
Dim lResalt As Long
    LVI.mask = LVIF_TEXT
    LVI.pszText = " * Новый элемент * " + vbNullChar
    LVI.iItem = Me.ListView1.SelectedItem.Index -  1 
    lResalt = SendMessage(ByVal Me.ListView1.hwnd, ByVal LVM_INSERTITEM, ByVal  0 &, LVI)
End Sub

Private Sub Form_Load()
Dim oLwItem As ListItem, i As Integer, strItem As String
    Me.ListView1.LabelEdit = lvwManual
    Me.ListView1.View = lvwReport
    Me.ListView1.ColumnHeaders.Add , , "Имя объекта", Me.ListView1.Width /  2 
    For i =  1  To  10 
        strItem$ = "Объект №" & Str$(i)
        Set oLwItem = Me.ListView1.ListItems.Add(i, , strItem, ,  0 )
    Next i
End Sub
...
Рейтинг: 0 / 0
05.09.2004, 14:25
    #32680548
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
_HRACH_ ты где? Сдаваться нельзя.
Предыдущий мой код работает только если ListView с одной колонкой. Перепробовал всякие разные варианты добавления Items в ListView с несколькими колонками - ни как. Делаешь как написано в MSDN(для Item - LVM_INSERTITEM, для SubItem - LVM_SETITEM) не получается, выдает ошибку "Память не может быть Read" и все тут. Решил пойти по другому пути. Вот, что получилось. Все работает.
Module1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
Option Explicit

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

 '/* структура LV_ITEM 
Public Type LV_ITEM
    mask As Long
    iItem As Long
    iSubItem As Long
    State As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    lParam As Long
    iIndent As Long
End Type

 '/* структура LVITEM 
Public Type LVITEM
    mask As Long
    iItem As Long
    iSubItem As Long
    State As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    lParam As Long
 ' #if (_WIN32_IE >= =&H0300) 
    iIndent As Long
 ' #end If 
 '#if (_WIN32_WINNT >= &h501) 
    iGroupId As Long
    cColumns As Long  '; // tile view columns 
    puColumns As Long
 '#End If 
End Type

 '/* флаги для LV_ITEM.Mask 
Public Const LVIF_TEXT        As Long = &H1
Public Const LVIF_IMAGE       As Long = &H2
Public Const LVIF_PARAM       As Long = &H4
Public Const LVIF_STATE       As Long = &H8
Public Const LVIF_INDENT      As Long = &H10
Public Const LVIF_NORECOMPUTE As Long = &H800
Public Const LVIF_DI_SETITEM  As Long = &H1000
Public Const LVIF_COLUMNS     As Long = &H200

 '/* флаги состояние ListView.Items 
Public Const LVNI_ALL         As Long = &H0
Public Const LVNI_FOCUSED     As Long = &H1
Public Const LVNI_SELECTED    As Long = &H2
Public Const LVNI_CUT         As Long = &H4
Public Const LVNI_DROPHILITED As Long = &H8

Public Const LVNI_ABOVE       As Long = &H100
Public Const LVNI_BELOW       As Long = &H200
Public Const LVNI_TOLEFT      As Long = &H400
Public Const LVNI_TORIGHT     As Long = &H800


 '/* сообщения для ListView 
Public Const LVM_FIRST            As Long = &H1000               '// ListView messages 
Public Const LVN_FIRST            As Long = - 100 &                '// listview 
Public Const LVM_GETITEMCOUNT     As Long = (LVM_FIRST +  4 )
Public Const LVM_GETITEM          As Long = (LVM_FIRST +  5 )
Public Const LVM_SETITEM          As Long = (LVM_FIRST +  6 )
Public Const LVM_INSERTITEM       As Long = (LVM_FIRST +  7 )
Public Const LVM_DELETEITEM       As Long = (LVM_FIRST +  8 )
Public Const LVM_GETNEXTITEM      As Long = (LVM_FIRST +  12 )
Public Const LVM_GETHEADER        As Long = (LVM_FIRST +  31 )
Public Const LVM_SETITEMCOUNT     As Long = (LVM_FIRST +  47 )
Public Const LVM_REDRAWITEMS      As Long = (LVM_FIRST +  21 )
Public Const LVM_UPDATE           As Long = (LVM_FIRST +  42 )
Public Const LVM_GETSELECTEDCOUNT As Long = (LVM_FIRST +  50 )
Public Const LVM_GETHOTITEM       As Long = (LVM_FIRST +  61 )

Public Const LVN_GETDISPINFO  As Long = (LVN_FIRST -  50 )

Public Const LVSICF_NOINVALIDATEALL As Long = &H1
Public Const LVSICF_NOSCROLL        As Long = &H2
Form1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
Private Sub Form_Load()
Dim oLwItem As ListItem, i As Integer, strItem As String
    Me.ListView1.LabelEdit = lvwManual
    Me.ListView1.View = lvwReport
    Me.ListView1.ColumnHeaders.Add , , "Имя объекта", Me.ListView1.Width \  4 
    Me.ListView1.ColumnHeaders.Add , , "Тип объекта", Me.ListView1.Width \  4 
    For i =  1  To  10 
        strItem$ = "Объект №" & Str$(i)
        Set oLwItem = Me.ListView1.ListItems.Add(i, , strItem, ,  1 )
        oLwItem.SubItems( 1 ) = "Папка"
    Next i
End Sub

Private Sub Command3_Click()
Dim LVI As LVITEM
Dim lResalt As Long, fCount As Long
     ' количество Item в ListView 
    fCount = SendMessage(Me.ListView1.hwnd, LVM_GETITEMCOUNT,  0 ,  0 )
    Debug.Print "Колличество объктов в ListView: " & Str$(fCount)
    
     ' получаем структуру LVITEM любого ListView.Item (например, Item.Index = 0) 
    LVI.mask = LVIF_TEXT Or LVIF_IMAGE Or LVIF_PARAM Or LVIF_STATE Or LVIF_INDENT Or LVIF_DI_SETITEM Or _
                                                                                                LVIF_COLUMNS
    Call SendMessage(ByVal Me.ListView1.hwnd, ByVal LVM_GETITEM, ByVal  0 &, LVI)
    
     ' добавляем новый ListView.Item 
    LVI.pszText = " * Новый элемент * " & vbNullChar
    LVI.cchTextMax = Len(LVI.pszText)
    LVI.iItem = SendMessage(ByVal Me.ListView1.hwnd, ByVal LVM_GETNEXTITEM&, ByVal  0 &, ByVal LVNI_SELECTED&)
    lResalt = SendMessage(ByVal Me.ListView1.hwnd, ByVal LVM_INSERTITEM, ByVal  0 &, LVI)
    
     ' добавляем новый ListView.SubItem 
    LVI.mask = LVIF_TEXT
    LVI.iItem = lResalt
    LVI.iSubItem =  1 
    LVI.pszText = " * Новая папка * " & vbNullChar
    lResalt = SendMessage(ByVal Me.ListView1.hwnd, ByVal LVM_SETITEM, ByVal  0 &, LVI)
    
     ' количество Item в ListView 
    fCount = SendMessage(Me.ListView1.hwnd, LVM_GETITEMCOUNT,  0 ,  0 )
    Debug.Print "Колличество объктов в ListView: " & Str$(fCount)
End Sub
...
Рейтинг: 0 / 0
07.09.2004, 13:51
    #32683227
-HRACH-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Привет Максим.
Извини, что пишу с опозданием(не было интернет связи).
На страке Set oLwItem = Me.ListView1.ListItems.Add(i, , strItem, , 1)
программа дает ошибка.
.....................................................................................
...... Run-time Error '35613' .....
...... ImageList must be Initialized before it can bu used .....
.....................................................................................
...
Рейтинг: 0 / 0
07.09.2004, 14:01
    #32683275
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
-HRACH-На страке Set oLwItem = Me.ListView1.ListItems.Add(i, , strItem, , 1)
программа дает ошибка.
.....................................................................................
...... Run-time Error '35613' .....
...... ImageList must be Initialized before it can bu used .....
.....................................................................................

Это видимо потому, что Вы пытаетесь добавить иконку в ListView из ListImage, не ассоциированного с этим ListView.
MSDNBefore setting either the Icons or SmallIcons properties, you must first initialize them. You can do this at design time by specifying an ImageList object with the General tab of the ListView Control Properties dialog box, or at run time with the following code:

ListView1.Icons = ImageList1 'Assuming the Imagelist is ImageList1.
ListView1.SmallIcons = ImageList2
...
Рейтинг: 0 / 0
07.09.2004, 18:58
    #32684117
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
У меня просто на пробу был на форме ListImage и я от туда присваивал имедж объекту. Перепиши одну строку:
Код: plaintext
Set oLwItem = Me.ListView1.ListItems.Add(i, , strItem, ,  0 )
...
Рейтинг: 0 / 0
13.09.2004, 13:20
    #32691756
_HRACH-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Друзя спасибо за помошь.

Сейчс мне интересует следующий вопрос?

Как могу программным способом выбрать(Select) или активизировать
пункт(элемента) обьекта TreeView другой программы,
если имею Handle этого элемента.
...
Рейтинг: 0 / 0
13.09.2004, 16:16
    #32692238
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Не проверял, пока занят, но ,наверное, что-то в этом роде:
Код: plaintext
1.
2.
3.
4.
5.
Dim TVI As TVITEM
    TVI.mask = TVIF_HANDLE Or TVIF_STATE
    TVI.hItem =  0                 ' укажи дискриптор нужного элемента TreeView 
    TVI.state = TVIS_SELECTED
    TVI.stateMask = TVIS_STATEIMAGEMASK
    Call SendMessage(ByVal TreeView1.hWnd, ByVal TVM_SETITEM, ByVal  0 &, TVI)
...
Рейтинг: 0 / 0
14.09.2004, 14:58
    #32693892
HRACH-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Привет Максим.

Ваш код не могу проверять

Каталог, который хочу активизиривать,
находится на 4-ом уровне TreeView,
как могу найти его дескриптор?
...
Рейтинг: 0 / 0
14.09.2004, 19:31
    #32694595
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
авторесли имею Handle этого элемента
Я так понял, что дискриптор элемента TreeView ты имеешь?
Или у тебя есть только TreeView1.hwnd?
...
Рейтинг: 0 / 0
15.09.2004, 17:35
    #32696262
-HRACH-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Привет Максим.

Хочу представить подробнее мою задачу.
Я пишу программу, которая осуществляет запуск и управление другой программы (Nero Express).
Имея дескриптор (Handle) TreeView этой программы мне не удается активизировать пункты (элементы) TreeView.
...
Рейтинг: 0 / 0
15.09.2004, 19:07
    #32696478
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Привет(а тоя чего-то ни разу не поздороволся)!
Я тут за вчерашний вечер тебе пример набросал. Сегодня его в порядок привел. Вот что получилось.
1. Создаешь проект - стандартный exe-файл.
2. На Form1 добавляешь:
- TreeView1;
- TreeView2;
- Command1
3. Копирй мой код в код формы Form1.
Все. Дальше "кликаешь" кнопку и все увидишь.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
Option Explicit

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 Const TV_FIRST           As Long = &H1100       '// TreeView messages 

Private Const TVM_GETCOUNT       As Long = (TV_FIRST +  5 )
Private Const TVM_GETNEXTITEM    As Long = (TV_FIRST +  10 )
Private Const TVM_SELECTITEM     As Long = (TV_FIRST +  11 )
Private Const TVM_GETITEM        As Long = (TV_FIRST +  12 )
Private Const TVM_GETEDITCONTROL As Long = (TV_FIRST +  15 )

Private Const TVGN_ROOT            As Long = &H0
Private Const TVGN_NEXT            As Long = &H1
Private Const TVGN_PREVIOUS        As Long = &H2
Private Const TVGN_PARENT          As Long = &H3
Private Const TVGN_CHILD           As Long = &H4
Private Const TVGN_FIRSTVISIBLE    As Long = &H5
Private Const TVGN_NEXTVISIBLE     As Long = &H6
Private Const TVGN_PREVIOUSVISIBLE As Long = &H7
Private Const TVGN_DROPHILITE      As Long = &H8
Private Const TVGN_CARET           As Long = &H9


Private Const TVIF_TEXT          As Long = &H1
Private Const TVIF_IMAGE         As Long = &H2
Private Const TVIF_PARAM         As Long = &H4
Private Const TVIF_STATE         As Long = &H8
Private Const TVIF_HANDLE        As Long = &H10
Private Const TVIF_SELECTEDIMAGE As Long = &H20
Private Const TVIF_CHILDREN      As Long = &H40


Private Type TVITEM
    mask As Long
    hItem As Long
    state As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    iSelectedImage As Long
    cChildren As Long
    lParam As Long
End Type

Private Type TVIParentChildren
    lItem As Long
    lParent As Long
    lIndent As Long
End Type

Private lCurrentItem As Long
Private aHTREEITEM() As TVIParentChildren

Private Sub Form_Load()
Dim mNodes As Nodes, i As Integer, j As Integer
Dim intNodeKey As Integer, intParentKey As Integer
     ' создаваемый TreeView 
    Me.TreeView2.Nodes.Clear
    Me.TreeView2.LineStyle = tvwRootLines
    Me.TreeView2.Appearance = ccFlat
    Me.TreeView2.HideSelection = False
    Me.TreeView2.Indentation =  20 
     ' исходный TreeView 
    Me.TreeView1.Enabled = False
    Me.TreeView1.Nodes.Clear
    Me.TreeView1.LineStyle = tvwRootLines
    Me.TreeView1.Appearance = ccFlat
    Me.TreeView1.HideSelection = False
    Me.TreeView1.Indentation =  20 
    Set mNodes = Me.TreeView1.Nodes
    Call mNodes.Add(,  1 , "0_", "Root Node, Level 0")
    intNodeKey =  1 
    For i =  1  To  10 
        Call mNodes.Add("0_",  4 , Str$(intNodeKey) & "_", "Children Node " & Str$(intNodeKey) & ", level 1")
        intNodeKey = intNodeKey +  1 
        Call mNodes.Add(Str$(intNodeKey -  1 ) & "_",  4 , Str$(intNodeKey) & "_", "Children Node " & Str$(intNodeKey) & ", level 2")
        intParentKey = intNodeKey
        intNodeKey = intNodeKey +  1 
        For j =  1  To  5 
            Call mNodes.Add(Str$(intParentKey) & "_",  4 , Str$(intNodeKey) & "_", "Children Node " & Str$(intNodeKey) & ", level 3")
            intNodeKey = intNodeKey +  1 
        Next j
        intNodeKey = intNodeKey +  1 
    Next i
End Sub

Private Sub Command1_Click()
Dim lItemCount As Long, lHwndItem As Long, i As Long
Dim bFlag As Boolean, mNodes As Nodes
    lItemCount = SendMessage(ByVal TreeView1.hwnd, ByVal TVM_GETCOUNT, ByVal  0 &, ByVal  0 &)
    ReDim aHTREEITEM( 0  To lItemCount -  1 )
    
     ' получаем HTREEITEM Root элемента 
    aHTREEITEM( 0 ).lItem = SendMessage(ByVal TreeView1.hwnd, ByVal TVM_GETNEXTITEM, ByVal TVGN_ROOT, ByVal  0 &)
    aHTREEITEM( 0 ).lIndent =  0 
    
     ' HTREEITEM первого элемента первого уровеня TreeView 
    aHTREEITEM( 1 ).lItem = SendMessage(ByVal TreeView1.hwnd, ByVal TVM_GETNEXTITEM, ByVal TVGN_CHILD, _
                                                                                   ByVal aHTREEITEM( 0 ).lItem)
    aHTREEITEM( 1 ).lParent = aHTREEITEM( 0 ).lItem
    aHTREEITEM( 1 ).lIndent =  1 
    
     ' определяем HTREEITEM следующих элементов первого уровня 
    lHwndItem = SendMessage(ByVal TreeView1.hwnd, ByVal TVM_GETNEXTITEM, ByVal TVGN_NEXT, _
                                                                                   ByVal aHTREEITEM( 1 ).lItem)
    i =  1 
    Do While lHwndItem <>  0 
        i = i +  1 
        aHTREEITEM(i).lItem = lHwndItem
        aHTREEITEM(i).lParent = aHTREEITEM( 0 ).lItem
        aHTREEITEM(i).lIndent =  1 
        lHwndItem = SendMessage(ByVal TreeView1.hwnd, ByVal TVM_GETNEXTITEM, ByVal TVGN_NEXT, _
                                                                                   ByVal aHTREEITEM(i).lItem)
    Loop
     ' определяем HTREEITEM элементов следующих уровней 
    lCurrentItem = i
    bFlag = True
    i =  1 
    Do While bFlag
        bFlag = GetOneLevelItem(ByVal i)
        i = i +  1 
    Loop
     ' заполняем TreeView2 
    Me.TreeView2.Nodes.Clear
    Set mNodes = Me.TreeView2.Nodes
    Call mNodes.Add(,  1 , Trim$(Str$(aHTREEITEM( 0 ).lItem)) & "_", "Root Node, Level 0 - HTREEITEM: " & _
                                                                       Trim$(Str$(aHTREEITEM( 0 ).lItem)))
    For i =  1  To UBound(aHTREEITEM)
        Call mNodes.Add(Trim$(Str$(aHTREEITEM(i).lParent)) & "_",  4 , Trim$(Str$(aHTREEITEM(i).lItem)) & "_", _
                           "Children Node, level " & Trim$(Str$(aHTREEITEM(i).lIndent)) & " - HTREEITEM: " & _
                                                                             Trim$(Str$(aHTREEITEM(i).lItem)))
    Next i
End Sub

 '/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
 '/* Обрабатывает HTREEITEM эелементов TreeView одного уровня 
Function GetOneLevelItem(ByVal lNumLevel As Long) As Boolean
Dim aTempHTREEITEM() As TVIParentChildren, i As Long, j As Long, lhItem As Long
    For i =  0  To UBound(aHTREEITEM)
        If aHTREEITEM(i).lIndent = lNumLevel Then
            ReDim Preserve aTempHTREEITEM(j)
            aTempHTREEITEM(j) = aHTREEITEM(i)
            j = j +  1 
        End If
    Next i
    For i =  0  To UBound(aTempHTREEITEM)
         ' HTREEITEM первый Children элемент указанного уровеня TreeView 
        lhItem = SendMessage(ByVal TreeView1.hwnd, ByVal TVM_GETNEXTITEM, ByVal TVGN_CHILD, _
                                                                         ByVal aTempHTREEITEM(i).lItem)
        If lhItem <>  0  Then
            GetOneLevelItem = True
            lCurrentItem = lCurrentItem +  1 
            aHTREEITEM(lCurrentItem).lItem = lhItem
            aHTREEITEM(lCurrentItem).lParent = aTempHTREEITEM(i).lItem
            aHTREEITEM(lCurrentItem).lIndent = lNumLevel +  1 
            
             ' определяем HTREEITEM следующих Children элементов указанного уровня 
            j = SendMessage(ByVal TreeView1.hwnd, ByVal TVM_GETNEXTITEM, ByVal TVGN_NEXT, _
                                                                  ByVal aHTREEITEM(lCurrentItem).lItem)
            Do While j <>  0 
                lCurrentItem = lCurrentItem +  1 
                aHTREEITEM(lCurrentItem).lItem = j
                aHTREEITEM(lCurrentItem).lParent = aTempHTREEITEM(i).lItem
                aHTREEITEM(lCurrentItem).lIndent = lNumLevel +  1 
                j = SendMessage(ByVal TreeView1.hwnd, ByVal TVM_GETNEXTITEM, ByVal TVGN_NEXT, _
                                                                  ByVal aHTREEITEM(lCurrentItem).lItem)
            Loop
        End If
    Next i
End Function

Private Sub TreeView2_NodeClick(ByVal Node As MSComctlLib.Node)
Dim lhItem As Long
    lhItem = CLng(Mid$(Me.TreeView2.SelectedItem.Key,  1 , Len(Me.TreeView2.SelectedItem.Key) -  1 ))
    Call SendMessage(ByVal TreeView1.hwnd, ByVal TVM_SELECTITEM, ByVal TVGN_CARET, ByVal lhItem&)
End Sub
Все. Я пошел смотреть футбол(и так уже 15 минут пропустил).
...
Рейтинг: 0 / 0
15.09.2004, 19:38
    #32696535
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Да, забыл сказать. Растяни форму до средних размеров. И элементы TreeView расположи на форме как панели в Norton Commander. Так будет более наглядно.
...
Рейтинг: 0 / 0
25.09.2004, 16:45
    #32711605
HRACH
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Привет, Максим!
Твой код очень помог.
Но возникла новая проблема.

Как могу развернуть весь TreeViev или отдельный пункт,
если имею дескриптор TreeViev и дескриптор пункта?
...
Рейтинг: 0 / 0
25.09.2004, 18:11
    #32711630
МаксимВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к информации ListView или TreeView через API
Добавь к предыдущему примеру:
1. В секцию Declarations :
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Const TVM_EXPAND         As Long = (TV_FIRST +  2 )

Private Const TVE_COLLAPSE      As Long = &H1
Private Const TVE_EXPAND        As Long = &H2
Private Const TVE_TOGGLE        As Long = &H3
Private Const TVE_EXPANDPARTIAL As Long = &H4000
Private Const TVE_COLLAPSERESET As Long = &H8000
2. Две процедуры событий объекта TreeView2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub TreeView2_Collapse(ByVal Node As MSComctlLib.Node)
Dim lhItem As Long
    lhItem = CLng(Mid$(Node.Key,  1 , Len(Node.Key) -  1 ))
    Call SendMessage(ByVal TreeView1.hwnd, ByVal TVM_EXPAND, ByVal TVE_COLLAPSE, ByVal lhItem&)
End Sub

Private Sub TreeView2_Expand(ByVal Node As MSComctlLib.Node)
Dim lhItem As Long
    lhItem = CLng(Mid$(Node.Key,  1 , Len(Node.Key) -  1 ))
    Call SendMessage(ByVal TreeView1.hwnd, ByVal TVM_EXPAND, ByVal TVE_EXPAND, ByVal lhItem&)
End Sub
Если нужно окрыть все дочерние "узлы", то обрабатывай в цикле. Все данные у тебя есть в массиве aHTREEITEM().
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / доступ к информации ListView или TreeView через API / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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