Upload
suresh-sharma
View
8
Download
3
Embed Size (px)
DESCRIPTION
GETSYS
Citation preview
GETSYS***** Getsys.prg** Standard Clipper GET/READ Subsystem** Copyright (c) 1991-1993, Computer Associates International, Inc.* All rights reserved.** This version was modified for SOUND & VISION by Tom Groeger 1993** ReadKill ( [<lKill>] ) --> lKill* ReadUpdated( [<lUpdated>] ) --> lUpdated* ReadFormat ( [<bFormat>] ) --> bFormat | NIL** NOTE: compile with /m /n /w**/
#include "Inkey.ch"#include "Getexit.ch"#include "SoundVis.ch"
#define K_UNDO K_CTRL_U
/* define Keys for Spinner */#ifndef K_CTRL_UP #define K_CTRL_UP 397 // Ctrl-Up#endif
#ifndef K_CTRL_DOWN #define K_CTRL_DOWN 401 // Ctrl-Down#endif
#ifndef K_SPACE #define K_SPACE 32 // SpaceBar#endif
//// State variables for active READ//STATIC sbFormatSTATIC slUpdated := .F.STATIC slKillReadSTATIC slBumpTopSTATIC slBumpBotSTATIC snLastExitStateSTATIC snLastPosSTATIC soActiveGetSTATIC scReadProcNameSTATIC snReadProcLine
//@@New:static snPosstatic snBouncestatic snFieldPosstatic slIcon
//// Format of array used to preserve state variables//#define GSV_KILLREAD 1#define GSV_BUMPTOP 2
Page 1
GETSYS#define GSV_BUMPBOT 3#define GSV_LASTEXIT 4#define GSV_LASTPOS 5#define GSV_ACTIVEGET 6#define GSV_READVAR 7#define GSV_READPROCNAME 8#define GSV_READPROCLINE 9
//@@New :#define GSV_NPOS 10 // Aktiv GetField#define GSV_BOUNCEPOS 11 // New Getfield#define GSV_FIELDPOS 12 // Position within Get#define GSV_LISTICON 13 // ListIcon active .t./.f.#define GSV_COUNT 13 // Size of SaveArrays
#define GE_BOUNCE 9 // ExitState: activate new Get
/* FUNCTIONS :
GetSetFocus( oGet ) ReadFormat( b ) ReadUpdated( lUpdated ) ReadKill( lKill ) RangeCheck( oGet, junk, lo, hi ) DateMsg() ShowScoreboard() ReadInsert( lNew ) ReadExit( lNew ) Updated() SetFldIcon ( nId ) SetBounce ( nBounce ) GetActive( g ) __KillRead() __SetFormat( b ) GetReadVar( oGet ) RestoreGetSysVars( aSavSysVars ) ClearGetSysVars() PostActiveGet( oGet ) Settle( GetList, nPos ) GetDoSetKey( keyBlock, oGet ) GetPostValidate( oGet ) GetPreValidate( oGet ) GetApplyKey( oGet, nKey ) GetReader( oGet, Getlist ) ReadModal( GetList, nPos )
*/
/***** ReadModal()** Standard modal READ on an array of GETs**/FUNCTION ReadModal( GetList, nPos )
Page 2
GETSYS
LOCAL oGet LOCAL aSavGetSysVars
IF ( VALTYPE( sbFormat ) == "B" ) EVAL( sbFormat ) ENDIF
IF ( EMPTY( GetList ) ) RETURN (.F.) // NOTE ENDIF
// Preserve state variables aSavGetSysVars := ClearGetSysVars()
// Set these for use in SET KEYs scReadProcName := PROCNAME (1) snReadProcLine := PROCLINE (1)
// Set initial GET to be read IF !( VALTYPE( nPos ) == "N" .AND. nPos > 0 ) snPos := Settle( Getlist, 0 ) ELSE snPos := nPos //@NEW snPos ENDIF
WHILE !( snPos == 0 )
/* Get next GET from list and post it as the active GET */ PostActiveGet( oGet := GetList[ snPos ] )
/* Read the GET @@new: Parameter Getlist */ IF ( VALTYPE( oGet:reader ) == "B" )
/* Use Custom-Reader */ EVAL( oGet:reader, oGet, getlist,snPos )
ELSE GetReader( oGet, getlist)
ENDIF
/* Move to next GET based on exit condition */ snPos := Settle( GetList, snPos )
ENDDO
// Restore state variables RestoreGetSysVars( aSavGetSysVars )
// S'87 compatibility SETPOS( MAXROW() - 1, 0 )
RETURN ( slUpdated )
/***** GetReader()** Standard modal read of a single GET
Page 3
GETSYS* @@New: Parameter getlist*/PROCEDURE GetReader( oGet, Getlist ) LOCAL nCurs := SETCURSOR()
// Read the GET if the WHEN condition is satisfied IF ( GetPreValidate( oGet ) )
//@@New : Activate the GET for reading GetSetFocus ( oGet )
WHILE ( oGet:exitState == GE_NOEXIT )
// Check for initial typeout (no editable positions) IF ( oGet:typeOut ) oGet:exitState := GE_ENTER ENDIF
// Apply keystrokes until exit WHILE ( oGet:exitState == GE_NOEXIT )
// @@New CursOn() GetApplyKey ( oGet, KeyReader (getlist,0) )
ENDDO
// @@New : Restore Cursor but retain Insert-Status IF nCurs > 0 CursOn() ELSE SETCURSOR (0) ENDIF
// Disallow exit if the VALID condition is not satisfied IF ( !GetPostValidate( oGet ) ) oGet:exitState := GE_NOEXIT ENDIF ENDDO
// De-activate the GET oGet:killFocus()
ENDIF
RETURN
/***** GetApplyKey()** Apply a single INKEY() keystroke to a GET** NOTE: GET must have focus.**/PROCEDURE GetApplyKey( oGet, nKey ) local cKey
Page 4
GETSYS do case case ( nKey == K_RIGHT ) ; oGet:right() case ( nKey == K_LEFT ) ; oGet:left() case ( nKey == K_ENTER ) ; oGet:exitState := GE_ENTER case ( nKey == K_CTRL_HOME) ; oGet:exitState := GE_TOP case ( nKey == K_UNDO ) ; oGet:undo() case ( nKey == K_HOME ) ; oGet:home() case ( nKey == K_END ) ; oGet:end() case ( nKey == K_CTRL_RIGHT ) ; oGet:wordRight() case ( nKey == K_CTRL_LEFT ) ; oGet:wordLeft() case ( nKey == K_BS ) ; oGet:backSpace() case ( nKey == K_DEL ) ; oGet:delete() case ( nKey == K_CTRL_T ) ; oGet:delWordRight() case ( nKey == K_CTRL_Y ) ; oGet:delEnd() case ( nKey == K_CTRL_BS ) ; oGet:delWordLeft()
case ( nKey == K_UP ) .OR. ( nKey == K_SH_TAB ) oGet:exitState := GE_UP
case ( nKey == K_DOWN ) .OR. ( nKey == K_TAB ) oGet:exitState := GE_DOWN
case ( nKey == K_PGUP ) .OR. ( nKey == K_PGDN ) oGet:exitState := GE_WRITE
case ( nKey == K_ESC ) if (SET( _SET_ESCAPE)) oGet:undo() oGet:exitState := GE_ESCAPE endif
case ( nKey == K_INS ) set (_SET_INSERT, !set(_SET_INSERT)) ShowScoreboard()
#ifdef CTRL_END_SPECIAL case ( nKey == K_CTRL_END ) // ^W and ^End go to the last GET oGet:exitState := GE_BOTTOM #else case ( nKey == K_CTRL_W ) // ^W and ^End terminate the READ (default) oGet:exitState := GE_WRITE #endif
otherwise if (nKey >= 32 .AND. nKey < 255 ) // NOTE < 255, not 255! cKey := chr (nKey)
if (oGet:type == "N" .AND. (cKey == "." .OR. cKey == "," ) ) oGet:toDecPos() else if (set( _SET_INSERT )) oGet:insert( cKey ) else oGet:overstrike( cKey ) endif
if ( oGet:typeOut ) if ( set ( _SET_BELL )) errorsound(2) endif if ( !set (_SET_CONFIRM ) )
Page 5
GETSYS oGet:exitState := GE_ENTER endif endif endif endif endcase
return
/***** GetPreValidate()** Test entry condition (WHEN clause) for a GET**/FUNCTION GetPreValidate (oGet)
LOCAL lSavUpdated LOCAL lWhen := .T.
if ! (oGet:preBlock == nil) lSavUpdated := slUpdated lWhen := oGet:preBlock:eval (oGet) oGet:display() slUpdated := lSavUpdated
endif if ! (slKillRead == nil) .AND. (slKillRead) lWhen := .F. oGet:exitState := GE_ESCAPE // Provokes ReadModal() exit
elseif ! (lWhen) oGet:exitState := GE_WHEN // Indicates failure
else oGet:exitState := GE_NOEXIT // Prepares for editing endif
return lWhen
/***** GetPostValidate()** Test exit condition (VALID clause) for a GET** NOTE: Bad dates are rejected in such a way as to preserve edit buffer**/FUNCTION GetPostValidate( oGet )
LOCAL lSavUpdated LOCAL lValid := .T.
IF ( oGet:exitState == GE_ESCAPE ) RETURN ( .T. ) // NOTE
Page 6
GETSYS ENDIF
IF ( oGet:badDate() ) oGet:home() DateMsg() ShowScoreboard() RETURN ( .F. ) // NOTE ENDIF
// If editing occurred, assign the new value to the variable IF ( oGet:changed ) oGet:assign() slUpdated := .T. ENDIF
// Reform edit buffer, set cursor to home position, redisplay oGet:reset()
// Check VALID condition if specified IF !( oGet:postBlock == NIL )
lSavUpdated := slUpdated lValid := EVAL( oGet:postBlock, oGet )
ShowScoreBoard() oGet:updateBuffer()
slUpdated := lSavUpdated
IF ( slKillRead ) oGet:exitState := GE_ESCAPE // Provokes ReadModal() exit lValid := .T.
ENDIF ENDIF
RETURN ( lValid )
/***** GetDoSetKey()** Process SET KEY during editing**/PROCEDURE GetDoSetKey( keyBlock, oGet )
LOCAL lSavUpdated
// If editing has occurred, assign variable IF ( oGet:changed ) oGet:assign() slUpdated := .T. ENDIF
lSavUpdated := slUpdated
EVAL( keyBlock, scReadProcName, snReadProcLine, ReadVar() )
ShowScoreboard() oGet:updateBuffer()
Page 7
GETSYS
slUpdated := lSavUpdated
IF ( slKillRead ) oGet:exitState := GE_ESCAPE // provokes ReadModal() exit ENDIF
RETURN
/**** READ services*/
/***** Settle()** Returns new position in array of Get objects, based on:* - current position* - exitState of Get object at current position** NOTES: return value of 0 indicates termination of READ* exitState of old Get is transferred to new Get**/STATIC FUNCTION Settle( GetList, nPos )
LOCAL nExitState
IF ( nPos == 0 ) nExitState := GE_DOWN ELSE nExitState := GetList[ nPos ]:exitState
ENDIF
IF ( nExitState == GE_ESCAPE .or. nExitState == GE_WRITE ) RETURN ( 0 ) // NOTE ENDIF
IF !( nExitState == GE_WHEN ) // Reset state info snLastPos := nPos slBumpTop := .F. slBumpBot := .F. ELSE // Re-use last exitState, do not disturb state info nExitState := snLastExitState ENDIF
// // Move // DO CASE CASE ( nExitState == GE_UP ) nPos--
Page 8
GETSYS
CASE ( nExitState == GE_DOWN ) nPos++
CASE ( nExitState == GE_TOP ) nPos := 1 slBumpTop := .T. nExitState := GE_DOWN
CASE ( nExitState == GE_BOTTOM ) nPos := LEN( GetList ) slBumpBot := .T. nExitState := GE_UP
CASE ( nExitState == GE_ENTER ) nPos++
// @@New ( Mouse ) case ( nExitState == GE_BOUNCE ) nPos := snBounce nExitState := GE_DOWN
ENDCASE
// // Bounce // IF ( nPos == 0 ) // Bumped top IF ( !ReadExit() .and. !slBumpBot ) slBumpTop := .T. nPos := snLastPos nExitState := GE_DOWN
ENDIF
ELSEIF ( nPos == len( GetList ) + 1 ) // Bumped bottom IF ( !ReadExit() .and. !( nExitState == GE_ENTER ) .and. !slBumpTop ) slBumpBot := .T. nPos := snLastPos nExitState := GE_UP ELSE nPos := 0 ENDIF ENDIF
// Record exit state snLastExitState := nExitState
IF !( nPos == 0 ) GetList[ nPos ]:exitState := nExitState ENDIF
RETURN ( nPos )
/***** PostActiveGet()** Post active GET for ReadVar(), GetActive()**/
Page 9
GETSYSSTATIC PROCEDURE PostActiveGet( oGet )
GetActive( oGet ) ReadVar( GetReadVar( oGet ) )
ShowScoreBoard()
RETURN
/***** ClearGetSysVars()** Save and clear READ state variables. Return array of saved values** NOTE: 'Updated' status is cleared but not saved (S'87 compatibility)*/STATIC FUNCTION ClearGetSysVars()
LOCAL aSavSysVars[ GSV_COUNT ]
// Save current sys vars aSavSysVars[ GSV_KILLREAD ] := slKillRead aSavSysVars[ GSV_BUMPTOP ] := slBumpTop aSavSysVars[ GSV_BUMPBOT ] := slBumpBot aSavSysVars[ GSV_LASTEXIT ] := snLastExitState aSavSysVars[ GSV_LASTPOS ] := snLastPos aSavSysVars[ GSV_ACTIVEGET ] := GetActive( NIL ) aSavSysVars[ GSV_READVAR ] := ReadVar( "" ) aSavSysVars[ GSV_READPROCNAME ] := scReadProcName aSavSysVars[ GSV_READPROCLINE ] := snReadProcLine
// @@New// ----- aSavSysVars [GSV_NPOS] := snPos aSavSysVars [GSV_BOUNCEPOS] := snBounce aSavSysVars [GSV_FIELDPOS] := snFieldPos aSavSysVars [GSV_LISTICON] := slIcon
// Re-init old ones slKillRead := .F. slBumpTop := .F. slBumpBot := .F. snLastExitState := GE_ENTER snLastPos := 0 scReadProcName := "" snReadProcLine := 0 slUpdated := .F.
//@New snPos := 0 snBounce := 0 snFieldPos := -1 slIcon := 0
RETURN ( aSavSysVars )
/***Page 10
GETSYS** RestoreGetSysVars()** Restore READ state variables from array of saved values** NOTE: 'Updated' status is not restored (S'87 compatibility)**/STATIC PROCEDURE RestoreGetSysVars( aSavSysVars )
slKillRead := aSavSysVars[ GSV_KILLREAD ] slBumpTop := aSavSysVars[ GSV_BUMPTOP ] slBumpBot := aSavSysVars[ GSV_BUMPBOT ] snLastExitState := aSavSysVars[ GSV_LASTEXIT] snLastPos := aSavSysVars[ GSV_LASTPOS ]
GetActive( aSavSysVars[ GSV_ACTIVEGET ] )
ReadVar( aSavSysVars[ GSV_READVAR ] )
scReadProcName := aSavSysVars[ GSV_READPROCNAME ] snReadProcLine := aSavSysVars[ GSV_READPROCLINE ]
// @@New:// ----- snPos := aSavSysVars [GSV_NPOS] snBounce := aSavSysVars [GSV_BOUNCEPOS] snFieldPos := aSavSysVars [GSV_FIELDPOS] slIcon := aSavSysVar [GSV_LISTICON]
RETURN
/***** GetReadVar()** Set READVAR() value from a GET**/STATIC FUNCTION GetReadVar( oGet )
LOCAL cName := UPPER( oGet:name ) LOCAL i
// The following code includes subscripts in the name returned by // this FUNCTIONtion, if the get variable is an array element // // Subscripts are retrieved from the oGet:subscript instance variable // // NOTE: Incompatible with Summer 87 // IF !( oGet:subscript == NIL ) FOR i := 1 TO LEN( oGet:subscript ) cName += "[" + LTRIM( STR( oGet:subscript[i] ) ) + "]" NEXT END
RETURN ( cName )
Page 11
GETSYS
/**** System Services*/
/***** __SetFormat()** SET FORMAT service**/PROCEDURE __SetFormat( b ) sbFormat := IF( VALTYPE( b ) == "B", b, NIL ) RETURN
/***** __KillRead()** CLEAR GETS service**/PROCEDURE __KillRead() slKillRead := .T. RETURN
/***** GetActive()** Retrieves currently active GET object*/FUNCTION GetActive( g )
LOCAL oldActive := soActiveGet
IF ( PCOUNT() > 0 ) soActiveGet := g ENDIF
RETURN ( oldActive )
/***** Updated()**/FUNCTION Updated() RETURN slUpdated
/***Page 12
GETSYS** ReadExit()**/FUNCTION ReadExit( lNew ) RETURN ( SET( _SET_EXIT, lNew ) )
/***** ReadInsert()**/FUNCTION ReadInsert( lNew ) RETURN ( SET( _SET_INSERT, lNew ) )
/**** Wacky Compatibility Services*/
// Display coordinates for SCOREBOARD#define SCORE_ROW 0#define SCORE_COL 60
/***** ShowScoreboard()**/STATIC PROCEDURE ShowScoreboard()
LOCAL nRow LOCAL nCol
IF ( SET( _SET_SCOREBOARD ) ) nRow := ROW() nCol := COL()
SETPOS( SCORE_ROW, SCORE_COL ) DISPOUT( IF( SET( _SET_INSERT ), "Ins", " " ) ) SETPOS( nRow, nCol ) ENDIF
RETURN
/***** DateMsg()**/STATIC PROCEDURE DateMsg()
LOCAL nRow LOCAL nCol
IF ( SET( _SET_SCOREBOARD ) )Page 13
GETSYS
nRow := ROW() nCol := COL()
SETPOS( SCORE_ROW, SCORE_COL ) DISPOUT( "Invalid Date" ) SETPOS( nRow, nCol )
WHILE ( NEXTKEY() == 0 ) END
SETPOS( SCORE_ROW, SCORE_COL ) DISPOUT( SPACE( 12 ) ) SETPOS( nRow, nCol )
ENDIF
RETURN
/***** RangeCheck()** NOTE: Unused second param for 5.00 compatibility.**/FUNCTION RangeCheck( oGet, junk, lo, hi )
LOCAL cMsg, nRow, nCol LOCAL xValue
IF ( !oGet:changed ) RETURN ( .T. ) // NOTE ENDIF
xValue := oGet:varGet()
IF ( xValue >= lo .and. xValue <= hi ) RETURN ( .T. ) // NOTE ENDIF
IF ( SET(_SET_SCOREBOARD) )
cMsg := "Range: " + LTRIM( TRANSFORM( lo, "" ) ) + ; " - " + LTRIM( TRANSFORM( hi, "" ) )
IF ( LEN( cMsg ) > MAXCOL() ) cMsg := SUBSTR( cMsg, 1, MAXCOL() ) ENDIF
nRow := ROW() nCol := COL()
SETPOS( SCORE_ROW, MIN( 60, MAXCOL() - LEN( cMsg ) ) ) DISPOUT( cMsg ) SETPOS( nRow, nCol )
WHILE ( NEXTKEY() == 0 ) END
SETPOS( SCORE_ROW, MIN( 60, MAXCOL() - LEN( cMsg ) ) )Page 14
GETSYS DISPOUT( SPACE( LEN( cMsg ) ) ) SETPOS( nRow, nCol )
ENDIF
RETURN ( .F. )
/***** ReadKill()**/FUNCTION ReadKill( lKill )
LOCAL lSavKill := slKillRead
IF ( PCOUNT() > 0 ) IF (slKillRead := lKill) .AND. VALTYPE(soActiveGet) == "O" soActiveGet:ExitState := GE_ESCAPE // @@New SetLastKey (K_ESC) ENDIF ENDIF
RETURN ( lSavKill )
/***** ReadUpdated()**/FUNCTION ReadUpdated( lUpdated )
LOCAL lSavUpdated := slUpdated
IF ( PCOUNT() > 0 ) slUpdated := lUpdated ENDIF
RETURN ( lSavUpdated )
/***** ReadFormat()**/FUNCTION ReadFormat( b )
LOCAL bSavFormat := sbFormat
IF ( PCOUNT() > 0 ) sbFormat := b ENDIF
RETURN ( bSavFormat )
Page 15
GETSYS/*ÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÝÞ FUNCTION SetBounce ( nBounce) -> activeGet /@@NEW ÝÞ Set StaticVar snBounce to new Target Getfield ÝÞ Set activeGet:exitstate GE_BOUNCE ÝÞ Return soActiveGet ÝÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝ */
FUNCTION SetBounce ( nBounce )
if pcount() == 0 return snBounce endif
snBounce := nBounce if ! ( soActiveGet == nil)
soActiveGet:exitState := GE_BOUNCE endif
return ( soActiveGet )
/*ÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÝÞ FUNCTION SetFldIcon ( nId ) -> slIcon /@@NEW ÝÞ Set StaticVar snBounce to new Target Getfield ÝÞ Set activeGet:exitstate GE_BOUNCE ÝÞ Return soActiveGet ÝÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝ */
FUNCTION SetFldIcon ( nId ) RETURN IIF(PCOUNT() == 0, slIcon, slIcon := nId )
/*ÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÝÞ FUNCTION SetFieldPos( nId ) -> nFieldPos /@@NEW ÝÞ Set StaticVar snFieldPos to new Position ÝÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝ */
FUNCTION SetFieldPos ( nPos ) RETURN IIF(PCOUNT() == 0, snFieldPos, snFieldPos := nPos )
/*ÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÝÞ FUNCTION GetGetPos (nPos) -> nGetPos /@@NEW ÝÞ Get Position of current Get in Getlist ÝÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝ */
FUNCTION GetGetPos ( ) RETURN snPos
/*ÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÝÞ SUBROUTINE GetSetFocus /@@NEW ÝÞ This Proc sets the Input-Focus to the GET ÝÞ and positions the Cursor at the MouseCol ÝÞ ÝÞ PARAMETER: oGet : active Get ÝÞ RETURNS : nil ÝÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝ*/
PROCEDURE GetSetFocus( oGet )
Page 16
GETSYS/* donate Input-Focus -------------------- */ oGet:SetFocus()
/* fix FieldPosition ------------------- */ IF ! ( snFieldPos == -1 )
IF (LEN (TRANSFORM (oGet:varGet, oGet:picture)) >= snFieldPos) oGet:pos := snFieldPos+1 SetPos (oGet:row, oGet:Col + snFieldPos )
ENDIF ENDIF
snFieldPos := -1
RETURN
/*ÞßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÝÞ SUBROUTINE ErrorSound( nMode ) ÝÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝ*/ procedure ErrorSound ( nMode ) default nMode TO 2
if fm_is() fm_reset() FM_KeyOn ( nMode*2-1, 10 , 3) FM_KeyOn ( nMode*2, 10 , 2) SV_F058 ( 1, 25, "StopSound") else tone (1000) endif return
FUNCTION StopSound () local nx for nx := 1 to 8 FM_KeyOff (nx) next KillEvent ( ThisEvent() ) return nil
�
Page 17