Search Locate Previous Next Contents

Writing the Application Code

It is very easy to get carried away with the Gui stuff and forget that the user-interface is only there as a way for users to run your code! It is good practice to ensure that the entire application can be run from the APL session with no Gui components visible. If you find that you have to get the system into a given ‘state’ – with certain forms visible and various controls clicked – before you can test anything ... watch out!

Of course there is no harm in adding dummy functions to check that the controls run without VALUE ERRORs, but build and test them from the session! Here are my very minimal functions to add and delete rows from the database – add your own bells and whistles to taste ...

     ’ pos„ADDNAME
[1]   © Catenate a new row to our data
[2]    ‘names,„›'(noname)'
[3]    ‘addrs,„›'House' 'Street' 'Town' 'PostCode'
[4]    ‘eyes,„1
[5]    ‘log,„›0 2½0 ''
[6]    pos„½‘eyes
     ’
     ’ new„DELNAME pos
[1]   © Remove marked row(s)
[2]    :If 1<½‘eyes
[3]     msk„~(¼½‘eyes)¹pos
[4]     ‘names„msk/‘names
[5]     ‘addrs„msk/‘addrs
[6]     ‘eyes„msk/‘eyes
[7]     ‘log„msk/‘log
[8]    :End
[9]    new„pos˜½‘eyes
     ’
© Better test it ...
      ‘names     
 Joe Bloggs
      ADDNAME
2
      ‘names
 Joe Bloggs  (noname)
      DELNAME 2
1
      ‘names
 Joe Bloggs

Now for a minimalist file system. We will need to save data to a given file name, and load it back again. Both of these operations should take a snapshot so that the user will be allowed to exit with no warnings if he/she has just loaded a new file, or has not made any changes since the last save.

Here is the code ...

     ’ SAVEFILE fi
[1]   © Save our datafile
[2]    fi„fi,(~'.'¹fi)/'.con'
[3]   © Write data to file!
[4]    fi Put ‘names ‘addrs ‘eyes ‘log
[5]   © Record latest state of data
[6]    ‘was„‘names ‘addrs ‘eyes ‘log
     ’
     ’ OPENFILE fi
[1]   © Read our datafile and note state
[2]    fi„fi,(~'.'¹fi)/'.con'
[3]   © Read data from file!
[4]    ‘names ‘addrs ‘eyes ‘log„Get fi
[5]    ‘was„‘names ‘addrs ‘eyes ‘log
     ’
     ’fi Put var;ŒTRAP
[1]   © Minimalist file system
[2]    ŒTRAP„22 'E' '…New'
[3]    fi ŒFTIE 1 ª …Write
[4]   New:fi ŒFCREATE 1
[5]   Write:ŒFDROP 1,1-1†1‡ŒFSIZE 1
[6]    var ŒFAPPEND 1
[7]    ŒFUNTIE 1
     ’
     ’var„Get fi
[1]   © Minimalist file system
[2]    fi ŒFSTIE 1
[3]    var„ŒFREAD 1 1
[4]    ŒFUNTIE 1
     ’
      ‘file„'demo'
      SAVEFILE ‘file
      NEWFILE

To get the saved data back, we can use the standard Windows file browser to retrieve the name, set this into ‘file, and read the data ...

‘file„Win.Fbx '*.con' 'Contacts files'

      ‘file
C:\DATA\DWS\Demo.con
      OPENFILE ‘file
      ‘names
 Joe Bloggs 

Ignoring, for the moment, the Incidents > button, you now have a completely functional application! Attach the ADDNAME and DELNAME functions to the Select events of the Add and Delete buttons and you should have a main form which looks like:


... notice the space along the top edge for a toolbar. The menu will make space for itself, but toolbars just sit over the top area of the form.

If you have set all the actions correctly, you should be able to add a new entry, tab to the Name field and change it. As you leave the field, the name in the left-hand list box should alter to match! As you move up and down the list box, all three of the boxed fields change to match. Just in case yours doesn’t work yet – here is the complete code from this dialogue box displayed with Disp ...

      Disp ‘Ty’ ‘Caption’ ‘Posn’ ‘Size’ ‘Properties’®dbx.mf

ÚÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ

ÛTyÛCaption ÛPosn ÛSize ÛProperties Û

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛFMÛMy Contacts Û176 36 Û288 568 ÛÚÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û

Û Û Û Û ÛÛBehaviourÛÚÎÎÂÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÂÎÎÌÛ Û

Û Û Û Û ÛÛ ÛÛCRÛÛ¸ ’Do ‘SetIcon’ ‘cau... Û{}ÛÛ Û

Û Û Û Û ÛÛ ÛÃÎÎÏÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÝÛ Û

Û Û Û Û ÛÛ ÛÛCRÛÛinx„1 Û{}ÛÛ Û

Û Û Û Û ÛÛ ÛÀÎÎÁÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÁÎÎÙÛ Û

Û Û Û Û ÛÃÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ Û

Û Û Û Û ÛÛLocals Û{inx} Û Û

Û Û Û Û ÛÀÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛLSÛ Û40 16 Û¯108 152 ÛÚÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û

Û Û Û Û ÛÛIndicesÛÚÎÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌÛ Û

Û Û Û Û ÛÛ ÛÛExpressionÛinx ÛÛ Û

Û Û Û Û ÛÛ ÛÃÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝÛ Û

Û Û Û Û ÛÛ ÛÛDependenceÛ{inxÛ‘namesÛ‘file}ÛÛ Û

Û Û Û Û ÛÛ ÛÀÎÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙÛ Û

Û Û Û Û ÛÃÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ Û

