Listbox Column Resize

  1. 2 weeks ago

    Dave S

    Mar 9 San Diego, California USA

    Can a listbox have a column width change by dragging if it has a HEADER row?
    I have a listbox where a header is not appropriate, and I can't seem to get a drag type column resize to even activate :(

  2. Dave S

    Mar 9 San Diego, California USA

    there are 8 columns..... columns 0 and 1 should be adjustable by the user
    2 thru 6 are fixed at 120px wide
    and column 7 is flexible as the window is resized (column 0 and 1 should only change per the user, not window resize)

  3. Dave S

    Mar 9 San Diego, California USA
    Edited 2 weeks ago

    here is the OPEN code for the listbox

    its gonna to be a simple Gannt chart

    Sub Open() Handles Open
      // First THREE(3) Rows are "Headers"
      Dim i As Integer
      Dim s As String
      Me.ColumnCount         = 8
      Me.ColumnsResizable    = True
      Me.ScrollBarHorizontal = True
      Me.ScrollBarVertical   = True
      Me.DeleteAllRows
      Me.ColumnWidths="*,*,120,120,120,120,120,*"
      //
      // Year
      //
      Me.addRow  
      s=""
      For i=0 To 7
        //Me.column(i).UserResizable=(i<2) // only column 0 and 1 are resizeable
        Me.CellBorderTop(0,i)=Listbox.BorderThinSolid
        Me.CellBorderBottom(0,i)=Listbox.BorderThinSolid
        Me.CellBorderRight(0,i)=Listbox.Bordernone
        Me.CellBorderleft(0,i)=Listbox.Bordernone
        Select Case i
        Case 7
          Me.CellBorderLeft(0,i)=Listbox.BorderThinSolid
          Me.CellBorderRight(0,i)=Listbox.BorderThinSolid
          s="[YEAR]"
        End Select
        Me.cell(0,i)=s
      Next i
      //
      // Month
      //
      Me.addRow  
      
      For i=0 To 7
        Me.CellBorderBottom(1,i)=Listbox.Bordernone
        Me.CellBorderRight(1,i)=Listbox.BorderThinSolid
        Me.CellBorderleft(1,i)=Listbox.BorderThinSolid
        Select Case i
        Case 0
          s="Task"
        Case 1
          s="Assigned"
        Case 2,3
          s="Estimated"
        Case 4,5
          s="Actual"
        Case 6
          s="Percent"
        Case 7
          s="[MONTH]"
        End Select
        Me.cell(1,i)=s
      Next i
      // Days
      Me.addRow
      For i=0 To 7
        Me.CellBorderBottom(2,i)=Listbox.BorderThinSolid
        Me.CellBorderRight(2,i)=Listbox.BorderThinSolid
        Me.CellBorderleft(2,i)=Listbox.BorderThinSolid
        Select Case i
        Case 0
          s="Description"
        Case 1
          s="To"
        Case 2,4
          s="Start"
        Case 3,5,6
          s="Complete"
        Case 7
          s="[DAYS]"
        End Select
        Me.cell(2,i)=s
      Next i
      
      Me.addRow
      For i=0 To 7
        Select Case i
        Case 0
          s="This is just a test"
        Case 1
          s="Baker Electric"
        Case 2 To 6
          s="WWW 88,8888"
        Case 7
          s="[XXX]"
        End Select
        Me.cell(3,i)=s
      Next i
      
    End Sub
  4. Jean-Yves P

    Mar 10 Pre-Release Testers, Xojo Pro Europe (France, Besançon)

    I don't put "*" in a resizeable column, but nothing. does this help ?

  5. Andre K

    Mar 10 Pre-Release Testers

    Drag columnresizing is only possible through the headers.

  6. Dave S

    Mar 10 San Diego, California USA

    @Andre K Drag column resizing is only possible through the headers.

    yeah.. I ultimately determined that.... so I was forced to write my own column resize routine.... fortunately it works quite well.

  7. Andre K

    Mar 10 Pre-Release Testers

    @Dave S yeah.. I ultimately determined that.... so I was forced to write my own column resize routine.... fortunately it works quite well.

    I knew without any doubt that you were capable to do that, gratulations!

  8. Dale A

    Mar 11 San Diego, California, USA

    @Dave S yeah.. I ultimately determined that.... so I was forced to write my own column resize routine.... fortunately it works quite well.

    Dave, would you be willing to share it? I've been trying to do a similar routine but haven't succeeded yet. I'd like to see how you did it and take it from there. (We all know you're a better programmer than I am.)

  9. Dave S

    Mar 11 San Diego, California USA

    Certainly.... bear in mind that you will need to adjust based on your specific situation..... this is just rough cut/paste from my project

    these are all events of a Listbox subclass
    and the listbox MUST have values in COLUMNWIDTHS for any column to be resized ... '*' won't work. in my app I am only allowing the first two to be resized, and the last column is '*'

    Private Property colDRAG as Integer
    Private Property zMouseX as Integer
    Private Property zMouseY as Integer
    Private Property zColumnWidths as string
    Function MouseDown(x As Integer, y As Integer) Handles MouseDown as Boolean
      zMouseX=x
      zMouseY=y
      Return (IsContextualClick=False)
    End Function
    Sub MouseMove(X As Integer, Y As Integer) Handles MouseMove
    // changes cursor as it nears edge of a column
      Const tolerance=8
      Dim w As Integer
      Dim i As Integer
      coldrag=(-1)
      w=0
      If y<=Me.RowHeight*2 Then 
        For i=0 To 1 // I only allow first two columns to be resized
          w=w+Me.Column(i).WidthActual
          If x>=(w-tolerance) And x<=(w+tolerance) Then 
            colDrag=i
            Exit For
          End If
        Next i
      End If
      If colDRAG>=0 Then 
        Me.MouseCursor=System.Cursors.SplitterEastWest
        mouseW=Me.column(colDRAG).WidthActual
      Else
        Me.MouseCursor=System.Cursors.StandardPointer
      End If
     
    End Sub
    Sub MouseDrag(x As Integer, y As Integer) Handles MouseDrag
      Dim w As Integer
      If coldrag>=0 Then 
        w=mouseW+(x-zMouseX)
        If w<zDefaultColumnWidth Then Return
        setColumnWidth(colDRAG,w)
      End If
    End Sub
    Sub MouseUp(x As Integer, y As Integer) Handles MouseUp
      colDrag=(-1)
    End Sub
    Private Sub setColumnWidth(col as integer, wide as integer)
      Dim v() As String
      If col=8 Then Return // this column must always be '*'
      v=Split(zColumnWidths,",")
      v(col)=Str(wide)
      zColumnWidths=Join(v,",")
      listbox1.columnwidths=zColumnwidths
    End Sub

    I store the columnWidths as zCOLUMNWIDTHS as the same values need to be applied to 2 different listboxes

  10. Dale A

    Mar 11 San Diego, California, USA

    Thanks, Dave.

or Sign Up to reply!