home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / clarion / clarmemo.zip / MEMTEST.CLA < prev    next >
Text File  |  1991-12-30  |  30KB  |  747 lines

  1. MEMTEST         PROGRAM
  2.          INCLUDE('STD_KEYS.CLA')
  3.          INCLUDE('CTL_KEYS.CLA')
  4.          INCLUDE('ALT_KEYS.CLA')
  5.          INCLUDE('SHF_KEYS.CLA')
  6.  
  7. REJECT_KEY   EQUATE(CTRL_ESC)
  8. ACCEPT_KEY   EQUATE(CTRL_ENTER)
  9. TRUE         EQUATE(1)
  10. FALSE         EQUATE(0)
  11.  
  12.          MAP
  13.            PROC(G_OPENFILES)
  14.            PROC(SetMemMsg)
  15.            PROC(PauseMsg)
  16.            FUNC(AbortEdit_),STRING
  17.            PROC(MAINMENU)         !memo test application
  18.            PROC(SHO_KEY)         !Show Memtest By Key
  19.            PROC(UPD_MEMTEST)         !Update Memtest
  20.            MODULE('ALERTED'),BINARY
  21.              FUNC(ALERTED),LONG         !ALERTED FUNCTION
  22.            .
  23.            MODULE('INTERUPT'),BINARY
  24.              PROC(INTERRUPT)         !INTERRUPT LEM
  25.            .
  26.            MODULE('MEMOEDIT')
  27.              FUNC(MEMOEDIT),LONG     !MEMO EDIT PROCEDURE
  28.            .
  29.          .
  30.          EJECT('FILE LAYOUTS')
  31. MEMTEST         FILE,PRE(FIL),CREATE,RECLAIM
  32. BY_KEY           KEY(FIL:KEY),NOCASE,OPT
  33. DATA3           MEMO(4560)
  34. RECORD           RECORD
  35. KEY             STRING(4)
  36. DATA1             STRING(30)
  37. DATA2             STRING(30)
  38.          . .
  39.          GROUP,OVER(FIL:DATA3)
  40. FIL_MEMO_ROW       STRING(76),DIM(60)
  41.          .
  42.  
  43.          EJECT('GLOBAL MEMORY VARIABLES')
  44. ACTION         SHORT                 !0 = NO ACTION
  45.                          !1 = ADD RECORD
  46.                          !2 = CHANGE RECORD
  47.                          !3 = DELETE RECORD
  48.                          !4 = LOOKUP FIELD
  49.                          !5 = AUTONUMKEY ADD
  50. Idle_Kill    SHORT                 ! IDLE Kill switch (new b.g.)
  51. Menu_Nesc    SHORT                 !Menu Escape switch (new b.g.)
  52. AbortEdg     BYTE                 !AbortEdit_ control (new b.g.)
  53.          GROUP,PRE(MEM)
  54. MESSAGE           STRING(30)             !Global Message Area
  55. PAGE           SHORT             !Report Page Number
  56. LINE           SHORT             !Report Line Number
  57. DEVICE           STRING(30)             !Report Device Name
  58.          .
  59.  
  60. !**************************************************************       (new b.g.)
  61. !     MessageScrn_ SCREEN                      *       (new b.g.)
  62. !**************************************************************       (new b.g.)
  63. MessageScrn_ SCREEN    WINDOW(3,80),AT(23,1),HUE(15,1)          !       (new b.g.)
  64.            ROW(1,1)      STRING('╔═{78}╗')              !       (new b.g.)
  65.            ROW(2,1)      STRING('║<0{78}>║')              !       (new b.g.)
  66.            ROW(3,1)      STRING('╚═{78}╝')              !       (new b.g.)
  67. Message_     ROW(2,2)    STRING(78),HUE(11,1)              !       (new b.g.)
  68.          .                              !       (new b.g.)
  69. !*************************************************************!       (new b.g.)
  70.  
  71.          EJECT('CODE SECTION')
  72.   CODE
  73.   SETHUE(7,0)                     !SET WHITE ON BLACK
  74.   BLANK                         !  AND BLANK
  75.   Idle_Kill = False                 ! Clear the IDLE switch (new b.g.)
  76.   AbortEdg = False                 !AbortEdit_ control (new b.g.)
  77.   HELP('MEMOEDIT.HLP')                 !OPEN THE HELP FILE
  78.   G_OPENFILES                     !OPEN OR CREATE FILES
  79.   SETHUE()                     !    THE SCREEN
  80.   MAINMENU                     !memo test application
  81.   RETURN                     !EXIT TO DOS
  82.  
  83. G_OPENFILES  PROCEDURE                 !OPEN FILES & CHECK FOR ERROR
  84.   CODE
  85.   SHOW(25,1,CENTER('Opening File: ' & 'MEMTEST',80)) !DISPLAY FILE NAME
  86.   OPEN(MEMTEST)                     !OPEN THE FILE
  87.   IF ERROR()                     !OPEN RETURNED AN ERROR
  88.     CASE ERRORCODE()                 ! CHECK FOR SPECIFIC ERROR
  89.     OF 46                     !  KEYS NEED TO BE REQUILT
  90.       SETHUE(0,7)                 !  BLACK ON WHITE
  91.       SHOW(25,1,CENTER('Rebuilding Key Files For MEMTEST',80)) !INDICATE MSG
  92.       BUILD(MEMTEST)                 !  CALL THE BUILD PROCEDURE
  93.       SETHUE(7,0)                 !  WHITE ON BLACK
  94.       BLANK(25,1,1,80)                 !  BLANK THE MESSAGE
  95.     OF 2                     !IF NOT FOUND,
  96.       CREATE(MEMTEST)                 ! CREATE
  97.     ELSE                     ! ANY OTHER ERROR
  98.       LOOP                     !  STOP EXECUTION
  99.     STOP('Cannot Open MEMTEST - Error: ' & ERROR())
  100.       .
  101.   . .
  102.  
  103.   BLANK                         !BLANK THE SCREEN
  104.  
  105.  
  106. !**************************************************************       (new b.g.)
  107. !    SetMemMsg procedure                      *       (new b.g.)
  108. !**************************************************************       (new b.g.)
  109. SetMemMsg   PROCEDURE                          !       (new b.g.)
  110.         CODE                          !       (new b.g.)
  111.         EXECUTE ACTION                      !       (new b.g.)
  112.         MEM:MESSAGE='Record will be Added'              !       (new b.g.)
  113.         MEM:MESSAGE='Record will be Changed'          !       (new b.g.)
  114.         MEM:MESSAGE='Press Enter to Delete'              !       (new b.g.)
  115.         .                              !       (new b.g.)
  116.  
  117. !**************************************************************       (new b.g.)
  118. !    PauseMsg procedure                      *       (new b.g.)
  119. !**************************************************************       (new b.g.)
  120. PauseMsg     PROCEDURE(Msg_)                      !       (new b.g.)
  121. Msg_         STRING(80)                          !       (new b.g.)
  122.          code                          !       (new b.g.)
  123.          open(MessageScrn_)                      !       (new b.g.)
  124.          Message_ = center(Msg_,size(Message_))          !       (new b.g.)
  125.          beep(800,20)                      !       (new b.g.)
  126.          beep(800,20); ask                      !       (new b.g.)
  127.          close(MessageScrn_)                  !       (new b.g.)
  128.  
  129. !**************************************************************       (new b.g.)
  130. !    AbortEdit_ Function                      *       (new b.g.)
  131. !**************************************************************       (new b.g.)
  132. AbortEdit_   FUNCTION                          !       (new b.g.)
  133. Screen         SCREEN      WINDOW(8,43),AT(18,20),HUE(15,4)    !       (new b.g.)
  134.            ROW(1,1)      STRING('╔═{41}╗')              !       (new b.g.)
  135.            ROW(2,1)      REPEAT(6);STRING('║<0{41}>║') .     !       (new b.g.)
  136.            ROW(8,1)      STRING('╚═{41}╝')              !       (new b.g.)
  137.            ROW(2,13)  STRING('Lose Your Changes?'),BLK    !       (new b.g.)
  138.            ROW(4,4)      STRING('Ctrl-Esc')              !       (new b.g.)
  139.          COL(16)  STRING('Quit (and Lose Changes)')   !       (new b.g.)
  140.            ROW(5,4)      STRING('Ctrl-Enter')              !       (new b.g.)
  141.          COL(16)  STRING('Quit after Saving Changes') !       (new b.g.)
  142.            ROW(7,10)  STRING('Any other key to continue') !       (new b.g.)
  143.            ROW(3,25)  ENTRY,USE(?First_Field)          !       (new b.g.)
  144.            .                          !       (new b.g.)
  145.   Code                                  !       (new b.g.)
  146.   Open(Screen); Setcursor; Beep(800,20)                  !       (new b.g.)
  147.   LOOP                                  !       (new b.g.)
  148.     ASK                                  !       (new b.g.)
  149.     CASE KEYCODE()                          !       (new b.g.)
  150.       OF Accept_Key;  RETURN('S')                  !       (new b.g.)
  151.       OF Reject_Key;  RETURN('Y')                  !       (new b.g.)
  152.       OF Esc_Key;     BEEP(800,20); CYCLE              !       (new b.g.)
  153.       ELSE          RETURN('N')                  !       (new b.g.)
  154.   . .                                  !       (new b.g.)
  155.  
  156.          EJECT ('memo test application')
  157. MAINMENU     PROCEDURE
  158.  
  159. SCREEN         SCREEN      PRE(SCR),WINDOW(12,30),HUE(15,3)
  160.            ROW(1,1)   STRING('<201,205{28},187>'),HUE(15,3)
  161.            ROW(2,1)   REPEAT(10);STRING('<186,0{28},186>'),HUE(15,3) .
  162.            ROW(12,1)  STRING('<200,205{28},188>'),HUE(15,3)
  163.            ROW(2,6)   STRING('memo test application')
  164. DATE           ROW(4,12)  STRING(@D1),HUE(15,3)
  165.               ENTRY,USE(?FIRST_FIELD)
  166.               ENTRY,USE(?PRE_MENU)
  167.               MENU,USE(MENU_FIELD"),REQ
  168.            ROW(6,7)    STRING('Show Memtest By Key'),HUE(1,3),SEL(0,7)
  169.            ROW(10,14)    STRING('Quit'),HUE(1,3),SEL(0,7)
  170.          .          .
  171.  
  172.   EJECT
  173.   CODE
  174.   OPEN(SCREEN)                     !OPEN THE MENU SCREEN
  175.   SETCURSOR                     !TURN OFF ANY CURSOR
  176.   MENU_FIELD" = ''                 !START MENU WITH FIRST ITEM
  177.   Idle_Kill = false                 !clear the idle switch (new b.g.)
  178.   Menu_Nesc = false                 !clear the menu escape (new b.g.)
  179.   LOOP                         !LOOP UNTIL USER EXITS
  180.     SCR:DATE = TODAY()
  181.     ALERT                     !TURN OFF ALL ALERTED KEYS
  182.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  183.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  184.     ACCEPT                     !READ A FIELD OR MENU CHOICE
  185.     IF KEYCODE() = REJECT_KEY THEN         !RETURN ON SCREEN REJECT
  186.       if Menu_Nesc then BEEP(800,20)         !Menu Nesc proc (new b.g.)
  187.      LOOP WHILE KEYBOARD(); ASK.; CYCLE.     !Menu Nesc proc (new b.g.)
  188.       if Idle_Kill then IDLE().             !Idle Kill proc (new b.g.)
  189.       Idle_Kill = false                 !Idle Kill proc (new b.g.)
  190.       RETURN                     !
  191.     .                         !
  192.  
  193.     IF KEYCODE() = ACCEPT_KEY             !ON SCREEN ACCEPT KEY
  194.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  195.       SELECT(?)                     !  START WITH CURRENT FIELD
  196.       SELECT                     !  EDIT ALL FIELDS
  197.       CYCLE                     !  GO TO TOP OF LOOP
  198.     .                         !
  199.  
  200.     CASE FIELD()                 !JUMP TO FIELD EDIT ROUTINE
  201.     OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  202.       IF KEYCODE() = ESC_KEY THEN         !  RETURN ON ESC KEY
  203.     if Menu_Nesc then BEEP(800,20); ACCEPT     !Menu Nesc proc (new b.g.)
  204.        LOOP WHILE KEYBOARD(); ASK.; CYCLE.     !Menu Nesc proc (new b.g.)
  205.     if Idle_Kill then IDLE().         !Idle Kill proc (new b.g.)
  206.     Idle_Kill = false             !Idle Kill proc (new b.g.)
  207.     RETURN                     !
  208.       .                         !
  209.  
  210.     OF ?PRE_MENU                 !PRE MENU FIELD CONDITION
  211.       IF KEYCODE() = ESC_KEY             !  BACKING UP?
  212.     SELECT(?-1)                 !    SELECT PREVIOUS FIELD
  213.       ELSE                     !  GOING FORWARD
  214.     SELECT(?+1)                 !    SELECT MENU FIELD
  215.       .
  216.     OF ?MENU_FIELD"                 !FROM THE MENU FIELD
  217.       if Idle_Kill then IDLE().             !Idle Kill proc (new b.g.)
  218.       Idle_Kill = false                 !Idle Kill proc (new b.g.)
  219.       EXECUTE CHOICE()                 !  CALL THE SELECTED PROCEDURE
  220.     SHO_KEY                     !  Show Memtest By Key
  221.     RETURN
  222.   . . .
  223.          EJECT ('Show Memtest By Key')
  224. SHO_KEY         PROCEDURE
  225.  
  226. SCREEN         SCREEN      PRE(SCR),WINDOW(25,74),HUE(15,1)
  227.            ROW(6,3)   PAINT(17,70),HUE(0,7)
  228.            ROW(1,1)   STRING('<201,205{72},187>'),HUE(15,1)
  229.            ROW(2,1)   REPEAT(23);STRING('<186,0{72},186>'),HUE(15,1) .
  230.            ROW(25,1)  STRING('<200,205{72},188>'),HUE(15,1)
  231.            ROW(2,29)  STRING('Show Memtest By Key')
  232.            ROW(4,33)  STRING('LOCATE:'),HUE(11,1)
  233.            ROW(23,12) STRING('Ins to Add'),HUE(11,1)
  234.              COL(49)  STRING('Enter to Change'),HUE(11,1)
  235.            ROW(24,12) STRING('Del to Delete'),HUE(11,1)
  236.              COL(48)  STRING('Ctrl-Esc to Exit'),HUE(11,1)
  237. LOCATOR           ROW(4,40)  STRING(4),HUE(11,1)
  238.               ENTRY,USE(?FIRST_FIELD)
  239.               ENTRY,USE(?PRE_POINT)
  240.               REPEAT(17),EVERY(1),INDEX(NDX)
  241.            ROW(6,4) POINT(1,68),USE(?POINT),ESC(?-1)
  242. KEY             COL(5)    STRING(4)
  243. DATA1             COL(10)    STRING(30)
  244. DATA2             COL(41)    STRING(30)
  245.          .          .
  246.  
  247. NDX         BYTE                 !REPEAT INDEX FOR POINT AREA
  248. ROW         BYTE                 !ACTUAL ROW OF SCROLL AREA
  249. COL         BYTE                 !ACTUAL COLUMN OF SCROLL AREA
  250. COUNT         BYTE(17)                 !NUMBER OF ITEMS TO SCROLL
  251. ROWS         BYTE(17)                 !NUMBER OF ROWS TO SCROLL
  252. COLS         BYTE(68)                 !NUMBER OF COLUMNS TO SCROLL
  253. FOUND         BYTE                 !RECORD FOUND FLAG
  254. NEWPTR         LONG                 !POINTER TO NEW RECORD
  255.  
  256. TABLE         TABLE,PRE(TBL)             !TABLE OF RECORD DATA
  257. PTR           LONG                 !  POINTER TO FILE RECORD
  258. KEY           STRING(4)
  259. DATA1           STRING(30)
  260. DATA2           STRING(30)
  261.          .
  262.  
  263.   EJECT
  264.   CODE
  265.   ACTION# = ACTION                 !SAVE ACTION
  266.   OPEN(SCREEN)                     !OPEN THE SCREEN
  267.   SETCURSOR                     !TURN OFF ANY CURSOR
  268.   TBL:PTR = 1                     !START AT TABLE ENTRY
  269.   NDX = 1                     !PUT SELECTOR BAR ON TOP ITEM
  270.   ROW = ROW(?POINT)                 !REMEMBER TOP ROW AND
  271.   COL = COL(?POINT)                 !LEFT COLUMN OF SCROLL AREA
  272.   RECORDS# = TRUE                 !INITIALIZE RECORDS FLAG
  273.   CACHE(FIL:BY_KEY,.25)                 !CACHE KEY FILE
  274.   IF ACTION = 4                     !  TABLE LOOKUP REQUEST
  275.     NEWPTR = POINTER(MEMTEST)             !  SET POINTER TO RECORD
  276.     IF NOT NEWPTR                 !  RECORD NOT PASSED TO TABLE
  277.       SET(FIL:BY_KEY,FIL:BY_KEY)         !    POSITION TO CLOSEST RECORD
  278.       NEXT(MEMTEST)                 !    READ RECORD
  279.       NEWPTR = POINTER(MEMTEST)             !    SET POINTER
  280.     .
  281.     DO FIND_RECORD                 !  POSITION FILE
  282.   ELSE
  283.     NDX = 1                     !  PUT SELECTOR BAR ON TOP ITEM
  284.     DO FIRST_PAGE                 !  BUILD MEMORY TABLE OF KEYS
  285.   .
  286.   RECORDS# = TRUE                 !  ASSUME THERE ARE RECORDS
  287.   LOOP                         !LOOP UNTIL USER EXITS
  288.     ACTION = ACTION#                 !RESTORE ACTION
  289.     ALERT                     !RESET ALERTED KEYS
  290.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  291.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  292.     ALERT(UP_KEY)                 ! New b.g.
  293.     ALERT(DOWN_KEY)                 ! New b.g.
  294.     ALERT(LEFT_KEY)                 ! New b.g.
  295.     ALERT(RIGHT_KEY)                 ! New b.g.
  296.     ALERT(TAB_KEY)                 ! New b.g.
  297.     ALERT(SHFT_TAB)                 ! New b.g.
  298.     ALERT(HOME_KEY)                 ! New b.g.
  299.     ALERT(END_KEY)                 ! New b.g.
  300.     ACCEPT                     !READ A FIELD
  301.     IF KEYCODE() = REJECT_KEY             !ON SCREEN REJECT KEY
  302.       FREE(FIL:BY_KEY)                 !  FREE THE CACHE
  303.       RETURN                     !  AND RETURN TO CALLER
  304.     .
  305.     IF    KEYCODE() = ACCEPT_KEY      |         !ON SCREEN ACCEPT KEY
  306.     AND FIELD() <> ?POINT             !BUT NOT ON THE POINT FIELD
  307.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  308.       SELECT(?)                     !  START WITH CURRENT FIELD
  309.       SELECT                     !  EDIT ALL FIELDS
  310.       CYCLE                     !  GO TO TOP OF LOOP
  311.     .
  312.  
  313.     CASE FIELD()                 !JUMP TO FIELD EDIT ROUTINE
  314.  
  315.     OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  316.       IF KEYCODE() = ESC_KEY   |         !  RETURN ON ESC KEY
  317.       OR RECORDS# = FALSE             !  OR NO RECORDS
  318.     BREAK                     !    EXIT PROCEDURE
  319.       .
  320.     OF ?PRE_POINT                 !PRE POINT FIELD CONDITION
  321.       IF KEYCODE() = ESC_KEY             !  BACKING UP?
  322.     SELECT(?-1)                 !    SELECT PREVIOUS FIELD
  323.       ELSE                     !  GOING FORWARD
  324.     SELECT(?POINT)                 !    SELECT MENU FIELD
  325.       .
  326.       IF KEYCODE() = ESC_KEY             !  BACKING UP?
  327.     SCR:LOCATOR = ''             !    CLEAR LOCATOR
  328.     SETCURSOR                 !    AND TURN CURSOR OFF
  329.       ELSE                     !  GOING FORWARD
  330.     LEN# = 0                 !    RESET TO START OF LOCATOR
  331.     SETCURSOR(ROW(SCR:LOCATOR),COL(SCR:LOCATOR)) !AND TURN CURSOR ON
  332.       .
  333.     OF ?POINT                     !PROCESS THE POINT FIELD
  334.       IF RECORDS(TABLE) = 0             !IF THERE ARE NO RECORDS
  335.     CLEAR(FIL:RECORD)             !  CLEAR RECORD AREA
  336.     UPDATE                     !  UPDATE ALL FIELDS
  337.     ACTION = 1                 !  SET ACTION TO ADD
  338.     GET(MEMTEST,0)                 !  CLEAR PENDING RECORD
  339.     UPD_MEMTEST                 !  CALL FORM FOR NEW RECORD
  340.     NEWPTR = POINTER(MEMTEST)         !    SET POINTER TO NEW RECORD
  341.     DO FIRST_PAGE                 !  DISPLAY THE FIRST PAGE
  342.     IF RECORDS(TABLE) = 0             !  IF THERE AREN'T ANY RECORDS
  343.       RECORDS# = FALSE             !    INDICATE NO RECORDS
  344.       SELECT(?PRE_POINT-1)             !    SELECT THE PRIOR FIELD
  345.     .
  346.     CYCLE                     !    AND LOOP AGAIN
  347.       .
  348.       IF KEYCODE() > 31             |         !THE DISPLAYABLE CHARACTERS
  349.       AND KEYCODE() < 255             !ARE USED TO LOCATE RECORDS
  350.     IF LEN# < SIZE(SCR:LOCATOR)         !  IF THERE IS ROOM LEFT
  351.       SCR:LOCATOR = SUB(SCR:LOCATOR,1,LEN#) & CHR(KEYCODE())
  352.       LEN# += 1                 !    INCREMENT THE LENGTH
  353.     .
  354.       ELSIF KEYCODE() = BS_KEY             !BACKSPACE UNTYPES A CHARACTER
  355.     IF LEN# > 0                 !  IF THERE ARE CHARACTERS LEFT
  356.       LEN# -= 1                 !    DECREMENT THE LENGTH
  357.       SCR:LOCATOR = SUB(SCR:LOCATOR,1,LEN#)     !    ERASE THE LAST CHARACTER
  358.     .
  359.       ELSE                     !FOR ANY OTHER CHARACTER
  360.     LEN# = 0                 !  ZERO THE LENGTH
  361.     SCR:LOCATOR = ''             !  ERASE THE LOCATOR FIELD
  362.       .
  363.       SETCURSOR(ROW(SCR:LOCATOR),COL(SCR:LOCATOR)+LEN#) !AND RESET THE CURSOR
  364.       FIL:KEY = CLIP(SCR:LOCATOR)         !    UPDATE THE KEY FIELD
  365.       IF KEYBOARD() > 31         |         !THE DISPLAYABLE CHARACTERS
  366.       AND KEYBOARD() < 255         |         !ARE USED TO LOCATE RECORDS
  367.       OR KEYBOARD() = BS_KEY             !INCLUDE BACKSPACE
  368.     CYCLE
  369.       .
  370.       IF LEN# > 0                 !ON A LOCATOR REQUEST
  371.     FIL:KEY = CLIP(SCR:LOCATOR)         !    UPDATE THE KEY FIELD
  372.     SET(FIL:BY_KEY,FIL:BY_KEY)         !  POINT TO NEW RECORD
  373.     NEXT(MEMTEST)                 !  READ A RECORD
  374.     IF (EOF(MEMTEST) AND ERROR())         !  IF EOF IS REACHED
  375.       SET(FIL:BY_KEY)             !    SET TO FIRST RECORD
  376.       PREVIOUS(MEMTEST)             !    READ THE LAST RECORD
  377.     .
  378.     NEWPTR = POINTER(MEMTEST)         !  SET NEW RECORD POINTER
  379.     SKIP(MEMTEST,-1)             !  BACK UP TO FIRST RECORD
  380.     FREE(TABLE)                 !  CLEAR THE TABLE
  381.     DO NEXT_PAGE                 !  AND DISPLAY A NEW PAGE
  382.       .
  383.       CASE KEYCODE()                 !PROCESS THE KEYSTROKE
  384.  
  385.       OF INS_KEY                 !INS KEY
  386.     CLEAR(FIL:RECORD)             !  CLEAR RECORD AREA
  387.     ACTION = 1                 !  SET ACTION TO ADD
  388.     GET(MEMTEST,0)                 !  CLEAR PENDING RECORD
  389.     UPD_MEMTEST                 !  CALL FORM FOR NEW RECORD
  390.     IF ~ACTION                 !  IF RECORD WAS ADDED
  391.       NEWPTR = POINTER(MEMTEST)         !    SET POINTER TO NEW RECORD
  392.       DO FIND_RECORD             !    POSITION IN FILE
  393.     .
  394.       OF ENTER_KEY                 !ENTER KEY
  395.       OROF ACCEPT_KEY                 !CTRL-ENTER KEY
  396.     DO GET_RECORD                 !  GET THE SELECTED RECORD
  397.     IF ACTION = 4 AND KEYCODE() = ENTER_KEY!    IF THIS IS A LOOKUP REQUEST
  398.       ACTION = 0                 !    SET ACTION TO COMPLETE
  399.       BREAK                     !    AND RETURN TO CALLER
  400.     .
  401.     IF ~ERROR()                 !  IF RECORD IS STILL THERE
  402.       ACTION = 2                 !    SET ACTION TO CHANGE
  403.       UPD_MEMTEST                 !    CALL FORM TO CHANGE REC
  404.       IF ACTION THEN CYCLE.             !    IF SUCCESSFUL RE-DISPLAY
  405.     .
  406.     NEWPTR = POINTER(MEMTEST)         !    SET POINTER TO NEW RECORD
  407.     DO FIND_RECORD                 !    POSITION IN FILE
  408.       OF DEL_KEY                 !DEL KEY
  409.     DO GET_RECORD                 !  READ THE SELECTED RECORD
  410.     IF ~ERROR()                 !  IF RECORD IS STILL THERE
  411.       ACTION = 3                 !    SET ACTION TO DELETE
  412.       UPD_MEMTEST                 !    CALL FORM TO DELETE
  413.       IF ~ACTION                 !    IF SUCCESSFUL
  414.         N# = NDX                 !    SAVE POINT INDEX
  415.         DO SAME_PAGE             !    RE-DISPLAY
  416.         NDX = N#                 !    RESTORE POINT INDEX
  417.     . .
  418.  
  419.       OF DOWN_KEY OROF RIGHT_KEY OROF TAB_KEY     !DOWN ARROW KEY (New b.g.)
  420.        IF NDX < RECORDS(TABLE)             ! New b.g.
  421.     NDX += 1                 ! New b.g.
  422.        ELSE                     ! New b.g.
  423.     DO SET_NEXT                 !  POINT TO NEXT RECORD
  424.     DO FILL_NEXT                 !  FILL A TABLE ENTRY
  425.     IF FOUND                 !  FOUND A NEW RECORD
  426.       SCROLL(ROW,COL,ROWS,COLS,ROWS(?POINT)) !  SCROLL THE SCREEN UP
  427.       GET(TABLE,RECORDS(TABLE))         !  GET RECORD FROM TABLE
  428.       DO FILL_SCREEN             !  DISPLAY ON SCREEN
  429.     . .                     ! New b.g.
  430.  
  431.       OF PGDN_KEY                 !PAGE DOWN KEY
  432.     DO SET_NEXT                 !  POINT TO NEXT RECORD
  433.     DO NEXT_PAGE                 !  DISPLAY THE NEXT PAGE
  434.  
  435.       OF CTRL_PGDN                 !CTRL-PAGE DOWN KEY
  436.     DO LAST_PAGE                 !  DISPLAY THE LAST PAGE
  437.     NDX = RECORDS(TABLE)             !  POSITION POINT BAR
  438.  
  439.       OF UP_KEY OROF LEFT_KEY OROF SHFT_TAB     !UP ARROW KEY (New b.g.)
  440.        IF NDX > 1 THEN                 ! New b.g.
  441.     NDX -= 1                 ! New b.g.
  442.        ELSE                     ! New b.g.
  443.     DO SET_PREV                 !  POINT TO PREVIOUS RECORD
  444.     DO FILL_PREV                 !  FILL A TABLE ENTRY
  445.     IF FOUND                 !  FOUND A NEW RECORD
  446.       SCROLL(ROW,COL,ROWS,COLS,-(ROWS(?POINT)))! SCROLL THE SCREEN DOWN
  447.       GET(TABLE,1)                 !  GET RECORD FROM TABLE
  448.       DO FILL_SCREEN             !  DISPLAY ON SCREEN
  449.       . .                     ! New b.g.
  450.  
  451.       OF PGUP_KEY                 !PAGE UP KEY
  452.     DO SET_PREV                 !  POINT TO PREVIOUS RECORD
  453.     DO PREV_PAGE                 !  DISPLAY THE PREVIOUS PAGE
  454.  
  455.       OF CTRL_PGUP                 !CTRL-PAGE UP
  456.     DO FIRST_PAGE                 !  DISPLAY THE FIRST PAGE
  457.     NDX = 1                     !  POSITION POINT BAR
  458.  
  459.       OF HOME_KEY                 ! New b.g.
  460.     NDX = 1                     ! New b.g.
  461.  
  462.       OF END_KEY                 ! New b.g.
  463.     NDX = RECORDS(TABLE)             ! New b.g.
  464.   . . .
  465.   FREE(TABLE)                     !FREE MEMORY TABLE
  466.   FREE(FIL:BY_KEY)                 !FREE CACHE
  467.   RETURN                     !AND RETURN TO CALLER
  468.  
  469. SAME_PAGE ROUTINE                 !DISPLAY THE SAME PAGE
  470.   GET(TABLE,1)                     !  GET THE FIRST TABLE ENTRY
  471.   DO FILL_RECORD                 !  FILL IN THE RECORD
  472.   SET(FIL:BY_KEY,FIL:BY_KEY,TBL:PTR)         !  POSITION FILE
  473.   FREE(TABLE)                     !  EMPTY THE TABLE
  474.   DO NEXT_PAGE                     !  DISPLAY A FULL PAGE
  475.  
  476. FIRST_PAGE ROUTINE                 !DISPLAY FIRST PAGE
  477.   BLANK(ROW,COL,ROWS,COLS)
  478.   FREE(TABLE)                     !  EMPTY THE TABLE
  479.   CLEAR(FIL:RECORD,-1)                 !  CLEAR RECORD TO LOW VALUES
  480.   CLEAR(TBL:PTR)                 !  ZERO RECORD POINTER
  481.   SET(FIL:BY_KEY)                 !  POINT TO FIRST RECORD
  482.   LOOP NDX = 1 TO COUNT                 !  FILL UP THE TABLE
  483.     DO FILL_NEXT                 !    FILL A TABLE ENTRY
  484.     IF NOT FOUND THEN BREAK.             !    GET OUT IF NO RECORD
  485.   .
  486.   NDX = 1                     !  SET TO TOP OF TABLE
  487.   DO SHOW_PAGE                     !  DISPLAY THE PAGE
  488.  
  489. LAST_PAGE ROUTINE                 !DISPLAY LAST PAGE
  490.   NDX# = NDX                     !  SAVE SELECTOR POSITION
  491.   BLANK(ROW,COL,ROWS,COLS)             !  CLEAR SCROLLING AREA
  492.   FREE(TABLE)                     !  EMPTY THE TABLE
  493.   CLEAR(FIL:RECORD,1)                 !  CLEAR RECORD TO HIGH VALUES
  494.   CLEAR(TBL:PTR,1)                 !  CLEAR PTR TO HIGH VALUE
  495.   SET(FIL:BY_KEY)                 !  POINT TO FIRST RECORD
  496.   LOOP NDX = COUNT TO 1 BY -1             !  FILL UP THE TABLE
  497.     DO FILL_PREV                 !    FILL A TABLE ENTRY
  498.     IF NOT FOUND THEN BREAK.             !    GET OUT IF NO RECORD
  499.   .                         !  END OF LOOP
  500.   NDX = NDX#                     !  RESTORE SELECTOR POSITION
  501.   DO SHOW_PAGE                     !  DISPLAY THE PAGE
  502.  
  503. FIND_RECORD ROUTINE                 !POSITION TO SPECIFIC RECORD
  504.   SET(FIL:BY_KEY,FIL:BY_KEY,NEWPTR)         !POSITION FILE
  505.   IF NEWPTR = 0                     !NEWPTR NOT SET
  506.     NEXT(MEMTEST)                 !  READ NEXT RECORD
  507.     NEWPTR = POINTER(MEMTEST)             !  SET NEWPTR
  508.     SKIP(MEMTEST,-1)                 !  BACK UP TO DISPLAY RECORD
  509.   .
  510.   FREE(TABLE)                     !  CLEAR THE RECORD
  511.   DO NEXT_PAGE                     !  DISPLAY A PAGE
  512.  
  513. NEXT_PAGE ROUTINE                 !DISPLAY NEXT PAGE
  514.   SAVECNT# = RECORDS(TABLE)             !  SAVE RECORD COUNT
  515.   LOOP COUNT TIMES                 !  FILL UP THE TABLE
  516.     DO FILL_NEXT                 !    FILL A TABLE ENTRY
  517.     IF NOT FOUND                 !    IF NONE ARE LEFT
  518.       IF NOT SAVECNT#                 !    IF REBUILDING TABLE
  519.     DO LAST_PAGE                 !    FILL IN RECORDS
  520.     EXIT                     !    EXIT OUT OF ROUTINE
  521.       .
  522.       BREAK                     !    EXIT LOOP
  523.   . .
  524.   DO SHOW_PAGE                     !  DISPLAY THE PAGE
  525.  
  526. SET_NEXT ROUTINE                 !POINT TO THE NEXT PAGE
  527.   GET(TABLE,RECORDS(TABLE))             !  GET THE LAST TABLE ENTRY
  528.   DO FILL_RECORD                 !  FILL IN THE RECORD
  529.   SET(FIL:BY_KEY,FIL:BY_KEY,TBL:PTR)         !  POSITION FILE
  530.   NEXT(MEMTEST)                     !  READ THE CURRENT RECORD
  531.  
  532. FILL_NEXT ROUTINE                 !FILL NEXT TABLE ENTRY
  533.   FOUND = FALSE                     !  ASSUME RECORD NOT FOUND
  534.   LOOP UNTIL EOF(MEMTEST)             !  LOOP UNTIL END OF FILE
  535.     NEXT(MEMTEST)                 !    READ THE NEXT RECORD
  536.     FOUND = TRUE                 !    SET RECORD FOUND
  537.     DO FILL_TABLE                 !    FILL IN THE TABLE ENTRY
  538.     ADD(TABLE)                     !    ADD LAST TABLE ENTRY
  539.     GET(TABLE,RECORDS(TABLE)-COUNT)         !    GET ANY OVERFLOW RECORD
  540.     DELETE(TABLE)                 !    AND DELETE IT
  541.     EXIT                     !    RETURN TO CALLER
  542.   .
  543. PREV_PAGE ROUTINE                 !DISPLAY PREVIOUS PAGE
  544.   LOOP COUNT TIMES                 !  FILL UP THE TABLE
  545.     DO FILL_PREV                 !    FILL A TABLE ENTRY
  546.     IF NOT FOUND THEN BREAK.             !    GET OUT IF NO RECORD
  547.   .
  548.   DO SHOW_PAGE                     !  DISPLAY THE PAGE
  549.  
  550. SET_PREV ROUTINE                 !POINT TO PREVIOUS PAGE
  551.   GET(TABLE,1)                     !  GET THE FIRST TABLE ENTRY
  552.   DO FILL_RECORD                 !  FILL IN THE RECORD
  553.   SET(FIL:BY_KEY,FIL:BY_KEY,TBL:PTR)         !  POSITION FILE
  554.   PREVIOUS(MEMTEST)                 !  READ THE CURRENT RECORD
  555.  
  556. FILL_PREV ROUTINE                 !FILL PREVIOUS TABLE ENTRY
  557.   FOUND = FALSE                     !  ASSUME RECORD NOT FOUND
  558.   LOOP UNTIL BOF(MEMTEST)             !  LOOP UNTIL BEGINNING OF FILE
  559.     PREVIOUS(MEMTEST)                 !    READ THE PREVIOUS RECORD
  560.     FOUND = TRUE                 !    SET RECORD FOUND
  561.     DO FILL_TABLE                 !    FILL IN THE TABLE ENTRY
  562.     ADD(TABLE,1)                 !    ADD FIRST TABLE ENTRY
  563.     GET(TABLE,COUNT+1)                 !    GET ANY OVERFLOW RECORD
  564.     DELETE(TABLE)                 !    AND DELETE IT
  565.     EXIT                     !    RETURN TO CALLER
  566.   .
  567. SHOW_PAGE ROUTINE                 !DISPLAY THE PAGE
  568.   NDX# = NDX                     !  SAVE SCREEN INDEX
  569.   LOOP NDX = 1 TO RECORDS(TABLE)         !  LOOP THRU THE TABLE
  570.     GET(TABLE,NDX)                 !    GET A TABLE ENTRY
  571.     DO FILL_SCREEN                 !    AND DISPLAY IT
  572.     IF TBL:PTR = NEWPTR                 !    SET INDEX FOR NEW RECORD
  573.       NDX# = NDX                 !    POINT TO CORRECT RECORD
  574.   . .
  575.   NDX = NDX#                     !  RESTORE SCREEN INDEX
  576.   NEWPTR = 0                     !  CLEAR NEW RECORD POINTER
  577.   CLEAR(FIL:RECORD)                 !  CLEAR RECORD AREA
  578.  
  579. FILL_TABLE ROUTINE                 !MOVE FILE TO TABLE
  580.   TBL:KEY = FIL:KEY
  581.   TBL:DATA1 = FIL:DATA1
  582.   TBL:DATA2 = FIL:DATA2
  583.   TBL:PTR = POINTER(MEMTEST)             !  SAVE RECORD POINTER
  584.  
  585. FILL_RECORD ROUTINE                 !MOVE TABLE TO FILE
  586.   FIL:KEY = TBL:KEY
  587.  
  588. FILL_SCREEN ROUTINE                 !MOVE TABLE TO SCREEN
  589.   SCR:KEY = TBL:KEY
  590.   SCR:DATA1 = TBL:DATA1
  591.   SCR:DATA2 = TBL:DATA2
  592.  
  593. GET_RECORD ROUTINE                 !GET SELECTED RECORD
  594.   GET(TABLE,NDX)                 !  GET TABLE ENTRY
  595.   GET(MEMTEST,TBL:PTR)                 !  GET THE RECORD
  596.  
  597.  
  598.          EJECT ('Update Memtest')
  599. UPD_MEMTEST  PROCEDURE
  600.  
  601. SCREEN         SCREEN      PRE(SCR),WINDOW(25,80),HUE(15,4)
  602.            ROW(1,1)   STRING('<201,205{78},187>'),HUE(15,4)
  603.            ROW(2,1)   REPEAT(23);STRING('<186,0{78},186>'),HUE(15,4) .
  604.            ROW(25,1)  STRING('<200,205,0{25},205{52},188>'),HUE(15,4)
  605.            ROW(2,34)  STRING('Update Memtest')
  606.            ROW(4,4)   STRING('KEY  :'),HUE(7,4)
  607.            ROW(5,4)   STRING('DATA1:'),HUE(7,4)
  608.            ROW(6,4)   STRING('DATA2:'),HUE(7,4)
  609.            ROW(25,3)  STRING('[Editing'),HUE(15,4)
  610.              COL(12)  STRING('/')
  611.              COL(14)  STRING('Row-'),HUE(15,4)
  612.              COL(20)  STRING(' Col-'),HUE(15,4)
  613.              COL(27)  STRING(']'),HUE(15,4)
  614. MESSAGE           ROW(3,26)  STRING(30),HUE(15,4)
  615. DATA3           ROW(8,3)   STRING(76),HUE(11,1)
  616. EROW           ROW(25,18) STRING(@P##P),HUE(14,4)
  617. ECOL             COL(25)  STRING(@P##P),HUE(14,4)
  618.               ENTRY,USE(?FIRST_FIELD)
  619.            ROW(4,10)  ENTRY(@s4),USE(FIL:KEY),REQ,HUE(15,4),SEL(0,7)
  620.            ROW(5,10)  ENTRY(@s30),USE(FIL:DATA1),HUE(15,4),SEL(0,7)
  621.            ROW(6,10)  ENTRY(@s30),USE(FIL:DATA2),HUE(15,4),SEL(0,7)
  622.              COL(47)  PAUSE('press enter to file transaction')           |
  623.                 USE(?PAUSE_FIELD),HUE(15,4)
  624.               ENTRY,USE(?LAST_FIELD)
  625.               PAUSE(''),USE(?DELETE_FIELD)
  626.          .
  627.  
  628. Chk_Abort    byte                 !AbortEdit_ control (new b.g.)
  629. ChangedAb    byte                 !AbortEdit_ control (new b.g.)
  630. AbEdRt         string(1)                 !AbortEdit_ control (new b.g.)
  631. NextFrSw     byte                 !NextForm/Deletes   (new b.g.)
  632. MultiAdd     byte                 !MultiAdd control   (new b.g.)
  633.  
  634.   EJECT
  635.   CODE
  636.   OPEN(SCREEN)                     !OPEN THE SCREEN
  637.   SETCURSOR                     !TURN OFF ANY CURSOR
  638.   Chk_Abort = False; ChangedAb = False         !AbortEdit_ control (new b.g.)
  639.   IF AbortEdg then Chk_Abort = True.         !AbortEdit_ control (new b.g.)
  640.   NextFrSw = False                 !NextForm/Deletes   (new b.g.)
  641.   MultiAdd = False                 !MultiAdd control   (new b.g.)
  642.   Chk_Abort=True                 !CALL SETUP PROCEDURE
  643.   DISPLAY                     !DISPLAY THE FIELDS
  644.   LOOP                         !LOOP THRU ALL THE FIELDS
  645.     MEM:MESSAGE = CENTER(MEM:MESSAGE)         !DISPLAY ACTION MESSAGE
  646.     DO CALCFIELDS                 !CALCULATE DISPLAY FIELDS
  647.     ALERT                     !RESET ALERTED KEYS
  648.     ALERT(ACCEPT_KEY)                 !ALERT SCREEN ACCEPT KEY
  649.     ALERT(REJECT_KEY)                 !ALERT SCREEN REJECT KEY
  650.     ACCEPT                     !READ A FIELD
  651.     IF REFER() AND ACTION <> 3 THEN         !AbortEdit_ control (new b.g.)
  652.       ChangedAb = True.                 !AbortEdit_ control (new b.g.)
  653.     IF KEYCODE() = REJECT_KEY THEN         !AbortEdit_ logic (new b.g.)
  654.       IF ~Chk_Abort OR ~ChangedAb THEN RETURN.     !AbortEdit_ logic (new b.g.)
  655.       AbEdRt = AbortEdit_()             !AbortEdit_ logic (new b.g.)
  656.       IF AbEdRt = 'Y' THEN RETURN.         !AbortEdit_ logic (new b.g.)
  657.       IF AbEdRt = 'S' THEN UPDATE; SELECT(?)     !AbortEdit_ logic (new b.g.)
  658.                SELECT; CYCLE.     !AbortEdit_ logic (new b.g.)
  659.       SELECT(?); CYCLE                 !AbortEdit_ logic (new b.g.)
  660.       .                         !AbortEdit_ logic (new b.g.)
  661.     SetMemMsg                     !Sets Mem:Message (new b.g.)
  662.     IF KEYCODE() = ACCEPT_KEY             !ON SCREEN ACCEPT KEY
  663.       UPDATE                     !  MOVE ALL FIELDS FROM SCREEN
  664.       SELECT(?)                     !  START WITH CURRENT FIELD
  665.       SELECT                     !  EDIT ALL FIELDS
  666.       CYCLE                     !  GO TO TOP OF LOOP
  667.     .
  668.     CASE FIELD()                 !JUMP TO FIELD EDIT ROUTINE
  669.     OF ?FIRST_FIELD                 !FROM THE FIRST FIELD
  670.       IF KEYCODE() = ESC_KEY THEN         !AbortEdit_ logic (new b.g.)
  671.       IF ~Chk_Abort OR ~ChangedAb THEN RETURN.     !AbortEdit_ logic (new b.g.)
  672.       AbEdRt = AbortEdit_()             !AbortEdit_ logic (new b.g.)
  673.       IF AbEdRt = 'Y' THEN RETURN.         !AbortEdit_ logic (new b.g.)
  674.       IF AbEdRt = 'S' THEN UPDATE; SELECT(?)     !AbortEdit_ logic (new b.g.)
  675.                SELECT; CYCLE.     !AbortEdit_ logic (new b.g.)
  676.       SELECT(?); CYCLE                 !AbortEdit_ logic (new b.g.)
  677.       .                         !AbortEdit_ logic (new b.g.)
  678.  
  679.       IF ACTION = 3 THEN SELECT(?DELETE_FIELD).!    OR CONFIRM FOR DELETE
  680.  
  681.     OF ?FIL:KEY
  682.       IF DUPLICATE(FIL:BY_KEY)             !  CHECK FOR DUPLICATE KEY
  683.     MEM:MESSAGE = 'Creates Duplicate Entry'     !    MOVE AN ERROR MESSAGE
  684.     SELECT(?FIL:KEY)             !    STAY ON THE SAME FIELD
  685.     BEEP                     !    SOUND THE KEYBOARD ALARM
  686.     CYCLE                     !    AND LOOP AGAIN
  687.       .
  688.  
  689.     OF ?FIL:DATA2
  690.       i#=memoedit(fil_memo_row[],scr:data3,i#,15,scr:erow,scr:ecol)
  691.  
  692.       OF ?PAUSE_FIELD                 !ON PAUSE FIELD
  693.     IF KEYCODE() <> ENTER_KEY|         !IF NOT ENTER KEY
  694.     AND KEYCODE() <> ACCEPT_KEY|         !AND NOT CTRL-ENTER KEY
  695.     AND KEYCODE() <> 0             !AND NOT NONSTOP MODE
  696.       BEEP                     !  SOUND KEYBOARD ALARM
  697.       SELECT(?PAUSE_FIELD)             !  AND STAY ON PAUSE FIELD
  698.     .
  699.     OF ?LAST_FIELD                 !FROM THE LAST FIELD
  700.       EXECUTE ACTION                 !  UPDATE THE FILE
  701.     ADD(MEMTEST)                 !    ADD NEW RECORD
  702.     PUT(MEMTEST)                 !    CHANGE EXISTING RECORD
  703.     DELETE(MEMTEST)                 !    DELETE EXISTING RECORD
  704.       .
  705.       IF ERRORCODE() = 40             !  DUPLICATE KEY ERROR
  706.     MEM:MESSAGE = ERROR()             !    DISPLAY ERR MESSAGE
  707.     SELECT(2)                 !    POSITION TO TOP OF FORM
  708.     CYCLE                     !    GET OUT OF EDIT LOOP
  709.       ELSIF ERROR()                 !  CHECK FOR UNEXPECTED ERROR
  710.     EXECUTE ACTION                 !    BUILD AN ERROR MESSAGE
  711.       ERROR" = 'Error: ' & ERROR() & ' ' |     !    FOR ADDING
  712.            & 'Adding to MEMTEST'
  713.       ERROR" = 'Error: ' & ERROR() & ' ' |     !    FOR CHANGE
  714.            & 'Changing MEMTEST'
  715.       ERROR" = 'Error: ' & ERROR() & ' ' |     !    FOR DELETING
  716.            & 'Deleting from MEMTEST'
  717.     .
  718.     STOP(ERROR")                 !    HALT EXECUTION
  719.       .
  720.       ChangedAb = False                 !AbortEdit_ control (new b.g.)
  721.       ACTION = 0                 !  SET ACTION TO COMPLETE
  722.       RETURN                     !  AND RETURN TO CALLER
  723.  
  724.     OF ?DELETE_FIELD                 !FROM THE DELETE FIELD
  725.       IF KEYCODE() = ENTER_KEY |         !  ON ENTER KEY
  726.       OR KEYCODE() = ACCEPT_KEY             !  OR CTRL-ENTER KEY
  727.     SELECT(?LAST_FIELD)             !    DELETE THE RECORD
  728.       ELSE                     !  OTHERWISE
  729.     BEEP                     !    BEEP AND ASK AGAIN
  730.   . . .
  731.  
  732. CALCFIELDS   ROUTINE
  733.   IF FIELD() > ?FIRST_FIELD             !BEYOND FIRST_FIELD?
  734.     IF KEYCODE() = 0 AND SELECTED() > FIELD() THEN EXIT. !GET OUT IF NOT NONSTOP
  735.   .
  736.   SCR:MESSAGE = MEM:MESSAGE
  737.   R# = ROW(SCR:DATA3)                 !SAVE ROW OF MEMO
  738.   C# = COL(SCR:DATA3)                 !SAVE COL OF MEMO
  739.   SETHUE(FOREHUE(R#,C#),BACKHUE(R#,C#))         !RETRIEVE COLOR OF MEMO
  740.   LOOP I# = 1 TO 15                 !DISPLAY MEMO FIELD BY ROWS
  741.     SHOW(R#+I#-1,C#,FIL_MEMO_ROW[I#],@S76)     !SHOW NEXT ROW
  742.   .
  743.   SETHUE                     !TURN OFF COLOR
  744.   SCR:EROW = 0
  745.   SCR:ECOL = 0
  746.  
  747.