Û Û Û Û ÛÛItems ÛÚÎÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û Û

Û Û Û Û ÛÛ ÛÛExpressionÛ‘names Û Û Û

Û Û Û Û ÛÛ ÛÃÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ Û Û

Û Û Û Û ÛÛ ÛÛDependenceÛ{‘namesÛ‘file}Û Û Û

Û Û Û Û ÛÛ ÛÀÎÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û Û

Û Û Û Û ÛÀÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛTXÛName ... Û64 208 Û20 ¯232 ÛÚÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û

Û Û Û Û ÛÛTextÛÚÎÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÌÛ Û

Û Û Û Û ÛÛ ÛÛExpressionÛinxœ‘names ÛÛ Û

Û Û Û Û ÛÛ ÛÃÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÝÛ Û

Û Û Û Û ÛÛ ÛÛDependenceÛ{inxÛ‘names}ÛÛ Û

Û Û Û Û ÛÛ ÛÀÎÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÙÛ Û

Û Û Û Û ÛÀÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛNPÛAddress ... Û108 208Û¯156 ¯356ÛÚÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û

Û Û Û Û ÛÛTextÛÚÎÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÌÛ Û

Û Û Û Û ÛÛ ÛÛExpressionÛinxœ‘addrs ÛÛ Û

Û Û Û Û ÛÛ ÛÃÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÝÛ Û

Û Û Û Û ÛÛ ÛÛDependenceÛ{inxÛ‘addrs}ÛÛ Û

Û Û Û Û ÛÛ ÛÀÎÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÙÛ Û

Û Û Û Û ÛÀÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛRBÛEyes Û104 ¯24Û100 112 ÛÚÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û

Û Û Û Û ÛÛStyle Û{Smalltext} Û Û

Û Û Û Û ÛÃÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ Û

Û Û Û Û ÛÛIndex ÛÚÎÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÌÛ Û

Û Û Û Û ÛÛ ÛÛExpressionÛinxœ‘eyes ÛÛ Û

Û Û Û Û ÛÛ ÛÃÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÝÛ Û

Û Û Û Û ÛÛ ÛÛDependenceÛ{inxÛ‘eyes}ÛÛ Û

Û Û Û Û ÛÛ ÛÀÎÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÙÛ Û

Û Û Û Û ÛÃÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ Û

Û Û Û Û ÛÛLabelsÛÚÎÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÌ Û Û

Û Û Û Û ÛÛ ÛÛExpressionÛ‘eyecolourÛ Û Û

Û Û Û Û ÛÛ ÛÀÎÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÙ Û Û

Û Û Û Û ÛÀÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛACÛ&Add Û¯32 16 Û28 72 ÛÚÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û

Û Û Û Û ÛÛBehaviourÛÚÎÎÂÂÎÎÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÌÛ Û

Û Û Û Û ÛÛ ÛÛSLÛÛinx„ADDNAMEÛ{‘namesÛinx}ÛÛ Û

Û Û Û Û ÛÛ ÛÀÎÎÁÁÎÎÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÙÛ Û

Û Û Û Û ÛÀÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛACÛ&Delete Û¯32 92 Û28 72 ÛÚÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌÛ

Û Û Û Û ÛÛBehaviourÛÚÎÎÂÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÌÛÛ

Û Û Û Û ÛÛ ÛÛSLÛÛinx„DELNAME inxÛ{‘namesÛinx}ÛÛÛ

Û Û Û Û ÛÛ ÛÀÎÎÁÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÙÛÛ

Û Û Û Û ÛÀÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙÛ

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛGVÛ Û40 196 Û¯76 ¯204 ÛÚÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û

Û Û Û Û ÛÛDepthÛÚÎÎÎÎÎÎÎÎÎÎÂÎÎÌÛ Û

Û Û Û Û ÛÛ ÛÛExpressionÛ-1ÛÛ Û

Û Û Û Û ÛÛ ÛÀÎÎÎÎÎÎÎÎÎÎÁÎÎÙÛ Û

Û Û Û Û ÛÀÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛSTÛ Û264 0 Û24 568 ÛÚÎÎÎÎÎÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û

Û Û Û Û ÛÛStyle Û{Smalltext} Û Û

Û Û Û Û ÛÃÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÝ Û

Û Û Û Û ÛÛBehaviourÛÚÎÎÂÂÎÎÎÎÂÎÎÌÛ Û

Û Û Û Û ÛÛ ÛÛCRÛÛsb„¸Û{}ÛÛ Û

Û Û Û Û ÛÛ ÛÀÎÎÁÁÎÎÎÎÁÎÎÙÛ Û

Û Û Û Û ÛÀÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û

ÃÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÝ

ÛACÛ&Incidents >Û¯48 ¯24Û24 112 ÛÚÎÎÎÎÂÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÌ Û

Û Û Û Û ÛÛHintÛUpdate incident logÛ Û

Û Û Û Û ÛÀÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ Û

ÀÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÁÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÙ

The event table is still quite simple, but note the button actions which also set the index to the new entry, so need to ‘holler’ it to ensure the list box moves the highlight and the name/address/eyes fields get redrawn. The ‘Incident’ button has a suitable hint, but does not do anything yet.

As a system for your personal use, this is probably OK as it is, but if you want to ship it as a runtime application, then the next stage is obviously to hook up the file functions to a menu bar, and probably to duplicate them on a standard ‘Office-style’ toolbar.



Continue to: Adding Menus and Toolbars
© Copyright Causeway Graphical Systems Ltd 2001