17
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 sbFormat STATIC slUpdated := .F. STATIC slKillRead STATIC slBumpTop STATIC slBumpBot STATIC snLastExitState STATIC snLastPos STATIC soActiveGet STATIC scReadProcName STATIC snReadProcLine //@@New: static snPos static snBounce static snFieldPos static slIcon // // Format of array used to preserve state variables // #define GSV_KILLREAD 1 #define GSV_BUMPTOP 2 Page 1

GETSYS

Embed Size (px)

DESCRIPTION

GETSYS

Citation preview

Page 1: GETSYS

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

Page 2: GETSYS

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

Page 3: GETSYS

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

Page 4: GETSYS

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

Page 5: GETSYS

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

Page 6: GETSYS

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

Page 7: GETSYS

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

Page 8: GETSYS

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

Page 9: GETSYS

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

Page 10: GETSYS

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

Page 11: GETSYS

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

Page 12: GETSYS

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

Page 13: GETSYS

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

Page 14: GETSYS

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

Page 15: GETSYS

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

Page 16: GETSYS

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

Page 17: GETSYS

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