home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / FOXPRO / TASKDE / TASKDEMO.PRG < prev   
Text File  |  1993-12-29  |  19KB  |  717 lines

  1. ****************************************************************************
  2. *                              TASKDEMO.PRG                                *
  3. *                                                                          *
  4. *           Multi-Tasking Demonstration Program For FoxPro (DOS)           *
  5. *                                                                          *
  6. *  Author: Ed Duchesne CIS [70720,1423]                                    *
  7. *  Date: December 28, 1993                                                 *
  8. *  Requires: FoxPro (DOS version), file - INTERVAL.BIN                     *
  9. *  Optional: files - LOADFONT.EXE, LEDGAUGE.FON, NORMAL.FON                *
  10. ****************************************************************************
  11. ****************************************************************************
  12. *
  13. * Notes: This program demonstrates background tasks for FoxPro (DOS only).
  14. * In this demo the user can view and edit a customer type database file 
  15. * while 3 tasks execute in the background. The user can edit records and
  16. * move through the customer file while different types of information are
  17. * displayed at various intervals. Stock Market type information scrolls at
  18. * the top of the screen. Personal type messages appear in a two line edit
  19. * box. Other information appears in a Pop-Up window. The Pop-Up window will
  20. * disappear after a short display time. Notice the user does not need to
  21. * stop typing when a new message has appeared. Also notice that when the
  22. * user selects exit and the ConfirmQuit window appears, the background
  23. * displays continue as usual. In this demo it is also possible to change
  24. * the look and feel of the application at any time if you are useing a 
  25. * VGA display. Almost all the editing in the demo is done in EDIT fields
  26. * instead of GET fields for reasons detailed in TASKDEMO.DOC. To navigate
  27. * the EDIT fields you must use the TAB key or press ENTER after editing
  28. * each field.
  29. * For more information on the LOADFONT.EXE,LEDGAUGE.FON,
  30. * and NORMAL.FON files, see the GAGEDE.ZIP file on Compuserve.
  31. * TASKDEMO.PRG as well as INTERVAL.BIN may be distributed as public domain.
  32. *
  33. * See file TASKDEMO.DOC for more detailed information about the demo.
  34. *
  35. * If you find any of the ideas included in this demo useful in you own
  36. * applications or have any questions about these techniques I would like
  37. * to hear from you.
  38. * Ed Duchesne
  39. * 3960-76st
  40. * Edmonton,Alberta (Canada)
  41. * T6K-1V6
  42. *
  43. * CIS [70720,1423]
  44. * Phone - Day: (403) 468-1133, Evening: (403) 463-0008.
  45. ****************************************************************************
  46.  
  47. DO Initialize
  48. DO Main
  49. DO Shutdown
  50.  
  51. PROCEDURE Initialize
  52.  
  53.   PUBLIC m.NYSE,m.CanUse3D,m.UpdateNYSE,m.ShowSystem,m.MessageArrival
  54.   PUBLIC m.HelpButton,m.NextButton,m.PrevButton,m.TopButton,m.BottButton
  55.   PUBLIC m.Button3D,m.Done,m.In3D,m.RunDemo,m.FirstObj
  56.   PUBLIC m.EWinOpen,m.EWinCounter,m.EMessageCounter,m.MessageCounter
  57.   PUBLIC m.SystemCounter,m.NYSECounter
  58.   PUBLIC TalkSave,ColorSave,BlinkSave,EscapeSave
  59.   
  60.   IF SET('TALK') = 'ON'
  61.     SET TALK OFF       
  62.     TalkSave = 'ON'
  63.   ELSE
  64.     TalkSave = 'OFF'
  65.   ENDIF
  66.   IF SET('BLINK') = 'ON'
  67.     SET BLINK OFF
  68.     BlinkSave = 'ON'
  69.   ELSE
  70.     BlinkSave = 'OFF'
  71.   ENDIF
  72.   IF SET('ESCAPE') = 'ON'
  73.     SET ESCAPE OFF       
  74.     EscapeSave = 'ON'
  75.   ELSE
  76.     EscapeSave = 'OFF'
  77.   ENDIF
  78.   ColorSave = SET('COLOR')
  79.   
  80.   DO OpenFiles
  81.  
  82.   PUSH KEY CLEAR
  83.  
  84.   m.NYSE = SPACE(54)
  85.   m.CanUse3D = .F.  
  86.   m.In3D = .F.       
  87.   m.RunDemo = .T.
  88.   m.FirstObj = 6
  89.   m.UpdateNYSE = .T.
  90.   m.ShowSystem = .T.
  91.   m.MessageArrival = .T.
  92.   m.EWinOpen = .F.
  93.   m.EWinCounter = 0
  94.   m.SystemCounter = 0
  95.   m.MessageCounter = 0
  96.   m.NYSECounter = 1
  97.   
  98.  
  99.   IF SYS(2006) = 'VGA/Color'
  100.     m.CanUse3D = .T.
  101.   ENDIF
  102.   
  103.   IF CanUse3D
  104.     IF FILE('LOADFONT.EXE') AND FILE('LEDGAUGE.FON')
  105.       SET DISPLAY TO VGA25
  106.       RUN LOADFONT.EXE LEDGAUGE.FON
  107.     ELSE
  108.       CanUse3D = .F.  
  109.     ENDIF
  110.   ENDIF   
  111.  
  112.   DO InitTimer
  113.   ON KEY LABEL ~ DO TimeEvent
  114.   ON KEY LABEL LEFTMOUSE DO ReportMouse WITH MROW(""),MCOL("")
  115.   ON KEY LABEL F1 DO ShowAppHelp
  116.   ON KEY LABEL F2 DO NextRec
  117.   ON KEY LABEL F3 DO PrevRec
  118.   ON KEY LABEL F4 DO TopRec
  119.   ON KEY LABEL F5 DO BottomRec
  120.   IF m.CanUse3D
  121.     ON KEY LABEL F6 DO Toggle3D
  122.   ENDIF
  123.   ON KEY LABEL ESC DO ExitApp
  124.   SELECT Customer
  125. RETURN
  126.  
  127. PROCEDURE Main
  128.   DO StartTimer
  129.     DO WHILE m.RunDemo
  130.       DO DrawScreen WITH m.In3D
  131.       READ CYCLE OBJECT m.FirstObj
  132.     ENDDO  
  133. RETURN
  134.  
  135. PROCEDURE Shutdown
  136.   DO StopTimer
  137.  
  138.   IF USED("customer")
  139.     SELECT customer
  140.     USE
  141.   ENDIF
  142.  
  143.   IF USED("event")
  144.     SELECT event
  145.     USE
  146.   ENDIF
  147.  
  148.   IF USED("message")
  149.     SELECT message
  150.     USE
  151.   ENDIF
  152.  
  153.   IF USED("nyse")
  154.     SELECT nyse
  155.     USE
  156.   ENDIF
  157.  
  158.   ON KEY LABEL ~
  159.   RELEASE WINDOW EMessage
  160.   POP KEY
  161.   RELEASE m.NYSE
  162.   DO ReleaseTimer
  163.   SET TALK &TalkSave
  164.   SET COLOR TO &ColorSave
  165.   SET BLINK &BlinkSave
  166.   SET ESCAPE &EscapeSave
  167.  
  168.   CLEAR
  169.   
  170.   IF CanUse3D
  171.     IF FILE('LOADFONT.EXE') AND FILE('NORMAL.FON')
  172.       RUN LOADFONT.EXE NORMAL.FON
  173.     ENDIF
  174.   ENDIF 
  175. RETURN
  176.  
  177. PROCEDURE OpenFiles
  178.   IF USED("customer")
  179.     SELECT customer
  180.     SET ORDER TO 0
  181.   ELSE
  182.     SELECT 0
  183.     USE (LOCFILE("customer.dbf","DBF","Where is customer?"));
  184.     AGAIN ALIAS customer ORDER 0
  185.   ENDIF
  186.  
  187.   IF USED("event")
  188.     SELECT event
  189.     SET ORDER TO 0
  190.   ELSE
  191.     SELECT 0
  192.     USE (LOCFILE("event.dbf","DBF","Where is event?"));
  193.     AGAIN ALIAS event ORDER 0
  194.   ENDIF
  195.  
  196.   IF USED("message")
  197.     SELECT message
  198.     SET ORDER TO 0
  199.   ELSE
  200.     SELECT 0
  201.     USE (LOCFILE("message.dbf","DBF","Where is message?"));
  202.     AGAIN ALIAS message ORDER 0
  203.   ENDIF
  204.  
  205.   IF USED("nyse")
  206.     SELECT nyse
  207.     SET ORDER TO 0
  208.   ELSE
  209.     SELECT 0
  210.     USE (LOCFILE("nyse.dbf","DBF","Where is nyse?"));
  211.     AGAIN ALIAS nyse ORDER 0
  212.   ENDIF
  213.  
  214.  SELECT customer 
  215. RETURN
  216.  
  217. * Draw screen with 2D or 3D look and feel
  218. PROCEDURE DrawScreen
  219.   PARAMETER Draw3D
  220.   SET COLOR TO W+/B
  221.   CLEAR  
  222.   IF NOT Draw3D
  223.     @ 0,0 TO 19,79 COLOR W+/B    
  224.     @ 8,1 TO 8,78 COLOR W+/B
  225.     @ 8,0 SAY "├" COLOR W+/B
  226.     @ 8,79 SAY "┤" COLOR W+/B
  227.     SET COLOR TO N/W
  228.     @ 20,0 TO 24,79 FILL
  229.     @ 20,0 TO 24,79
  230.   ELSE
  231.     SET COLOR TO N/W
  232.     @ 1,1 TO 23,78 FILL
  233.     =DrawFrame(0,0,23,78,'W+/B','N+/B',.F.)
  234.     =DrawFrame(1,1,5,14,'W+/W','N+/W',.F.)
  235.     =DrawFrame(1,22,1,54,'W+/W','N+/W',.T.)
  236.     =DrawFrame(4,26,2,50,'W+/W','N+/W',.T.)
  237.     =DrawFrame(8,1,11,76,'W+/W','N+/W',.F.)
  238.     =DrawFrame(9,10,4,45,'W+/W','N+/W',.T.)
  239.     =DrawFrame(15,10,3,56,'W+/W','N+/W',.T.)
  240.     * Buttons
  241.     =DrawFrame(21,1,1,9,'W+/W','N+/W',.F.)
  242.     =DrawFrame(21,12,1,9,'W+/W','N+/W',.F.)
  243.     =DrawFrame(21,23,1,9,'W+/W','N+/W',.F.)
  244.     =DrawFrame(21,34,1,8,'W+/W','N+/W',.F.)
  245.     =DrawFrame(21,44,1,11,'W+/W','N+/W',.F.)
  246.     IF m.CanUse3D
  247.       =DrawFrame(21,57,1,7,'W+/W','N+/W',.F.)
  248.     ENDIF
  249.     =DrawFrame(21,66,1,10,'W+/W','N+/W',.F.)  
  250.   ENDIF
  251.   
  252.   IF Draw3D
  253.     SET COLOR TO N/W
  254.   ELSE
  255.     SET COLOR TO W+/B
  256.   ENDIF
  257.   
  258.   @ 2,3 SAY "Update" 
  259.   @ 2,18 SAY "NYSE"
  260.   @ 5,19 SAY "Message"
  261.   @ 10,6 SAY "Name"
  262.   @ 10,42 SAY "No"
  263.   @ 11,6 SAY "Addr"
  264.   @ 12,6 SAY "City"
  265.   @ 13,5 SAY "State"  
  266.   @ 13,22 SAY "Zip"
  267.   @ 13,38 SAY "Amount $" 
  268.   @ 16,3 SAY "Details" 
  269.   
  270.   * Draw buttons
  271.   IF Draw3D
  272.     SET COLOR TO N/W
  273.   ELSE
  274.     SET COLOR TO BG+/B
  275.   ENDIF
  276.   @ 22,2 SAY " Help    "
  277.   @ 22,13 SAY " Next    "
  278.   @ 22,24 SAY " Prev    "  
  279.   @ 22,35 SAY " Top    "  
  280.   @ 22,45 SAY " Bottom    "
  281.   IF m.CanUse3D
  282.     IF Draw3D
  283.       @ 22,58 SAY " 2D    "
  284.     ELSE  
  285.       @ 22,58 SAY " 3D    "
  286.     ENDIF
  287.   ENDIF  
  288.   @ 22,67 SAY " Exit     "
  289.   
  290.   IF Draw3D
  291.     SET COLOR TO W+/W
  292.   ELSE
  293.     SET COLOR TO GR+/B
  294.   ENDIF
  295.   
  296.   @ 22,8 SAY "F1"
  297.     @ 22,19 SAY "F2"
  298.     @ 22,30 SAY "F3"
  299.     @ 22,40 SAY "F4"
  300.     @ 22,53 SAY "F5"
  301.     IF m.CanUse3D
  302.       @ 22,62 SAY "F6"  
  303.     ENDIF  
  304.   @ 22,73 SAY "ESC"
  305.   
  306.   IF NOT Draw3D
  307.     SET COLOR TO N+/W
  308.     @ 23,3 SAY '▀▀▀▀▀▀▀▀▀'
  309.     @ 22,11 SAY '▄'
  310.     @ 23,14 SAY '▀▀▀▀▀▀▀▀▀'
  311.     @ 22,22 SAY '▄'
  312.     @ 23,25 SAY '▀▀▀▀▀▀▀▀▀'  
  313.     @ 22,33 SAY '▄'
  314.     @ 23,36 SAY '▀▀▀▀▀▀▀▀'
  315.     @ 22,43 SAY '▄'
  316.     @ 23,46 SAY '▀▀▀▀▀▀▀▀▀▀▀'
  317.     @ 22,56 SAY '▄'
  318.     IF m.CanUse3D
  319.       @ 23,59 SAY '▀▀▀▀▀▀▀'
  320.       @ 22,65 SAY '▄'
  321.     ENDIF
  322.     
  323.     @ 23,68 SAY '▀▀▀▀▀▀▀▀▀▀'
  324.     @ 22,77 SAY '▄'
  325.   ENDIF
  326.     
  327.   IF Draw3D
  328.     DO Set3DColors
  329.   ELSE
  330.     DO SetNormalColors
  331.   ENDIF
  332.   
  333.   @ 3,3 GET m.UpdateNYSE PICTURE "@*C NYSE" SIZE 1,8 COLOR SCHEME 1
  334.   @ 4,3 GET m.ShowSystem PICTURE "@*C Events" SIZE 1,10 COLOR SCHEME 1
  335.   @ 5,3 GET m.MessageArrival PICTURE "@*C Messages" SIZE 1,12 COLOR SCHEME 1
  336.   @ 2,23 GET m.NYSE SIZE 1,54 DISABLE
  337.   @ 5,27 EDIT message.text SIZE 2,50,0 DISABLE  
  338.   
  339.   @ 10,11 EDIT customer.cust_name SIZE 1,30,30 COLOR N/W ;
  340.   WHEN FieldWhen() VALID FieldValid('customer.cust_name')
  341.   @ 10,45 EDIT customer.cust_no SIZE 1,10,10 COLOR N/W ;
  342.   WHEN FieldWhen() VALID FieldValid('customer.cust_no')
  343.   @ 11,11 EDIT customer.cust_addr SIZE 1,30,30 COLOR N/W ;
  344.   WHEN FieldWhen() VALID FieldValid('customer.cust_addr')
  345.   @ 12,11 EDIT customer.cust_city SIZE 1,25,25 COLOR N/W ;
  346.   WHEN FieldWhen() VALID FieldValid('customer.cust_city')
  347.   @ 13,11 EDIT customer.cust_state SIZE 1,2,2 COLOR N/W ;
  348.   WHEN FieldWhen() VALID FieldValid('customer.cust_state')
  349.   @ 13,26 EDIT customer.cust_zip SIZE 1,10,10 COLOR N/W ;
  350.   WHEN FieldWhen() VALID FieldValid('customer.cust_zip')
  351.   @ 13,47 GET customer.amount SIZE 1,9 ;
  352.     WHEN AmountWhen() VALID AmountValid()
  353.   @ 16,11 EDIT customer.details SIZE 3,56,0 SCROLL COLOR W+/W
  354. RETURN  
  355.     
  356. * Called once a second by INTERVAL.BIN
  357. PROCEDURE TimeEvent
  358.   
  359.   IF m.EWinOpen
  360.     m.EWinCounter = m.EWinCounter + 1
  361.     IF m.EWinCounter > 10  && 10 cycles (10 seconds)
  362.       m.EWinCounter = 0
  363.       DO CloseEMessage
  364.     ENDIF  
  365.   ENDIF
  366.   
  367.   m.SystemCounter = m.SystemCounter + 1
  368.   IF m.ShowSystem
  369.     IF m.SystemCounter >= 25  && 25 cycles (25 seconds)
  370.       m.SystemCounter = 0
  371.       DO DisplayEMessage      
  372.     ENDIF
  373.   ENDIF
  374.  
  375.   m.MessageCounter = m.MessageCounter + 1
  376.   IF m.MessageArrival
  377.     IF m.MessageCounter >= 40  && 40 cycles (40 seconds)
  378.       m.MessageCounter = 0
  379.       SKIP 1 IN MESSAGE
  380.       IF EOF('MESSAGE')
  381.         GO TOP IN MESSAGE
  382.       ENDIF
  383.       SHOW OBJECT 5 LEVEL 1 
  384.     ENDIF  
  385.   ENDIF   
  386.  
  387.   IF m.UpdateNYSE
  388.     m.NYSE = NYSEStr()
  389.     SHOW GET m.NYSE LEVEL 1
  390.   ENDIF  
  391. RETURN
  392.  
  393. FUNCTION NYSEStr
  394.   PRIVATE TempStr
  395.   TempStr = SUBSTR(m.NYSE+SUBSTR(nyse.Stock,m.NYSECounter,3),4,54)
  396.   m.NYSECounter = m.NYSECounter + 3
  397.   IF m.NYSECounter >= 18
  398.     m.NYSECounter = 1
  399.     SKIP 1 IN NYSE
  400.     IF EOF('NYSE')
  401.       GO TOP IN NYSE
  402.     ENDIF
  403.   ENDIF  
  404. RETURN TempStr
  405.  
  406. * Stop timer while editing the amount field
  407. FUNCTION AmountWhen
  408.  DO StopTimer
  409. RETURN .T.
  410.  
  411. * Restart the timer after editing the amount field
  412. FUNCTION AmountValid
  413.   DO StartTimer
  414. RETURN .T.
  415.  
  416. PROCEDURE ShowAppHelp
  417.   IF m.In3D
  418.     =DrawFrame(21,1,1,9,'W+/W','N+/W',.T.)
  419.     =Delay(0.01)
  420.     =DrawFrame(21,1,1,9,'W+/W','N+/W',.F.)
  421.   ENDIF
  422.   =SorryNoHelp()
  423.   SHOW GETS
  424. RETURN
  425.  
  426. PROCEDURE NextRec
  427.   IF m.In3D
  428.     =DrawFrame(21,12,1,9,'W+/W','N+/W',.T.)
  429.     =Delay(0.01)
  430.     =DrawFrame(21,12,1,9,'W+/W','N+/W',.F.)
  431.   ENDIF
  432.   SKIP
  433.   IF EOF()
  434.     GO BOTTOM
  435.   ENDIF
  436.   SHOW GETS
  437. RETURN
  438.  
  439. PROCEDURE PrevRec
  440.   IF m.In3D
  441.     =DrawFrame(21,23,1,9,'W+/W','N+/W',.T.)
  442.     =Delay(0.01)
  443.     =DrawFrame(21,23,1,9,'W+/W','N+/W',.F.)
  444.   ENDIF
  445.   IF RECNO() > 1
  446.     SKIP -1
  447.     SHOW GETS
  448.   ENDIF
  449. RETURN
  450.  
  451. PROCEDURE TopRec
  452.   IF m.In3D
  453.     =DrawFrame(21,34,1,8,'W+/W','N+/W',.T.)
  454.     =Delay(0.01)
  455.     =DrawFrame(21,34,1,8,'W+/W','N+/W',.F.)
  456.   ENDIF
  457.   IF RECCOUNT() > 0
  458.     GO TOP
  459.     SHOW GETS
  460.   ENDIF
  461. RETURN
  462.  
  463. PROCEDURE BottomRec
  464.   IF m.In3D
  465.     =DrawFrame(21,44,1,11,'W+/W','N+/W',.T.)
  466.     =Delay(0.01)
  467.     =DrawFrame(21,44,1,11,'W+/W','N+/W',.F.)
  468.   ENDIF
  469.   IF RECCOUNT() > 0
  470.     GO BOTTOM
  471.     SHOW GETS
  472.   ENDIF
  473. RETURN
  474.  
  475. PROCEDURE Toggle3D
  476.   IF m.In3D
  477.     =DrawFrame(21,57,1,7,'W+/W','N+/W',.T.)
  478.     =Delay(0.01)
  479.     =DrawFrame(21,57,1,7,'W+/W','N+/W',.F.)
  480.     m.In3D = .F.
  481.   ELSE
  482.     m.In3D = .T.
  483.     m.FirstObj = _CUROBJ
  484.   ENDIF
  485.   CLEAR READ
  486. RETURN
  487.  
  488. PROCEDURE ExitApp
  489.   IF m.In3D
  490.     =DrawFrame(21,66,1,10,'W+/W','N+/W',.T.)
  491.     =Delay(0.01)
  492.     =DrawFrame(21,66,1,10,'W+/W','N+/W',.F.)
  493.   ENDIF
  494.   IF ConfirmQuit()
  495.     m.RunDemo = .F.
  496.     CLEAR READ
  497.   ENDIF  
  498. RETURN
  499.  
  500. PROCEDURE DisplayEMessage
  501.   m.EWinOpen = .T.
  502.   DEFINE WINDOW EMessage FROM 10,57 TO 13,76 SHADOW COLOR W+/RB
  503.   ACTIVATE WINDOW EMessage NOSHOW
  504.   @ 0,1 SAY event.line1 COLOR W+/RB
  505.   @ 1,1 SAY event.line2 COLOR W+/RB
  506.   ACTIVATE WINDOW EMessage BOTTOM
  507.   IF WEXIST('Confirm')
  508.     ACTIVATE WINDOW Confirm
  509.   ELSE  
  510.     ACTIVATE SCREEN
  511.   ENDIF  
  512. RETURN
  513.  
  514. PROCEDURE CloseEMessage
  515.   m.EWinOpen = .F.
  516.   RELEASE WINDOW EMessage
  517.   SKIP 1 IN EVENT
  518.   IF EOF('EVENT')
  519.     GO TOP IN EVENT
  520.   ENDIF
  521. RETURN
  522.  
  523. PROCEDURE InitTimer
  524.   LOAD INTERVAL.BIN
  525. RETURN
  526.  
  527. * Start timing with approx. 1 second intervals.
  528. * stuff keyboard with tilde "~" char
  529. PROCEDURE StartTimer
  530.   CALL INTERVAL WITH '18,126'
  531. RETURN
  532.  
  533. PROCEDURE StopTimer
  534.   CALL INTERVAL WITH '0'
  535. RETURN
  536.  
  537. PROCEDURE ReleaseTimer
  538.   CALL INTERVAL WITH '0'
  539.   RELEASE MODULE INTERVAL
  540. RETURN
  541.  
  542. *  Function DrawFrame : Draw a 3D style frame ****************************** 
  543. *  Parameters 
  544. *     - FRow = Row for the top of the frame
  545. *     - FCol = Column left edge of frame
  546. *     - FHeight = The vertical space "between" the top and bottom edges
  547. *     - FWidth = The number of columns "between" the right and left edges
  548. *     - SunColor = Color of the sunlit part of the frame
  549. *     - ShadeColor = Color of the shaded areas of the frame
  550. *     - Inset = .T. For concave frame, .F. For convex frame          
  551. *  Note: The background color for SunColor & ShadeColor should be the same
  552. *  e.g.: =DrawFrame(10,10,1,20,'W+/W','N+/W',.T.)
  553. ****************************************************************************
  554.  
  555. FUNCTION DrawFrame
  556. PARAMETERS FRow,FCol,FHeight,FWidth,SunColor,ShadeColor,Inset
  557.   IF FHeight < 1 OR FWidth < 1
  558.     RETURN .F.
  559.   ENDIF
  560.   IF Inset
  561.     LTColor = ShadeColor  && Left & Top
  562.     RBColor = SunColor    && Right & Botom
  563.   ELSE
  564.     LTColor = SunColor
  565.     RBColor = ShadeColor
  566.   ENDIF
  567.   
  568.   SET COLOR TO <Color
  569.   @ FRow,FCol SAY '╟'+REPLICATE('╞',FWidth) 
  570.   FOR LineCount = 1 to FHeight
  571.     @ FRow+LineCount,FCol SAY '╫'
  572.   ENDFOR
  573.   SET COLOR TO &RBColor
  574.   FOR LineCount = 1 to FHeight
  575.     @ FRow+LineCount,FCol+FWidth+1 SAY 'Å'
  576.   ENDFOR
  577.   @ FRow+FHeight+1,FCol+1 SAY REPLICATE('╪',FWidth)+'ô'
  578. RETURN .T.
  579.  
  580. PROCEDURE SetNormalColors
  581.   SET COLOR OF SCHEME 1 TO GR+/B,N/W,GR+/B,GR+/B,R+/B,W+/GR,W+/B,N+/N,GR+/B,G+/N
  582.   SET COLOR OF SCHEME 2 TO BG/W,N/W,N/W,B/W,W/N,N/BG,W+/W,N+/N,B/W,W+/BG
  583. RETURN
  584.  
  585. PROCEDURE Set3DColors
  586.   SET COLOR OF SCHEME 1 TO N/W,N/W,GR+/B,GR+/B,R+/B,W+/N*,W+/B,N+/N,N/W,G+/N
  587.   SET COLOR OF SCHEME 2 TO BG/W,N/W,N/W,B/W,W/N,N/BG,W+/W,N+/N,B/W,N/W* 
  588. RETURN
  589.  
  590. FUNCTION Delay
  591.   PARAMETER DelayLength
  592.   PRIVATE Start,Current
  593.   Start = SECONDS()
  594.   DO WHILE .T.
  595.     Current = SECONDS()
  596.     IF (Current > Start + DelayLength) OR (Current < Start)
  597.       EXIT
  598.     ENDIF
  599.   ENDDO
  600. RETURN .T.
  601.  
  602.  
  603. PROCEDURE ReportMouse
  604.   PARAMETERS MouseRow,MouseColumn
  605.   IF MouseRow <> 22
  606.     RETURN
  607.   ELSE
  608.     SET CURSOR OFF  
  609.     DO CASE
  610.         CASE MouseColumn > 1 AND MouseColumn < 11
  611.           DO ShowAppHelp
  612.         CASE MouseColumn > 12 AND MouseColumn < 22
  613.           DO NextRec
  614.         CASE MouseColumn > 23 AND MouseColumn < 33
  615.           DO PrevRec
  616.         CASE MouseColumn > 34 AND MouseColumn < 42
  617.           DO TopRec
  618.         CASE MouseColumn > 44 AND MouseColumn < 56
  619.           DO BottomRec
  620.         CASE MouseColumn > 57 AND MouseColumn < 65 AND m.CanUse3D
  621.           DO Toggle3D
  622.         CASE MouseColumn > 66 AND MouseColumn < 77
  623.           DO ExitApp  
  624.     ENDCASE
  625.     SET CURSOR ON
  626.   ENDIF
  627. RETURN
  628.  
  629. * See if user really wants to exit the application
  630. FUNCTION ConfirmQuit
  631.   PRIVATE m.QResult
  632.   m.QResult = 2
  633.   PUSH KEY
  634.   ON KEY LABEL LEFTMOUSE
  635.   ON KEY LABEL F1
  636.   ON KEY LABEL F2
  637.   ON KEY LABEL F3
  638.   ON KEY LABEL F4
  639.   ON KEY LABEL F5
  640.   ON KEY LABEL F6
  641.   ON KEY LABEL ESC CLEAR READ
  642.   ON KEY LABEL SPACEBAR
  643.   
  644.   IF m.In3D
  645.     DEFINE WINDOW Confirm FROM 8,22 TO 14,57 NONE SHADOW COLOR N/BG
  646.     ACTIVATE WINDOW Confirm NOSHOW
  647.     =DrawFrame(0,1,5,32,'BG+/BG','N/BG',.T.)
  648.     @ 2,3 SAY "Are You Sure You Want To Quit?" COLOR W+/BG 
  649.     @ 4,8 GET m.QResult PICTURE '@*HT \<Yes;\<Cancel' SIZE 1,8,4
  650.     =DrawFrame(3,7,1,8,'W+/BG','N+/BG',.F.)
  651.     =DrawFrame(3,19,1,8,'W+/BG','N+/BG',.F.)
  652.   ELSE
  653.     DEFINE WINDOW Confirm FROM 8,22 TO 14,57 NONE SHADOW COLOR W+/W
  654.     ACTIVATE WINDOW Confirm NOSHOW
  655.     @ 0,0 TO 7,35 DOUBLE
  656.     @ 2,3 SAY "Are You Sure You Want To Quit?" COLOR N/W
  657.     @ 4,8 GET m.QResult PICTURE '@*HT \<Yes;\<Cancel' SIZE 1,8,4
  658.     @ 5,9 SAY '▀▀▀▀▀▀▀▀' COLOR N+/W
  659.     @ 4,16 SAY '▄' COLOR N+/W
  660.     @ 5,21 SAY '▀▀▀▀▀▀▀▀' COLOR N+/W
  661.     @ 4,28 SAY '▄' COLOR N+/W
  662.   ENDIF
  663.   ACTIVATE WINDOW Confirm
  664.   READ CYCLE
  665.   RELEASE WINDOW Confirm
  666.   POP KEY
  667. RETURN IIF(m.QResult = 1,.T.,.F.)
  668.  
  669. * Force the use of character 255 instead of space character
  670. FUNCTION FieldWhen
  671.   ON KEY LABEL SPACEBAR KEYBOARD CHR(255)
  672. RETURN .T.
  673.  
  674. * Replace all character 255's with space characters
  675. FUNCTION FieldValid
  676.   PARAMETER TranVar
  677.   ON KEY LABEL SPACEBAR
  678.   REPLACE &TranVar WITH STRTRAN(&TranVar,CHR(255),CHR(32))
  679. RETURN .T.
  680.  
  681. * Tell user no help is available
  682. FUNCTION SorryNoHelp
  683.   PRIVATE m.HResult
  684.   m.HResult = 1
  685.   PUSH KEY
  686.   ON KEY LABEL LEFTMOUSE
  687.   ON KEY LABEL F1
  688.   ON KEY LABEL F2
  689.   ON KEY LABEL F3
  690.   ON KEY LABEL F4
  691.   ON KEY LABEL F5
  692.   ON KEY LABEL F6
  693.   ON KEY LABEL ESC CLEAR READ
  694.   
  695.   IF m.In3D
  696.     DEFINE WINDOW NoHelp FROM 8,25 TO 14,54 NONE SHADOW COLOR N/BG
  697.     ACTIVATE WINDOW NoHelp NOSHOW
  698.     =DrawFrame(0,1,5,26,'BG+/BG','N/BG',.T.)
  699.     @ 2,3 SAY "Sorry! No Help Available" COLOR W+/BG 
  700.     @ 4,13 GET m.HResult PICTURE '@*HT \<Ok' SIZE 1,4,0
  701.     =DrawFrame(3,12,1,4,'W+/BG','N+/BG',.F.)
  702.   ELSE
  703.     DEFINE WINDOW NoHelp FROM 8,25 TO 14,54 NONE SHADOW COLOR W+/W
  704.     ACTIVATE WINDOW NoHelp NOSHOW
  705.     @ 0,0 TO 7,29 DOUBLE
  706.     @ 2,3 SAY "Sorry! No Help Available" COLOR N/W
  707.     @ 4,13 GET m.HResult PICTURE '@*HT \<Ok' SIZE 1,4,0
  708.     @ 5,14 SAY '▀▀▀▀' COLOR N+/W
  709.     @ 4,17 SAY '▄' COLOR N+/W
  710.   ENDIF
  711.   ACTIVATE WINDOW NoHelp
  712.   READ CYCLE
  713.   RELEASE WINDOW NoHelp
  714.   POP KEY
  715. RETURN .T.
  716.