[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]


/*********************************************************************

   EX2.PRG - CUA-Clip Library examples.

   This file contains sample code illustrating the Event system.

Author: Dave Rooney
Date  : Feb. 22, 1993

*********************************************************************/

#include "Demo.CH"

//
// Example 2 - Establishing a background procedure using SetInterrupt.
//

FUNCTION Event_Examples

LOCAL cScreen,       ; // Screen behind the dialog box
      cOldColor,     ; // Colour on entry
      bInterrupt,    ; // Interrupt code block on entry
      nKey,          ; // Key pressed by the user
      lExit            // Loop control flag

//
// Initialize the variables...
//
cOldColor := SETCOLOR()
nKey      := 0
lExit     := .F.

//
// Set an interrupt function to be called during wait states,
// i.e. InterruptKey().  Note that we're saving the current
// interrupt code block which we'll restore later.
//
bInterrupt := SetInterrupt( {|| MyInterrupt() } )

//
// Display the dialog box:
//
//                      Position   Type Colour
//                         v         v     v
cScreen := ShadowBox( 4, 12, 12, 68, 2, "GR+/B" )

SETCOLOR( "W+/B" )

@ 4,14 SAY "[ CUA-Clip Interface Library - Event System Examples ]"

SETCOLOR( "BG+/B" )

@  6,14 SAY "Press any key (<ESC> to exit)..."
@  8,14 SAY "Scan code:"
@ 10,14 SAY "Current time:"

SETCOLOR( "W+/B" )

DO WHILE nKey <> K_ESC
   //
   // Read keystrokes until the user presses <ESC>.
   //
   // Note that InterruptKey operates exactly like INKEY (you pass
   // the number of seconds to wait or 0 to wait indefinitely),
   // except that it calls the current Interrupt function in the
   // background.
   //
   nKey := InterruptKey(0)

   IF nKey <> K_ESC
      @ 8,25 SAY PADR( STR( nKey, 3 ), 20 )
   ENDIF
ENDDO

//
// Get rid of the dialog box...
//
KillBox( cScreen )

//
// Reset the interrupt code block.
//
SetInterrupt( bInterrupt )

SETCOLOR( cOldColor )

RETURN NIL
//
// That's all folks!
//


/*******************************************************************

   FUNCTION MyInterrupt

   This is our background function that will be called during the
InterruptKey wait state.  It will display the time in the dialog
box, and display a message if you wait too long!!

NOTE: You must remember that this function will be called many times!
      As such its processing must be kept to a minimum.  In this case
      we will only redisplay the time if it has changed.

   Parameters: None.

      Returns: NIL

*******************************************************************/

STATIC FUNCTION MyInterrupt

STATIC cOldTime, nWaited

LOCAL cOldColor,     ; // Colour on entry
      cCurTime,      ; // Current time
      nRow, nCol       // Position on entry

IF cOldTime == NIL
   cOldTime := TIME()
   nWaited  := 0
ENDIF

cCurTime := TIME()

IF !( cCurTime == cOldTime )
   cOldColor := SETCOLOR( "W+/B" )
   nRow      := ROW()
   nCol      := COL()

   @ 10,28 SAY cCurTime

   cOldTime := cCurTime

   ++ nWaited

   IF nWaited > 10
      nWaited := 0

      TONE( 250, 1 )

      @ 8,25 SAY "Well... press a key!"

      InterruptKey(3)

      @ 8,25 SAY SPACE(20)
   ENDIF

   SETPOS( nRow, nCol )
   SETCOLOR( cOldColor )
ENDIF

RETURN NIL
//
// EOP: MyInterrupt
//

This page created by ng2html v1.05, the Norton guide to HTML conversion utility. Written by Dave Pearson