Страница: 1 | 
		
		 
			   
			 
			 
			 
			 Страница: 1 | 
 
			
 
  
		
     
  
    
Вопрос: Просветите
     
    
Добавлено: 27.03.08 15:09
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
     Oleg | ICQ: 407182478
 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
 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
 Sharp










Лидер форума
ICQ: 216865379 
Вопросов: 106
Ответов: 9979
      
 Web-сайт:  
 Профиль |  | #2
      
Добавлено:  27.03.08 20:02
       
    
       
  
В том, что Long это не TV_INSERTSTRUCT. Попробуй VarPtr.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа: Oleg
 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)
 = 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
 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 внутри структуры, интересно мне знать?