Article ID: 141026
Article Last Modified on 12/9/2003
71067 How to Set Tab Stops in a List Box in Visual Basic
Option Explicit
Const WM_USER = &H400
#If Win16 Then
Const LB_SETTABSTOPS = WM_USER + 19
Const LB_SETHORIZONTALEXTENT As Long = WM_USER + 21
Private Declare Function SendMessage Lib "User" (ByVal hwnd As _
Integer,ByVal wMsg As Integer, ByVal wParam As Integer, _
lParam As Any) As Long
Dim scrollbarwidth As Integer ' Width of horizontal scrollbar.
Dim numtabs As Integer ' Number of tabs needed.
Dim tabstops() As Integer ' Array of value of tab stop of columnn
#Else
Const LB_SETTABSTOPS = &H192 ' Has changed in Win32.
Const LB_SETHORIZONTALEXTENT As Long = &H194 ' Has changed in Win32.
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Long) As Long
Dim scrollbarwidth As Long ' Width of horizontal scrollbar.
Dim numtabs As Long ' Number of tabs needed.
Dim tabstops() As Long ' Array of value of tab stop of columnn
#End If
Private Sub Fill_List(lb As ListBox, sn As Recordset)
Const NUMCHARS = 2 ' Amount of white space between columns.
' Temporary variables to preserve form font settings:
Dim hold_fontname As String, hold_fontsize As Integer
Dim hold_fontbold As Integer, hold_fontitalic As Integer
Dim hold_fontstrikethru As Integer, hold_fontunderline As Integer
Dim whiteSpace As Integer, accumtabstops As Integer, _
dialogUnits As Integer
Dim fieldVal As String, listline As String
Dim avgWidth As Single
Dim i As Integer ' Used in For Next loops.
Dim biggest_value() As Single ' Array of longest string of columns.
Dim retval As Long ' Return value of SendMessage function
' Save form's font settings so we can use the form to calculate the
' TextWidth / Height of the strings to go into the list box.
hold_fontname = Me.FontName
hold_fontsize = Me.FontSize
hold_fontbold = Me.FontBold
hold_fontitalic = Me.FontItalic
hold_fontstrikethru = Me.FontStrikethru
hold_fontunderline = Me.FontUnderline
' Set form font settings to be identical to list box.
Me.FontName = lb.FontName
Me.FontSize = lb.FontSize
Me.FontBold = lb.FontBold
Me.FontItalic = lb.FontItalic
Me.FontStrikethru = lb.FontStrikethru
Me.FontUnderline = lb.FontUnderline
' Get the average character width of the current list box font
' (in pixels) using the form's TextWidth width method.
avgWidth = Me.TextWidth _
("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
avgWidth = avgWidth / Screen.TwipsPerPixelX / 52
' Set the white space you want between columns.
whiteSpace = avgWidth * NUMCHARS
ReDim biggest_value(0 To sn.Fields.Count - 1)
ReDim tabstops(1 To sn.Fields.Count)
lb.Clear
' Loop through the field values for each record in the snapshot.
' Calculate the width required for that field value to fit in the list
' box. Also, build each line of the list box and add it to the list as
' you go.
While Not sn.EOF
For i = 0 To sn.Fields.Count - 1
fieldVal = sn(i) & "" ' Append "" in case of a null field.
' The LB_SETTABSTOP message requires coordinates in dialog units
' (roughly 4 *, the average character width in pixels).
dialogUnits = ((Me.TextWidth(fieldVal) / Screen.TwipsPerPixelX + _
whiteSpace) \ avgWidth) * 4
If dialogUnits > biggest_value(i) Then
biggest_value(i) = dialogUnits
End If
listline = listline & sn(i) & vbTab
Next i
lb.AddItem listline
listline = ""
sn.MoveNext
Wend
' Fill the tabstops() array with the position of each tab stop.
For i = 0 To sn.Fields.Count - 1
accumtabstops = accumtabstops + biggest_value(i)
tabstops(i + 1) = accumtabstops
Next i
' numtabs must be a Long for Win32, Integer for Win16.
numtabs = i
' Send LB_SETTABSTOP to the list box to set the position of each
' column.
retval& = SendMessage(lb.hwnd, LB_SETTABSTOPS, numtabs, tabstops(1))
' Set the horizontal extent just wider than the first tab stop.
' This produces a horizontal scroll bar on the list box.
' This message requires coordinates in pixels, so we convert the tab
' stop coordinate back from dialog units to pixels.
' scrollbarwidth must be a Long for Win32, Integer for Win16
scrollbarwidth = (tabstops(i) \ 4) * avgWidth
retval& = SendMessage(lb.hwnd, LB_SETHORIZONTALEXTENT, _
scrollbarwidth, 0&)
' Restore form's original font property settings.
Me.FontName = hold_fontname
Me.FontSize = hold_fontsize
Me.FontBold = hold_fontbold
Me.FontItalic = hold_fontitalic
Me.FontStrikethru = hold_fontstrikethru
Me.FontUnderline = hold_fontunderline
End Sub
Private Sub Command1_Click()
MousePointer = vbHourglass
Dim db As Database
Dim rs As Recordset
Set db = DBEngine.Workspaces(0).OpenDatabase("BIBLIO.MDB")
Set rs = db.OpenRecordset("Select * From Publishers", dbOpenSnapshot)
Fill_List List1, rs
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
MousePointer = vbDefault
End Sub
Additional query words: 4.00 vb4win vb4all
Keywords: kbcode KB141026