home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C!T ROM 2
/
ctrom_ii_b.zip
/
ctrom_ii_b
/
PROGRAM
/
FOXPRO
/
TASKDE
/
TASKDEMO.PRG
< prev
Wrap
Text File
|
1993-12-29
|
19KB
|
717 lines
****************************************************************************
* TASKDEMO.PRG *
* *
* Multi-Tasking Demonstration Program For FoxPro (DOS) *
* *
* Author: Ed Duchesne CIS [70720,1423] *
* Date: December 28, 1993 *
* Requires: FoxPro (DOS version), file - INTERVAL.BIN *
* Optional: files - LOADFONT.EXE, LEDGAUGE.FON, NORMAL.FON *
****************************************************************************
****************************************************************************
*
* Notes: This program demonstrates background tasks for FoxPro (DOS only).
* In this demo the user can view and edit a customer type database file
* while 3 tasks execute in the background. The user can edit records and
* move through the customer file while different types of information are
* displayed at various intervals. Stock Market type information scrolls at
* the top of the screen. Personal type messages appear in a two line edit
* box. Other information appears in a Pop-Up window. The Pop-Up window will
* disappear after a short display time. Notice the user does not need to
* stop typing when a new message has appeared. Also notice that when the
* user selects exit and the ConfirmQuit window appears, the background
* displays continue as usual. In this demo it is also possible to change
* the look and feel of the application at any time if you are useing a
* VGA display. Almost all the editing in the demo is done in EDIT fields
* instead of GET fields for reasons detailed in TASKDEMO.DOC. To navigate
* the EDIT fields you must use the TAB key or press ENTER after editing
* each field.
* For more information on the LOADFONT.EXE,LEDGAUGE.FON,
* and NORMAL.FON files, see the GAGEDE.ZIP file on Compuserve.
* TASKDEMO.PRG as well as INTERVAL.BIN may be distributed as public domain.
*
* See file TASKDEMO.DOC for more detailed information about the demo.
*
* If you find any of the ideas included in this demo useful in you own
* applications or have any questions about these techniques I would like
* to hear from you.
*
* Ed Duchesne
* 3960-76st
* Edmonton,Alberta (Canada)
* T6K-1V6
*
* CIS [70720,1423]
* Phone - Day: (403) 468-1133, Evening: (403) 463-0008.
****************************************************************************
DO Initialize
DO Main
DO Shutdown
PROCEDURE Initialize
PUBLIC m.NYSE,m.CanUse3D,m.UpdateNYSE,m.ShowSystem,m.MessageArrival
PUBLIC m.HelpButton,m.NextButton,m.PrevButton,m.TopButton,m.BottButton
PUBLIC m.Button3D,m.Done,m.In3D,m.RunDemo,m.FirstObj
PUBLIC m.EWinOpen,m.EWinCounter,m.EMessageCounter,m.MessageCounter
PUBLIC m.SystemCounter,m.NYSECounter
PUBLIC TalkSave,ColorSave,BlinkSave,EscapeSave
IF SET('TALK') = 'ON'
SET TALK OFF
TalkSave = 'ON'
ELSE
TalkSave = 'OFF'
ENDIF
IF SET('BLINK') = 'ON'
SET BLINK OFF
BlinkSave = 'ON'
ELSE
BlinkSave = 'OFF'
ENDIF
IF SET('ESCAPE') = 'ON'
SET ESCAPE OFF
EscapeSave = 'ON'
ELSE
EscapeSave = 'OFF'
ENDIF
ColorSave = SET('COLOR')
DO OpenFiles
PUSH KEY CLEAR
m.NYSE = SPACE(54)
m.CanUse3D = .F.
m.In3D = .F.
m.RunDemo = .T.
m.FirstObj = 6
m.UpdateNYSE = .T.
m.ShowSystem = .T.
m.MessageArrival = .T.
m.EWinOpen = .F.
m.EWinCounter = 0
m.SystemCounter = 0
m.MessageCounter = 0
m.NYSECounter = 1
IF SYS(2006) = 'VGA/Color'
m.CanUse3D = .T.
ENDIF
IF CanUse3D
IF FILE('LOADFONT.EXE') AND FILE('LEDGAUGE.FON')
SET DISPLAY TO VGA25
RUN LOADFONT.EXE LEDGAUGE.FON
ELSE
CanUse3D = .F.
ENDIF
ENDIF
DO InitTimer
ON KEY LABEL ~ DO TimeEvent
ON KEY LABEL LEFTMOUSE DO ReportMouse WITH MROW(""),MCOL("")
ON KEY LABEL F1 DO ShowAppHelp
ON KEY LABEL F2 DO NextRec
ON KEY LABEL F3 DO PrevRec
ON KEY LABEL F4 DO TopRec
ON KEY LABEL F5 DO BottomRec
IF m.CanUse3D
ON KEY LABEL F6 DO Toggle3D
ENDIF
ON KEY LABEL ESC DO ExitApp
SELECT Customer
RETURN
PROCEDURE Main
DO StartTimer
DO WHILE m.RunDemo
DO DrawScreen WITH m.In3D
READ CYCLE OBJECT m.FirstObj
ENDDO
RETURN
PROCEDURE Shutdown
DO StopTimer
IF USED("customer")
SELECT customer
USE
ENDIF
IF USED("event")
SELECT event
USE
ENDIF
IF USED("message")
SELECT message
USE
ENDIF
IF USED("nyse")
SELECT nyse
USE
ENDIF
ON KEY LABEL ~
RELEASE WINDOW EMessage
POP KEY
RELEASE m.NYSE
DO ReleaseTimer
SET TALK &TalkSave
SET COLOR TO &ColorSave
SET BLINK &BlinkSave
SET ESCAPE &EscapeSave
CLEAR
IF CanUse3D
IF FILE('LOADFONT.EXE') AND FILE('NORMAL.FON')
RUN LOADFONT.EXE NORMAL.FON
ENDIF
ENDIF
RETURN
PROCEDURE OpenFiles
IF USED("customer")
SELECT customer
SET ORDER TO 0
ELSE
SELECT 0
USE (LOCFILE("customer.dbf","DBF","Where is customer?"));
AGAIN ALIAS customer ORDER 0
ENDIF
IF USED("event")
SELECT event
SET ORDER TO 0
ELSE
SELECT 0
USE (LOCFILE("event.dbf","DBF","Where is event?"));
AGAIN ALIAS event ORDER 0
ENDIF
IF USED("message")
SELECT message
SET ORDER TO 0
ELSE
SELECT 0
USE (LOCFILE("message.dbf","DBF","Where is message?"));
AGAIN ALIAS message ORDER 0
ENDIF
IF USED("nyse")
SELECT nyse
SET ORDER TO 0
ELSE
SELECT 0
USE (LOCFILE("nyse.dbf","DBF","Where is nyse?"));
AGAIN ALIAS nyse ORDER 0
ENDIF
SELECT customer
RETURN
* Draw screen with 2D or 3D look and feel
PROCEDURE DrawScreen
PARAMETER Draw3D
SET COLOR TO W+/B
CLEAR
IF NOT Draw3D
@ 0,0 TO 19,79 COLOR W+/B
@ 8,1 TO 8,78 COLOR W+/B
@ 8,0 SAY "├" COLOR W+/B
@ 8,79 SAY "┤" COLOR W+/B
SET COLOR TO N/W
@ 20,0 TO 24,79 FILL
@ 20,0 TO 24,79
ELSE
SET COLOR TO N/W
@ 1,1 TO 23,78 FILL
=DrawFrame(0,0,23,78,'W+/B','N+/B',.F.)
=DrawFrame(1,1,5,14,'W+/W','N+/W',.F.)
=DrawFrame(1,22,1,54,'W+/W','N+/W',.T.)
=DrawFrame(4,26,2,50,'W+/W','N+/W',.T.)
=DrawFrame(8,1,11,76,'W+/W','N+/W',.F.)
=DrawFrame(9,10,4,45,'W+/W','N+/W',.T.)
=DrawFrame(15,10,3,56,'W+/W','N+/W',.T.)
* Buttons
=DrawFrame(21,1,1,9,'W+/W','N+/W',.F.)
=DrawFrame(21,12,1,9,'W+/W','N+/W',.F.)
=DrawFrame(21,23,1,9,'W+/W','N+/W',.F.)
=DrawFrame(21,34,1,8,'W+/W','N+/W',.F.)
=DrawFrame(21,44,1,11,'W+/W','N+/W',.F.)
IF m.CanUse3D
=DrawFrame(21,57,1,7,'W+/W','N+/W',.F.)
ENDIF
=DrawFrame(21,66,1,10,'W+/W','N+/W',.F.)
ENDIF
IF Draw3D
SET COLOR TO N/W
ELSE
SET COLOR TO W+/B
ENDIF
@ 2,3 SAY "Update"
@ 2,18 SAY "NYSE"
@ 5,19 SAY "Message"
@ 10,6 SAY "Name"
@ 10,42 SAY "No"
@ 11,6 SAY "Addr"
@ 12,6 SAY "City"
@ 13,5 SAY "State"
@ 13,22 SAY "Zip"
@ 13,38 SAY "Amount $"
@ 16,3 SAY "Details"
* Draw buttons
IF Draw3D
SET COLOR TO N/W
ELSE
SET COLOR TO BG+/B
ENDIF
@ 22,2 SAY " Help "
@ 22,13 SAY " Next "
@ 22,24 SAY " Prev "
@ 22,35 SAY " Top "
@ 22,45 SAY " Bottom "
IF m.CanUse3D
IF Draw3D
@ 22,58 SAY " 2D "
ELSE
@ 22,58 SAY " 3D "
ENDIF
ENDIF
@ 22,67 SAY " Exit "
IF Draw3D
SET COLOR TO W+/W
ELSE
SET COLOR TO GR+/B
ENDIF
@ 22,8 SAY "F1"
@ 22,19 SAY "F2"
@ 22,30 SAY "F3"
@ 22,40 SAY "F4"
@ 22,53 SAY "F5"
IF m.CanUse3D
@ 22,62 SAY "F6"
ENDIF
@ 22,73 SAY "ESC"
IF NOT Draw3D
SET COLOR TO N+/W
@ 23,3 SAY '▀▀▀▀▀▀▀▀▀'
@ 22,11 SAY '▄'
@ 23,14 SAY '▀▀▀▀▀▀▀▀▀'
@ 22,22 SAY '▄'
@ 23,25 SAY '▀▀▀▀▀▀▀▀▀'
@ 22,33 SAY '▄'
@ 23,36 SAY '▀▀▀▀▀▀▀▀'
@ 22,43 SAY '▄'
@ 23,46 SAY '▀▀▀▀▀▀▀▀▀▀▀'
@ 22,56 SAY '▄'
IF m.CanUse3D
@ 23,59 SAY '▀▀▀▀▀▀▀'
@ 22,65 SAY '▄'
ENDIF
@ 23,68 SAY '▀▀▀▀▀▀▀▀▀▀'
@ 22,77 SAY '▄'
ENDIF
IF Draw3D
DO Set3DColors
ELSE
DO SetNormalColors
ENDIF
@ 3,3 GET m.UpdateNYSE PICTURE "@*C NYSE" SIZE 1,8 COLOR SCHEME 1
@ 4,3 GET m.ShowSystem PICTURE "@*C Events" SIZE 1,10 COLOR SCHEME 1
@ 5,3 GET m.MessageArrival PICTURE "@*C Messages" SIZE 1,12 COLOR SCHEME 1
@ 2,23 GET m.NYSE SIZE 1,54 DISABLE
@ 5,27 EDIT message.text SIZE 2,50,0 DISABLE
@ 10,11 EDIT customer.cust_name SIZE 1,30,30 COLOR N/W ;
WHEN FieldWhen() VALID FieldValid('customer.cust_name')
@ 10,45 EDIT customer.cust_no SIZE 1,10,10 COLOR N/W ;
WHEN FieldWhen() VALID FieldValid('customer.cust_no')
@ 11,11 EDIT customer.cust_addr SIZE 1,30,30 COLOR N/W ;
WHEN FieldWhen() VALID FieldValid('customer.cust_addr')
@ 12,11 EDIT customer.cust_city SIZE 1,25,25 COLOR N/W ;
WHEN FieldWhen() VALID FieldValid('customer.cust_city')
@ 13,11 EDIT customer.cust_state SIZE 1,2,2 COLOR N/W ;
WHEN FieldWhen() VALID FieldValid('customer.cust_state')
@ 13,26 EDIT customer.cust_zip SIZE 1,10,10 COLOR N/W ;
WHEN FieldWhen() VALID FieldValid('customer.cust_zip')
@ 13,47 GET customer.amount SIZE 1,9 ;
WHEN AmountWhen() VALID AmountValid()
@ 16,11 EDIT customer.details SIZE 3,56,0 SCROLL COLOR W+/W
RETURN
* Called once a second by INTERVAL.BIN
PROCEDURE TimeEvent
IF m.EWinOpen
m.EWinCounter = m.EWinCounter + 1
IF m.EWinCounter > 10 && 10 cycles (10 seconds)
m.EWinCounter = 0
DO CloseEMessage
ENDIF
ENDIF
m.SystemCounter = m.SystemCounter + 1
IF m.ShowSystem
IF m.SystemCounter >= 25 && 25 cycles (25 seconds)
m.SystemCounter = 0
DO DisplayEMessage
ENDIF
ENDIF
m.MessageCounter = m.MessageCounter + 1
IF m.MessageArrival
IF m.MessageCounter >= 40 && 40 cycles (40 seconds)
m.MessageCounter = 0
SKIP 1 IN MESSAGE
IF EOF('MESSAGE')
GO TOP IN MESSAGE
ENDIF
SHOW OBJECT 5 LEVEL 1
ENDIF
ENDIF
IF m.UpdateNYSE
m.NYSE = NYSEStr()
SHOW GET m.NYSE LEVEL 1
ENDIF
RETURN
FUNCTION NYSEStr
PRIVATE TempStr
TempStr = SUBSTR(m.NYSE+SUBSTR(nyse.Stock,m.NYSECounter,3),4,54)
m.NYSECounter = m.NYSECounter + 3
IF m.NYSECounter >= 18
m.NYSECounter = 1
SKIP 1 IN NYSE
IF EOF('NYSE')
GO TOP IN NYSE
ENDIF
ENDIF
RETURN TempStr
* Stop timer while editing the amount field
FUNCTION AmountWhen
DO StopTimer
RETURN .T.
* Restart the timer after editing the amount field
FUNCTION AmountValid
DO StartTimer
RETURN .T.
PROCEDURE ShowAppHelp
IF m.In3D
=DrawFrame(21,1,1,9,'W+/W','N+/W',.T.)
=Delay(0.01)
=DrawFrame(21,1,1,9,'W+/W','N+/W',.F.)
ENDIF
=SorryNoHelp()
SHOW GETS
RETURN
PROCEDURE NextRec
IF m.In3D
=DrawFrame(21,12,1,9,'W+/W','N+/W',.T.)
=Delay(0.01)
=DrawFrame(21,12,1,9,'W+/W','N+/W',.F.)
ENDIF
SKIP
IF EOF()
GO BOTTOM
ENDIF
SHOW GETS
RETURN
PROCEDURE PrevRec
IF m.In3D
=DrawFrame(21,23,1,9,'W+/W','N+/W',.T.)
=Delay(0.01)
=DrawFrame(21,23,1,9,'W+/W','N+/W',.F.)
ENDIF
IF RECNO() > 1
SKIP -1
SHOW GETS
ENDIF
RETURN
PROCEDURE TopRec
IF m.In3D
=DrawFrame(21,34,1,8,'W+/W','N+/W',.T.)
=Delay(0.01)
=DrawFrame(21,34,1,8,'W+/W','N+/W',.F.)
ENDIF
IF RECCOUNT() > 0
GO TOP
SHOW GETS
ENDIF
RETURN
PROCEDURE BottomRec
IF m.In3D
=DrawFrame(21,44,1,11,'W+/W','N+/W',.T.)
=Delay(0.01)
=DrawFrame(21,44,1,11,'W+/W','N+/W',.F.)
ENDIF
IF RECCOUNT() > 0
GO BOTTOM
SHOW GETS
ENDIF
RETURN
PROCEDURE Toggle3D
IF m.In3D
=DrawFrame(21,57,1,7,'W+/W','N+/W',.T.)
=Delay(0.01)
=DrawFrame(21,57,1,7,'W+/W','N+/W',.F.)
m.In3D = .F.
ELSE
m.In3D = .T.
m.FirstObj = _CUROBJ
ENDIF
CLEAR READ
RETURN
PROCEDURE ExitApp
IF m.In3D
=DrawFrame(21,66,1,10,'W+/W','N+/W',.T.)
=Delay(0.01)
=DrawFrame(21,66,1,10,'W+/W','N+/W',.F.)
ENDIF
IF ConfirmQuit()
m.RunDemo = .F.
CLEAR READ
ENDIF
RETURN
PROCEDURE DisplayEMessage
m.EWinOpen = .T.
DEFINE WINDOW EMessage FROM 10,57 TO 13,76 SHADOW COLOR W+/RB
ACTIVATE WINDOW EMessage NOSHOW
@ 0,1 SAY event.line1 COLOR W+/RB
@ 1,1 SAY event.line2 COLOR W+/RB
ACTIVATE WINDOW EMessage BOTTOM
IF WEXIST('Confirm')
ACTIVATE WINDOW Confirm
ELSE
ACTIVATE SCREEN
ENDIF
RETURN
PROCEDURE CloseEMessage
m.EWinOpen = .F.
RELEASE WINDOW EMessage
SKIP 1 IN EVENT
IF EOF('EVENT')
GO TOP IN EVENT
ENDIF
RETURN
PROCEDURE InitTimer
LOAD INTERVAL.BIN
RETURN
* Start timing with approx. 1 second intervals.
* stuff keyboard with tilde "~" char
PROCEDURE StartTimer
CALL INTERVAL WITH '18,126'
RETURN
PROCEDURE StopTimer
CALL INTERVAL WITH '0'
RETURN
PROCEDURE ReleaseTimer
CALL INTERVAL WITH '0'
RELEASE MODULE INTERVAL
RETURN
* Function DrawFrame : Draw a 3D style frame ******************************
* Parameters
* - FRow = Row for the top of the frame
* - FCol = Column left edge of frame
* - FHeight = The vertical space "between" the top and bottom edges
* - FWidth = The number of columns "between" the right and left edges
* - SunColor = Color of the sunlit part of the frame
* - ShadeColor = Color of the shaded areas of the frame
* - Inset = .T. For concave frame, .F. For convex frame
* Note: The background color for SunColor & ShadeColor should be the same
* e.g.: =DrawFrame(10,10,1,20,'W+/W','N+/W',.T.)
****************************************************************************
FUNCTION DrawFrame
PARAMETERS FRow,FCol,FHeight,FWidth,SunColor,ShadeColor,Inset
IF FHeight < 1 OR FWidth < 1
RETURN .F.
ENDIF
IF Inset
LTColor = ShadeColor && Left & Top
RBColor = SunColor && Right & Botom
ELSE
LTColor = SunColor
RBColor = ShadeColor
ENDIF
SET COLOR TO <Color
@ FRow,FCol SAY '╟'+REPLICATE('╞',FWidth)
FOR LineCount = 1 to FHeight
@ FRow+LineCount,FCol SAY '╫'
ENDFOR
SET COLOR TO &RBColor
FOR LineCount = 1 to FHeight
@ FRow+LineCount,FCol+FWidth+1 SAY 'Å'
ENDFOR
@ FRow+FHeight+1,FCol+1 SAY REPLICATE('╪',FWidth)+'ô'
RETURN .T.
PROCEDURE SetNormalColors
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
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
RETURN
PROCEDURE Set3DColors
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
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*
RETURN
FUNCTION Delay
PARAMETER DelayLength
PRIVATE Start,Current
Start = SECONDS()
DO WHILE .T.
Current = SECONDS()
IF (Current > Start + DelayLength) OR (Current < Start)
EXIT
ENDIF
ENDDO
RETURN .T.
PROCEDURE ReportMouse
PARAMETERS MouseRow,MouseColumn
IF MouseRow <> 22
RETURN
ELSE
SET CURSOR OFF
DO CASE
CASE MouseColumn > 1 AND MouseColumn < 11
DO ShowAppHelp
CASE MouseColumn > 12 AND MouseColumn < 22
DO NextRec
CASE MouseColumn > 23 AND MouseColumn < 33
DO PrevRec
CASE MouseColumn > 34 AND MouseColumn < 42
DO TopRec
CASE MouseColumn > 44 AND MouseColumn < 56
DO BottomRec
CASE MouseColumn > 57 AND MouseColumn < 65 AND m.CanUse3D
DO Toggle3D
CASE MouseColumn > 66 AND MouseColumn < 77
DO ExitApp
ENDCASE
SET CURSOR ON
ENDIF
RETURN
* See if user really wants to exit the application
FUNCTION ConfirmQuit
PRIVATE m.QResult
m.QResult = 2
PUSH KEY
ON KEY LABEL LEFTMOUSE
ON KEY LABEL F1
ON KEY LABEL F2
ON KEY LABEL F3
ON KEY LABEL F4
ON KEY LABEL F5
ON KEY LABEL F6
ON KEY LABEL ESC CLEAR READ
ON KEY LABEL SPACEBAR
IF m.In3D
DEFINE WINDOW Confirm FROM 8,22 TO 14,57 NONE SHADOW COLOR N/BG
ACTIVATE WINDOW Confirm NOSHOW
=DrawFrame(0,1,5,32,'BG+/BG','N/BG',.T.)
@ 2,3 SAY "Are You Sure You Want To Quit?" COLOR W+/BG
@ 4,8 GET m.QResult PICTURE '@*HT \<Yes;\<Cancel' SIZE 1,8,4
=DrawFrame(3,7,1,8,'W+/BG','N+/BG',.F.)
=DrawFrame(3,19,1,8,'W+/BG','N+/BG',.F.)
ELSE
DEFINE WINDOW Confirm FROM 8,22 TO 14,57 NONE SHADOW COLOR W+/W
ACTIVATE WINDOW Confirm NOSHOW
@ 0,0 TO 7,35 DOUBLE
@ 2,3 SAY "Are You Sure You Want To Quit?" COLOR N/W
@ 4,8 GET m.QResult PICTURE '@*HT \<Yes;\<Cancel' SIZE 1,8,4
@ 5,9 SAY '▀▀▀▀▀▀▀▀' COLOR N+/W
@ 4,16 SAY '▄' COLOR N+/W
@ 5,21 SAY '▀▀▀▀▀▀▀▀' COLOR N+/W
@ 4,28 SAY '▄' COLOR N+/W
ENDIF
ACTIVATE WINDOW Confirm
READ CYCLE
RELEASE WINDOW Confirm
POP KEY
RETURN IIF(m.QResult = 1,.T.,.F.)
* Force the use of character 255 instead of space character
FUNCTION FieldWhen
ON KEY LABEL SPACEBAR KEYBOARD CHR(255)
RETURN .T.
* Replace all character 255's with space characters
FUNCTION FieldValid
PARAMETER TranVar
ON KEY LABEL SPACEBAR
REPLACE &TranVar WITH STRTRAN(&TranVar,CHR(255),CHR(32))
RETURN .T.
* Tell user no help is available
FUNCTION SorryNoHelp
PRIVATE m.HResult
m.HResult = 1
PUSH KEY
ON KEY LABEL LEFTMOUSE
ON KEY LABEL F1
ON KEY LABEL F2
ON KEY LABEL F3
ON KEY LABEL F4
ON KEY LABEL F5
ON KEY LABEL F6
ON KEY LABEL ESC CLEAR READ
IF m.In3D
DEFINE WINDOW NoHelp FROM 8,25 TO 14,54 NONE SHADOW COLOR N/BG
ACTIVATE WINDOW NoHelp NOSHOW
=DrawFrame(0,1,5,26,'BG+/BG','N/BG',.T.)
@ 2,3 SAY "Sorry! No Help Available" COLOR W+/BG
@ 4,13 GET m.HResult PICTURE '@*HT \<Ok' SIZE 1,4,0
=DrawFrame(3,12,1,4,'W+/BG','N+/BG',.F.)
ELSE
DEFINE WINDOW NoHelp FROM 8,25 TO 14,54 NONE SHADOW COLOR W+/W
ACTIVATE WINDOW NoHelp NOSHOW
@ 0,0 TO 7,29 DOUBLE
@ 2,3 SAY "Sorry! No Help Available" COLOR N/W
@ 4,13 GET m.HResult PICTURE '@*HT \<Ok' SIZE 1,4,0
@ 5,14 SAY '▀▀▀▀' COLOR N+/W
@ 4,17 SAY '▄' COLOR N+/W
ENDIF
ACTIVATE WINDOW NoHelp
READ CYCLE
RELEASE WINDOW NoHelp
POP KEY
RETURN .T.