Option Explicit Private Const CB_SHOWDROPDOWN = &H14F 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 Command1_Click() End End Sub Private Sub Form_Load() Dim ItemIndex As Integer ItemIndex = SftTree1.Items.Add("Click on a cell to edit") SftTree1.Cell(ItemIndex, 1).Text = "Use Tab/Return keys" SftTree1.Cell(ItemIndex, 2).Text = "Use arrow keys" ItemIndex = SftTree1.Items.Add("This sample supports cell navigation") SftTree1.Cell(ItemIndex, 1).Text = "Ctrl+Home and Ctrl+End" Dim i As Integer For i = 1 To 50 Dim Item As SftTreeItem Dim Cell As SftTreeCell ItemIndex = SftTree1.Items.Add("An item") SftTree1.Cell(ItemIndex, 1).Text = "2nd Column" SftTree1.Cell(ItemIndex, 2).Text = "3rd Column" ItemIndex = SftTree1.Items.Add("Another item") Set Item = SftTree1.Item(ItemIndex) Item.Level = 1 Item.Cell(1).Text = "2nd Column" Item.Cell(2).Text = "3rd Column" ItemIndex = SftTree1.Items.Add("This item can't be edited") Set Item = SftTree1.Item(ItemIndex) Item.Level = 2 Item.EditIgnore = True Item.Cell(0).Image.Appearance = sftImageCheckboxYes Item.Cell(1).Text = "2nd Column (can't edit this item)" Item.Cell(2).Text = "3rd Column (can't edit this item)" ItemIndex = SftTree1.Items.Add("A fourth item") Set Item = SftTree1.Item(ItemIndex) Item.Level = 1 Set Cell = SftTree1.Cell(ItemIndex, 1) Cell.Text = "This cell can't be edited" Cell.EditIgnore = True Cell.Image.Appearance = sftImageCheckboxYes SftTree1.Cell(ItemIndex, 1).EditIgnore = True SftTree1.Cell(ItemIndex, 2).Text = "3rd Column" Next SftTree1.ColumnsObj.MakeOptimal SftTree1.RowHeaders.MakeOptimal SftTree1.Items.RecalcHorizontalExtent End Sub Private Sub SftTree1_ItemClick(ByVal ItemIndex As Long, ByVal ColIndex As Integer, ByVal AreaType As Integer, ByVal Button As Integer, ByVal Shift As Integer) If AreaType = constSftTreeCellText Then ' User clicked on a cell SftTree1.Cell(ItemIndex, ColIndex).Edit 0, 0 ElseIf AreaType = constSftTreeCellGraphic Then ' check if check box - toggle Dim Img As SftPictureObject Set Img = SftTree1.Cell(ItemIndex, ColIndex).Image If Img.Appearance = sftImageCheckboxNo Then Img.Appearance = sftImageCheckboxYes ElseIf Img.Appearance = sftImageCheckboxYes Then Img.Appearance = sftImageCheckboxNo End If End If End Sub Private Sub SftTree1_ItemDblClick(ByVal ItemIndex As Long, ByVal ColIndex As Integer, ByVal AreaType As Integer, ByVal Button As Integer, ByVal Shift As Integer) If AreaType = constSftTreeColumnRes Then SftTree1.Column(ColIndex).MakeOptimal ElseIf AreaType = constSftTreeCellGraphic Then ' check if check box - toggle Dim Img As SftPictureObject Set Img = SftTree1.Cell(ItemIndex, ColIndex).Image If Img.Appearance = sftImageCheckboxNo Then Img.Appearance = sftImageCheckboxYes ElseIf Img.Appearance = sftImageCheckboxYes Then Img.Appearance = sftImageCheckboxNo End If End If End Sub Private Sub SftTree1_ToolTipVScroll(Text As String, ByVal ItemIndex As Long, ByVal ColIndex As Integer) Text = "Item " & ItemIndex & " - " & Text End Sub Private Sub SftTree1_EditAllowed(ByVal ItemIndex As Long, ByVal ColIndex As Integer, Allowed As Boolean) ' Last chance to suppress cell editing for a cell 'If ItemIndex = 1 And ColIndex = 1 Then ' Allowed = False 'End If End Sub Private Sub SftTree1_EditInitializing(Window As stdole.OLE_HANDLE, vData As Variant, ByVal EditIndex As Long, ByVal EditCol As Integer, LeftPix As stdole.OLE_XPOS_PIXELS, TopPix As stdole.OLE_YPOS_PIXELS, WidthPix As stdole.OLE_XSIZE_PIXELS, HeightPix As stdole.OLE_YSIZE_PIXELS) Dim ctrl As Control ' Choose a control based on current column being edited If EditCol = 1 Then Set ctrl = Combo1 Else Set ctrl = Text1 End If Dim TextHeight As Integer ' Left/Top/Width/Height describes the current cell area ' we need to return the position and size needed for editing. ' In this example, we use the height of the control on the form ' and center it over the cell. TextHeight = ctrl.Height / Screen.TwipsPerPixelX TopPix = TopPix + (HeightPix - TextHeight) / 2 HeightPix = TextHeight ' Set the text in the control used for cell editing and ' set other control-specific properties If ctrl = Text1 Then Text1.Text = SftTree1.Cell(EditIndex, EditCol).Text Text1.SelStart = 0 Text1.SelLength = 999 Else Combo1.Clear Combo1.AddItem "Option 1" Combo1.AddItem "Option 2" Combo1.AddItem "Option 3" Combo1.AddItem SftTree1.Cell(EditIndex, EditCol).Text Combo1.Text = SftTree1.Cell(EditIndex, EditCol).Text End If ' Return the control's window handle Window = ctrl.hwnd ' Define navigation keys ' VK_TAB SftTree1.CellEditIntercept Asc(vbTab), cellEditInterceptSftTreeChar + cellEditInterceptSftTreeControlChar + cellEditInterceptSftTreeShiftChar ' VK_RETURN SftTree1.CellEditIntercept Asc(vbCr), cellEditInterceptSftTreeChar + cellEditInterceptSftTreeControlChar + cellEditInterceptSftTreeShiftChar ' VK_HOME SftTree1.CellEditIntercept 36, cellEditInterceptSftTreeControlChar ' VK_END SftTree1.CellEditIntercept 35, cellEditInterceptSftTreeControlChar If ctrl = Text1 Then ' We want these keys just for the edit control. ' VK_UP SftTree1.CellEditIntercept 38, cellEditInterceptSftTreeChar + cellEditInterceptSftTreeControlChar + cellEditInterceptSftTreeShiftChar ' VK_DOWN SftTree1.CellEditIntercept 40, cellEditInterceptSftTreeChar + cellEditInterceptSftTreeControlChar + cellEditInterceptSftTreeShiftChar End If End Sub Private Sub SftTree1_EditInitialized(ByVal Window As stdole.OLE_HANDLE, ByVal vData As Variant, ByVal EditIndex As Long, ByVal EditCol As Integer, ByVal ParentWindow As stdole.OLE_HANDLE, ByVal LeftPix As Long, ByVal TopPix As Long, ByVal WidthPix As Long, ByVal HeightPix As Long, Positioned As Boolean) ' Show the combo box dropdown portion If Window = Combo1.hwnd Then ' We're taking over positioning, so we can drop down the dropdown portion of the control Positioned = True Combo1.Left = LeftPix * Screen.TwipsPerPixelX Combo1.Top = TopPix * Screen.TwipsPerPixelY Combo1.Width = WidthPix * Screen.TwipsPerPixelX ' Combo1.Height = HeightPix * Screen.TwipsPerPixelY ' can't set height of a combo box Combo1.Enabled = True Combo1.Visible = True Combo1.SetFocus SendMessage Window, CB_SHOWDROPDOWN, 1, 0 End If End Sub Private Sub SftTree1_EditNavigating(ByVal Key As Long, ByVal Shift As Integer, ByVal ItemIndex As Long, ByVal ColIndex As Integer) ' Process key pressed SftTree1.EditNavigate Key, Shift End Sub Private Sub SftTree1_EditValidate(ByVal Window As stdole.OLE_HANDLE, ByVal vData As Variant, ByVal EditIndex As Long, ByVal EditCol As Integer, InputValid As Boolean) ' Validate the new cell contents Dim S As String If Window = Text1.hwnd Then S = Text1.Text Else S = Combo1.Text End If S = Trim(S) If Len(S) <= 0 Then MsgBox ("Just to demonstrate data input validation, this example rejects empty cells. Please enter some data.") InputValid = False End If End Sub Private Sub SftTree1_EditEnding(ByVal Window As stdole.OLE_HANDLE, ByVal vData As Variant, ByVal EditIndex As Long, ByVal EditCol As Integer, ByVal SaveInput As Boolean) ' Save the new cell contents If SaveInput Then If Window = Text1.hwnd Then SftTree1.Cell(EditIndex, EditCol).Text = Text1.Text Else SftTree1.Cell(EditIndex, EditCol).Text = Combo1.Text End If End If End Sub