home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / FOXPRO / VLIST110 / VLIST1.DOC < prev    next >
Text File  |  1992-09-25  |  24KB  |  619 lines

  1.           VList Library V1.1 -- (c) 1992, Jayson R. Minard
  2.                                           P.O. Box 1306
  3.                                           Westminster, CO 80030-1306 (USA)
  4. ===============================================================================
  5. INTRODUCTION
  6. -------------------------------------------------------------------------------
  7.  
  8. Welcome to the VList "Virtual List" library for FORCE.  This library has
  9. grown from a simple PICK_LIST replacement to a full-scale dynamic string
  10. management system.  There are now over 80 functions in the library.  If
  11. you do not find documentation for a function in these files then print out
  12. the header file (VLIST.HDR and VMOUSE.HDR) and some of the functions
  13. have documentation within those files.  These are ones that I have not
  14. yet had time to add to the .DOC files.
  15.  
  16. The library is divided into two parts, core functions and meta-functions.
  17. Core functions make up the list management system to control list creation,
  18. additions, deletion, insertion, and editting.  The meta-functions use groups of
  19. core library functions to form larger functions such as menus and pick-list
  20. routines.  The core functions are mostly Assembler and the meta-functions are
  21. written in FORCE.  This allows easy changes to the more logically complex
  22. meta-functions.
  23.  
  24. The core functions consist of the following:
  25.  
  26. VList_Add()
  27. VList_Append()
  28. VList_Bol()
  29. VList_Bottom()
  30. VList_CCopy()
  31. VList_CDelete()
  32. VList_CEdit()
  33. VList_CGet_Color()
  34. VList_CGet_Status()
  35. VList_CInsert()
  36. VList_Clear()
  37. VList_Copy()
  38. VList_CReplace()
  39. VList_CSet_Color()
  40. VList_CSet_Status()
  41. VList_CStr()
  42. VList_Delete()
  43. VList_Edit()
  44. VList_Empty()
  45. VList_Get_Color()
  46. VList_Get_Status()
  47. VList_Get_StrLen()
  48. VList_Goto()
  49. VList_Init()
  50. VList_Insert()
  51. VList_Is_Init()
  52. VList_Max()
  53. VList_Number()
  54. VList_Replace()
  55. VList_Set_Color()
  56. VList_Set_Status()
  57. VList_Skip()
  58. VList_Str()
  59. VList_Tol()
  60. VList_Top()
  61. VMouse_Col()
  62. VMouse_Cursor()
  63. VMouse_Get_Position()
  64. VMouse_Init()
  65. VMouse_Left_Button()
  66. VMouse_Save()
  67. VMouse_Set_RowCol()
  68. VMouse_Reset()
  69. VMouse_Restore()
  70. VMouse_Right_Button()
  71. VMouse_Row()
  72.  
  73.  
  74. The meta-functions consist of:
  75.  
  76. VList_1_FPick()
  77. VList_Copy()
  78. VList_Count_Elements()
  79. VList_Default_Key_Handler()
  80. VList_Default_Menu_Handler()
  81. VList_Default_Prompt_Handler()
  82. VList_Embed_Caps()
  83. VList_Find_First_Good()
  84. VList_Find_Last_Good()
  85. VList_Fix_Path()
  86. VList_FPick()
  87. VList_Free_Screen()
  88. VList_FullView()
  89. VList_Get_Last_Good()
  90. VList_Get_Next_Good()
  91. VList_Locate()
  92. VList_Locate_SubStr()
  93. VList_Pick()
  94. VList_PopUp()
  95. VList_Prompt()
  96. VList_PullDown()
  97. VList_Restore()
  98. VList_Restore_Append()
  99. VList_Save()
  100. VList_Save_Append()
  101. VList_Say()
  102. VList_Short_Path()
  103. VList_Simple()
  104. VList_Skip_Last()
  105. VList_Skip_Next()
  106. VList_SmallView()
  107. VList_Sort()
  108. VList_Sort_SubStr()
  109. VList_What_Color()
  110.  
  111. -------------------------------------------------------------------------------
  112. Methods for using Core Functions
  113. -------------------------------------------------------------------------------
  114.  
  115. The core functions in the VList library can be used to access a VList
  116. either by an index (like an array) or like a database, skipping forward and
  117. backward.  To say, 'goto element 100', the VLIST_GOTO() function will determine
  118. which is the best path to follow to get to the element:  start at front, start
  119. at current, or start at end.  Therefore it does an internal skipping from
  120. element to element, but quickly in Assembler.
  121.  
  122. The first thing you must do when wanting to use a VList is to initialize
  123. the list.  The VLIST_INIT() command accomplishes this by returning a pointer to
  124. the list structure and accepting 1 parameter which is the number of characters
  125. each element will consist of.  Each element will be the same width.  A return
  126. value of 0 represents a failure to allocate enough memory for the list header.
  127.  
  128. ex.
  129.  
  130.      VARDEF
  131.        LONG   handle
  132.      ENDDEF
  133.  
  134.      handle = VList_Init( 40 )
  135.      IF handle = 0
  136.        ? "Error initializing list"
  137.        QUIT
  138.      ENDIF
  139.  
  140. The list is now ready to be accessed.  The list can also be checked to see if
  141. it is allocated using the VLIST_IS_INIT() function which returns a logical .T.
  142. if the list has a valid structure in memory.  If the list is empty, you can use
  143. the VLIST_EMPTY() function to determine so.
  144.  
  145. ex.
  146.  
  147.     handle = VList_Init( 40 )
  148.     IF .NOT. VList_Is_Init( handle )
  149.       ? "Error initializing list"
  150.       QUIT
  151.     ENDIF
  152.  
  153.     Call_Some_Weird_Proc( handle )
  154.     IF VList_Empty( handle )
  155.       ? "List is still empty!"
  156.     ENDIF
  157.  
  158. The VLIST_EMPTY() is basically the same as asking if there are 0 elements in
  159. the list or...
  160.  
  161.     IF VList_Max( handle ) = 0
  162.       ? "List is still empty!"
  163.     ENDIF
  164.  
  165. These are the basic initialization functions to get a list going.  A list can
  166. be completely removed from memory by using VLIST_CLEAR() which free's each
  167. element and clears the header from memory.
  168.  
  169.     VList_Clear( handle )
  170.  
  171. Now that we have a list to work with, we can start adding elements.  This is
  172. similar to a APPEND in xBASE dialect except you provide the information that is
  173. contained in the element instead of just getting a blank 'record'.  An element
  174. contains three pieces of information, the element status, the color, and the
  175. string contents.  VLIST_ADD() asks only for the handle of the list to add an
  176. element to, and the string contents.  The status and color are set to default
  177. values (&jl_normal and &jl_default respectively) which are explained later.  A
  178. logical value is returned which signifies if the addition was successful.  A
  179. .F. will be returned when there is no more memory available.
  180.  
  181.    temp_str = "New Dude"
  182.    IF .NOT. VList_Add( handle, temp_str )
  183.      ? "Memory problem!"
  184.      VList_Clear( handle )
  185.      RETURN
  186.    ENDIF
  187.  
  188. NOTE that I cleared the list so that the program can continue with all
  189. available memory that the list previously held.  In this example that was the
  190. case, in others you may wish to keep the list and continue with a limited list.
  191.  
  192. VLIST_APPEND() asks for all of the three items an element can contain.
  193.  
  194.    IF .NOT. VList_Add( handle, &jl_normal, &jl_default, temp_str )
  195.      {...}
  196.    ENDIF
  197.  
  198. The first parameter is the list handle, which will be the case for most of the
  199. VList core functions.  The second is the item status.  This is used by menus
  200. and pick-list routines to decide if an element is 'normal', 'skipped', 'hit',
  201. or 'hidden'.  They are explained as follows:
  202.  
  203.    NORMAL:    the element is displayed in __color_std and can be selected.
  204.               This is represented by the macro &JL_NORMAL.
  205.  
  206.    SKIPPED:   the element is displayed in __color_skip but the cursor will
  207.               jump the element and cannot select it. (&JL_SKIP)
  208.  
  209.    HIT:       the element is displayed in __color_hit and the cursor can move
  210.               onto the element but cannot be selected. (&JL_HIT)
  211.  
  212.    HIDDEN:    the element is NOT displayed and therefore not selectable.
  213.               (&JL_HIDDEN)
  214.  
  215. The third parameter is the item color.  If a specific color is noted then that
  216. will be the color the item is displayed in rather than the normal global
  217. variable (ie. __color_std, __color_hit...).  If the macro &JL_DEFAULT is
  218. specified then the normal default variable is used for that item's status.
  219.  
  220. When an item is added, the internal list pointer for that list is moved to the
  221. item therefore any 'current' access functions will correspond to this element.
  222.  
  223. With items in the list, you can now call some of the meta-functions
  224. described later.  But first, we will cover accessing and changing the items.
  225. To alter a specific item, you can do one of two things, either 'GOTO' the item
  226. and then do a 'current' access, or do a remote access by specifying the item
  227. index (like an array).  If you do a current access, the internal pointer will
  228. remain on the record.  For a remote access, the pointer is moved to the correct
  229. element, the access made, and then the pointer is moved back to the original
  230. element.
  231.  
  232. To change all of the item's parameters at one time you can use VLIST_REPLACE()
  233. for a remote access or VLIST_CREPLACE() for a current access.  NOTE that
  234. the C is prepended to the word replace;  this will be the same for all of the
  235. access functions.
  236.  
  237. Ex.
  238.      *- current access
  239.      VList_Goto( handle, 20 )
  240.      VList_CReplace( handle, &jl_skip, &jl_default, "Editted Value" )
  241.  
  242.      *- remote access
  243.      VList_Replace( handle, 20, &jl_skip, &jl_default, "Editted Value" )
  244.  
  245. Both of the previous examples have the same functionality.  The first will
  246. stay on the editted element while the second will return to the element it
  247. was on before the VList_Replace call was made.
  248.  
  249. You can also just edit individual element parameters using the other functions.
  250. VLIST_EDIT() and VLIST_CEDIT() will alter the string contents.
  251.  
  252. Ex.
  253.      *- current access
  254.      VList_Goto( handle, 20 )
  255.      VList_CEdit( handle, "Editted Value" )
  256.  
  257.      *- remote access
  258.      VList_Edit( handle, 20, "Editted Value" )
  259.  
  260. You can change the color with VLIST_SET_COLOR() or VLIST_CSET_COLOR() and set
  261. the status with VLIST_SET_STATUS() or VLIST_CSET_STATUS().
  262.  
  263. To do the opposite and get the current values within an element, you will use
  264. individual functions for each parameter.  VLIST_CSTR() and VLIST_STR() will
  265. return the string contents of the element.
  266.  
  267. Ex.
  268.  
  269.     *- current access
  270.     VList_Goto( handle, 20 )
  271.     temp_str = VList_CStr( handle )
  272.  
  273.     *- remote access
  274.     temp_str = VList_Str( handle, 20 )
  275.  
  276. For colors and status use VLIST_GET_COLOR(), VLIST_CGET_COLOR(),
  277. VLIST_GET_STATUS(), and VLIST_CGET_STATUS().
  278.  
  279. To find the maximum width of elements in a list, you can use the
  280. VLIST_GET_STRLEN() function.
  281.  
  282. Once you have a list, you need to know how to move around within the list.
  283. The VList_Goto() function has already been used and is pretty simple to see.
  284. The following text will print all of the items in a list using the VLIST_MAX()
  285. function to determine the number of items in a list.
  286.  
  287.    FOR loop_var = 1 TO VList_Max( handle )
  288.      VList_Goto( handle, loop_var )
  289.      ? VList_CStr( handle )
  290.    NEXT
  291.  
  292. This would be decently quick since the VLIST_GOTO() function is smart and will
  293. always start at the current element to find the next instead of going all the
  294. way to the start of the list to find an element in the middle.  DO NOT do the
  295. following since the internal pointer would go from the current, to the selected,
  296. back to the current, then to the next selected and so on.
  297.  
  298.    FOR loop_var = 1 TO VList_Max( handle )
  299.      ? VList_Str( handle, loop_var )
  300.    NEXT
  301.  
  302. You can also access the list like it was a database using the VLIST_TOP()
  303. function to go to the top element (#1) and the VLIST_BOTTOM() to go to the
  304. last element.  To determine if you are at the top, you can use VLIST_TOL()
  305. which asks 'are we at the Top Of List?' and VLIST_BOL() for the bottom.
  306. The VLIST_SKIP() function will move the 'current' pointer from one element
  307. to another.
  308.  
  309.    *- forward:
  310.    VList_Top( handle )
  311.    DO WHILE .NOT. VList_Bol( handle )
  312.      ? VList_CStr( handle )
  313.      VList_Skip( handle, &JL_FORWARD )
  314.    ENDDO
  315.  
  316.    *- backward
  317.    VList_Bottom( handle )
  318.    DO WHILE .NOT. VList_Tol( handle )
  319.      ? VList_CStr( handle )
  320.      VList_Skip( handle, &JL_BACKWARD )
  321.    ENDDO
  322.  
  323. Notice the use of the macros &JL_FORWARD and &JL_BACKWARD to determine which
  324. direction SKIP will move.  If you want to know what the current element pointer
  325. is, then try VLIST_NUMBER().
  326.  
  327.    VList_Bottom( handle )
  328.    DO WHILE .NOT. VList_Tol( handle )
  329.      ? VList_Number( handle )
  330.      VList_Skip( handle, &JL_BACKWARD )
  331.    ENDDO
  332.  
  333. This should count backwards printing the element number.
  334.  
  335. You can also Insert and Delete elements either using the current position
  336. or going to a 'remote' position.  Inserting will create a new element, like
  337. VLIST_APPEND() you must specify all 3 items, and move the current pointer to
  338. that position when using VLIST_CINSERT().  VLIST_INSERT() will return the
  339. current pointer to the element that you inserted the new one before.
  340.  
  341. ex.
  342.  
  343.    *- this example doesn't do error checking which is bad!!!
  344.    handle = VList_Init( 50 )
  345.    VList_Add( handle, "element 1" )
  346.    VList_Add( handle, "element 3" )
  347.  
  348.    *- now to add element 2, we could either:
  349.    VList_Insert( handle, 2, &jl_normal, &jl_default, "element 2" )
  350.    *- which means insert BEFORE element 2 this new guy, OR we could:
  351.    VList_Goto( handle, 2 )
  352.    VList_CInsert( handle, &jl_normal, &jl_default, "element 2" )
  353.    *- if we wanted to stay on the new element.
  354.  
  355. The opposite of insert is delete.  VLIST_CDELETE will delete the current
  356. element and move the current pointer to the element that was following it
  357. unless it WAS the last element, then it moves 1 backward.  Therefore the
  358. element number will be the same in the first case, 1 less in the second.
  359. VLIST_DELETE() will delete the SPECIFIED element and return to the current
  360. unless it was the one deleted...
  361.  
  362. The LAST core function that does not deal with the mouse is VLIST_COPY() and
  363. VLIST_CCOPY() which can be used to make a copy of an items elements from
  364. one to another.
  365.  
  366.  
  367. -------------------------------------------------------------------------------
  368.                           MOUSE Core Functions
  369. -------------------------------------------------------------------------------
  370.  
  371. Some of the meta-functions use the mouse functions to provide mouse support.
  372. You will need to initialize the mouse in order for these to use it.  Some of
  373. the meta-functions also ask for a parameter which specifies whether or not
  374. to use the mouse.  A good way to deal with this is to do the following...
  375.  
  376.    *- VMouse_Init returns the number of buttons on the mouse, else 0 for no
  377.    *  mouse.
  378.  
  379.    IF VMouse_Init() <> 0
  380.      is_mouse = .T.
  381.      VMouse_Reset()
  382.      *- clean up the mouse drivert
  383.    ELSE
  384.      is_mouse = .F.
  385.    ENDIF
  386.  
  387.    VList_Pick( handle, {...}, is_mouse, is_mouse, {...} )
  388.  
  389.    IF is_mouse
  390.      VMouse_Reset()
  391.      VMouse_Cursor( .F. )
  392.    ENDIF
  393.  
  394.    QUIT
  395.  
  396. This example basically starts the mouse up if there is one present, then passes
  397. the 'is_mouse' logical value to the VLIST_PICK() routine in the parameter spot
  398. for 'provide-mouse-support' and 'show-scroll-bar'.  The second use of 'is_mouse'
  399. is there since some people do not want a scroll bar if no mouse is present.
  400. Therefore the 'is_mouse' variable provides the answer.  At the end of the
  401. program, the mouse driver is reset and the cursor is ensured to be off.  The
  402. reset is done to make sure that the driver is in the correct state.
  403.  
  404. The other mouse functions are listed:
  405.  
  406.    VMOUSE_COL           - return the character column of the mouse
  407.    VMOUSE_CURSOR        - set the cursor on (.T.) or off (.F.)
  408.    VMOUSE_GET_POSITION  - returns the PIXEL position of the mouse
  409.    VMOUSE_INIT          - initialize the mouse driver
  410.    VMOUSE_LEFT_BUTTON   - is the left button pressed?
  411.    VMOUSE_RESET         - reset the mouse driver
  412.    VMOUSE_RESTORE       - restore the 'saved' mouse driver state
  413.    VMOUSE_RIGHT_BUTTON  - is the right button pressed?
  414.    VMOUSE_ROW           - return the character row of the mouse
  415.    VMOUSE_SAVE          - save the mouse driver state to a buffer
  416.    VMOUSE_SET_ROWCOL    - set the character position of the mouse cursor
  417.  
  418. Most of these will only be used by the meta-functions but are prototyped for
  419. your use to create NEW meta-functions.
  420.  
  421. ===============================================================================
  422. ===============================================================================
  423.                              META-Functions
  424. -------------------------------------------------------------------------------
  425.  
  426. The meta-functions provide already-programmed usefulness from the VList
  427. library.  They provide pick-lists, prompted menus, pull-down menus,
  428. pop-up menus, file-list picking, text-file viewing, and list searching.
  429. I have even written a TEXT/MEMO editor using this library that took 3 days
  430. instead of months.  It is available in another library (VEDIT.LIB).
  431.  
  432. Many of the meta-functions receive a list as a parameter.  The list contains
  433. a defined structure which will allow for variable-length parameters.  These
  434. parameters are covered here under each function topic instead of in the
  435. reference section since they require much text.
  436.  
  437. The functions will be covered with the simple routines near the front and
  438. the more complex to the rear.  This is a text description and the prototype
  439. with parameter list can be found in the reference section.
  440.  
  441. ===============================================================================
  442. VList_Count_Elements()
  443. VList_Find_First_Good()
  444. VList_Find_Last_Good()
  445. VList_Get_Last_Good()
  446. VList_Get_Next_Good()
  447. VList_Skip_Next()
  448. VList_Skip_Last()
  449. -------------------------------------------------------------------------------
  450.  
  451. The above elements are designed to help the other meta-functions deal with
  452. hidden and skipped elements.  Therefore you can determine if there is a
  453. valid 'next' element to go to, or how many there are between here and there.
  454.  
  455. ex.
  456.  
  457.     num_elements = VList_Count_Elements( handle, min, max )
  458.  
  459. VLIST_COUNT_ELEMENTS(), VLIST_SKIP_NEXT(), and VLIST_SKIP_LAST() will only
  460. ignore hidden elements since they deal with what can be displayed.  The
  461. others deal with hidden AND skipped since they deal with what can be
  462. selected.
  463.  
  464. Their exact definition is covered in the function reference section.
  465.  
  466.  
  467. ===============================================================================
  468. VList_Fix_Path()
  469. VList_Short_Path()
  470. -------------------------------------------------------------------------------
  471.  
  472. These two are pretty much unrelated to a list, except they are needed by the
  473. VLIST_1_FPICK() and VLIST_FPICK() functions when displaying the file-path
  474. being listed.
  475.  
  476. VLIST_FIX_PATH() standardizes paths by expanding paths that start with ..
  477. and . and making sure the path always ends with a \.
  478.  
  479. VLIST_SHORT_PATH() takes a long path name and alters it to fit within a
  480. set width.
  481.  
  482. Ex.
  483.  
  484.      C:\PROGRAM\SOURCE\VLIST\LIB\DEMO\
  485.  
  486.   would become (when placed under a width of 25 )
  487.  
  488.      C:\...\VLIST\LIB\DEMO\
  489.  
  490.  
  491. ==============================================================================
  492. VList_Restore()
  493. VList_Restore_Append()
  494. VList_Save()
  495. VList_Save_Append()
  496. ------------------------------------------------------------------------------
  497.  
  498. To save a VList to disk is simple using these 4 functions.  VLIST_SAVE() will
  499. store a list along with the max width, and number of elements to a text file.
  500. This can be encrypted by sending a .T. as one of the parameters.
  501. VLIST_SAVE_APPEND() will add to an already saved list.  If the list is
  502. encrypted, so will this one.  If this list has a longer or shorter width then
  503. it will be altered as saved.
  504.  
  505. VLIST_RESTORE() will init a new list and read a list file into memory.  If
  506. you want to add to a current list in memory then use VLIST_RESTORE_APPEND().
  507.  
  508.  
  509. ==============================================================================
  510. VList_Free_Screen()
  511. ------------------------------------------------------------------------------
  512.  
  513. This routine will free a screen saved by SAVE_SCREEN() without restoring it
  514. to the screen.  Therefore the memory is regained, but you do not have to
  515. bring up the wrong screen.
  516.  
  517. ==============================================================================
  518. VList_What_Color()
  519. ------------------------------------------------------------------------------
  520.  
  521. VLIST_WHAT_COLOR() is called by a majority of the meta-functions to set the
  522. color that the element should be.
  523.  
  524. The parameters are the list handle and the value that __color_std should
  525. represent for this element if &JL_DEFAULT is used.
  526.  
  527. ex.
  528.  
  529.    old_std = __color_std
  530.    old_enh = __color_enhcd
  531.  
  532.    *- element not highlighted
  533.    VList_What_Color( handle, old_std )
  534.    ? VList_CStr( handle )
  535.  
  536.    *- element highlighted
  537.    VList_What_Color( handle, old_enh )
  538.    ? VList_Cstr( handle )
  539.  
  540.  
  541. ==============================================================================
  542. VList_Sort()
  543. VList_Sort_Substr()
  544. ------------------------------------------------------------------------------
  545.  
  546. To place a list in computer-alphanumeric order (sort-of alphabetical) then
  547. you can sort the list using either the entire string contents or a partial
  548. section.  The Substr sort is nice when you are using the first character
  549. for say a marker and do not want it looked at during the sort.  VLIST_SORT()
  550. is quicker than VLIST_SORT_SUBSTR() since it does not have to break the
  551. string down.  They both use the same internal VLIST function but it is
  552. smart to determine whether or not it has to do extra string functions.
  553.  
  554. You can specify a start element and end element for sorting between.  The
  555. QUICK-SORT method is used here.
  556.  
  557.  
  558. ==============================================================================
  559. VList_Locate()
  560. VList_Locate_Substr()
  561. ------------------------------------------------------------------------------
  562.  
  563. These act similar to the LOCATE command in the xBASE standard.  You can either
  564. search for a string looking at the entire string or for a substr.  If you
  565. set 'exact match' to .T. then the strings must compare exactly in length and
  566. from first to last character.  The non-exact match will look for a string
  567. that matches up to the length of the user defined search string.  To do
  568. a logical CONTINUE (such as in xBASE), you can call with almost the same
  569. parameters except set the 'continue from current' parameter to .T.
  570.  
  571. ==============================================================================
  572. VList_Say()
  573. ------------------------------------------------------------------------------
  574.  
  575. This routine is similar to the @SAY command except that it displays an
  576. element with any highlighted characters in their different color.  Therefore
  577. to display embedded color codes, call this routine.  It is not as quick
  578. as @SAY so should only be used when you know that embedded codes are used.
  579.  
  580. An embedded code is a character preceded by the special character in
  581. __EMBED_CHAR which means to display this single character in the color
  582. __COLOR_HI_STD or __COLOR_HI_ENHCD depending on whether the highlight
  583. bar is over the element or not.
  584.  
  585. Ex.
  586.  
  587.     __EMBED_CHAR = "^"
  588.     temp_str = "save ^File"
  589.     VList_Add( handle, temp_str )
  590.  
  591. Now in any list that you have 'allow_embedded' turned on OR if using
  592. VLIST_SAY() then the character 'F' will be displayed in __COLOR_HI_STD
  593. or __COLOR_HI_ENHCD.  NOTE that the embedded character can be changed
  594. to whatever value you wish and should be set at the beginning of your
  595. program.
  596.  
  597. ==============================================================================
  598. VList_Embed_Caps()
  599. ------------------------------------------------------------------------------
  600.  
  601. This routine will take a list range and add the __EMBED_CHAR before the
  602. FIRST capital letter found within a list.  This makes it easier for you
  603. to highlight elements for menus and such especially if you have selected
  604. an __EMBED_CHAR that you cannot display or use in your editor.
  605.  
  606. Ex.
  607.  
  608.     __EMBED_CHAR = CHR( 27 )
  609.     VList_Add( handle, "Jayson was here" )
  610.     VList_Add( handle, "was It right?" )
  611.     VList_Add( handle, "vList is cool..." )
  612.     VList_Embed_Caps( handle, 1, 3 )
  613.  
  614. Now the 'J', 'I', and 'L' will have a CHR( 27 ) placed before them.
  615.  
  616. ==============================================================================
  617.                       <<<CONTINUED IN VLIST2.DOC>>>
  618. ==============================================================================
  619.