PmU*f @ @"Data.app1@ .12 3 7 @@@0 @A&@AB18ColA19ColB19 ,AReturns the absolute value of a floating-point number that is, without any +/- sign for example ABS(-10.099) is 10.099 If x is an integer, you wont get an error, but the result will be converted to floating-point for example ABS(-6) is 6.0. Use IABS to return the absolute value as a long integer.5BReturns the address at which variable is stored in memory. The values of different types of variables are stored in bytes starting at ADDR(variable). See PEEK for details. The maximum address is guaranteed to be less than 64K on the Series 3c, while it is not on the Series 5. The return type therefore must be a long integer on the Series 5, but may be an integer on the Series 3c. (3) See SETFLAGS if you require the 64K limit to be enforced on the Series 5. If the flag is set to restrict the limit, a& is guaranteed to fit into an integer. See UADD, USUB.tCOpens or closes a gap at off& (off%) within the allocated cell pcell& (pcell%), returning the new cell address or zero if out of memory. off& (off%) is 0 for the first byte in the cell. Opens a gap if the amount am& (am%) is positive, and closes it if negative. The number of bytes allocated is restricted to 64K on the Series 3c, while it is not on the Series 5. The return type therefore must be a long integer on the Series 5, but may be an integer on the Series 3c. Cells are allocated lengths that are the smallest multiple of four greater than the size requested. An error will be raised if the cell address argument is not in the range known by the heap. See also SETFLAGS if you require the 64K limit to be enforced on the Series 5. If the flag is set to restrict the limit, pcelln& is guaranteed to fit into an integer. See ALLOC. See also the Advanced Topics chapter.BPresents an alert - a simple dialog - with the messages and keys specified, and waits for a response. m1$ is the message to be displayed on the first line, and m2$ on the second line. If m2$ is not supplied or if it is a null string, the second message line is left blank. Up to three keys may be used. b1$, b2$ and b3$ are the strings (usually words) to use over the keys. b1$ appears over an Esc key, b2$ over Enter, and b3$ over Space. This means you can have Esc, or Esc and Enter, or Esc, Enter and Space keys. If no key strings are supplied, the word CONTINUE is used above an Esc key. The key number 1 for Esc, 2 for Enter or 3 for Space is returned. Constants for these return values are supplied in Const.oph.A"Times New Roman h8p @  xHP X Times New Roman"Times New Roman   E^on"Times New Romanf@iTable1 ColA17 ColB17ColA18ColB18ColA19ColB19 Index1ColA17  ColA17 BAllocates a cell on the heap of the specified size, returning the pointer to the cell or zero if there is not enough memory. The number of bytes allocated is restricted to 64K on the Series 3c, while it is not on the Series 5. The return type therefore must be a long integer on the Series 5, but may be an integer on the Series 3c. Cells are allocated lengths that are the smallest multiple of four greater than the size requested. An error will be raised if the cell address argument is not in the range known by the heap. See also SETFLAGS if you require the 64K limit to be enforced. If the flag is set to restrict the limit, pcelln& is guaranteed to fit into an integer. See ADJUSTALLOC, REALLOC, FREEALLOC.BBegins definition of an OPL application. caption is the applications name (or caption) in the machines default language. Note that although caption is a string, it is not enclosed in quotes. uid& is the applications UID. For distributed applications, official reserved UIDs must be used. These can be obtained by contacting Psion Software plc (see the OPL applications section in the Advanced Topics chapter for details of how to do this). All information included in the APP...ENDA structure will be used to generate an AIF file which specifies the applications caption in various languages, its icons for use on the System screen and its setting of FLAGS. See the Advanced Topics chapter for further details of this. See CAPTION, ICON, FLAGS.DAdds a new record to the end of the current data file. The record which was current is unaffected. The new record, the last in the file, becomes the current record. The record added is made from the current values of the field variables A.field1$, A.field2$, and so on, of the current data file. If a field has not been assigned a value, zero will be assigned to it if it is a numeric field, or a null string if it is a string field. Example: PROC add:  OPEN address,A,f1$,f2$,f3$  PRINT ADD NEW RECORD  PRINT Enter name:,  INPUT A.f1$  PRINT Enter street:,  INPUT A.f2$  PRINT Enter town:,  INPUT A.f3$  APPEND  CLOSE ENDP To overwrite the current record with new field values, use UPDATE.  On the Series 5, INSERT, PUT and CANCEL should be used in preference to APPEND and UPDATE, although APPEND and UPDATE are still supported for Series 3c compatibility. However, note that APPEND can generate a lot of extra (intermediate) erased records. COMPACT should be used to remove them, or alternatively use SETFLAGS to set auto-compaction on.  See the Series 5 Database Handling chapter for more details. See also INSERT, MODIFY, PUT, CANCEL, SETFLAGSA"Times New Roman:.  /$5 , b "Courier$"Times New Roman"Times New Roman@Table1Command  dUsage dText dAReturns the character code of the first character of a$. For the Series 5, see Appendix D for the character set and for the Series 3c, see the character set in the back of the User Guide for the character codes. Alternatively, use A%=%char to find the code for char - e.g. %X for X. If a$ is a null string () ASC returns the value 0. Example: A%=ASC(hello) returns 104, the code for h.VDPositions the cursor at x% characters across the text window and y% rows down. AT 1,1 always moves to the top left corner of the window. Initially, the window is the full size of the screen, but you can change its size and position with the SCREEN command. A common use of AT is to display strings at particular positions in the text window. For example: AT 5,2 :PRINT message.  PRINT statements without an AT display at the left edge of the window on the line below the last PRINT statement (unless you use , or ;) and strings displayed at the top of the window eventually scroll off as more strings are displayed at the bottom of the window.  Displayed strings always overwrite anything that is on the screen - they do not cause things below them on the screen to scroll down.  Example: PROC records:  LOCAL k%  OPEN clients,A,name$,tel$  DO  CLS  AT 1,7  PRINT Press a key to  PRINT step to next record  PRINT or Q to quit  AT 2,3 :PRINT A.name$  AT 2,4 :PRINT A.tel$  NEXT  IF EOF  AT 1,6 :PRINT EndOfFile  FIRST  ENDIF  k%=GET  UNTIL k%=%Q OR k%=%q  CLOSE ENDPwB"Times New Roman  h8p @  xHP X "Times New Roman  h8p @  xHP X Times New Roman"Times New Romanc      "Times New Roman DSounds the buzzer. The beep lasts for time%/32 seconds so for a beep a second long make time%=32, etc. The maximum is 3840 (2 minutes). The pitch (frequency) of the beep is 512/(pitch%+1) KHz. BEEP 5,300 gives a comfortably pitched beep. If you make time% negative, BEEP first checks whether the sound system is in use (perhaps by another OPL program), and returns if it is. Otherwise, BEEP waits until the sound system is free. Example a scale from middle C: PROC scale:  LOCAL freq,n% REM n% relative to middle A  n%=3 REM start at middle C  WHILE n%<16  freq=440*2**(n%/12.0) REM middle A = freq 440Hz  BEEP 8,512000/freq-1.0  n%=n%+1  IF n%=4 OR n%=6 OR n%=9 OR n%=11 OR n%=13  n%=n%+1  ENDIF  ENDWH ENDP  Alternatively, sound the buzzer with this statement: PRINT CHR$(7). This produces a click sound. Note that on the Series 5 if your batteries are low BEEP may not produce the desired effect: the buzzer will be used instead to produce the beep. The buzzer produces a higher pitched sound.AThis converts days&, the number of days since 1/1/1900, to the corresponding date, returning the day of the month to day%, the month to month% and the year to year%. This is useful for converting the value set by dDATE, which also gives days since 1/1/1900._ABegins a transaction on the current database. The purpose of this is to allow changes to a database to be committed in stages. Once a transaction has been started on a view (or table) then all database keywords will function as usual, but the changes to that view will not be made until COMMITTRANS is used. See also COMMITTRANS, ROLLBACK, INTRANS.L-%YBA>T5QABSUsage: a=ABS(x) ,k"Times New Romanx"Times New RomanACOSUsage: a=ACOS(x)Returns the arc cosine, or inverse cosine (COS-1) of x. x must be in the range -1 to +1. The number returned will be an angle in radians. To convert the angle to degrees, use the DEG function.k"Times New Roman:"Times New RomanADDRUsage: a&=ADDR(variable) 5z"Times New Roman=r"Times New Roman ADJUSTALLOC%pcelln&=ADJUSTALLOC(pcell&,off&,am&)tz"Times New Roman32"Times New Roman}ALERTrr%=ALERT(m1$,m2$,b1$,b2$,b3$) r%=ALERT(m1$,m2$,b1$,b2$) r%=ALERT(m1$,m2$,b1$) r%=ALERT(m1$,m2$) r%=ALERT(m1$)z"Times New Roman "Times New Romanu"Times New Roman@C=<"Times New RomanALLOCpcell&=ALLOC(size&)z"Times New Roman~%$"Times New RomanAPPAPP caption,uid&u"Times New Roman"Times New RomanAPPENDAPPENDASC a%=ASC(a$)u"Times New Roman;665"Times New RomanASIN a=ASIN(x)Returns the arc sine, or inverse sine (SIN-1) of x. x must be in the range -1 to +1. The number returned will be an angle in radians. To convert the angle to degrees, use the DEG function.k"Times New Roman6"Times New RomanAT AT x%,y%VwATAN a=ATAN(x)Returns the arc tangent, or inverse tangent (TAN-1) of x. The number returned will be an angle in radians. To convert the angle to degrees, use the DEG function.k"Times New Roman<hg"Times New RomanBACKBACKMakes the previous record in the current data file the current record. If the current record is the first record in the file, then the current record does not change.k"Times New RomanH`_"Times New RomanBEEPBEEP time%,pitch%  BEGINTRANS BEGINTRANS_k"Times New Roman6)("Times New RomanBOOKMARK b%=BOOKMARKPuts a bookmark at the current record of the current database view. The value returned can be used in GOTOMARK to make the record current again. Use KILLMARK to delete the bookmark.D"Times New RomanFCBUSY str$ displays str$ in the bottom left of the screen, until BUSY OFF is called. Use this to indicate Busy messages, usually when an OPL program is going to be unresponsive to keypresses for a while. If c% is given, it controls the corner in which the message appears: c%corner 0top left 1bottom left (default) 2top right 3bottom right Constants for these corner values are supplied in Const.oph. delay% specifies a delay time (in half seconds) before the message should be shown. Use this to prevent Busy messages from continually appearing very briefly on the screen. Only one message can be shown at a time. The maximum string length of a BUSY message is 80 characters on the Series 5, and an Invalid argument error is returned for any value in excess of this. On the Series 3c, the maximum length is 19 characters.ESpecifies an OPAs public name (or caption) for a particular language, which will appear below its icon on the Extras bar and in the list of Programs in the New File dialog (assuming the setting of FLAGS allows these) when the language is that used by the machine. CAPTION may only be used inside an APP...ENDA construct. The language code specifies for which language variant the caption should be used, so that the caption need not be changed when used on a different language machine. If used, for whatever language, CAPTION causes the default caption given in the APP declaration to be discarded. Therefore CAPTION statements must be supplied for every language in which the application is liable to be used, including the language of the machine on which the application is originally developed. The values of the language code should be one of the following: English 1French 2 German 3Spanish 4 Italian 5Swedish 6Danish 7Norwegian 8 Finnish 9American 10Swiss-French 11Swiss-German 12 Portuguese 13Turkish 14Icelandic 15Russian 16 Hungarian 17Dutch 18Belgian-Flemish 19Australian 20 Belgian-French 21Austrian 22New Zealand 23International French 24 Constants for the language codes are supplied in Const.oph. The maximum length of caption$ is 255 characters. However, you should bear in mind that a caption longer than around 8 characters will not fit neatly below the applications icon on the Extras bar. See APP.tACloses the current view on a database. If there are no other views open on the database then the database itself will be closed. See SETFLAGS for details of how to set auto-compaction on closing files. If youve used ERASE to remove some records, CLOSE recovers the memory used by the deleted records, provided it is held either in the internal memory, on a memory disk.@Returns the command-line arguments passed when starting a program. Null strings may be returned. x% should be from 1 to 3 for the Series 5 and may be up to 5 on the Series 3c. CMD$(2) to CMD$(5) are only for OPL applications. CMD$(1) returns the full path name used to start the running program. CMD$(2) returns the full path name of the file to be used by an OPL application. On the Series 5, if the CMD$(3)=R (see below), a default filename, including path, is passed in CMD$(2). CMD$(3) returns C for Create file or O for Open file and may also return R on the Series 5. If the OPL application is being run with a new filename, this will return C. This happens the very first time the OPL application is used, and whenever a new filename is used to run it. Otherwise, the OPA is being run with the name of an existing file, and CMD$(3) will return O if it is selected directly from the system screen. R (Series 5 only) is returned if your application has been run from the Program editor or has been selected via the Applications icon on the Extras bar, and not by the selection or creation of one of your documents from the system screen. Constants for the array elements (1-3) and for the return values of CMD$(3) are supplied in Const.oph. See also GETCMD$.ZACompacts the database file$, rewriting the file in place. All views on the database and the hence the file itself should be closed before calling this command. This should not be done to often since it uses considerable processor power. Compaction can also be done automatically on closing a file by setting the appropriate flag using SETFLAGS. CDeclares constants which are treated as literals, not stored as data. The declarations must be made outside any procedure, usually at the beginning of the module. KConstantName has the normal type-specification indicators (%, &, $ or nothing for floating-point numbers). CONST values have global scope, and are not overridden by locals or globals with the same name: in fact the translator will not allow the declaration of locals or globals of the same name. By convention, all constants should be named with a leading K to distinguish them from variables. It should be noted that it is not possible to define constants with values -32768 (for integers) and -214748648 (for long integers) in decimals, but hexadecimal notation may be used instead (i.e. values of $8000 and &80000000 respectively).CCopies the file src$, which may be of any type, to the file dest$. Any existing file with the name dest$ is deleted. You can copy across devices. On the Series 3c you can use the appropriate file extensions to indicate the type of file, and on all machines use wildcards if you wish to copy more than one file at a time.  If src$ contains wildcards, dest$ must not specify a filename, just the device and directory to which the files are to be copied under their original names. You must specify either an extension or .* on the first filename. The file type extensions are listed in the User Guide. Example: To copy all the OPL files from internal memory (in \OPL) to B:\ME\: COPY M:\OPL\*.OPL,B:\ME\ (Remember the final backslash on the directory name.) See COMPRESS for more control over copying data files. If you use COPY to copy a data file, deleted records are copied and you cannot append to another data file. There are more details of full file specifications in the Advanced topics chapter.N$EA qy5}BREAKBREAKMakes a program performing a DO...UNTIL or WHILE...ENDWH loop exit the loop and immediately execute the line following the UNTIL or ENDWH statement.D"Times New Roman}BUSY7BUSY str$,c%,delay% BUSY str$,c% BUSY str$ BUSY OFFu"Times New Roman  "Times New RomanF"Times New Roman F   >"Times New RomanBYREFBYREF variablePasses variable by reference to an OPX procedure when used in a procedure argument list. This means that the value of the variable may be changed by the procedure. See the Using OPXs on the Series 5 chapter for more details.k"Times New Roman?>"Times New RomanCANCELCANCELeMarks the end of a databases INSERT or MODIFY phase and discards the changes made during that phaseDed"Times New RomanCAPTIONCAPTION caption$,languageCode%"Times New Roman HA%'4/5C= "Times New RomanCHR$ a$=CHR$(x%)Returns the character with character code x%. You can use it to display characters not easily available from the keyboard. For example, the instruction PRINT CHR$(133) displays an ellipsis (...).k"Times New Roman0"Times New Roman CLEARFLAGSCLEARFLAGS flags&xClears the flags given in flags& if they have previously been set by SETFLAGS, returning to the default. See SETFLAGS.k"Times New Romanj "Times New RomanCLOSECLOSEtk"Times New Roman"Times New RomanCLSCLSClears the contents of the text window. The cursor then goes to the beginning of the top line. If you have used CURSOR OFF the cursor is still positioned there, but is not displayed.k"Times New Roman)"Times New RomanCMD$ c$=CMD$(x%) "Times New RomanGh"Times New Roman COMMITTRANS COMMITTRANSVCommits the transaction on the current view. See also BEGINTRANS, ROLLBACK, INTRANS.k"Times New Roman.('"Times New RomanCOMPACTCOMPACT file$!Zk"Times New Romanlk"Times New RomanCONTINUE CONTINUEMakes a program immediately go to the UNTIL... line of a DO...UNTIL loop or the WHILE... line of a WHILE...ENDWH loop i.e. to the test condition. See also BREAK.k"Times New Roman"Times New RomanCONST"CONST KConstantName=constantValue" k"Times New Roman/"Times New RomanCOPYCOPY src$,dest$#"Times New RomanCzN7UT"Times New RomanCOS c=COS(x)uReturns the cosine of x, where x is an angle in radians. To convert from degrees to radians, use the RAD function.k"Times New Roman;:9"Times New RomanCAReturns the number of records in the current data file. This number will be 0 if the file is empty. If you try to count the number of records in a view while updating the view an Incompatible update mode error will be raised (This will occur between assignment and APPEND / UPDATE or between MODIFY / INSERT and PUT).B dh8p @  xHP X "Times New Roman d h8p @  xHP "Times New Roman d6Ql  ) D _z7Rm"Times New Roman;"7QP"Times New Roman,A"Times New Roman h8p @  xHP X "Times New RomanS,+*"Times New RomanAReturns the number of seconds since 00:00 on 1/1/1970 at the date/time specified. Raises an error for dates before 1/1/1970. The value returned is an unsigned long integer. (Values up to +2147483647, which is 03:14:07 on 19/1/2038, are returned as expected. Those from +2147483648 upwards are returned as negative numbers, starting from -2147483648 and increasing towards zero.) See also SECSTODATE, HOUR, MINUTE, SECOND.;@O&'imes New Roman RT and PUT).VGCreates a table in a database. The database is also created if necessary. Immediately after calling CREATE, the file and view (or table) is open and ready for access. tableSpec$ contains the database filename and optionally a table name and the field names to be created within that table. For example: CREATE clients FIELDS name(40), tel TO phone, D, n$, t$ The filename is clients. The table to be created within the file is phone. The comma-separated list, between the keywords FIELDS and TO, specifies the field names whose types are specified by the field handles (i.e. n$, t$). The name field has a length of 40 bytes, as specified within the brackets that follow it. The tel field has the default length of 255 bytes. This mechanism is necessary for creating some indexes. See the Using OPXs on the Series 5 chapter for more details on index creation. The filename may be a full file specification of up to 255 characters. A field name may be up to a maximum of 64 characters long. Text fields have a default length of 255 bytes. log specifies the logical file name A to Z. This is used as an abbreviation for the file name when you use other data file commands such as USE. Compatibility with the Series 3c As on the Series 3c, the table specification may contain just the filename. In this case the table name will default to Table1 and the field names will be derived from the handles: $ replaced by s, % by i, and & by a. E.g. n$ becomes ns. Knowing this allow views to be opened on tables (called Table1) that were created with the OPL16 method. However, it would be better to create the fields with proper names in the first place. For example: CREATE clients,A,n$,t%,d& is a short version of CREATE clients FIELDS ns,ti,da TO Table1,A,n$,t%,d& both creating Table1. Database clients is also created if it does not yet exist.AReturns the current date and time from the system clock as a string - for example: Fri 16 Oct 1992 16:25:30. The string returned always has this format - 3 mixed-case characters for the day, then a space, then 2 digits for the day of the month, and so on. (Constants for offsets of each elements within the string (to be used with MID$, for example) are supplied in Const.oph. The Date OPX provides a large set of procedures for manipulating dates and for accurate timing.@\cefd\c efd.AJ7QP"Times New RomanDCURSOR ON switches the text cursor on at the current cursor position. Initially, no cursor is displayed. You can switch on a graphics cursor in a window by following CURSOR with the ID of the window. This replaces any text cursor. At the same time, you can also specify the cursors shape, and its position relative to the baseline of text. asc% is the ascent - the number of pixels (-128 to 127) by which the top of the cursor should be above the baseline of the current font. h% and w% (both from 0 to 255) are the cursors height and width. If you do not specify them, the following default values are used: asc%font ascent h%font height w%2 If type% is given, it can have these effects: 2 not flashing 4grey You can add these values together to combine effects - if type% is 6 a grey non-flashing cursor is drawn. The Series 3c also supports an obloid cursor by specifying a type% of 1. Using type%=1 on the Series 5 just displays a default graphics cursor, as though no type had been specified. Constants for these types are supplied in Const.oph. An error is raised if id% specifies a bitmap rather than a window. CURSOR OFF switches off any cursor.BConverts x%, a number from 1 to 7, to the day of the week, expressed as a three letter string. E.g. d$=DAYNAME$(1) returns MON. Example: PROC Birthday: LOCAL d&,m&,y&,dWk%  DO  dINIT  dTEXT ,Date of birth,2  dTEXT ,eg 23 12 1963,$202  dLONG d&,Day,1,31  dLONG m&,Month,1,12  dLONG y&,Year,1900,2155  IF DIALOG=0 :BREAK :ENDIF  dWk%=DOW(d&,m&,y&)  CLS :PRINT DAYNAME$(dWk%),  PRINT d&,m&,y&  dINIT dTEXT ,Again?,$202  dBUTTONS No,%N,Yes,%Y  UNTIL DIALOG<>%y ENDP See also DOW.BReturns the number of days since 1/1/1900. Use this to find out the number of days between two dates. Example: PROC deadline: LOCAL a%,b%,c%,deadlin& LOCAL today&,togo% PRINT What day? (1-31) INPUT a% PRINT What month? (1-12) INPUT b% PRINT What year? (19??) INPUT c% deadlin&=DAYS(a%,b%,1900+c%) today&=DAYS(DAY,MONTH,YEAR) togo%=deadlin&-today& PRINT togo%,days to go GET ENDP See also dDATE, SECSTODATE. (The Date OPX provides a large set of procedures for manipulating dates and for accurate timing.ACreates a dialog checkbox entry. This is similar to a choice list with two items, except that the list is replaced by a checkbox with the tick either on or off. The state of the checkbox is maintained across calls to the dialog. Initially you should set the live variable chk% to 0 to set the tick symbol off and to any other value to set it on. chk% is then automatically set to 0 if the box is unchecked or -1 if it is checked when the dialog is closed. See also dINIT.A"Times New Roman%#y?   .5 ;   "Times New Roman go GET ENDP See also dDATE, SECSTODATE. (The Date OPX provides a large set of procedures for manipulating dates and for accurate timing.@Defines exit keys to go at the bottom or the side (see dINIT) of a dialog. Each pair of p$ and k% specifies an exit key; p$ is the text to be displayed on it, while k% is the keycode of the shortcut key. DIALOG returns the keycode of the key pressed (in lower case for letters). For alphabetic keys, use the % sign - %A means the code of A, and so on. The shortcut key is then Ctrl+alphabetic key on the Series 5. An appendix lists the codes for keys (such as Tab) which are not part of the character set. If you use the code for one of these keys, its name (e.g. Tab, or Enter) will be shown in the key. The following effects may be obtained by adding the appropriate constants to the shortcut key keycode: effect -- constant value display a button with no shortcut key label underneath it -- 256 ($100) use the key alone (without the Ctrl modification) as the shortcut key -- 512 ($200) Constants for these flags and keycodes for Esc and other keys are supplied in Const.oph. If you use a negative value for a k% argument, that key is a Cancel key. The corresponding positive value is used for the key to display and the value for DIALOG to return, but if you do press this key to exit, the var variables used in the commands like dEDIT, dTIME etc. will not be set. When using a negative shortcut to specify the cancel button, you must negate the shortcut together with any added flags. The Esc key will always cancel a dialog box, with DIALOG returning 0. If you want to show the Esc key as one of the exit keys, use -27 as the k% argument (its keycode is 27) so that the var variables will not be set if Esc is pressed. There can be only one dBUTTONS item per dialog. (The buttons take up two lines on the screen. dBUTTONS may be used anywhere between dINIT and DIALOG; the postion of its use does not affect the position of the buttons in the dialog. Some keypresses cannot be specified.This example presents a simple query, returning False for No, or True for Yes, providing shortcut keys of N and Y respectively and without labels beneath the keys. PROC query:  dINIT  dTEXT ,FORGET CHANGES,2  dTEXT ,Sure?,$202  dBUTTONSa No,-(%N OR $100 OR $200),Yes,%Y OR $100 OR $200  RETURN DIALOG=%y ENDP  See also dINIT.BDefines an edit box for a date, to go in a dialog. p$ will be displayed on the left side of the line. lg&, which must be a LOCAL or a GLOBAL variable, specifies the date to be shown initially. Although it will appear on the screen like a normal date, for example 15/03/92, lg& must be specified as days since 1/1/1900. min& and max& give the minimum and maximum values which are to be allowed. Again, these are in days since 1/1/1900. An error is raised if min& is higher than max&. When you finish using the dialog, the date you entered is returned in lg&, in days since 1/1/1900. The system setting determines whether years, months or days are displayed first. See also DAYS, SECSTODATE,DAYSTODATE, dINIT.*"Times New Roman)DDefines a choice list to go in a dialog. p$ will be displayed on the left side of the line. list$ should contain the possible choices, separated by commas - for example, No,Yes. One of these will be displayed on the right side of the line, and arrow keys can be used to move between the choices. choice% must be a LOCAL or a GLOBAL variable. It specifies which choice should initially be shown - 1 for the first choice, 2 for the second, and so on. When you finish using the dialog, choice% is given a value indicating which choice was selected - again, 1 for the first choice, and so on. (On the Series 5, dCHOICE supports an unrestricted number of items (up to memory limits). To extend a dCHOICE list, add a comma after the last item on the line followed by ... (three full-stops), as shown in the usage above. choice% must be the same on all the lines, otherwise an error is raised. For example, the following specifies items i1, i2, i3, i4, i5, i6: dCHOICE ch%,prompt$,i1,i2,... dCHOICE ch%,,i3,14,... dCHOICE ch%,,i5,i6 See also dINIT.7BordEDIT var str$,p$ Defines a string edit box, to go in a dialog. p$ will be displayed on the left side of the line. str$ is the string variable to edit. Its initial contents will appear in the dialog. The length used when str$ was defined is the maximum length you can type in. len%, if supplied, gives the width of the edit box (allowing for widest possible character in the font). The string will scroll inside the edit box, if necessary. If len% is not supplied, the edit box is made wide enough for the maximum width str$ could possibly be. See also dTEXT.ays since 1/1/1900. The system setting determines whether years, months or days are displayed first. See also DAYS, SECSTODATE,DAYSTODATE, dINIT.BCauses the translator to report an error if any variables or procedures are used before they are declared. It should be used at the beginning of the module to which it applies, before the first procedure. It is useful for detecting Undefined externals errors at translate-time rather than at runtime. For example, with DECLARE EXTERNAL commented out, the following translates and raises the error, Undefined externals, i at runtime. Adding the declaration causes the error to be detected at translate-time instead. REM DECLARE EXTERNAL PROC main:  LOCAL i%  i%=10  PRINT i  GET ENDP If you use this declaration, you will need to declare all subsequent variables and procedures used in the module, using EXTERNAL. See also EXTERNAL.ADraws a circle with the centre at the current position in the current drawable. If the value of radius% is negative then no circle is drawn. If fill% is supplied and if fill%<>0 then the circle is filled with the current pen colour. See gELLIPSE, gCOLOR.ADeletes any type of file. (You can use wildcards for example, to delete all the files in D:\OPL DELETE D:\OPL\* (You can use wildcards for example, to delete all the OPL files in B:\OPL DELETE B:\OPL\*.OPL The file type extensions are listed in the User Guide. See also RMDIR. See also dTEXT.M7--!i!uCOUNT c%=COUNT'Cp"Times New Roman:-"Times New Roman}CREATE CREATE tableSpec$,log,f1,f2,...C " Courier New(V)}CURSORVCURSOR ON CURSOR OFF CURSOR id%,asc%,w%,h% CURSOR id%,asc%,w%,h%,type% CURSOR id%z"Times New Roman    "Times New Roman*"Times New RomanjD/#6D$#"Times New Roman DATETOSECS's&=DATETOSECS(yr%,mo%,dy%,hr%,mn%,sc%)+,,DATIM$ d$=DATIM$-k"Times New Roman"Times New RomanDAYd%=DAYFReturns the current day of the month (1 to 31) from the system clock.DFE"Times New RomanDAYNAME$d$=DAYNAME$(x%)."Times New Roman  !  "Times New RomanDAYS!Usage:d&=DAYS(day%,month%,year%)/"Times New Roman-<    a`"Times New Roman DAYSTODATE#DAYSTODATE days&,year%,month%,day%0D"Times New Roman}DBUTTONSdBUTTONS p1$,k1% ...D"Times New Roman1"Times New RomanLMhIUZ1% ?"Times New Roman DCHECKBOXdCHECKBOX chk%,prompt$2p"Times New Roman"Times New Roman}DCHOICEdCHOICE var choice%,p$,list$ or dCHOICE var choice%,p$,list1$+"..."dCHOICE var choice%,"",list2$+"..."...dCHOICE var choice%,"",listN$X'$4)"Times New Roman*&r!"Times New RomanDDATEdDATE var lg&,p$,min&,max&3"Times New Roman44dR-,"Times New RomanDECLARE EXTERNALDECLARE EXTERNAL5"Times New Roman 0   "Times New Roman DECLARE OPX:DECLARE OPX opxname,opxUid&,opxVersion& ...ENDDECLAREDeclares an OPX. opxname is the name of the OPX, opxUid& its UID and opxVersion& its version number. Declarations of the OPXs preocedures should be made inside this structure. See the Using OPXs on the Series 5 chapter for more details.p"Times New RomanfM?>"Times New RomanDEDITdEDIT var str$,p$,len%67"Times New Roman/4 "Times New Roman6MDefines a multi-line edit box to go into a dialog. Normally the resulting text would be used in a subsequent dialog, saved to file or printed using the Printer OPX (see the Using OPXs on the Series 5 chapter). It is also possible to paste text into the buffer from other applications and vice versa, although any formatting or embedded objects contained in text pasted in will be removed. ptrData& is the address of a buffer to take the edited data. It could be the address of an array as returned by ADDR, or of a heap cell, as returned by ALLOC (see ADDR and ALLOC). The buffer may not be specified directly as a string and may not be read as such. Instead it should be peeked, byte by byte (see PEEK). The leading 4 bytes at ptrData& contain the initial number of bytes of data following. These bytes are also set by dEDITMULTI to the actual number of bytes edited. For this reason it is convenient to use a long integer array as the buffer, with at least 1+(maxLength%+3)/4 elements. The first element of the array then specifies the initial length. If an allocated cell is used (probably because more than 64K is required), the first 4 bytes of the cell must be set to the initial length of the data. If this length is not set then an error will be raised. For example if a cell of 100000 bytes is allocated, you would need to poke a zero long integer in the start to specify that there is initially no text in the cell. For example: p&=ALLOC(100000) POKEL p&,0REM Text starts at p&+4 Special characters such as line breaks and tab characters may appear in the buffer. Constants for the codes of these are supplied in Const.oph. The prompt, p$ will be displayed on the left side of the edit box. widthInChars% specifies the width of the edit box within which the text is wrapped, using a notional average character width. The actual number of characters that will fit depends on the character widths, with e.g. more is fitting than ws. numberLines% specifies the number of full lines displayed. Any more lines will be scrolled. maxLength% specifies the length in bytes of the buffer provided (excluding the bytes used to store the length). The Enter key is used by a multi-line edit box which has the focus before being offered to any buttons. This means that Enter cant be used to exit the dialog, unless another item is provided that can take the focus without using the Enter key. Normal practice is to provide a button that does not use the Enter key to exit a dialog whenever it contains a multi-line edit box. The Esc key will always cancel a dialog however, even when it contains a multi-line edit box. The following example presents a three-line edit box which is about 10 characters wide and allows up to 399 characters: CONST KLenBuffer%=399 PROC dEditM:  LOCAL buffer&(101) REM 101=1+(399+3)/4 in integer arithmetic  LOCAL pLen&,pText&  LOCAL i%  LOCAL c%  pLen&=ADDR(buffer&(1))  pText&=ADDR(buffer&(2))  WHILE 1  dINIT Try dEditMulti  dEDITMULTI pLen&,Prompt,10,3,KLenBuffer% dBUTTONS Done,%d REM button needed to exit dialog  IF DIALOG=0 :BREAK :ENDIF  PRINT Length:;buffer&(1)  PRINT Text:  i%=0  WHILE i%=32  PRINT CHR$(c%);  ELSE  PRINT .;REM just print a dot for special characters  ENDIF  i%=i%+1  ENDWH  ENDWH ENDP See also dINIT.A h8p @  xHP X "Times New Roman^];:"Times New RomanNew RomanCChange the default window (ID=1) to change the colour mode. The default window uses 4-colour mode initially. mode%=1 just clears the screen, leaving the window in 4-colour mode. Clearing of the screen ensures compatibility with Series 3c. mode%=0 changes the screen to 2-colour mode (actually results in a mapping of greys to white or black).mode%=2 changes to 16-colour mode, as expected. Using DEFAULTWIN with either of these values also clears the screen. Using 4-colour mode uses more power than using 2-colour mode and using 16-colour mode uses more power that either of these.Constants for the modes of DEFAULTWIN are supplied in Const.oph. You are advised to call DEFAULTWIN once and for all near the start of your program if you need to change the colour mode of the default window on the Series 5 or use grey on the Series 3c. If it fails with Out of memory error, the program can then exit cleanly without losing vital information. See also gGREY, gCOLOR, gCREATE.BConverts from radians to degrees. Returns x, an angle in radians, as a number of degrees. The formula used is: 180*x/PI All the trigonometric functions (SIN,COS etc.) work in radians, not degrees. You can use DEG to convert an angle returned by a trigonometric function back to degrees: Example: PROC xarctan:  LOCAL arg,angle  PRINT Enter argument:;  INPUT arg  PRINT ARCTAN of,arg,is  angle=ATAN(arg)  PRINT angle,radians  PRINT DEG(angle),degrees  GET ENDP To convert from degrees to radians, use RAD.A h8p @  xHP X "Times New RomanYT "Times New RomanGuide. See also RMDIR.@Defines a filename edit box or selector, to go in a dialog. A Folder and Disk selector are automatically added on the following lines.By default no prompts are displayed for the file, folder and disk selectors. A comma-separated prompt list should be supplied. For example, for a filename editor with the standard prompts use: dFILE f$,File,Folder,Disk,1 f% controls the type of file editor or selector, and the kind of input allowed. You can add together any of the following values:  valuemeaning 0 use a selector 1 use an edit box 2 allow directory names 4 directory names only 8 disallow existing files 16 query existing files 32 allow null string input 64 invalid on Series 5128 obey/allow wildcards 256 allow ROM files to be selected 512 allow files in the System folder to be selected The first of the list is the most crucial. If you add 1 into f%, you will see a file edit box, as when creating a new file. If you do not add 1, you will see the matching file selector, used when choosing an existing file. The value 64 (to omit file extensions) is not valid on the Series 5 since file extensions are no longer treated as special components of the filename. If performing a copy to operation, you might use 1+2+16, to specify a file edit box, in which you can type the name of a directory to copy to, and which will produce a query if you type the name of an existing file. If asking for the name of a directory to remove, you might use 4, to allow an existing directory name only. Query existing is ignored if disallow existing is set. These two, as well as allow null string input, only work with file edit boxes, not matching file selectors. For file selectors, dFILE supports file restriction by UID, or by type from the users point of view. Documents are identified by three UIDs which identify which application created the document and what kind of file it is. Specifying all three UIDs will restrict the files as much as is possible, and specifying fewer will provide less restriction. You can supply 0 for uid1& and uid2& if you only want to restrict the list to uid3&. This may be useful when dealing with documents from one of your own applications: you can easily find out the third UID as it will be the UID you specified in the APP statement. Note that UIDs are ignored for editors. For example, if your application has UID KUidMyApp&, then the following will list only your application-specific documents: dFILE f$,p$,f%,0,KUidOplDoc&,KUidMyApp& REM KUidOplDoc& for OPL docs Some OPL-related UIDs are given in Const.oph. See the Calling Procedures for details of how to use this file and Appendix E for a listing of it. file$ is the string variable to edit. Its initial contents always control the initial drive and directory used. Any filename part of file$ is shown initially in the filename box. For a matching file selector, you can use wildcards in the filename part (such as *.tmp) to control which filenames are matched. To do this, you must add 128 to f%. 128 also allows wildcard specifications to be entered (returned in str$), for both matching and new file selectors. With a matching file selector (as opposed to an edit box) the value 8 restricts the selection to files which match the filename/extension in file$. You can always press Tab to produce the full file selector with a dFILE item. file$ must be declared to be 255 bytes long, since file names may be up to this length, and if it is shorter an error will be raised. On the Series 3c, it must be at least 128 bytes long. Constants for the flags used by dFILE and for some OPL-related UIDs are supplied in Const.oph. See also dINIT.ADefines an edit box for a floating-point number, to go in a dialog. p$ will be displayed on the left side of the line. min and max give the minimum and maximum values which are to be allowed. An error is raised if min is higher than max. fp must be a LOCAL or a GLOBAL variable. It specifies the value to be shown initially. When you finish using the dialog, the value you entered is returned in fp. See also dINIT.eBPresents the dialog prepared by dINIT and commands such as dTEXT and dCHOICE. If you complete the dialog by pressing Enter, your settings are stored in the variables specified in dLONG, dCHOICE etc., although you can prevent this with dBUTTONS. If you used dBUTTONS when preparing the dialog, the keycode which ended the dialog is returned. Otherwise, DIALOG returns the line number of the item which was current when Enter was pressed. The top item (or the title line, if present), has line number 1. If you cancel the dialog by pressing Esc, the variables are not changed, and 0 is returned. See also dINIT.EPrepares for definition of a dialog, cancelling any existing one. Use dTEXT, dCHOICE etc. to define each item in the dialog, then DIALOG to display the dialog. If title$ is supplied, it will be displayed at the top of the dialog. Any supplied title$ will be positioned in a grey box at the top of the dialog. flags% can be any added combination of the following constants to achieve the following effects, effectvalue buttons on the right rather than at the bottom1 no title bar (any title in dINIT is ignored)2 use the full screen4 dont allow the dialog box to be dragged8 pack the dialog densely (not buttons though)16 Constants for these flags are supplied in Const.oph. It should be noted that dialogs without titles cannot be dragged regardless of the No drag setting. Dense packing enables more lines to fit on the screen for larger dialogs. On the Series 5, if an error occurs when adding an item to a dialog, the dialog is deleted and dINIT needs calling again. This is necessary to avoid having partially specified dialog lines. In practical terms, this means that the following artificial example will raise a Structure fault error.dINIT ONERR e1 REM bad arg list gives argument error dCHOICE ch%,ChList,a,b,,,,c e1:: ONERR OFF dLONG l&,Long,0,12345 DIALOGBLists filenames, including subdirectory names, matching a file specification. You can include wildcards in the file specification. If filespec$ is just a directory name, include the final backslash on the end for example, \TEMP\ . Use the function like this: DIR$(filespec$) returns the name of the first file matching the file specification. DIR$() then returns the name of the second file in the directory. DIR$() again returns the third, and so on. When there are no more matching files in the directory, DIR$() returns a null string. Example, listing all the files whose names begin with A in C:\ME\ PROC dir:  LOCAL d$(255)  d$=DIR$(C:\ME\A*)  WHILE d$<>  PRINT d$  d$=DIR$()  ENDWH  GET ENDPA"Times New Roman  h8p @  xHP X Times New Roman"Times New RomanVE.YC  "Times New RomanADefines an edit box for a long integer, to go in a dialog. p$ will be displayed on the left side of the line. min& and max& give the minimum and maximum values which are to be allowed. An error is raised if min& is higher than max&. lg& must be a LOCAL or a GLOBAL variable. It specifies the value to be shown initially. When you finish using the dialog, the value you entered is returned in lg&. See also dINIT.?BDO forces the set of statements which follow it to execute repeatedly until the condition specified by UNTIL is met. This is the easiest way to repeat an operation a certain number of times. Every DO must have its matching UNTIL to end the loop. If you set a condition which is never met, the program will go round and round, locked in the loop forever. You can escape by pressing Ctrl+Esc, provided you havent set ESCAPE OFF. If you have set ESCAPE OFF, you will have to return to go to the Task list, select your program in the list and click the Close file option.RA"Times New Roman  h8p @  xHP X Times New Roman"Times New RomanvK8m"Times New Roman6AReturns the day of the week from 1 (Monday) to 7 (Sunday) given the date. day% must be between 1 and 31, month% from 1 to 12 and year% from 1900 to 2155. For example, D%=DOW(4,7,1992) returns 6, meaning Saturday. Constants for the numeric values assigned to the days of the week are supplied in Const.oph.BPositions a dialog. Use dPOSITION at any time between dINIT and DIALOG. dPOSITION uses two integer values. The first specifies the horizontal position, and the second, the vertical. dPOSITION -1,-1 positions to the top left of the screen; dPOSITION 1,1 to the bottom right; dPOSITION 0,0 to the centre, the usual position for dialogs. dPOSITION 1,0, for example, positions to the right-hand edge of the screen, and centres the dialog half way up the screen. Constants for the positions are supplied in Const.oph. See also dINIT.#EDefines a line of text to be displayed in a dialog. p$ will be displayed on the left side of the line, and body$ on the right side. If you only want to display a single string, use a null string () for p$, and pass the desired string in body$. It will then have the whole width of the dialog to itself. An error is raised if body$ is a null string. body$ is normally displayed left aligned (although usually in the right column). You can override this by specifying t%: t% effect 0 left align body$ 1 right align body$ 2 centre body$ However, note that on the Series 5, alignment of body$ is only supported when p$ is null, with the body being left aligned otherwise. In addition, you can add any or all of the following three values to t%, for these effects: $200 draw a line below this item $400 allow this item to be selected $800 specify this item as a text separator You can display a line separator between any dialog items by setting the flag $800 on an item which has null p$ and body$. (If p$ and/or body$ are not null, then the flag is ignored and no separator is drawn.) The separator counts as an item in the value returned by DIALOG. The flag $400 only allows the prompt, and not the body, to be selected. Constants for the text types are supplied in Const.oph. See also dEDIT, dINITADefines a secret string edit box, such as for a password, to go in a dialog. p$ will be displayed on the left side of the line. str$ is the string variable to take the string you type. str$ must be less than 16 characters long.Initially the dialog does not show any characters for the string; the initial contents of str$ are ignored. A special symbol will be displayed for each character you type, to preserve the secrecy of the string. See also dINIT.AFinds out whether youre at the end of a file yet. Returns -1 (true) if the end of the file has been reached, or 0 (false) if it hasnt. When reading records from a file, you should test whether there are still records left to read, otherwise you may get an error. Example: PROC eoftest:  OPEN myfile,A,a$,b%  DO  PRINT A.a$  PRINT A.b%  NEXT  PAUSE -40  UNTIL EOF  PRINT The last record  GET  RETURN ENDPh character you type, to preserve the secrecy of the string. See also dINIT.3IR$zDLONG{DO...UNTILEDefines an edit box for a time, to go in a dialog. p$ will be displayed on the left side of the line. lg&, which must be a LOCAL or a GLOBAL variable, specifies the time to be shown initially. Although it will appear on the screen like a normal time, for example 18:27, lg& must be specified as seconds after 00:00. A value of 60 means one minute past midnight; 3600 means one oclock, and so on. min& and max& give the minimum and maximum values which are to be allowed. Again, these are in seconds after 00:00. An error is raised if min& is higher than max&. When you finish using the dialog, the time you entered is returned in lg&, in seconds after 00:00. t% specifies the type of display required, as follows: t% time display 0 absolute time no seconds 1 absolute time with seconds 2 duration no seconds 3 duration with seconds 4 time without hours 8 absolute time in 24 hour clock Constants for dTIME types are supplied in Const.oph. For example, 03:45 represents an absolute time while 3 hours 45 minutes represents a duration. Absolute times are displayed in 24-hour or am/pm format according to the current system setting. 8 displays the time in 24 hour clock, regardless of the system setting. Absolute times always display am or pm as appropriate, unless 24 hour clock is being used. Durations never display am or pm. Note, however, that if you use the flag 4 (no hours) then the am/pm symbol will be displayed and the flag 2 must be added if you wish to hide it. See also dINIT.MKI=} DEDITMULTIAdEDITMULTI var ptrData&,p$,widthInChars%,numberLines%,maxLength%86 9 DEFAULTWINDEFAULTWIN mode%:"Times New Roman =2h1F|C*! "Times New RomanDEG d=DEG(x);"Times New Roman$W  -,"Times New RomanDELETEDELETE filename$<"Times New RomanGK8"Times New RomanDELETEDELETE dbase$,table$This deletes the table, table$, from the database, dbase$. To do this all views of the database, and hence the database itself, must be closed.D"Times New Roman}DFILEHUsage:dFILE var file$,p$,f% or dFILE var file$,p$,f%,uid1&,uid2&,uid3&a"Courier+*"Courier=f"Times New Roman$5m )O`"Times New RomanDFLOATdFLOAT var fp,p$,min,max>z"Times New RomanE4x"Times New RomanDIALOG n%=DIALOG?eu"Times New Roman]"Times New Roman}DINIT)dINIT dINIT title$ dINIT title$,flags%p"Times New Roman"Times New RomanA"Times New RomanGPb 1/+06k0" "Times New Roman}DIR$*Usage:d$=DIR$(filespec$)then d$=DIR$()a"Courier"Courier@BDLONGdLONG var lg&,p$,min&,max&Cz"Times New Roman<4|"Times New Roman} DO...UNTIL*Usage:DO statement ... UNTIL condition"Courier"Courier  "Courier "Courier"CourierD?ERDOWd%=DOW(day%,month%,year%)F6u"Times New RomanLQ<]\"Times New Roman DPOSITIONdPOSITION x%,y%Gz"Times New RomanI|8"Times New Roman}DTEXT%dTEXT p$,body$,t% or dTEXT p$,body$a"Courier"CourierH#"Times New Roman5,z "%,_9"Times New RomanDTIMEdTIME var lg&,p$,t%,min&,max&J"Times New Roman44(d8"6`"Times New RomanzCDisplays a string variable which you can edit directly on the screen. All the usual editing keys are available the arrow keys move along the line, Esc clears the line, and so on. When you have finished editing, press Enter to confirm the changes. If you press Enter before you have made any changes, then the string will be unaltered. If you use EDIT in conjunction with a PRINT statement, use a comma at the end of the PRINT statement, so that the string to be edited appears on the same line as the displayed string: ... PRINT Edit address:, EDIT A.address$ UPDATE .... TRAP EDIT If the Esc key is pressed while no text is on the input line, the Escape key pressed error (number -114) will be returned by ERR provided that the EDIT has been trapped. You can use this feature to enable the user to press the Esc key to escape from inputting a string. See also INPUT, dEDIT.GAReturns the error message for the specified error code x%. ERR$(ERR) gives the message for the last error which occurred. Example: TRAP OPEN \FILE,A,field1$ IF ERR  PRINT ERR$(ERR)  RETURN ENDIF See also ERR, ERRX$. See the Error Handling chapter for full details, including the list of error numbers and messages.gNT A.a$  PRINT A.b%  NEXT  PAUSE -40  UNTIL EOF  PRINT The last record  GET  RETURN ENDPAReturns the number of the last error which occurred, or 0 if there has been no error. Example: ... PRINT Enter age in years age:: TRAP INPUT age% IF ERR=-1  PRINT Number please:  GOTO age ENDIF ... You can set the value returned by ERR to 0 (or any other value) by using TRAP RAISE 0. This is useful for clearing ERR. See also ERR$,ERRX$. See the Error Handling chapter for full details, including the list of error numbers and messages.'ASets the pen colour of the current window. The red%,green%,blue% values specify a colour which will be mapped to white, black or one of the greys on non-colour screens. Note that if the values of red%, green% and blue% are equal, then a pure grey results, ranging from black (0) to white (255).f error numbers and messages.eAReturns the current extended error message (when an error has been trapped), e.g. Error in MODULE\PROCEDURE,EXTERN1,EXTERN2,... which would have been presented as an alert if the error had not been trapped. This allows the list of missing externals, missing procedure names, etc. to be found when an error has been trapped by a handler. See ERR, ERR$.BESCAPE OFF stops Ctrl+Esc on the Series 5 or Psion-Esc on the Series 3c being used to break out of the program when it is running. ESCAPE ON enables this feature again. ESCAPE OFF takes effect only in the procedure in which it occurs, and in any sub-procedures that are called. Ctrl+Esc is always enabled when a program begins running. If your program enters a loop which has no logical exit, and ESCAPE OFF has been used, you will have to return to the System screen, move to the program name and select the "Close file" option.@Evaluates the mathematical string expression s$ and returns the floating-point result. s$ mGay include any mathematical function or operator. Note that floating-point arithmetic is always performed. On the Series 5, EVAL runs in the context of the current procedure, so globals and externals can be used in s$, procedures in loaded modules can be called and the current values of gX and gY, can be used etc. LOCAL variables cannot be used in s$ (because the translator cannot reference them). For example: DO  AT 10,5 :PRINT Calc:,  TRAP INPUT n$  IF n$= :CONTINUE :ENDIF  IF ERR=-114 :BREAK :ENDIF  CLS :AT 10,4  PRINT n$;=;EVAL(n$) UNTIL 0 See also VAL.rAChecks to see that a file exists. Returns -1 (True) if the file exists and 0 (False) if it doesnt. Use this function when creating a file to check that a file of the same name does not already exist, or when opening a file to check that it has already been created: IF NOT EXIST(CLIENTS)  CREATE CLIENTS,A,names$ ELSE  OPEN CLIENTS,A,names$ ENDIF ...FRequired if DECLARE EXTERNAL is specified in the module. The first usage declares a variable as external. For example, EXTERNAL screenHeight% The second usage declares the prototype of a procedure (prototype includes the final : and the argument list). The procedure may then be referred to before it is defined. This allows parameter type-checking to be performed at translate-time rather than at runtime and also provides the necessary information for the translator to coerce numeric argument types. This is reasonable because OPL does not support argument overloading. The same coercion occurs as when calling the built-in keywords. Following the example of C and C++, you would normally provide a header file declaring prototypes of all the procedures and INCLUDE this header file at the beginning of the module which defines the declared procedures to ensure consistency. The header file would also be INCLUDEd in any other modules which call these procedures. Then you should use DECLARE EXTERNAL at the beginning of modules which include the header file so that the translator can ensure that these procedures are called with correct parameter types or types which can be coerced. The following is an example of usage of DECLARE EXTERNAL and EXTERNAL: DECLARE EXTERNAL EXTERNAL myProc%:(i%,l&) REM or INCLUDE myproc.oph that defines all your procedures PROC test: LOCAL i%,j%,s$(10) REM j% is coerced to a long integer as specified by the prototype. myProc%:(i%,j%) REM translator Type mismatch error: REM string cant be coerced to numeric type myProc%:(i%,s$)  REM wrong argument count gives translator error myProc%:(i%) ENDP PROC myProc%:(i%,l&) REM Translator checks consistency with prototype above ... ENDP See DECLARE EXTERNAL.BSearches the current data file (or view on the Series 5) for fields matching a$. The search starts from the current record, so use NEXT to progress to subsequent records. FIND makes the next record containing a$ the current record and returns the number of the record found. Capitals and lower-case letters match. You can use wildcards: ? matches any single character matches any group of characters. To find a record with a field containing Dr and either BROWN or BRAUN, use: F%=FIND(*DR*BR??N*) FIND(BROWN) will find only those records with a field consisting solely of the string BROWN. You can only search string fields. See also FINDFIELD.fA"Times New Roman  h8p @  xHP X Times New Roman"Times New Roman ; "M`$"Times New RomandDLike FIND, finds a string, makes the record with this string the current record, and returns the number of this record. a$ is the string for which to search: the search will be carried out in no% fields in each record, starting at the field with number start% (1 is the number of the first field). start% and no% may refer to string fields only and other types will be ignored. The flag% argument specifies the type of search as explained below. If you want to search in all fields, use start%=1 and for no% use the number of fields you used in the OPEN/CREATE command. flags% should be specified as follows: search directionflags% backwards from current record 0 forwards from current record 1 backwards from end of file 2 forwards from start of file 3 Constants for these flags are supplied in Const.oph.Add 16 to the value of flag% given above to make the search case-dependent, where case-dependent means that the record will exactly match the search string in case as well as characters. Other wise the search will case-independent which means that upper case and lower case characters will match.4BReturns a string representation of the number x, to y% decimal places. The string will be up to z% characters long. Example: FIX$(123.456,2,7) returns 123.46. If z% is negative then the string is right-justified for example FIX$(1,2,-6) returns 1.00 where there are two spaces to the left of the 1. If z% is positive then no spaces are added for example FIX$(1,2,6) returns 1.00. If the number x will not fit in the width specified by z%, then the string will just be asterisks, for example FIX$(256.99,2,4) returns ****. See also GEN$, NUM$, SCI$.WA"Times New Roman  h8p @  xHP X Times New Roman"Times New Romanu.T"Times New Roman8K[!]AIIH1ePDXINPUTdXINPUT var str$,p$L"Times New RomanN4:+"Times New RomanEDITEDIT a$Mz"Times New Roman  "Times New RomanEOFe%=EOFN"Times New Roman5X     "Times New RomanERASEERASEErases the current record in the current file. The next record is then current. If the erased record was the last record in a file, then following this command the current record will be null and EOF will return true.k"Times New Roman0"Times New RomanERRe%=ERRO"Times New Roman W   yzy"Times New RomanERR$ e$=ERR$(x%)PG"Times New Roman=I zy"Times New RomanERRX$ x$=ERRX$Qeu"Times New RomanS1"Times New Roman ESCAPE OFF ESCAPE OFFRp"Times New Roman"Times New RomanEVAL d=EVAL(s$)S"Times New Roman )  "Times New RomanEXISTEXISTTr"Times New Roman #G"Times New RomanEXP e=EXP(x)dReturns ex - that is, the value of the arithmetic constant e (2.71828...) raised to the power of x.d "Times New Roman"Times New RomanY"Times New RomanEXTERNAL)EXTERNAL variable orEXTERNALprototypeU"Times New Roman:V*H> U'-18"Times New RomanFIND f%=FIND(a$)VWf FINDFIELD#f%=FINDFIELD(a$,start%,no%,flags%)Xd"Times New Roman y(!!!5)("Times New RomanFIRSTFIRSTDPositions to the first record in the current view on the Series 5.DDC"Times New RomanFIXf$=FIX$(x,y%,z%)Y4ZWAReplaces TYPE on the Series 5. flags% values as follows: 1 specifies an application which can create files. It will then be included in the list of applications offered when the user creates a new file from the System screen. 2 prevents the application from appearing in the Extras bar. It is very unusual to have this flag set. Constants for these flags are supplied in Const.oph. FLAGS may only be used within the APP...ENDA construct.AConverts an integer expression (either integer or long integer) into a floating-point number. Example: PROC gamma:(v) LOCAL c  c=3E8  RETURN 1/SQR(1-(v*v)/(c*c)) ENDP You could call this procedure like this: gamma:(FLT(a%)) if you wanted to pass it the value of an integer variable without having first to assign the integer value to a floating-point variable. See also INT and INTF.EDraws a one-pixel wide, black border around the edge of the current drawable. If width% and height% are supplied, a border shape of this size is drawn with the top left corner at the current position. If they are not supplied, the border is drawn around the whole of the current drawable. flags% controls three attributes of the border a shadow to the right and beneath, a one-pixel gap all around, and the type of corners used: flags% effect 1 single pixel shadow 2 removes a single pixel shadow3 double pixel shadow 4 removes a double pixel shadow (leaves a gap for double pixel shadow on Series 3c) $100 one-pixel gap all round $200 more rounded corners Constants for the values of these flags are supplied in Const.oph. The shadows on the Series 5 will not appear in the same way as shadows on other objects such as dialogs and menu panes appear. To display such shadows on a window, you must specify them when using gCREATE. Hence you should use gCREATE (and gXBORDER) in preference to gBORDER on the Series 5. You can combine the values to control the three different effects. (1, 2, 3 and 4 are mutually exclusive you cannot use more than one of them.) For example, for rounded corners and a double pixel shadow, use flags%=$203. Set flags%=0 for no shadow, no gap, and sharper corners. For example, to de-emphasise a previously emphasised border, use gBORDER with the shadow turned off: gBORDER 3 REM show border GET gBORDER 4 REM border off ... See also gXBORDER.GDraws a 3-D black and grey button at the current position in a rectangle of the supplied width w% and height h%, which fully encloses the button in all its states. text$ specifies up to 64 characters to be drawn in the button in the current font and style. You must ensure that the text will fit in the button. type%=1 draws a Series 3c button; type%=2 specifies Series 5. state%=0 draws a raised button, state%=1 a semi-depressed (flat) button and state%=2 a fully-depressed (sunken) button.Bitmaps may be used on buttons. Three extra optional arguments can be passed which give the bitmap ID, the mask ID and the layout for the button respectively. maskId% can be 0 to specify no mask. The following constants should be used for layout% to specify relative positions of the text and icon on a button, position of text layout% right 0bottom 1top 2left 3The following constants can be added to the values above to specify how a buttons excess space is to be allocated, share 0 to text $10 to picture $20 Constants for all these layout types and for the button states are supplied in Const.oph. When the layout is such that the text is at the top or the bottom, then text and picture are centred vertically and horizontally in the space allotted to them. If the layout has text to the left or right, then the text is left aligned in the space allotted to it and the picture is right or left aligned respectively. Both text and picture are centred vertically in this case. Examples: layout% description $13 creates a button with text on the left and left aligned in any excess space. $20 creates a button with text on the right and the picture left aligned in any excess space. $10 creates a standard toolbar button, putting the text on the right. For a picture only with no text use text$=. Invalid arguments error is raised if you use OPL windows for gBUTTON. Read-only bitmaps may also be loaded using the Bitmap OPX.@\cefd\c efd.Aepplied and if fill%<>0 then the circle is filled with the current pen colour. See gELLIPSE, gCOLOR.@Displays or removes a clock showing the system time. The current position in the current window is used. Only one clock may be displayed in each window. mode% controls the type of clock. Values are: 6 black and grey medium, system setting 7 black and grey medium, analog 8 second type medium, digital 9 black and grey extra large 11 formatted digital (described below) Constants for the modes are supplied in Const.oph. There are additional features on the basic clocks which partially replace these effects. The digital clock (mode%=8) automatically displays the day of the week and day of the month below the time. The extra large analog clock (mode%=9) automatically displays a second hand. >> Do not use gSCROLL to scroll the region containing a clock. When the time is updated, the old position would be used. The whole window may, however, be moved using gSETWIN. Digital clocks display in 24-hour or 12-hour mode according to the system-wide setting. offset& specifies an offset in minutes from the system time to the time displayed. This allows you to display a clock showing a time other than the system time. A flag, which has the value $100, may be ORed with mode% so that offset& may be specified in seconds rather than minutes. The offset is a long integer to enable a whole day to be specified when the offset is in seconds. If these arguments are not supplied, mode% is taken as 1, and offset& as 0. The system setting for the clock type (i.e. digital or analog) can be changed by an OPL program using the procedure LCSETCLOCKFORMAT: in Date OPX This is function should be used to implement, for example, tapping a toolbar clock to change its type as in the built-in Series 5 applications. See the Using OPXs on the Series 5 section for full details of this procedure. format$, font% and style% are used only for formatted digital clocks (mode% 10 on the Series 3c and 11 on the Series 5). The values for font& and style% are as for gFONT and gSTYLE. The default font for gCLOCK is the system font. The default style is normal (0). For the formatted digital clock, a format string (up to 255 characters long) specifies how the clock is to be displayed. The format string contains a number of format specifiers in the form of a % followed by a letter. (Upper or lower case may be used.) The format string may contain the following symbols to obtain the required effects:  %% Insert a single % character in the string  %* Abbreviate following item. (The asterisk should be inserted between the % and the number or letter, e.g. %*1). In most cases this amounts to omitting any leading zeros, for example if it is the first of the month %F %*M will display as 1 rather than 01. %:n Insert a system time separator character. n is an integer between zero and three inclusive which indicates which time separator character is to be used. For European time settings, only n=1 and n=2 are used, giving the hours/minutes separator and minutes/seconds separator respectively. %/n Insert a system date separator character. n is an integer between zero and three inclusive which indicates which date sepaHrator character is to be used. For European time settings, only n=1 and n=2 are used, giving the day/month separator and month/year separator respectively. %1 Insert the first component of a three component date (i.e. a date including day, month and year) where the order of the components is determined by the system settings. The possibilities are: dd/mm/yyyy, (European), mm/dd/yyyy (American), yyyy/mm/dd (Japanese). %2 Insert the second component of a three component date where the order has been determined by the system settings. See %1. %3 Insert the third component of a three component date where the order has been determined by the system settings. See %1. %4 Insert the first component of a two component date (i.e. a date including day and month only) where the order has been determined by system settings. The possibilities are: dd/mm, (European), mm/dd (American), mm/dd (Japanese). %5 Insert the second component of a two component date where the order has been determined by the system settings. See %4. %A Insert am or pm according to the current language and time of day. Text is printed even if 24 hour clock is in use. Text may be specified to be printed before or after the time, and a trailing or leading space as appropriate will be added. The abbreviated version (%*A) removes this space. Optionally, a minus or plus sign may be inserted between the % and the A. This operates as follows: %-A causes am/pm text to be inserted only if the system setting of the am/pm symbol position is set to display before the time. Similarly, %+A causes am/pm text to be inserted only if the system setting of the am/pm symbol is set to display after the time. No am/pm text will be inserted before the time if a + is inserted in the string. For example you could use, %-A%H%:1%T%+A to insert the am/pm symbol either before or after the time, according to the system setting. %+A and %-A cannot be abbreviated. %B As %A, except that the am/pm text is only inserted if the system clock setting is 12 hour. (This should be used in conjunction with %J. ) %D Insert the two-digit day number in month (in conjunction with %1 etc.). %E Insert the day name. Abbreviation is language specific (3 letters in English). %F Use this at the beginning of a format string to make the date/time formatting independent of the system setting. This fixes the order of the following day/month/year component(s) in their given order, removing the need to use %1 to %5, allowing individual components of the date to be printed. (No abbreviation.) %H Insert the two-digit hour component of the time in 24 hour clock format. %I Insert the two-digit hour component of the time in 12 hour clock format. Any leading zero is automatically suppressed, regardless of whether an asterisk is inserted or not. %J Insert the two-digit hour component of time in either 12 or 24 hour clock format depending on the corresponding system setting. When the clock has been set to 12 hour format, the hours leading zero is automatically suppressed regardless of whether an asterisk has been inserted between the % and J. %M Insert the two-digit month number (in conjunction with %1 etc.). %N Insert the month name (in conjunction with %1 etc.). When using system settings (i.e. not using %F) this causes all months following %N in the string to be written in words. When using fixed format (i.e. when using %F) %N may be used alone to insert a month name. Abbreviation is language specific (3 letters in English). %S Insert the two-digit second component of the time. %T Insert the two-digit minute component of the time. %W Insert the two-digit week number in year, counting the first (part) week as week 1. %X Insert the date suffix. When using system settings (i.e. not using %F), this causes a suffix to be put on any date following %X in the string. When using fixed format (i.e. using %F), %X following any date appends a suffix for that particular date. Cannot be abbreviated. %Y Insert the four digit year number (in conjunction with %1 etc.). The abbreviation is the last two digits of the year. %Z Insert the three digit day number in year.  Some examples of the use of these format strings are as follows. The example use is 1:30:05 pm on Wednesday, 1st January 1997, with the system setting of European dates and with am/pm after the time: 1. %-A%I:%T:%S%+A will print the time in 12 hour clock, including seconds, with the am/pm either inserted before or after the time, depending on the system setting. So the example time would appear as, 1:30:05 pm. 2. %F%E %*D%X %N %Y will print the day of the week followed by the date with suffix, the month as a word and the year. For example, Wednesday 1st January 1997. 3. %E %D%X%N%Y %1 %2 %3 will use the locale setting for ordering the elements of the date, but will use a suffix on the day and the month in words. For example, Wednesday 01st January 1997. 4. %*E %*D%X%*N%*Y %1 %2 %3 will be similar to 3., but will abbreviate the day of the week, the day, the month and the year, so the example becomes Wed 1st Jan 97. 5. %M%Y%D%1%/0%2%/0%3 will appear as 01/01/1997. This demonstrates that the ordering of the %D, %M and %Y is irrelevant when using locale-dependent formatting. Instead the ordering of the date components is determined by the order of the %1, %2, and %3 formatting commands. style% may take any of the values used to specify gSTYLE, other than 2 (underlined). A note should also be made that a General Failure error will result if you attempt to use an invalid format. Invalid formats include using %: and %/ followed by 0 or 3 when in European locale setting (when these separators are without meaning) and using %+ and %- followed by characters other than A or B. As a final example, assuming that the settings in the Time application are for day/month/year date format, am-pm time format and : time separator and that the time is 11:30:05 pm on 9th March 1993, %G%L%P%O%*E, %1 %2 %3 %6%:%T:%S% generates Tue, 9th Mar 1993 11:30:05pm. With the same setup except for month/day/year date format in 24-hour mode, the same string generates Tue, Mar 9th 1993 23:30:05. E"Times New Roman h8p @  xHP X "Times New RomanQ# )" (5ZMtU+!{zy#dIP;J-BE44Uw,V6o"Times New Roman"Times New RomanY"Times New Roman"Times New Roman"Times New Roman"Times New Roman"Times New Roman"Times New Roman"Times New Roman"Times New Roman"Times New Roman "Times New Roman"Times New Roman"Times New Roman@"Times New Roman"Times New Roman"Times New Roman"Times New Roman"Times New RomanACreates a bitmap with the specified width and height, and makes it the current drawable. Sets the current position to 0,0, its top left corner. Returns id% which identifies this bitmap for other keywords. gCREATEBIT may be used with an optional third parameter which specifies the graphics mode of the bitmap to be created. The values of these are as given in gCREATE. By default the graphics mode of a bitmap is 2-colour. See also gCLOSE,gCREATE~BCopies a rectangle of the specified size (width w%, height h%) from the point x%,y% in drawable id%, to the current position in the current drawable. It is unadvisable to use gCOPY to copy from windows as it is very slow. It should only be used for copying from bitmaps to windows or other bitmaps. As this command can copy both set and clear pixels, the same modes are available as when displaying text. Set mode% = 0 for set, 1 for clear, 2 for invert or 3 for replace. 0, 1 and 2 act only on set pixels in the pattern; 3 copies the entire rectangle, with set and clear pixels. The current position is not affected in either window.AWaits for a key to be pressed and returns the character code for that key. For example, if the A key is pressed with Caps Lock off, the integer returned is 97 (a), or 65 (A) if A was pressed with the Shift key down. The character codes of special keys, such as Pg Dn, are given in Appendix D. You can use KMOD to check whether modifier keys (Shift, Control, Fn and Caps Lock) were used. See also KEY.ADraws an ellipse with the centre at the current position in the current drawable. hRadius% is the horizontal distance in pixels from the centre of the ellipse to the left (and right) of the ellipse. vRadius% is the vertical distance from the centre of the ellipse to the top (and bottom). If the length of either radius is less than zero, then no ellipse is drawn. If fill% is supplied and if fill%<>0 then the ellipse is filled with the current pen colour. See gCIRCLE, gCOLOR.ng text. Set mode% = 0 for set, 1 for clear, 2 for invert or 3 for replace. 0, 1 and 2 act only on set pixels in the pattern; 3 copies the entire rectangle, with set and clear pixels. The current position is not affected in either window.FCreates a window with specified position and size (width w%, height h%), and makes it both current and foreground. Sets the current position to 0,0, its top left corner. If v% is 1, the window will immediately be visible; if 0, it will be invisible. Returns id% which identifies this window for other keywords. flags% specifies the graphics mode to use and shadowing on the window. By default the graphics mode is 2-colour and there is no shadow. The least significant 4 bits of flags% gives the colour-mode as before 0 (2 colour-mode), 1 (4 colour-mode), 2 (16 colour-mode). The next 4 bits may be set to specify the shadowing on the window. If 0, the window has no shadow. The next 4 bits give the shadow height relative to the window behind it (a height of N units gives a shadow of N(2 pixels). The flags% argument is most easily specified in hexadecimal: flags% description $412 16 colour-mode ($2), shadowed window ($1), with height 4 units ($4) above the previous window with a shadow of 8 pixels. $010 2 colour-mode (black and white) shadowed window at the same height as the previous window. $101 4 colour mode window with no shadow (height ignored if shadow disabled). $111 4 colour mode window with shadow of 1 unit above window behind, i.e. 2 pixel shadow. Constants for specifying various of the arguments taken by gCREATE are given in Const.oph. Note that 63 windows may be open at any time and it is recommended that you use many small windows rather than a few large ones. See also gCLOSE, gGREY, DEFAULTWIN.AWaits until a key is pressed and then returns which key was pressed, as a string. For example, if the A key is pressed in lower case mode, the string returned is a. You can use KMOD to check whether any modifier keys (Shift, Control, Fn and Caps Lock) were used. See also KEY$.pendix D. You can use KMOD to check whether modifier keys (Shift, Control, Fn and Caps Lock) were used. See also KEY.)ap is 2-colour. See also gCLOSE,gCREATEzOieEM%!QFLAGS FLAGS flags%\z"Times New Roman:h687"Times New RomanFLT f=FLT(x&)]"Times New Romanh "Times New RomanFONTFONT id&,style%]Sets the text window font and style. Constants for the font UIDs are supplied in Const.oph.k"Times New Roman&76"Times New Roman FREEALLOCFREEALLOC pcell&-Frees a previously allocated cell at pcell&.D-,"Times New RomanGAT gAT x%,y%Sets the current position using absolute co-ordinates. gAT 0,0 moves to the top left of the current drawable. See also gMOVE.k"Times New Romano"Times New Roman}GBORDER1gBORDER flags%,width%,height% or gBORDER flags%%^"Times New Roman""VD&:f"Times New RomanGBOXgBOX width%,height%qDraws a box from the current position, width% to the right and height% down. The current position is unaffected.Dqp"Times New Roman}GBUTTONgBUTTON text$,type%,w%,h%,st% gBUTTON text$,type%,w%,h%,st%,bitmapId& gBUTTON text$,type%,w%,h%,st%,bitmapId&,maskId& gBUTTON text$,type%,w%,h%,st%,bitmapId&,maskId&,layout%o"Courier)187"Courier_"Times New Roman8@xt    u [| TaI/"Times New Roman}GCIRCLE*gCIRCLE radius%or gCIRCLE radius%,fill%y"Courier"Courier"Courier`p"Times New Roman]"Times New Roman}GCLOCKgCLOCK ON/OFF gCLOCK ON,mode% gCLOCK ON,mode%,offset& gCLOCK ON,mode%,offset&,format$ gCLOCK ON,mode%,offset&,format$,font% gCLOCK ON,mode%,offset&,format$,font%,style%"Times New Roman!'-,"Times New Romana$b GCLOSE gCLOSE id%Closes the specified drawable that was previously opened by gCREATE, gCREATEBIT or gLOADBIT. If the drawable closed was the current drawable, the default window (ID=1) becomes current. An error is raised if you try to close the default window.cGCLSgCLSdClears the whole of the current drawable and sets the current position to 0,0, its top left corner.Ddc"Times New RomanGCOLORgCOLOR red%,green%,blue%e'D'&"Times New RomanGCOPYgCOPY id%,x%,y%,w%,h%,mode%f~u"Times New Roman76"Times New Roman}GCREATE@id%=gCREATE(x%,y%,w%,h%,v%) id%=gCREATE(x%,y%,w%,h%,v%,flags%)k"Times New Roman#""Times New Romang"Times New Roman>>aO[\$#"Times New Roman} GCREATEBITid%=gCREATEBIT(w%,h%,mode%)D"Times New Romanhu"Times New Roman>"Times New RomanUAChanges the pen colour between black and grey. mode% has the following effects: mode%=1 sets the foreground colour of the current drawable to light grey. This is the same colour as would be achieved by using gCOLOR $aa,$aa,$aa. mode% of any other value sets the foreground colour to black (the default). See also DEFAULTWIN and gCREATE. no ellipse is drawn. If fill% is supplied and if fill%<>0 then the ellipse is filled with the current pen colour. See gCIRCLE, gCOLOR.@Returns a string representation of the number x. The string will be up to y% characters long. Example GEN$(123.456,7) returns 123.456 and GEN$(243,5) returns 243. If y% is negative then the string ish right-justified - for example GEN$(1,-6) returns 1 where there are five spaces to the left of the 1. If y% is positive then no spaces are added for example GEN$(1,6) returns 1. If the number x will not fit in the width specified by y%, then the string will just be asterisks, for example GEN$(256.99,4) returns ****. See also FIX$, NUM$, SCI$.A  h8p @  xHP X Times New Roman"Times New Roman h8p @  xHP X "Times New Roman_JO"Times New RomankBReturns new command-line arguments to an OPA, after a change files or quit event has occurred. The first character of the returned string is C, O or X. If the return is C or O, the rest of the string is a filename. The first character has the following meaning: C - close down the current file, and create the specified new file, O - close down the current file, and open the specified existing file, X - close down the current file (if any) and quit the OPA. Constants for these return values are supplied in Const.oph. You can only call GETCMD$ once for each system message. See also CMD$.A"Times New Roman>E0= n%k$33:   ))U "Times New RomanAGoes to the line following the label:: and continues from there. The label Must be in the current procedure Must start with a letter and end with a double colon, although the double colon is not necessary in the GOTO statement May be up to 32 characters longage. See also CMD$.KLGets all event types handled by GETEVENT ev%() and additionally pointer (pen) events. The latter are too large to fit into the array of integers provided for GETEVENT ev%(). ev&() must have at least 16 elements. All events return a 32-bit time stamp. The window ID mentioned below refers to the value returned by the gCREATE keyword. The modifier values and scancode values for a keypress (which specify a location on the keyboard) are given in the Advanced Topics chapter and Appendix D. GETEVENT32 returns more information than GETEVENT, as listed below: If a key has been pressed: (ev&(1) AND &400)=0  ev&(1) keycode  ev&(2) time stamp  ev&(3) scan code  ev&(4) modifier  ev&(5) repeat Note that unlike the repeat for GETEVENT, the repeat for GETEVENT32 is strictly a repeat, i.e. if there is only one keypress, then the value of ev&(5) is 0. For all the other event types, ev&(1) is greater than &400: If the program has moved to foreground: ev&(1)=&401  ev&(2) time stamp If the program has moved to background: ev&(1)=&402  ev&(2) time stamp If the machine is switched on:. ev&(1)=&403  ev&(2) time stamp Note that this event is not enabled unless the appropriate flag is set (by default it is not): see SETFLAGS. If the Series 5 wants the OPL application to switch files or exit: ev&(1)=&404 If this event is received, GETCMD$ should be called to find out what action should be taken: see GETCMD$. If a key is pressed down: ev&(1)=&406  ev&(2) time stamp  ev&(3) scan code  ev&(4) modifiers If a key is released: ev&(1)=&407  ev&(2) time stamp  ev&(3) scan code  ev&(4) modifiers If a pen event occurs: ev&(1)=&408  ev&(2) time stamp  ev&(3) window ID  ev&(4) pointer type (see below)  ev&(5) modifiers  ev&(6) x-co-ordinate  ev&(7) y-co-ordinate  ev&(8) x-co-ordinate relative to parent window  ev&(9) y-co-ordinate relative to parent window For pen events, ev&(4) has one of the following values: 0 - pen down1 - pen up6 - drag If a pen enters contact with the screen: ev&(1)=&409  ev&(2) time stamp  ev&(3) window ID If a pen exits contact with the screen: ev&(1)=&40A  ev&(2) time stamp  ev&(3) window ID Constants for the array subscripts and the return values are supplied in Const.oph. Some pointer events, and pointer enters and exits, can be filtered out to avoid being swamped by unwanted event types. See POINTERFILTER. Note that for other unknown events, ev&(1) contains &1400 added to the code returned by the window server. ev&(2) is the timestamp and ev&(3)is the window ID, and the rest of the data returned by the window server is put into ev&(4), ev&(5), etc. If a non-key event such as foreground occurs while a keyboard keyword such as GET, INPUT, MENU or DIALOG is being used, the event is discarded. So GETEVENT must be used if non-key events are to be monitored. If you need to use these keywords in OPAs, use LOCK ON / LOCK OFF around them, so that the System screen wont send messages to switch files or shutdown while the application cannot respond. See also GETEVENT, GETEVENTA32.ADraws a line from the current position to the point x%,y%. The current position moves to x%,y%. The Series 5 never draws the end point, so for gLINETO x%,y%, point x%,y% is not drawn Note, however, that OPL specially plots the point when the start and end-point coincide. To plot a single point on all machines, use gLINETO to the current position (or gLINEBY 0,0). See also gLINEBY, gPOLY.ASets the font for current drawable to fontId%. The font may be one of the predefined fonts in the ROM or a user-defined font. See the Graphics chapter for more details of fonts. Constants for the font UIDs are supplied in Const.oph. User-defined fonts must first be loaded by gLOADFONT, then the font UIDs of the loaded fonts may be used with gFONT. Note that this is not the ID returned by gLOADFONT (which is the font file ID), but the UID defined in the font file itself. See also gLOADFONT, FONT.ASets the effect of all subsequent drawing commands gLINEBY, gBOX etc. on the current drawable. mode% pixels will be: 0 set 1 cleared 2 inverted Constants for the mode are supplied in Const.oph. When you first use drawing commands on a drawable, they set pixels in the drawable. Use gGMODE to change this. For example, if you have drawn a black background, you can draw a white box outline inside it with either gGMODE 1 or gGMODE 2, followed by gBOX.$Ku}LE9^mYM59}GELLIPSE@gELLIPSE hRadius%,vRadius% or gELLIPSE hRadius%,vRadius%,fill%Y@"Courier "Courierjp"Times New Romann^"Times New RomanGEN$g$=gen$(x,y%)k5lGETg%=GETmz"Times New RomanMN` "Times New RomanGET$g$=GET$nu"Times New RomanTVd"Times New RomanGETCMD$ w$=GETCMD$ok"Times New Roman0GJ>>9"Times New RomanGETDOC$docname$=GETDOC$"Times New RomanGLINEBYgLINEBY dx%,dy%x"Times New RomancZ:5"Times New RomanGLINETOgLINETO x%,y%yz"Times New RomanaY[_"Times New Roman}GLOADBITSid%=gLOADBIT(name$,write%,index%) id%=gLOADBIT(name$,write%) id%=gLOADBIT(name$)j"Courier#"Courierz"Times New Roman Q/>?"Times New Roman GLOADFONTfileId%=gLOADFONT(file$){"Times New Roman kT"Times New RomanGLOBALGLOBAL variables|}uGMOVEgMOVE dx%,dy%Moves the current position dx% to the right and dy% downwards, in the current drawable. A negative dx% causes movement to the left; a negative dy% causes upward movement. See also gAT.~GORDERgORDER id%,position%ou"Times New Roman5%"Times New RomanGORIGINX x%=gORIGINXReturns the gap between the left side of the screen and the left side of the current window. Raises an error if the current drawable is a bitmap.k"Times New Roman^54"Times New RomanGORIGINY y%=gORIGINYReturns the gap between the top of the screen and the top of the current window. Raises an error if the current drawable is a bitmap.k"Times New RomanR54"Times New RomanGOTOGOTO label or GOTO label::MGOTOMARK GOTOMARK b%{Makes the record with bookmark b%, as returned by BOOKMARK, the current record. b% must be a bookmark in the current view.D{z"Times New RomanGPATTgPATT id%,width%,height%,mode%u"Times New Romanh'7$#"Times New RomanCDraws a sequence of lines, as if by gLINEBY and gMOVE commands. The array is set up as follows: a%(1) starting x position a%(2) starting y position a%(3) number of pairs of offsets a%(4) dx1% a%(5) dy1% a%(6) dx2% a%(7) dy2% etc. Constants for the first five array subscripts are supplied in Const.oph. Each pair of numbers dx1%,dy1%, for example specifies a line or a movement. To draw a line, dy% is the amount to move down, while dx% is the amount to move to the right multiplied by two. To specify a movement (i.e. without drawing a line) work out the dx%,dy% as for a line, then add 1 to dx%. (For drawing/movement up or left, use negative numbers.) gPOLY is quicker than combinations of gAT, gLINEBY and gMOVE. Example, to draw three horizontal lines 50 pixels long at positions 20,10, 20,30 and 20,50: a%(1)=20 :a%(2)=10 REM 20,10 a%(3)=5 REM 5 operations a%(4)=50*2 :a%(5)=0 REM draw right 50 a%(6)=0*2+1 :a%(7)=20 REM move down 20 a%(8)=-50*2 :a%(9)=0REM draw left 50 a%(10)=0*2+1 :a%(11)=20REM draw left 50 a%(12)=50*2 :a%(13)=0REM draw right 50 gPOLY a%()(DDisplays text t$ in a cleared box of width w% pixels. The current position is used for the left side of the box and for the baseline of the text. al% controls the alignment of the text in the box 1 for right aligned, 2 for left aligned, or 3 for centred. tp% and bt% are the clearances between the text and the top/bottom of the box. Together with the current font size, they control the height of the box. An error is raised if tp% plus the font ascent is greater than 255. m% controls the margins. For left alignment, m% is an offset from the left of the box to the start of the text. For right alignment, m% is an offset from the right of the box to the end of the text. For centring, m% is an offset from the left or right of the box to the region in which to centre, with positive m% meaning left and negative meaning right. If values are not supplied for some arguments, these defaults are used: al% left tp% 0 bt% 0 m% 0 Constants for the layout features and the defaults are supplied in Const.oph. See also gPRINT, gPRINTCLIP, gTWIDTH, gXPRINT.ADisplays a list of expressions at the current position in the current drawable. All variable types are formatted as for PRINT. Unlike PRINT, gPRINT does not end by moving to a new line. A comma between expressions is still displayed as a space, but a semicolon has no effect. gPRINT without a list of expressions does nothing. See also gPRINTB, gPRINTCLIP, gTWIDTH, gXPRINT, gTMODE.YASaves the current drawable as the named bitmap file. If width% and height% are given, then only the rectangle of that size from the current position is copied. gSAVEBIT does not add a default filename extension to the input argument name if none is provided on the Series 5, while on the Series 3c, if name$ has no file extension .PIC is used.AScrolls pixels in the current drawable by offset dx%,dy%. Positive dx% means to the right, and positive dy% means down. The drawable itself does not change its position. If you specify a rectangle in the current drawable, at x%,y% and of size wd%,ht%, only this rectangle is scrolled. The areas dx% wide and dy% deep which are left behind by the scroll are cleared. The current position is not affected.VAChanges position and, optionally, the size of the current window. An error is raised if the current drawable is a bitmap. The current position is unaffected. If you use this command on the default window, you must also use the SCREEN command to ensure that the area for PRINT commands to use is wholly contained within the default window.ASets the style of text displayed in subsequent gPRINT, gPRINTB and gPRINTCLIP commands on the current drawable. style% text style 0 normal 1 bold 2 underlined 4 inverse 8 double height 16 mono-spaced 32 italic You can combine these styles by adding their values for example, to set bold, underlined and double height, use gSTYLE 11, as 11=1+2+8. This command does not affect non-graphics commands, like PRINT. Constants for the styles are supplied in Const.oph.BSets the way characters are displayed by subsequent gPRINT and gPRINTCLIP commands on the current drawable. mode% pixels will be 0 set 1 cleared 2 inverted 3 replaced When you first use graphics text commands on a drawable, each dot in a letter causes a pixel to be set in the drawable. This is mode%=0. When mode% is 1 or 2, graphics text commands work in a similar way, but the pixels are cleared or inverted. When mode% is 3, entire character boxes are drawn on the screen - pixels are set in the letter and cleared in the background box. This command does not affect other text display commands. Constants for the modes are supplied in Const.oph.DThe Psions screen is usually updated whenever you display anything on it. gUPDATE OFF switches off this feature. The screen will then be updated as few times as possible (though note that some keywords will always cause an update.) You can still force an update by using the gUPDATE command on its own. This can result in a considerable speed improvement in some cases. You might, for example, use gUPDATE OFF, then a sequence of graphics commands, followed by gUPDATE. You should certainly use gUPDATE OFF if you are about to write exclusively to bitmaps. gUPDATE ON returns to normal screen updating. gUPDATE affects anything that displays on the screen. If you are using a lot of PRINT commands, gUPDATE OFF may make a noticeable difference in speed. Note that with gUPDATE OFF, the location of errors which occur while the procedure is running may be incorrectly reported. For this reason, gUPDATE OFF is best used in the final stages of program development, and even then you may have to remove it to locate some errors.CDraws a border in the current drawable of a specified type, fitting inside a rectangle of the specified size or with the size of the current drawable if no size is specified. type%=1 for drawing the Series 3c 3-D grey and black border. A shadow or a gap for a shadow is always assumed. type%=2 for drawing the Series 5 borders. Values for flags% and their effects on the Series 5 are as follows, border type flags% none $00 single black $01 shallow sunken $42 deep sunken $44 deep sunken with outline $54 shallow raised $82 deep raised $84 deep raised with outline $94 vertical bar $22 horizontal bar $2a Constants for these flags and types are supplied in Const.oph. The following values of flags% apply to all border types: 0 for normal corners Adding $100 leaves 1 pixel gap around the border. Adding $200 for more rounded corners Adding $400 for losing a single pixel. If both $400 and $200 are mistakenly supplied, $200 has priority. See also gBORDER.A h8p @  xHP X "Times New RomancJI"Times New Romanned in the final stages of program development, and even then you may have to remove it to locate some errors.(P1ya5Mui} GPEEKLINE#gPEEKLINE id%,x%,y%,d%(),ln%,mode%D#""Times New Romand"Times New Roman"Times New RomanM4Df7"Times New RomanGPOLY gPOLY a%()C"Times New Roman@!#   Jl:?]((&)(  "Times New RomanGPRINTgPRINT list of expressionsp"Times New Roman87"Times New Roman}GPRINTBqgPRINTB t$,w%,al%,tp%,bt%,m% gPRINTB t$,w%,al%,tp%,bt% gPRINTB t$,w%,al%,tp% gPRINTB t$,w%,al% gPRINTB t$,w%z"Times New Roman "Times New Roman("Times New Roman ndI O/."Times New Roman GPRINTCLIPw%=gPRINTCLIP(text$,width%)Displays text$ at the current position, displaying only as many characters as will fit inside width% pixels. Returns the number of characters displayed. See also gPRINT, gPRINTB, gTWIDTH, gXPRINT, gTMODE.k"Times New Roman43"Times New RomanGRANK rank%=gRANKReturns the foreground/background position, from 1 to 64 on the Series 5, and 1 to 8 on the Series 3c, of the current window. Raises an error if the current drawable is a bitmap. See also gORDER.p"Times New Roman6"Times New Roman}GSAVEBIT1gSAVEBIT name$,width%,height% or gSAVEBIT name$a"Courier"CourierYk"Times New Roman"Times New Roman}GSCROLL2gSCROLL dx%,dy%,x%,y%,wd%,ht% or gSCROLL dx%,dy%a"Courier"Courieru"Times New RomantT&%"Times New Roman GSETPENWIDTHgSETPENWIDTH width%=Sets the pen width in the current drawable to width% pixels.D=<"Times New Roman}GSETWIN/gSETWIN x%,y%,width%,height% or gSETWIN x%,y%a"Courier"CourierVu"Times New RomanC9%"Times New RomanGSTYLEgSTYLE style%"Times New Roman q    A43"Times New RomanGTMODE gTMODE mode%"Times New Roman m   ;32"Times New RomanGTWIDTHwidth%=gTWIDTH(text$)jReturns the width of text$ in the current font and style. See also gPRINT, gPRINTB, gPRINTCLIP, gXPRINT.k"Times New Roman;/."Times New Roman GUNLOADFONTgULOADFONT fileId%Unloads a user-defined font that was previously loaded using gLOADFONT. Raises an error if the font has not been loaded. The built-in fonts are not held in memory and cannot be unloaded. See also gLOADFONT.p"Times New RomanzC"Times New Roman}GUPDATE!gUPDATE ON gUPDATE OFF gUPDATEp"Times New Roman  "Times New Romanz"Times New Roman1/"Times New Roman@Displays string$ at the current position, with precise highlighting or underlining. The current font and style are still used, even if the style itself is inverse or underlined. If tex