DEMO - Formatted Listboxes

Home

Window Placement Techniques
Listview Report by Brent Thorn
Enhancing Liberty Basic [Array Handling]
The Road to Release
Formatted ListBox

 

Mike wrote on July 11th:

Here is another submission for the next newsletter. Maybe it would be of interest to those who say that LB is not suitable for business applications.

The code shows the methods I use to format listboxes and manipulate data from a listbox. No doubt this will be replaced soon by the excellent work being done with Windows ListView API, but users who shy away from dll calls may like to use it.

[Ed. Well Mike, I don't think it will be replaced by the API versions, as you mention, many users like doing these things using native LB commands. It is interesting to note that this newsletter contains two methods of doing nearly the same thing. See the Spotlight for an API based version of code to format the listbox. Here is Mike's code he submitted as a demo. There may be many line wraps, for an executable version, check the attached zip file for the basic program Formatted_Listbox.bas]

     'For LibertyBASIC tested with version 3.01, Win98, 800x600
     'Formatted listbox with column labels which become field
     'selection buttons for editing. To enable editing, click
     'the Edit button, select an item from the listbox and then
     'click the button for the field you wish to change. When
     'finished editing, click the Lock button and the listbox
     'resumes its' normal behaviour.
     'Obviously data would usually be saved to disc file rather
     'than data statements and editing would require changes to
     'be written back to the file.
     'mike@karemi.fsnet.co.uk
 '~~~~~~~~~~~~~~~~~~~~~~~ Window size ~~~~~~~~~~~~~~~~~~~~~~~~~
     ' following dimensions are pixels
     dw=DisplayWidth: dh=DisplayHeight
     WindowWidth = dw: WindowHeight = dh
     '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     disable=0:enable=1
     BackgroundColor$="darkcyan"
     NoMainWin
     Dim buy$(20)
     Dim array$(20) 'array for listbox
     'arrays for individual columns in listbox
     Dim serial$(20):Dim item$(20):Dim cost$(20)
     'fill arrays. Building array$() from separate elements enables
     'easy manipulation of the listbox contents.
     For n=1 to 20 'ignore element zero, see LB help file re-listbox
     ser$=Str$(n)
     serial$(n)=formatLeadingZeros$(5, ser$) 'fix length of serial$(),padded with zeros
     Read a$:item$(n)=a$ 'load demo data
     item$(n)=formatTrailingSpaces$(14, a$) 'fix length of item$(), paddedwith spaces
     Read cost 'load demo data
     cost$(n)=formatCost$(cost) 'format cost, aligning decimals
     array$(n)=makeListboxEntry$(n) 'build array for listbox
     Next n
     xRef=200
     Menu #m1, "&About program", "&Info", [info]
     Button #m1.L0, "", [], UL, xRef,140,49,20
     Button #m1.L1, "Item", [editItem], UL, xRef+49,140,121,20
     Button #m1.L2, "Cost", [editCost], UL, xRef+170,140,86,20
     Button #m1.L3, "Spare", [spare], UL, xRef+256,140,86,20
     Button #m1.b0, "BUY", [shop], UL, xRef,440,70,20
     Button #m1.b1, "Exit", [quit], UL, 0,0,0,0
     Button #m1.b3, "Edit", [edit], UL, xRef,110,70,20
     Listbox #m1.lb1, array$(,[show],xRef, 160, 341, 135
     Texteditor #m1.tb1, xRef,300,255,130
     Open "Listview" For window_popup As #m1 'no titlebar/close box
     'array of handles for buttons to be used as labels
     hCont(0)=hWnd(#m1.L0)
     hCont(1)=hWnd(#m1.L1)
     hCont(2)=hWnd(#m1.L2)
     hCont(3)=hWnd(#m1.L3)
     'font for button labels (use bold font for clarity)
     #m1.L0, "!font arial 9 bold"
     #m1.L1, "!font arial 9 bold"
     #m1.L2, "!font arial 9 bold"
     #m1.L3, "!font arial 9 bold"
     'disable buttons used as labels
     Call disableControl disable, 0, 3
     'Button can still be written to even though disabled
     #m1.L0, "Serial"
     #m1.tb1, "!font technical 12"
     'font for listbox (only use fixedwidth font or columns will not align)
     #m1.lb1, "font courier_new 10"
     #m1.lb1, "singleclickselect"
     #m1.tb1, "Click items in the listbox to add";Chr$(13);"those items to your shopping list!";_
     Chr$(13);"Then click BUY";Chr$(13);"Apologies to female programmers,";Chr$(13);_
     "for the list contents!"
     buy=1
     Wait
     '
     [shop]
     #m1.b1, "!locate 300 440 70 20"
     #m1, "refresh"
     #m1.tb1, "!cls"
     #m1.tb1, "You have bought:"
     For i=1 to buy
     #m1.tb1, buy$(i)
     Next
     #m1.tb1, "Total cost: £";totalcost
     If totalcost <>0 Then #m1.tb1, "Please mail me with your";Chr$(13);"credit card number!"
     Wait
     '
     [show]
     'show choice from listbox in texteditor
     If editControl<>1 Then
     If buy=1 Then #m1.tb1, "!cls"
     #m1.lb1, "selectionindex? index"
     #m1.tb1, "Selected from listbox:"
     #m1.tb1, "Serial is ";serial$(index)
     #m1.tb1, "Item is ";item$(index)
     #m1.tb1, "Cost is ";cost$(index)
     buy$(buy)=array$(index)
     totalcost=totalcost+Val(Right$(cost$(index),5))
     buy=buy+1
     End If
     Wait
     '
     [edit]
     editControl=1-editControl
     If editControl=1 Then
     Call disableControl enable, 1, 2
     #m1.b3, "Lock"
     #m1.tb1, "!cls"
     Else
     Call disableControl disable, 1, 2
     #m1.b3, "Edit"
     #m1.lb1, "selectindex 0"
     End If
     Wait
[editItem] 'edit item
     #m1.lb1, "selectionindex? index"
     If index<>0 Then
     p$=item$(index)
     Prompt "Enter new item..."; p$
     If p$<>"" Then
     '**** reformatting *********
     item$(index)=formatTrailingSpaces$(14, p$)
     'update listbox array
     array$(index)=makeListboxEntry$(index)
     #m1.lb1, "reload"
     #m1.lb1, "selectindex "; index
     End If
     End If
     Wait
[editCost] 'edit cost
     #m1.lb1, "selectionindex? index"
     If index<>0 Then
     p$=cost$(index)
     Prompt "Enter new cost..."; p$
     If p$<>"" Then
     '**** reformatting *********
     char=Asc(Left$(p$,1))
     If char<48 or char>57 Then p$=Mid$(p$,2)
     temp$=formatCost$(Val(p$))
     If Len(temp$)<=7 Then
     cost$(index)=formatCost$(Val(p$))
     'update listbox array
     array$(index)=makeListboxEntry$(index)
     #m1.lb1, "reload"
     #m1.lb1, "selectindex "; index 'keep item selected
     Else
     Notice "Invalid entry"
     End If
     End If
     End If
     Wait
[spare]
     'The number of columns in the list box can be expanded to suit.
     Wait
[info]
     Notice "About Program";Chr$(13);"Formatted Listbox with column labels";Chr$(13);_
     "Data for each column is from a separate array."
     Wait
     '
     [quit]
     Close #m1
     End
Sub disableControl state, strt, fin
     For n=strt to fin
     hC=hCont(n)
     CallDLL #user32, "EnableWindow",_
     hC As long,_
     state As ushort,_
     result As void
     Next n
     End Sub
Function formatLeadingZeros$(fieldWidth, ser$)
     formatLeadingZeros$=Right$("00000",fieldWidth-Len(ser$))+ser$
     End Function
Function formatTrailingSpaces$(fieldWidth, ft$)
     temp$=ft$+Right$(Space$(fieldWidth),fieldWidth-Len(ft$))
     formatTrailingSpaces$=Left$(temp$,fieldWidth) 'truncate if too long
     End Function
Function formatCost$(cost)
     formatCost$="£"+Using("###.##",cost)
     End Function
Function makeListboxEntry$(n)
     makeListboxEntry$=serial$(n)+Space$(1)+item$(n)+Space$(1)+cost$(n)
     End Function
'data to fill arrays for demo
     Data "Socks(2)",5.35,"Tie",7.29,"Shirt",12.50,"Tie pin",1.99,"Gloves",9.95
     Data "Wool jumper",23.68,"Shoes(lace)",57.75,"Tie",8.34,"Slippers",11.67,"Socks(3)",5.49
     Data "Silver Pen",5.35, "Hairbrush",7.29,"Razor",12.50,"Toothbrush",1.99
     Data "Sun lotion",9.95,"Trainers",23.68,"Shoes(slip-on)",57.75,"Mouse",8.34,
     Data "Gold pen",11.67,"Mousemat",3.49


Home

Window Placement Techniques
Listview Report by Brent Thorn
Enhancing Liberty Basic [Array Handling]
The Road to Release
Formatted ListBox