Страница: 1 |
Страница: 1 |
Вопрос: Просветите
Добавлено: 27.03.08 15:09
Автор вопроса: Oleg | ICQ: 407182478
imask 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
iIntegral As Long
End Type
Public Type TVITEM
imask As Long
hItem As Long
state As Long
stateMask As Long
pszText As String
IcchTextMax As Long
IiImage As Long
iSelectedImage As Long
IcChildren As Long
IlParam As Long
End Type
Public Type TV_INSERTSTRUCT
hParent As Long
hInsertAfter As Long
itemex As TVITEMEX
item As TVITEM
End Type
Объявил таким образом свою структуру, и опять непонятка
Public Sub AddItem()
Dim tvinsert As TV_INSERTSTRUCT
tvinsert.hParent = 0
tvinsert.hInsertAfter = TVI_FIRST
tvinsert.item.imask = TVIF_TEXT
tvinsert.item.pszText = "Root_Item"
tvinsert.itemex.pszText = "Root_Item"
Spreadsheet1.ActiveSheet.Range("c1") = SendMessage(UserForm1.TreeView1.hwnd, TVM_INSERTITEM, 0, tvinsert)
End Sub
В ответ на вызов этой процедуры Exel ругается типа "Type mismatch" и выделяет "tvinsert" в строке:
Spreadsheet1.ActiveSheet.Range("c1") = SendMessage(UserForm1.TreeView1.hwnd, TVM_INSERTITEM, 0, tvinsert)
Народ, плиз, подскажите в чём лажа?.
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
Oleg
ICQ: 407182478
Вопросов: 9
Ответов: 10
Профиль | | #1
Добавлено: 27.03.08 15:20
Совсем забыл, SendMessage объявлена вот так
Public Declare Function SendMessage _
Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 27.03.08 20:02
В том, что Long это не TV_INSERTSTRUCT. Попробуй VarPtr.
Номер ответа: 3
Автор ответа:
Oleg
ICQ: 407182478
Вопросов: 9
Ответов: 10
Профиль | | #3
Добавлено: 27.03.08 20:22
В этом разобрался. Возник ещё более глобальный вопрос
Public Declare Function SendMessage _
Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
lParam As TV_INSERTSTRUCT) As Long
Private Type TV_INSERTSTRUCT
hParent As Long
hInsertAfter As Long
Itemex_imask As Long
Itemex_hItem As Long
Itemex_state As Long
Itemex_stateMask As Long
Itemex_pszText As String
Itemex_cchTextMax As Long
Itemex_iImage As Long
Itemex_iSelectedImage As Long
Itemex_cChildren As Long
Itemex_lParam As Long
Itemex_iIntegral As Long
Item_imask As Long
Item_hItem As Long
Item_state As Long
Item_stateMask As Long
Item_pszText As String
Item_IcchTextMax As Long
Item_IiImage As Long
Item_iSelectedImage As Long
Item_IcChildren As Long
Item_IlParam As Long
End Type
Код модуля
Public Sub AddItem()
Dim ItemInfo As TV_INSERTSTRUCT
Dim ItemText As String
ItemText$ = "RootItem"
With ItemInfo
.hParent = 0
.hInsertAfter = TVI_FIRST
.Item_imask = TVIF_TEXT
.Item_pszText = ItemText$
.Item_IcchTextMax = 10
End With
Range("a1" = SendMessage(UserForm1.TreeView1.hwnd, TVM_INSERTITEM, 0, ItemInfo)
Item в TreeView добавляется, но пустой, без текста, а если на нём дважды кликнуть то Exel предлагает передать отчёт об ошибке в Microsoft.
Я думаю что здесь проблема в том, что .Item_pszText = ItemText$ приравнивается строка, а он должен содержать указатель на неё.
Иначе, почему же Item пустой? Как думаете?
Номер ответа: 4
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #4
Добавлено: 28.03.08 00:50
А ты уверен, что структуры правильные?) Тут все траблы, думается мне, в переменных типа String. Ибо бейсик передает не указатель, а указатель на указатель.
Номер ответа: 5
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #5
Добавлено: 28.03.08 02:25
StrPtr
Номер ответа: 6
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #6
Добавлено: 28.03.08 08:12
Какой StrPtr внутри структуры, интересно мне знать?