[futurebasic] Re: [FB] List boxes

Message: < previous - next > : Reply : Subscribe : Cleanse
Home   : July 2003 : Group Archive : Group : All Groups

From: "J. Smith" <jsmithxx@...>
Date: Fri, 25 Jul 2003 18:36:21 -0400
Where in this code should you read what item was clicked...and how (code) ??

J Smith

> From: Alain Pastor <apastor@...>
> Organization: Pix & Mix
> Reply-To: futurebasic@...
> Date: Fri, 25 Jul 2003 21:40:04 +0200
> To: futurebasic@...
> Subject: Re: [FB] List boxes
> 
> 
> 
> Bernie Wylde wrote:
>> Dear All,
>> 
>> It appears we can create list boxes in a number of different ways. What
>> appears to be the simplest and most straightforward method (to me) is
>> described on page 44 of the manual where it recommends creating an
>> 'ldes' resource with Resorcerer 2.4 or a template in any resource
>> editor. As I'm not about to fork out $256.00 for Resorcerer, can anyone
>> get me started on creating a template in say ResEdit?
>> 
>> Alternatively, there's a demo file on the CD, 'simple list in Carbon'
>> which eliminates the need for a resource editor. The problem I have with
>> this method is that a click on the list box doesn't generate a button
>> click event. So, do we instead have to detect mouse clicks and calculate
>> the selected cell from mouse position?
>> 
>> Hope I've made this clear. Any help appreciated.
>> 
> 
> Bernie,
> 
> maybe that one can help:
> 
> 
> 
> '~'A
> '                       Runtime : Rntm Appearance.Incl
> '                           CPU : Carbon
> '                    CALL Req'd : Off
> '~'B
> 
> /*
> With the Appearance Manager came a bazillion of new controls
> and among them we can find a control that display lists which
> can be easily built with the APPEARANCE BUTTON statement and
> the _kControlListBoxProc attribute.
> The caveat with that puppy is that no matter what you do
> to install a list after this, nothing happens unless you
> provide also a valid ldes resource to the procedure that
> creates the control in the first place.
> To solve the problem, therefore you need to add a ldes
> resource to your application resource file.
> Or you can use the trick below that allows you to build
> listbox controls on the fly.
> The program creates a simple temporary ldes resource to trick
> the Control Manager then the list can be inserted without
> problem. The temporary ldes resource is deleted after
> the installation of the list.
> by Alain Pastor
> with modifications by Robert P.     26 September 2001
> */
> 
> 
> #if ndef _appearanceRuntime
> compile shutdown "Must be compiled as an Appearance project"
> #endif
> 
> 
> _listBtn = 10
> 
> begin record ldesRec
> dim version       as short
> dim rows          as short
> dim column        as short
> dim cellHeight    as short
> dim cellWidth     as short
> dim hasVertScroll as boolean
> dim reserved1     as byte
> dim hasHorzScroll as boolean
> dim reserved2     as byte
> dim resID         as short
> dim hasSizeBox    as boolean
> dim reserved3     as byte
> end record
> 
> clear local mode
> local fn GetldesResID( listRectPtr as .rect )
> dim resH  as ..ldesRec
> dim resID as short
> 
> SetResLoad( _false )
> resH = fn GetResource( _"ldes", 128 )
> long if resH
> resID = 128 'ID reserved for resource based list control
> xelse
> resH = fn NewHandleClear( sizeof( ldesRec ) )
> long if resH
> resH..column        = 1
> resH..hasVertScroll = 1
> resH..cellWidth     = (listRectPtr.right - listRectPtr.left)
> resH..cellHeight    = 1.4 * usr FontHeight
> do
> resID = fn Unique1ID(_"ldes")
> until resID > 128
> AddResource( resH, _"ldes", resID, "" )
> long if fn ResError == _noErr
> ReleaseResource( resH )
> xelse
> resID = 0
> DisposeHandle( resH )
> end if
> end if
> end if
> SetResLoad( _true )
> end fn = resID
> 
> 
> clear local mode
> local fn RemoveldesRes( listResID as short )
> dim resH as handle
> 
> resH = fn GetResource( _"ldes", listResID )
> long if resH
> RmveResource( resH )
> long if fn ResError = _noErr
> DisposeHandle( resH )
> end if
> end if
> end fn
> 
> 
> local mode
> local fn PutListInButton( list(_maxInt) as str255, btnID as long )
> dim as short    i, nbItems
> dim as point    theCell
> dim as handle @ listH
> dim as long   @ actualSize
> 
> nbItems = val&( list(0) ) '1st str in array = number of items
> if nbItems == _nil then exit fn
> 
> def GetButtonData( btnID, _kControlListBoxPart, ¬
> _kControlListBoxListHandleTag, sizeof(listH), listH, actualSize )
> 
> long if listH
> LSetDrawingMode( _zTrue, listH )
> LDelRow( 0, 1, listH )
> theCell.h% = 0
> for i = 1 to nbItems
> theCell.v% = fn LAddRow( 1, i, listH )
> LSetCell( @list(i)+1, |@list(i)|, theCell, listH )
> next
> 
> end if
> 
> end fn
> 
> 
> clear local fn BuildWnd
> dim listResID       as short
> dim r               as rect
> dim stringArray(20) as str255
> 
> SetRect( r, 0, 0, 250, 130 )
> window -1, "List Box", @r, _docNoGrow
> def SetWindowBackground(_kThemeActiveDialogBackgroundBrush, _zTrue )
> InsetRect(r, 8, 8 )
> listResID = fn GetldesResID( r )
> appearance button _listBtn, _activeBtn,listResID,0,0, ¬
> "", @r,_kControlListBoxProc
> if listResID > 128 then fn RemoveldesRes( listResID )
> 
> stringArray(0) = "9"//number of items
> stringArray(1) = "One"
> stringArray(2) = "Two"
> stringArray(3) = "Three"
> stringArray(4) = "Four"
> stringArray(5) = "Five"
> stringArray(6) = "Six"
> stringArray(7) = "Seven"
> stringArray(8) = "Height"
> stringArray(9) = "Nine"
> 
> fn PutListInButton( stringArray(0), _listBtn )
> window 1
> 
> end fn
> 
> 
> local fn DoDialog
> dim as long   evnt, id
> evnt = dialog( 0 )
> id   = dialog( evnt )
> 
> select evnt
> case _wndClose
> end
> case _btnClick : beep
> end select
> end fn
> 
> on dialog fn DoDialog
> menu 1, 0, 1, "File"
> menu 1, 1, 1, "Quit/Q"
> edit menu 2
> fn BuildWnd
> do
> handleevents
> until _nil
> end
> 
> 
> 
> --
> To unsubscribe, send ANY message to <futurebasic-unsubscribe@...>
>