home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / xbase / library / clipper / window / clipwndw / cwindow.prg < prev   
Text File  |  1990-05-08  |  20KB  |  604 lines

  1. ***********************************************************************
  2. * These are a group of functions that I wrote for Clipper.  They
  3. * enable me to use a very SIMPLE windowing system to approach the
  4. * user. I am letting anyone use this, just mention me in your program.
  5. * I should warn you that the following code is pure Clipper and needs to
  6. * be extended. 
  7. *
  8. * Use, enhance and develop, then buy a good 'C' compiler and do
  9. * your databasing in that. spelled 'see code base 4'.
  10. * You can define GOOD.
  11. *
  12. *
  13. * If you need help or just have a question you can contact me at
  14. *
  15. * Robert Innes
  16. * (701) 293-8739            Home after 6
  17. * innes @ plains            internet address
  18. * rinnes @ extnet.plains.edu
  19. *
  20. *
  21. * If I am not there. 
  22. * Please note the date and remember people do move on. ENJOY !!
  23. ***************************************************************************
  24.  
  25.  
  26.  
  27. *:**********************************************************************:
  28. *:        Program: CWINDOW.PRG
  29. *:
  30. *:         System: Window Library for Clipper
  31. *:         Author: Robert Innes
  32. *:  Last modified: 06/08/89     10:12
  33. *:
  34. *:  Procs & Fncts: WCOLOR()        -       set the colors for a window
  35. *:               : MAKE_WINDOW()   -       build and show a window
  36. *:               : WTITLE()        -       title a window
  37. *:               : WSAYAT()        -       put a string, with clipping in a window
  38. *:               : WMENU()         -       display a windowed' achoice
  39. *:               : REMOVE_WINDOW() -       delete a window, restore if needed
  40. *:               : HOME_CURSOR     -       set the cursor to home
  41. *:               : WTRUNC_STR()    -       internal string truncation
  42. *:               : INRANGE()       -       see if coords are valid internal
  43. *:               : WGOTOXY         -       got to a point in a window
  44. *:               : WMESSAGE        -       pop up a message, various levels
  45. *:
  46. *:*********************************************************************
  47. *               Window Library For Clipper
  48. *
  49. *    DECLARE a Public STRING ARRAY
  50. *
  51. *    window[1] - Top of Window
  52. *    window[2] - Left of Window
  53. *    window[3] - Bottom of Window
  54. *    window[4] - Right of Window
  55. *    window[5] - ForeGround Color of Window
  56. *    window[6] - Background Color of Window
  57. *    window[7] - Title of Window
  58. *    window[8] - Does it Have a Shadow ?
  59. *    window[9] - Current Row of Cursor
  60. *    window[10]- Current Column of Cursor
  61. *    window[11]- Old Row of Cursor
  62. *    window[12]- Old Column of Cursor
  63. *    window[13]- Save contents under window ?
  64. *    window[14] - Window Save Buffer
  65. *
  66.  
  67.  
  68.  
  69. *
  70. *       Public Defines for window Routines
  71. *
  72. * YES, virginia, you need these.  
  73. *
  74.  
  75. PUBLIC shadow, noshadow, shadow_color, saveit, notsave, choic
  76. shadow =  1
  77. noshadow = 0
  78. shadow_color = '+/W'
  79. saveit = 1                                       
  80. notsave = 0
  81.  
  82. *
  83. * Currently all windows have double borders 'cause I was to lazy
  84. * to do any others.
  85. *
  86.  
  87. DOUBLE = CHR(201) + CHR(205) + CHR(187) + CHR(186) + CHR(188) + CHR(205) +;
  88. CHR(200) + CHR(186) + CHR(32)
  89.  
  90. ******************************************************
  91. * The following code is the test procedure. This can
  92. * be taken out when you get the hang of it.
  93. *
  94. * or use the preprocessor you have when you bought
  95. * that GOOD 'C' compiler. ;-)
  96. ******************************************************
  97.  
  98.  
  99.  
  100. PUBLIC win1[14], menu1[20], menuv[20]            && DEFINE PUBLIC VARIABLES
  101.  
  102. menu1[1] = 'Number 1'                            && wpop menu
  103. menu1[2] = 'Number 2'                            && wpop menu
  104. menu1[3] = 'Number 3'                            && wpop menu
  105. menu1[4] = 'Number 4'                            && wpop menu
  106. menu1[5] = 'Number 5'                            && wpop menu
  107. menu1[6] = 'Number 6'                            && wpop menu
  108. menu1[7] = 'Number 7'                            && wpop menu
  109. menu1[8] = 'Number 8'                            && wpop menu
  110. menu1[9] = 'Number 9'                            && wpop menu
  111. menu1[10] = 'Number 10'                          && wpop menu
  112. menu1[11] = 'Number 11'                          && wpop menu
  113. menu1[12] = 'Number 12'                          && wpop menu
  114. menu1[13] = 'Number 13'                          && wpop menu
  115. menu1[14] = 'Number 14'                          && wpop menu
  116. menu1[15] = 'Number 15'                          && wpop menu
  117. menu1[16] = 'Number 16'                          && wpop menu
  118. menu1[17] = 'Number 17'                          && wpop menu
  119. menu1[18] = 'Number 18'                          && wpop menu
  120. menu1[19] = 'Number 19'                          && wpop menu
  121. menu1[20] = 'Number 20'                          && wpop menu
  122.  
  123. *
  124. *  If an option is set to false then it is displayed but not 
  125. *  selectable. See achoice in the clipper manual.
  126. *
  127.  
  128. menuv[1] = .T.                                   && wpop menu
  129. menuv[2] = .T.                                   && wpop menu
  130. menuv[3] = .T.                                   && wpop menu
  131. menuv[4] = .T.                                   && wpop menu
  132. menuv[5] = .F.                                   && wpop menu
  133. menuv[6] = .T.                                   && wpop menu
  134. menuv[7] = .F.                                   && wpop menu
  135. menuv[8] = .T.                                   && wpop menu
  136. menuv[9] = .T.                                   && wpop menu
  137. menuv[10] = .T.                                  && wpop menu
  138. menuv[11] = .T.                                  && wpop menu
  139. menuv[12] = .T.                                  && wpop menu
  140. menuv[13] = .T.                                  && wpop menu
  141. menuv[14] = .T.                                  && wpop menu
  142. menuv[15] = .T.                                  && wpop menu
  143. menuv[16] = .T.                                  && wpop menu
  144. menuv[17] = .T.                                  && wpop menu
  145. menuv[18] = .T.                                  && wpop menu
  146. menuv[19] = .T.                                  && wpop menu
  147. menuv[20] = .T.                                  && wpop menu
  148.  
  149. win1[1] = STR(5)
  150. win1[2] = STR(5)
  151. win1[3] = STR(20)
  152. win1[4] = STR(40)
  153. win1[8] = STR(shadow)
  154. win1[13]= STR(saveit)
  155. wcolor( win1, 'BG', ' ')
  156. win1[14] = make_window( win1 )
  157. wtitle(win1, 'This is window Number 1')
  158. wsayat( win1, 5, 5, 'A String')
  159. wsayat( win1, 6, 5, 'A Very Very Long String That Should Not Print Far' )
  160.  
  161. wmessage(10, 10, 'Just a Note', 1)
  162. wmessage(10, 10, 'Just a Warning, Improper Input', 2)
  163. wmessage(10, 10, 'Error has Occured', 3)
  164. wmessage(10, 10, 'Everything is OK', 9)
  165.  
  166. choic = wpop_menu( 5, 5, 'Choices', 20, menu1, menuv )
  167. wsayat( win1, 7, 5, 'Choice = ' + LTRIM(STR(choic) ) )
  168. INKEY(0)
  169. remove_window( win1 )
  170.  
  171. RETURN                                           && return to calling program
  172.  
  173. *!*********************************************************************
  174. *!
  175. *!       Function: MAKE_WINDOW()
  176. *!
  177. *!      Called by: CWINDOW.PRG
  178. *!               : WMENU()        (function  in CWINDOW.PRG)
  179. *!               : WMESSAGE       (procedure in CWINDOW.PRG)
  180. *!
  181. *!          Calls: HOME_CURSOR    (procedure in CWINDOW.PRG)
  182. *!
  183. *!*********************************************************************
  184. FUNCTION make_window
  185.    PARAMETERS WINDOW
  186.  
  187.    PRIVATE wtop, wright, wbot, wleft, Buffer, shadow_bot, shadow_right, old_color  && DEFINE PRIVATE VARIABLES
  188.    PRIVATE wcolor                                && DEFINE PRIVATE VARIABLES
  189.    PRIVATE TOP, RIGHT, bot, LEFT                 && DEFINE PRIVATE VARIABLES
  190.  
  191.    *
  192.    *       Convert window values to integer
  193.    *
  194.    TOP = VAL(WINDOW[1])
  195.    LEFT = VAL(WINDOW[2])
  196.    bot = VAL(WINDOW[3])
  197.    RIGHT = VAL(WINDOW[4])
  198.  
  199.  
  200.    *
  201.    *       Set up actual window;  inside minus border
  202.    *
  203.    wtop = VAL(WINDOW[1]) + 1
  204.    wleft = VAL(WINDOW[2]) + 1
  205.    wbot = VAL(WINDOW[3]) - 1
  206.    wright = VAL(WINDOW[4]) - 1
  207.  
  208.    *
  209.    *       Save the Window underneath
  210.    *
  211.    IF VAL(WINDOW[13]) == saveit
  212.       IF VAL(WINDOW[8]) == noshadow
  213.          Buffer = Savescreen( TOP, LEFT, bot, RIGHT )
  214.       ELSE                                       && otherwise...
  215.          Buffer = Savescreen( TOP, LEFT, bot+1, RIGHT+2 )
  216.       ENDIF
  217.    ELSE                                          && otherwise...
  218.       Buffer = ""
  219.    ENDIF
  220.  
  221.    *
  222.    *       Make the window
  223.    *
  224.    @ TOP, LEFT, bot, RIGHT BOX DOUBLE
  225.  
  226.    IF VAL(WINDOW[8]) == shadow
  227.       cnt = TOP + 2
  228.       old_color = Setcolor()
  229.       Setcolor(shadow_color)
  230.       @ bot + 1, LEFT + 3  SAY SPACE( (RIGHT - (LEFT + 1)) )
  231.       DO WHILE cnt <= bot + 1
  232.          @ cnt, RIGHT + 1  SAY SPACE( 2 )
  233.          cnt = cnt + 1
  234.       END while
  235.       Setcolor(old_color)
  236.    ENDIF
  237.    wcolor = WINDOW[5] + '/' + WINDOW[6]
  238.    Setcolor(wcolor)
  239.    WINDOW[11] = STR( ROW() )
  240.    WINDOW[12] = STR( COL() )
  241.    home_cursor( WINDOW )
  242. RETURN Buffer                                    && RETURN TO CALLING PROGRAM
  243.  
  244. *!*********************************************************************
  245. *!
  246. *!       Function: REMOVE_WINDOW()
  247. *!
  248. *!      Called by: CWINDOW.PRG
  249. *!               : WMENU()        (function  in CWINDOW.PRG)
  250. *!               : WMESSAGE       (procedure in CWINDOW.PRG)
  251. *!
  252. *!*********************************************************************
  253. PROCEDURE remove_window
  254.    PARAMETER WINDOW
  255.    PRIVATE TOP, RIGHT, bot, LEFT, crow, ccol     && DEFINE PRIVATE VARIABLES
  256.  
  257.    IF VAL( WINDOW[13] ) == saveit
  258.  
  259.       *
  260.       *       Convert window values to integer
  261.       *
  262.       TOP = VAL(WINDOW[1])
  263.       LEFT = VAL(WINDOW[2])
  264.       bot = VAL(WINDOW[3])
  265.       RIGHT = VAL(WINDOW[4])
  266.  
  267.       *
  268.       *       Restore the area under the window
  269.       *
  270.       IF VAL( WINDOW[8] ) == noshadow
  271.          Restscreen( TOP, LEFT, bot, RIGHT, WINDOW[14] )
  272.       ELSE                                       && otherwise...
  273.          Restscreen( TOP, LEFT, bot+1, RIGHT+2, WINDOW[14] )
  274.       ENDIF
  275.    ENDIF
  276.  
  277.    *
  278.    *       Reposition the cursor
  279.    *
  280.    crow = VAL( WINDOW[11] )
  281.    ccol = VAL( WINDOW[12] )
  282.    @ crow, ccol SAY ""
  283.  
  284. RETURN                                           && return to calling program
  285.  
  286. *!*********************************************************************
  287. *!
  288. *!       Function: WTITLE()
  289. *!
  290. *!      Called by: CWINDOW.PRG
  291. *!               : WMENU()        (function  in CWINDOW.PRG)
  292. *!               : WMESSAGE       (procedure in CWINDOW.PRG)
  293. *!
  294. *!          Calls: HOME_CURSOR    (procedure in CWINDOW.PRG)
  295. *!
  296. *!*********************************************************************
  297. PROCEDURE wtitle
  298.    PARAMETER WINDOW, TITLE
  299.    PRIVATE TOP, RIGHT, bot, LEFT                 && DEFINE PRIVATE VARIABLES
  300.  
  301.    *
  302.    *       Convert window values to integer
  303.    *
  304.    TOP = VAL(WINDOW[1])
  305.    LEFT = VAL(WINDOW[2])
  306.    bot = VAL(WINDOW[3])
  307.    RIGHT = VAL(WINDOW[4])
  308.    WINDOW[7] = '[' + TITLE + ']'
  309.  
  310.    *
  311.    *       Title the window in the upper left corner
  312.    *
  313.    @ TOP, LEFT + 1  SAY WINDOW[7]
  314.    home_cursor( WINDOW )
  315. RETURN                                           && return to calling program
  316.  
  317. *!*********************************************************************
  318. *!
  319. *!      Procedure: HOME_CURSOR
  320. *!
  321. *!      Called by: MAKE_WINDOW()  (function  in CWINDOW.PRG)
  322. *!               : WTITLE()       (function  in CWINDOW.PRG)
  323. *!
  324. *!*********************************************************************
  325. PROCEDURE home_cursor
  326.    PARAMETER WINDOW
  327.    PRIVATE wtop, wleft                           && DEFINE PRIVATE VARIABLES
  328.  
  329.    wtop = VAL(WINDOW[1]) + 1
  330.    wleft = VAL(WINDOW[2]) + 1
  331.    WINDOW[9] = STR(wtop)
  332.    WINDOW[10] = STR(wleft)
  333.    @ wtop, wleft SAY ""
  334. RETURN                                           && return to calling program
  335.  
  336. *!*********************************************************************
  337. *!
  338. *!       Function: WTRUNC_STR()
  339. *!
  340. *!      Called by: WSAYAT()       (function  in CWINDOW.PRG)
  341. *!
  342. *!*********************************************************************
  343. FUNCTION wtrunc_str
  344.    PARAMETERS WINDOW, string, X
  345.    PRIVATE substring, wleft                      && DEFINE PRIVATE VARIABLES
  346.  
  347.    wright = VAL(WINDOW[4]) + 1
  348.  
  349.    IF (X + LEN(string)) > wright
  350.       substring = LEFT( string, wright - X )
  351.       string = substring
  352.    ENDIF
  353.  
  354. RETURN string                                    && RETURN TO CALLING PROGRAM
  355.  
  356.  
  357. *!*********************************************************************
  358. *!
  359. *!       Function: INRANGE()
  360. *!
  361. *!      Called by: WSAYAT()       (function  in CWINDOW.PRG)
  362. *!               : WGOTOXY        (procedure in CWINDOW.PRG)
  363. *!
  364. *!*********************************************************************
  365. FUNCTION inrange
  366.    PARAMETERS WINDOW, X, y
  367.  
  368.    IF X > VAL(WINDOW[1]) .AND. X < VAL(WINDOW[3])
  369.       IF  y > VAL(WINDOW[2]) .AND. y < VAL(WINDOW[4])
  370.       RETURN .T.                                 && RETURN TO CALLING PROGRAM
  371.    ELSE                                          && otherwise...
  372.       RETURN .F.                                 && RETURN TO CALLING PROGRAM
  373.    ENDIF
  374. ENDIF
  375.  
  376. RETURN .F.                                       && RETURN TO CALLING PROGRAM
  377.  
  378.  
  379. *!*********************************************************************
  380. *!
  381. *!      Procedure: WGOTOXY
  382. *!
  383. *!          Calls: INRANGE()      (function  in CWINDOW.PRG)
  384. *!
  385. *!*********************************************************************
  386. PROCEDURE wgotoxy
  387.    PARAMETERS WINDOW, X, y
  388.    PRIVATE wtop, wleft                           && DEFINE PRIVATE VARIABLES
  389.  
  390.    wtop = VAL(WINDOW[1]) + 1
  391.    wleft = VAL(WINDOW[2]) + 1
  392.  
  393.    X = wtop + X
  394.    y = wleft + X
  395.  
  396.    IF inrange( WINDOW, X, y )
  397.       WINDOW[9] = STR(X)
  398.       WINDOW[10] = STR(y)
  399.       @ X, y SAY ""
  400.    ENDIF
  401.  
  402. RETURN                                           && return to calling program
  403.  
  404. *!*********************************************************************
  405. *!
  406. *!       Function: WSAYAT()
  407. *!
  408. *!      Called by: CWINDOW.PRG
  409. *!               : WMESSAGE       (procedure in CWINDOW.PRG)
  410. *!
  411. *!          Calls: INRANGE()      (function  in CWINDOW.PRG)
  412. *!               : WTRUNC_STR()   (function  in CWINDOW.PRG)
  413. *!
  414. *!*********************************************************************
  415. PROCEDURE wsayat
  416.    PARAMETERS WINDOW, X, y, string
  417.    PRIVATE wtop, wleft, substring                && DEFINE PRIVATE VARIABLES
  418.  
  419.    wtop = VAL(WINDOW[1]) + 1
  420.    wleft = VAL(WINDOW[2]) + 1
  421.  
  422.    X = wtop + X
  423.    y = wleft + y
  424.  
  425.    IF inrange( WINDOW, X, y )
  426.       WINDOW[9] = STR(X)
  427.       WINDOW[10] = STR(y)
  428.       substring = wtrunc_str( WINDOW, string, X)
  429.       @ X, y SAY substring
  430.    ENDIF
  431.  
  432. RETURN                                           && return to calling program
  433.  
  434.  
  435. *!*********************************************************************
  436. *!
  437. *!       Function: WCOLOR()
  438. *!
  439. *!      Called by: CWINDOW.PRG
  440. *!               : WMENU()        (function  in CWINDOW.PRG)
  441. *!               : WMESSAGE       (procedure in CWINDOW.PRG)
  442. *!
  443. *!*********************************************************************
  444. PROCEDURE wcolor
  445.    PARAMETERS WINDOW, fcolor, bcolor
  446.    PRIVATE COLOR                                 && DEFINE PRIVATE VARIABLES
  447.  
  448.    WINDOW[5] = fcolor
  449.    WINDOW[6] = bcolor
  450.    COLOR = fcolor + '/' + bcolor
  451.  
  452.    Setcolor(COLOR)
  453.  
  454. RETURN                                           && return to calling program
  455.  
  456.  
  457. ***********************************************
  458. * Wow, an undocumenetd function. 8-) (* GRIN *)
  459. *
  460. ***********************************************
  461.  
  462.  
  463.  
  464. Procedure hline
  465.    Parameters  x, y, val, len, fcolor, bcolor
  466.  
  467.    Private color, width, str                     && DEFINE PRIVATE VARIABLES
  468.  
  469.    color = setcolor()
  470.    width = len - x
  471.    str = REPLICATE( val, width)
  472.  
  473.    setcolor(fcolor, bcolor)
  474.    @ x, y SAY str
  475.  
  476.    setcolor(color)
  477.  
  478. RETURN                                           && return to calling program
  479.  
  480.  
  481. *!*********************************************************************
  482. *!
  483. *!      Procedure: WMESSAGE
  484. *!
  485. *!          Calls: WCOLOR()       (function  in CWINDOW.PRG)
  486. *!               : MAKE_WINDOW()  (function  in CWINDOW.PRG)
  487. *!               : WTITLE()       (function  in CWINDOW.PRG)
  488. *!               : WSAYAT()       (function  in CWINDOW.PRG)
  489. *!               : REMOVE_WINDOW()(function  in CWINDOW.PRG)
  490. *!
  491. *!*********************************************************************
  492. PROCEDURE wmessage
  493.    PARAMETERS X, y, MESSAGE, level
  494.    PRIVATE wtop, wleft, wbot, wright, mwindow[14], wait_msg  && DEFINE PRIVATE VARIABLES
  495.  
  496.    wait_msg = "Press any Key ..."                && wait for one character
  497.    mwindow[1] = STR(X)
  498.    mwindow[2] = STR(y)
  499.    mwindow[3] = STR(X + 2)
  500.  
  501.    IF LEN( MESSAGE ) >  (79 - y)
  502.       MESSAGE = LEFT( MESSAGE, 3 )
  503.    ENDIF
  504.  
  505.    IF LEN( MESSAGE )  > LEN( wait_msg )
  506.       mwindow[4] = STR( X + LEN(MESSAGE) + 3)
  507.    ELSE                                          && otherwise...
  508.       mwindow[4] = STR( X + LEN( wait_msg) + 3)
  509.    ENDIF
  510.    mwindow[8] = STR(noshadow)
  511.    mwindow[13]= STR(saveit)
  512.  
  513.    DO CASE
  514.  
  515.       CASE level = 1                             && Informational Message
  516.          wcolor(mwindow,'N','G')
  517.          mwindow[14] = make_window( mwindow )
  518.          wtitle( mwindow, wait_msg)
  519.          wsayat(mwindow, 0, 0, MESSAGE)
  520.          INKEY(0)
  521.          remove_window( mwindow )
  522.  
  523.       CASE level = 2                             && Warning Message
  524.          wcolor(mwindow,'N','GR+')
  525.          mwindow[14] = make_window( mwindow )
  526.          wtitle( mwindow, wait_msg)
  527.          wsayat(mwindow, 0, 0, MESSAGE)
  528.          INKEY(0)
  529.          remove_window( mwindow )
  530.  
  531.       CASE level = 3                             && Error Message
  532.          wcolor(mwindow,'N','R')
  533.          mwindow[14] = make_window( mwindow )
  534.          wtitle( mwindow, wait_msg)
  535.          wsayat(mwindow, 0, 0, MESSAGE)
  536.          INKEY(0)
  537.          remove_window( mwindow )
  538.  
  539.       OTHERWISE                                  && Anything Else
  540.          wcolor(mwindow,'N','I')
  541.          mwindow[14] = make_window( mwindow )
  542.          wtitle( mwindow, wait_msg)
  543.          wsayat(mwindow, 0, 0, MESSAGE)
  544.          INKEY(0)
  545.          remove_window( mwindow )
  546.  
  547.    ENDCASE
  548.  
  549. RETURN                                           && return to calling program
  550.  
  551. *!*********************************************************************
  552. *!
  553. *!       Function: WMENU()
  554. *!
  555. *!      Called by: CWINDOW.PRG
  556. *!
  557. *!          Calls: WCOLOR()       (function  in CWINDOW.PRG)
  558. *!               : MAKE_WINDOW()  (function  in CWINDOW.PRG)
  559. *!               : WTITLE()       (function  in CWINDOW.PRG)
  560. *!               : REMOVE_WINDOW()(function  in CWINDOW.PRG)
  561. *!
  562. *!*********************************************************************
  563. FUNCTION wpop_menu
  564.    PARAMETERS X, y, TITLE, num_choice, choices, choice_selectable
  565.    PRIVATE wtop, wleft, wbot, wright, cwindow[14], cnt, LEN, curlen, VAL, oldcolor  && DEFINE PRIVATE VARIABLES
  566.  
  567.  
  568.    cnt = 1
  569.    LEN = 1
  570.    DO WHILE cnt <= num_choice
  571.       curlen = LEN( choices[cnt])
  572.       LEN = IIF( curlen > LEN, curlen, LEN )
  573.       cnt = cnt + 1
  574.    ENDDO                                         && loop back again
  575.  
  576.    cwindow[1] = STR(X)
  577.    cwindow[2] = STR(y)
  578.    cwindow[3] = STR( IIF( X + num_choice + 2 > 24, 24, X + num_choice + 1) )
  579.    cwindow[4] = STR( IIF( y + LEN + 2 > 79, 79, y + LEN + 1 ) )
  580.    cwindow[8] = STR(noshadow)
  581.    cwindow[13]= STR(saveit)
  582.  
  583.    oldcolor = Setcolor()
  584.    wcolor( cwindow, 'N', 'BG')
  585.    cwindow[14] = make_window( cwindow )
  586.    wtitle( cwindow, TITLE)
  587.  
  588.    wtop = VAL(cwindow[1]) + 1
  589.    wleft = VAL(cwindow[2]) + 1
  590.    wbot = VAL(cwindow[3]) - 1
  591.    wright = VAL(cwindow[4]) - 1
  592.  
  593.    VAL = Achoice(wtop, wleft, wbot, wright, choices, choice_selectable)
  594.    remove_window( cwindow )
  595.    Setcolor(oldcolor)
  596.  
  597. RETURN VAL                                       && RETURN TO CALLING PROGRAM
  598.  
  599. *: EOF: CWINDOW.PRG
  600.