Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Просветите Добавлено: 27.03.08 15:09  

Автор вопроса:  Oleg | ICQ: 407182478 
Public Type TVITEMEX
    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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: domkratt.com
 Профиль | | #4
Добавлено: 28.03.08 00:50
А ты уверен, что структуры правильные?) Тут все траблы, думается мне, в переменных типа String. Ибо бейсик передает не указатель, а указатель на указатель.

Ответить

Номер ответа: 5
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #5
Добавлено: 28.03.08 02:25
StrPtr

Ответить

Номер ответа: 6
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #6
Добавлено: 28.03.08 08:12
Какой StrPtr внутри структуры, интересно мне знать?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам