* Filename......: VernDemo.Prg * * Author........: Vernon E. Six, Jr. * 2908 Forest Hollow Lane #2329 * Arlington, Texas 76006 * Ph: (214) 283-3282 - Voice * Ph: (817) 695-0058 - BBS * * Last Update...: Tue 04-09-1991 10:28:16 * * Notice........: Copyright (c) 1989-90 by Vernon E. Six, Jr. * All Rights Reserved World Wide * * Version.......: Clipper Summer 87 & v5.0 * * Purpose.......: Demonstation program for VERNSIX.LIB ***** * Define variables for VMENU() ***** PRIVATE al_Avail[80] && What ones are available? PRIVATE ac_options[80] && Character array of options PRIVATE an_start[10] && Corresponds to each menu's number of options PRIVATE an_end[10] && "" PRIVATE ac_msgs[20] && Message for bottom of screen (top row of menu) PRIVATE ac_Title[4] && Title for menus PRIVATE n_Title && Number of lines in title array PRIVATE n_cntr && Misc use PRIVATE n_top && Used with GETCOORD demo PRIVATE n_left && Used with GETCOORD demo PRIVATE n_bottom && Used with GETCOORD demo PRIVATE n_right && Used with GETCOORD demo PRIVATE ac_Msg[20] && For DISPMSG() PRIVATE n_Value PRIVATE d_Date PRIVATE c_FrstName PRIVATE ac_PalNames[9] && To demonstrate how the programmer can allow && allow the user to change any palette PRIVATE n_Palette INITVERN() && Initialize my library INITHELP() && Open the help files in next work area EXTERNAL HELP && Help the linker find HELP.PRG EXTERNAL MAKEHLP && Help the linker find MAKEHLP.PRG EXTERNAL GETCOORD SET KEY 28 TO HELP && SET KEY 291 TO MAKEHLP && SET KEY 294 TO FAKELOCK && NEWSCRN() ***** * * I like to indent the GRABSCRN() and PUTSCRN() functions, so I don't forget * to include a PUTSCRN() for every GRABSCRN() * ***** SET CURSOR OFF GRABSCRN() ac_Msg[1] = " Vern Six's Clipper ToolBox v7.00 Thu 03-28-1991 " ac_Msg[2] = " " ac_Msg[3] = " Copyright (c) 1988-91 by Vernon E. Six, Jr. " ac_Msg[4] = " All Rights Reserved World Wide " ac_Msg[5] = " " ac_Msg[6] = " Vernon E. Six, Jr. " ac_Msg[7] = " 2908 Forest Hollow Lane #2329 " ac_Msg[8] = " Arlington, Texas 75080 " ac_Msg[9] = " Ph: (214) 283-3282 - VOICE " ac_Msg[10] = " Ph: (817) 695-0058 - BBS " DISPMSG(ac_Msg,10,"","") INKEY(5) PUTSCRN() GRABSCRN() ac_Msg[1] = "Welcome to the Vern Six Clipper Toolbox!! " ac_Msg[2] = " " ac_Msg[3] = "What you are about to see is a demonstration " ac_Msg[4] = "of some of the capabilities made possible via " ac_Msg[5] = "this library. " ac_Msg[6] = " " ac_Msg[7] = "For the most part, you will probably not be " ac_Msg[8] = "able to see much from just using this demo. " ac_Msg[9] = "You should look at and STUDY the source code " ac_Msg[10] = "to really get a feel for what is taking place " ac_Msg[11] = "in this program and how to access VERNSIX.LIB." DISPMSG(ac_Msg,11," Vern Six's Clipper Toolbox v6.11 "," Press any key to continue ") INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[1] = " VERNSIX.LIB comes complete with 41 fully operational " ac_Msg[2] = " functions and procedures that you can add to your " ac_Msg[3] = " Clipper application with very little effort. " ac_Msg[4] = " " ac_Msg[5] = " Each function is described in detail in the file " ac_Msg[6] = " called VERNSIX.DOC. To print this file on your " ac_Msg[7] = " printer, merely issue the following command at the " ac_Msg[8] = " DOS prompt: " ac_Msg[9] = " " ac_Msg[10] = " C> COPY VERNSIX.DOC PRN [Return] " ac_Msg[11] = " " ac_Msg[12] = " In addition to VERNSIX.DOC, a Norton Guides Database " ac_Msg[13] = " has been included (VERNSIX.NG). " DISPMSG(ac_Msg,13,""," Press any key to continue ") INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[1] = "The rest of this demonstration is merely a series of" ac_Msg[2] = "pull-down menus. You can move from one pull-down " ac_Msg[3] = "menu to the other, by the use of the left and right " ac_Msg[4] = "arrow keys. To 'pull a menu down', press [Return]. " ac_Msg[5] = "Once you highlight the function you want to see " ac_Msg[6] = "demonstrated, simply press [Return]. " ac_Msg[7] = " " ac_Msg[8] = "Note: Not all functions can be demonstrated from a " ac_Msg[9] = "'visual perspective'. In these cases, a dialog " ac_Msg[10] = "window will appear to tell you what is taking place." ac_Msg[11] = " " ac_Msg[12] = "Be sure to STUDY VERNDEMO.PRG to see what is taking " ac_Msg[13] = "place behind the scenes. " DISPMSG(ac_Msg,13,"", " Press any key to continue ") INKEY(0) PUTSCRN() ***** * Open SETUP.DBF for database functional demos ***** SELECT 0 BEGIN SEQUENCE IF .NOT. OPEN_DBF("SAMPLE") GRABSCRN() ac_Msg[1] = " Could not gain access to 'SAMPLE.DBF' " ac_Msg[2] = " " ac_Msg[3] = "Database function demonstrations disabled" DISPMSG(ac_Msg,3,""," Press any key to continue ") SET CURSOR OFF INKEY(0) SET CURSOR ON PUTSCRN() USE BREAK ENDIF END SEQUENCE ***** * Define the palette names so user can pick from list ***** ac_PalNames[1] = " Normal Text & Windows " ac_PalNames[2] = " Help Messages " ac_PalNames[3] = " Error Messages " ac_PalNames[4] = " Network I/O Messages " ac_PalNames[5] = " Programmer defined " ac_PalNames[6] = " Programmer defined " ac_PalNames[7] = " Programmer defined " ac_PalNames[8] = " Programmer defined " ac_PalNames[9] = " Programmer defined " ***** * Setup the VMENU() stuff ***** ***** * Title array ***** ac_Title[1] = "" ac_Title[2] = "CopyRight (c) 1988-91 by Vernon E. Six, Jr." ac_Title[3] = "All Rights Reserved World Wide" ac_Title[4] = "" n_title = 4 ***** * Setup the array of available options ***** FOR n_Cntr = 1 TO 80 al_Avail[n_Cntr] = .T. NEXT n_Cntr ****** * Setup the messages for the top row on the VMENU() panel ****** ac_Msgs[1] = "General Functions" ac_Msgs[2] = "Functions dealing with the user interface portion of an application" ac_Msgs[3] = "PRIVATE Area Networking (multi-user) application functions" ac_Msgs[4] = "Information about building 'context sensitive' help screens" ac_Msgs[5] = "Functions dealing with normal 'database' operations" ac_Msgs[6] = "Other functions and information" ***** * Define top menu (the one across the top) ***** an_start[1] = 1 an_end[1] = 6 ac_options[1] = " General " ac_options[2] = " Input/Output " ac_options[3] = " Network " ac_options[4] = " Help " ac_options[5] = " Database " ac_options[6] = " Other " ***** * First pull-down - General ***** an_start[2] = 10 an_end[2] = 12 ac_options[10] = " FSELECT() " ac_options[11] = " INITVERN() " ac_options[12] = " VERNVERS() " ***** * Second pull-down - Input/Output ***** an_start[3] = 15 an_end[3] = 38 ac_options[15] = " ASK() " ac_options[16] = " ASK2() " ac_options[17] = " CENTER() " ac_options[18] = " DEFPAL() " ac_options[19] = " DISPMSG() " ac_options[20] = " DOL2STR() " ac_options[21] = " DTOT() " ac_options[22] = " FIRSTCAP() " ac_options[23] = " GETCOLOR() " ac_options[24] = " GETCOORD " ac_options[25] = " GRABSCRN() " ac_options[26] = " NEWSCRN() " ac_options[27] = " NUM2TEXT() " ac_options[28] = " PADSTR() " ac_options[29] = " PALETTE() " ac_options[30] = " PARSE() " ac_options[31] = " PUTSCRN() " ac_options[32] = " READCOLR() " ac_options[33] = " SAVECOLR() " ac_options[34] = " SETCURS() " ac_options[35] = " TEXTCOLR() " ac_options[36] = " VMENU() " ac_options[37] = " VWIND() " ac_options[38] = " WINDCOLR() " ***** * Third pull-down - Network ***** an_start[4] = 45 an_end[4] = 49 ac_options[45] = " FAKELOCK " ac_options[46] = " V_APPEND() " ac_options[47] = " V_FLOCK() " ac_options[48] = " V_RLOCK() " ac_options[49] = " V_USE() " ***** * Fourth pull-down - Help ***** an_start[5] = 55 an_end[5] = 57 ac_options[55] = " HELP " ac_options[56] = " INITHELP() " ac_options[57] = " MAKEHLP " ***** * Fifth pull-down - Database ***** an_start[6] = 60 an_end[6] = 65 ac_options[60] = " ADD_FLD() " ac_options[61] = " OPEN_DBF() " ac_options[62] = " SHOW_NTX() " ac_options[63] = " VEDIT() " ac_options[64] = " VFILT() " ac_options[65] = " VPICK() " ***** * Sixth pull-down - Other ***** an_start[7] = 70 an_end[7] = 73 ac_options[70] = " Color settings " ac_options[71] = " A special thanks... " ac_options[72] = " Ordering Information " ac_options[73] = " Quit " ***** * Start at the top line with no "pull-downs" pulled down ***** gn_pulldown = 0 gn_option = 0 SET WRAP ON DO WHILE .T. n_opt = VMENU(ac_options,an_start,an_end,ac_msgs,ac_title,n_title,al_Avail) DO CASE CASE n_opt = 10 && FSELECT() ac_Msg[1] = " FSELECT() allows you to query the user for a " ac_Msg[2] = " filename matching a wildcard specification. The " ac_Msg[3] = " user will be able to move a light bar to the " ac_Msg[4] = " filename that he/she wishes to select. " ac_Msg[5] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[6] = " Select a file from the list on the right. " DISPMSG(ac_Msg,6," FSELECT() ","",5,1) c_choice = FSELECT("*.*",5,60,15,"","") IF .NOT. EMPTY(c_choice) ac_Msg[1] = " You selected " + c_choice DISPMSG(ac_Msg,1,"","") INKEY(3) ENDIF CASE n_opt = 11 && INITVERN() ac_Msg[1] = " INITVERN() initializes the variables used by the " ac_Msg[2] = " various functions in this library as well as sets " ac_Msg[3] = " the colors from the configuration database or creates " ac_Msg[4] = " the configuration database if it doesn't exist. " DISPMSG(ac_Msg,4," INITVERN() "," Press any key to continue ") INKEY(0) CASE n_Opt = 12 && VERNVERS() ac_Msg[1] = " VERNVERS() is used structly to indentify which version " ac_Msg[2] = " of the library you are using. The author of VERNSIX.LIB " ac_Msg[3] = " will need this information should you call for technical " ac_Msg[4] = " support." ac_Msg[5] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[6] = " Press any key to see a demonstration of VERNVERS() " DISPMSG(ac_Msg,6," VERNVERS() "," Press any key to continue ") INKEY(0) GRABSCRN() ac_Msg[1] = " VERNVERS() returned the following... " ac_Msg[2] = VERNVERS() DISPMSG(ac_Msg,2," VERNVERS() "," Press any key to continue ") INKEY(0) PUTSCRN() CASE n_opt = 15 && ASK() ac_Msg[1] = " ASK() prompts the user with a one line question. " ac_Msg[2] = " ASK() will return a one character response which " ac_Msg[3] = " can be limited to specific characters. ASK() is " ac_Msg[4] = " non-screen destructive. " ac_Msg[5] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[6] = " Press any key to see a demonstration of ASK() " DISPMSG(ac_Msg,6," ASK() ", "") INKEY(0) c_choice = ASK("DEMO: Do you want to continue","YyNn") CASE n_opt = 16 && ASK2() ac_Msg[1] = " ASK2() prompts the user with a multiple line " ac_Msg[2] = " question. ASK2() will return a one character " ac_Msg[3] = " response which can be limited to specific " ac_Msg[4] = " characters. ASK2() is non-screen destructive. " ac_Msg[5] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[6] = " Press any key to see a demonstration of ASK2() " DISPMSG(ac_Msg,6," ASK2() ", "") INKEY(0) ac_Msg[1] = "DEMO: This is line one of the multi-line question" ac_Msg[2] = "DEMO: Do you want to continue" c_choice = ASK2(ac_Msg,2,"","","YyNn") CASE n_opt = 17 && CENTER() ac_Msg[1] = " CENTER() allows you to center a string within a " ac_Msg[2] = " given width. " DISPMSG(ac_Msg,2," CENTER() ", " Press any key to continue ") INKEY(0) CASE n_Opt = 18 && DEFPAL() ac_Msg[1] = " DEFPAL() sets the specified palette to the default " ac_Msg[2] = " color settings. This function is used internally " ac_Msg[2] = " by VERNSIX.LIB but deserves mention here as well. " DISPMSG(ac_Msg,3," DEFPAL() ", " Press any key to continue ") INKEY(0) CASE n_opt = 19 && DISPMSG() ac_Msg[1] = " Displays a message in a window (centered on the " ac_Msg[2] = " screen). The programmer can supply optional top " ac_Msg[3] = " left coordinates for the window. This message is " ac_Msg[4] = " being displayed by DISPMSG(). " DISPMSG(ac_Msg,4," DISPMSG() " , " Press any key to continue ") INKEY(0) CASE n_Opt = 20 && DOL2STR() ac_Msg[1] = " DOL2STR() takes a numeric amount (similar to that on most " ac_Msg[2] = " checks) and converts it to a 'long-hand' representation " ac_Msg[3] = " of that number." ac_Msg[4] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[5] = " Press any key to see a demonstration of DOL2STR() " DISPMSG(ac_Msg,5," DOL2STR() ", "") INKEY(0) NEWSCRN() VWIND(11,10,13,60," DOL2STR() ","") n_Value = 0.00 SET CURSOR ON @ 12,12 SAY "Please enter a numeric amount:" GET n_Value READ SET CURSOR OFF NEWSCRN() ac_Msg[1] = "Your number was..." ac_Msg[2] = DOL2STR(n_Value) DISPMSG(ac_Msg,2," DOL2STR() "," Press any key to continue ") INKEY(0) CASE n_Opt = 21 && DTOT() ac_Msg[1] = " DTOT() converts a date expression to a specific " ac_Msg[2] = " character format. The programmer can request a " ac_Msg[3] = " specific format to convert to. " ac_Msg[4] = " i.e. Month Date, Year (January 28, 1991) or " ac_Msg[5] = " Date Mon Year (28 JAN 91) " ac_Msg[6] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[7] = " Press any key to see a demonstration of DTOT() " DISPMSG(ac_Msg,7," DTOT() ", "") INKEY(0) NEWSCRN() VWIND(11,10,13,60," DTOT() ","") d_Date = DATE() SET CURSOR ON @ 12,12 SAY "Please enter a date:" GET d_Date READ SET CURSOR OFF NEWSCRN() ac_Msg[1] = "Your date converts to... " ac_Msg[2] = "Style #1: " + DTOT(d_Date,1) ac_Msg[3] = "Style #2: " + DTOT(d_Date,2) DISPMSG(ac_Msg,3," DTOT() "," Press and key to continue ") INKEY(0) CASE n_Opt = 22 && FIRSTCAP() ac_Msg[1] = " FIRSTCAP() converts a string to all lower case with " ac_Msg[2] = " the exception of the first letter which is changed " ac_Msg[3] = " to upper case. " ac_Msg[4] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[5] = " Press any key to see a demonstration of FIRSTCAP() " DISPMSG(ac_Msg,5," FIRSTCAP() ","") INKEY(0) GRABSCRN() VWIND(10,10,12,70,"","") c_FrstName = SPACE(10) @ 11,12 SAY "Type you first name in lower case letters? " GET c_FrstName READ c_FrstName = FIRSTCAP(c_FrstName) @ 11,56 GET c_FrstName CLEAR GETS INKEY(10) PUTSCRN() CASE n_opt = 23 && GETCOLOR() ac_Msg[1] = " Prompts the user for the various color schemes " ac_Msg[2] = " (text and windowed) that he/she wants to use in " ac_Msg[3] = " your program. " ac_Msg[4] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[5] = " Press any key to see a demonstration of GETCOLOR() " DISPMSG(ac_Msg,5," GETCOLOR() ", "") INKEY(0) GRABSCRN() VWIND(6,26,16,56," Which palette? ","") n_Palette = ACHOICE(7,28,15,54,ac_PalNames) IF n_Palette >= 1 .AND. n_Palette <= 9 PALETTE(n_Palette) GETCOLOR() ENDIF PUTSCRN() TEXTCOLR() CASE n_opt = 24 && GETCOORD() GRABSCRN() ac_Msg[01] = " Allows the user to size a box on the screen " ac_Msg[02] = " through the use of the cursor control keys. " ac_Msg[03] = " Returns the top,left and bottom,right coordinates " ac_Msg[04] = " to your program. " DISPMSG(ac_Msg,4," GETCOORD() ", " Press any key to continue ") INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[01] = " When this procedure is called you will see a box " ac_Msg[02] = " appear on the screen (at the starting coordinates " ac_Msg[03] = " you specified). The cursor will be in the upper " ac_Msg[04] = " left hand corner of the box. You may move the " ac_Msg[05] = " corner around the screen by using the cursor " ac_Msg[06] = " control keys. " DISPMSG(ac_Msg,6," GETCOORD() ", " Press any key to continue ") INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[01] = " If you press the [HOME] key, the cursor will move " ac_Msg[02] = " from the upper left corner of the box to the lower " ac_Msg[03] = " right corner. You can now move this corner of the " ac_Msg[04] = " box around the screen by using the cursor control " ac_Msg[05] = " keys. Pressing the [HOME] key will once again " ac_Msg[06] = " place the cursor in the upper left corner of the " ac_Msg[07] = " box. " ac_Msg[08] = " " ac_Msg[09] = " When the box is the size and is in the location " ac_Msg[10] = " you want, press the [RETURN] key. " ac_Msg[11] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[12] = " Press any key to see a demonstration of GETCOORD() " DISPMSG(ac_Msg,12," GETCOORD() ", "") INKEY(0) n_top = 5 n_left = 10 n_bottom = 20 n_right = 70 DO GETCOORD WITH n_top, n_left, n_bottom, n_right PUTSCRN() CASE n_opt = 25 && GRABSCRN() ac_Msg[01] = " Captures contents of the screen (including cursor " ac_Msg[02] = " location, screen attributes, etc.) to be used in " ac_Msg[03] = " conjunction with PUTSCRN(). " ac_Msg[04] = " " ac_Msg[05] = " Clipper's SAVE SCREEN command doesn't quite fit " ac_Msg[06] = " the bill for most screen save operations. i.e. " ac_Msg[07] = " it doesn't save the cursor position or screen " ac_Msg[08] = " attributes. GRABSCRN() saves all these important " ac_Msg[09] = " aspects of your screen and will restore them " ac_Msg[10] = " properly when you call PUTSCRN(). " DISPMSG(ac_Msg,10," GRABSCRN() ", " Press any key to continue ") INKEY(0) CASE n_Opt = 26 && NEWSCRN() ac_Msg[1] = " NEWSCRN() is a quick and dirty little function to " ac_Msg[2] = " clear the screen and paint a 'pretty' background. " ac_Msg[3] = " NEWSCRN() makes a call to TEXTCOLR() before " ac_Msg[4] = " returning to your calling program." DISPMSG(ac_Msg,4," NEWSCRN() ", " Press any key to continue ") INKEY(0) CASE n_Opt = 27 && NUM2TEXT() ac_Msg[1] = " NUM2TEXT() converts a numeric value to a character " ac_Msg[2] = " value. i.e. 123 becomes One-Hundred Twenty Three " ac_Msg[3] = " NUM2TEXT() is very similar to DOL2STR() but does " ac_Msg[4] = " not format the return string to 'dollars and " ac_Msg[5] = " cents'. " DISPMSG(ac_Msg,5," NUM2TEXT() ", " Press any key to continue ") INKEY(0) CASE n_Opt = 28 && PADSTR() ac_Msg[1] = " PADSTR() pads a string to a specified length or " ac_Msg[2] = " truncates a long string. PADSTR() is used when " ac_Msg[3] = " you absolutely need a string of a specified length. " DISPMSG(ac_Msg,3," PADSTR() ", " Press any key to continue ") INKEY(0) CASE n_Opt = 29 && PALETTE() ac_Msg[1] = " PALETTE() allows the programmer to switch between the nine available " ac_Msg[2] = " color palettes. Some functions in VERNSIX.LIB use a specified palette " ac_Msg[3] = " i.e. HELP uses palette #2, Error messages are displayed using palette " ac_Msg[4] = " #3, and network delays are shown using palette #4. The programmer is " ac_Msg[5] = " free to use any and all of the nine available palettes. " DISPMSG(ac_Msg,5," PALETTE() ", " Press any key to continue ") INKEY(0) CASE n_Opt = 30 && PARSE() ac_Msg[1] = " PARSE() returns the first word in a string. " DISPMSG(ac_Msg,1," PARSE() "," Press any key to continue ") INKEY(0) CASE n_opt = 31 && PUTSCRN() ac_Msg[1] = " Restores a screen captured with GRABSCRN() " DISPMSG(ac_Msg,1," PUTSCRN() ", " Press any key to continue ") INKEY(0) CASE n_Opt = 32 && READCOLR() ac_Msg[1] = " READCOLR() is used by VERNSIX.LIB to read the color palettes from the " ac_Msg[2] = " config database. You may call it from within your programs as well, " ac_Msg[3] = " although there should never be a need to do so. " DISPMSG(ac_Msg,3," READCOLR() ", " Press any key to continue ") INKEY(0) CASE n_Opt = 33 && SAVECOLR() ac_Msg[1] = " SAVECOLR() is used by VERNSIX.LIB to save the color palettes to the " ac_Msg[2] = " config database. You may call it from within your programs as well, " ac_Msg[3] = " although there should never be a need to do so. " DISPMSG(ac_Msg,3," SAVECOLR() ", " Press any key to continue ") INKEY(0) CASE n_Opt = 34 && SETCURS() ac_Msg[1] = " SETCURS() is a replacement for the Clipper SET CURSOR ON and SET " ac_Msg[2] = " CURSOR OFF commands. This function is primarially for Clipper " ac_Msg[3] = " Summer 87 since that version has no way of detecting wether the " ac_Msg[4] = " cursor is on or off. " ac_Msg[5] = " " ac_Msg[6] = " This function is NOT in VERNSIX5.LIB. " DISPMSG(ac_Msg,6," SETCURS() ", " Press any key to continue ") INKEY(0) CASE n_opt = 35 && TEXTCOLR() ac_Msg[01] = " Sets color to normal text colors as defined by the " ac_Msg[02] = " configuration database. You can change the colors " ac_Msg[03] = " via the GETCOLOR() function. " DISPMSG(ac_Msg,3," TEXTCOLR() ", " Press any key to continue ") INKEY(0) CASE n_opt = 36 && VMENU() ac_Msg[01] = " Provides the programmer with a very fast and " ac_Msg[02] = " efficient means of producing 'pull-down' menus for " ac_Msg[03] = " their users. VMENU() is screen destructive. " ac_Msg[04] = " " ac_Msg[05] = " The menu used during this demonstration program was " ac_Msg[06] = " created with VMENU(). " DISPMSG(ac_Msg,6," VMENU() ", " Press any key to continue ") INKEY(0) CASE n_opt = 37 && VWIND() ac_Msg[01] = " Draws a window with optional shadow, color and " ac_Msg[02] = " custom box " ac_Msg[03] = " " ac_Msg[04] = " All the windows you see during this demonstration " ac_Msg[05] = " have been created with VWIND(). " DISPMSG(ac_Msg,5," VWIND() ", " Press any key to continue ") INKEY(0) CASE n_opt = 38 && WINDCOLR() ac_Msg[01] = " Sets color to windowed text colors as defined by " ac_Msg[02] = " the configuration database. You can change the " ac_Msg[03] = " colors via the GETCOLOR() function. " DISPMSG(ac_Msg,3," WINDCOLR() ", " Press any key to continue ") INKEY(0) CASE n_opt = 45 && FAKELOCK ac_Msg[01] = " Simulates a global network lock for runtime " ac_Msg[02] = " testing of logic associated with network file " ac_Msg[03] = " operations. " ac_Msg[04] = " " ac_Msg[05] = " FAKELOCK will force all of the VERNSIX.LIB network " ac_Msg[06] = " functions (V_APPEND(), V_FLOCK(), V_RLOCK(), " ac_Msg[07] = " V_USE()) to act as though they were unsuccessful. " ac_Msg[08] = " This is useful for testing your program code to " ac_Msg[09] = " recover from such failures. " DISPMSG(ac_Msg,9," FAKELOCK ", " Press any key to continue ") INKEY(0) CASE n_opt = 46 && V_APPEND() ac_Msg[01] = " Adds a blank record to the currently selected file " ac_Msg[02] = " or notifies user if unsuccessful. " ac_Msg[03] = " " ac_Msg[04] = " V_APPEND() will try to append a blank record to " ac_Msg[05] = " the currently selected file. If it is " ac_Msg[06] = " unsuccessful, a non-screen destructive message " ac_Msg[07] = " stating 'Waiting for busy network. Press any key " ac_Msg[08] = " to abort.' will appear on the screen and " ac_Msg[09] = " V_APPEND() will continue to endlessly attempt to " ac_Msg[10] = " append a blank record to the currently selected " ac_Msg[11] = " database. If the user aborts the operation by " ac_Msg[12] = " pressing a key, V_APPEND() will return a logical " ac_Msg[13] = " value of false. If V_APPEND() returns a value of " ac_Msg[14] = " false, its your job as the programmer to abort the " ac_Msg[15] = " operation and recover properly. " DISPMSG(ac_Msg,15," V_APPEND() ", " Press any key to continue ",5) INKEY(0) CASE n_opt = 47 && V_FLOCK() ac_Msg[01] = " Locks the currently selected file or notifies the " ac_Msg[02] = " user if unsuccessful. " ac_Msg[03] = " " ac_Msg[04] = " V_FLOCK() will try to lock the currently selected " ac_Msg[05] = " file. If it is unsuccessful, a non-screen " ac_Msg[06] = " destructive message stating 'Waiting for busy " ac_Msg[07] = " network. Press any key to abort.' will appear on " ac_Msg[08] = " the screen and V_FLOCK() will continue to " ac_Msg[09] = " endlessly attempt to lock the currently selected " ac_Msg[10] = " database. If the user aborts the operation by " ac_Msg[11] = " pressing a key, V_FLOCK() will return a logical " ac_Msg[12] = " value of false. If V_FLOCK() returns a value of " ac_Msg[13] = " false, its your job as the programmer to abort the " ac_Msg[14] = " operation and recover properly. " DISPMSG(ac_Msg,14," V_FLOCK() ", " Press any key to continue ",5) INKEY(0) CASE n_opt = 48 && V_RLOCK() ac_Msg[01] = " Locks the currently selected record or notifies " ac_Msg[02] = " the user if unsuccessful. " ac_Msg[03] = " " ac_Msg[04] = " V_RLOCK() will try to lock the currently selected " ac_Msg[05] = " record. If it is unsuccessful, a non-screen " ac_Msg[06] = " destructive message stating 'Waiting for busy " ac_Msg[07] = " network. Press any key to abort.' will appear on " ac_Msg[08] = " the screen and V_RLOCK() will continue to " ac_Msg[09] = " endlessly attempt to lock the currently selected " ac_Msg[10] = " database. If the user aborts the operation by " ac_Msg[11] = " pressing a key, V_RLOCK() will return a logical " ac_Msg[12] = " value of false. If V_RLOCK() returns a value of " ac_Msg[13] = " false, its your job as the programmer to abort the " ac_Msg[14] = " operation and recover properly. " DISPMSG(ac_Msg,14," V_RLOCK() ", " Press any key to continue ",5) INKEY(0) CASE n_opt = 49 && V_USE() ac_Msg[01] = " Opens a file in the current work area or notifies " ac_Msg[02] = " the user if unsuccessful. The file can have an " ac_Msg[03] = " ALIAS specified as well as EXCLUSIVE use set on or " ac_Msg[04] = " off. " DISPMSG(ac_Msg,4," V_USE() ", " Press any key to continue ") INKEY(0) CASE n_opt = 55 && HELP ac_Msg[01] = " HELP provides a non-screen-destructive help screen " ac_Msg[02] = " based on the calling program and variable name. " ac_Msg[03] = " Help screens can be added at any time after the " ac_Msg[04] = " program is compiled, through the use of the " ac_Msg[05] = " MAKEHLP procedure and are fully 'context' " ac_Msg[06] = " sensitive. To see a demo of HELP press F1 at any " ac_Msg[07] = " menu selection. " DISPMSG(ac_Msg,7," HELP ", " Press any key to continue ") INKEY(0) CASE n_opt = 56 && INITHELP() ac_Msg[01] = " This function creates the necessary HELP files " ac_Msg[02] = " (DBF, DBT and N?X) in the next available work " ac_Msg[03] = " area. " DISPMSG(ac_Msg,3," INITHELP() ", " Press any key to continue ") INKEY(0) CASE n_opt = 57 && MAKEHLP GRABSCRN() ac_Msg[01] = " Allows the developer to design a help screen after " ac_Msg[02] = " the application is compiled. " ac_Msg[03] = " " ac_Msg[04] = " When this routine is called, you will see a box " ac_Msg[05] = " appear on the screen. You should size the box " ac_Msg[06] = " using the technique described in GETCOORD. " ac_Msg[07] = " " ac_Msg[08] = " When you have a box that is suitable for your help " ac_Msg[09] = " window, press [RETURN]. At this point you may " ac_Msg[10] = " edit the help text as you wish. When you are " ac_Msg[11] = " done, press Ctrl-W. " DISPMSG(ac_Msg,11," MAKEHLP ", " Press any key to continue ",5) INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[01] = " To see a demonstration of MAKEHLP, create a text " ac_Msg[02] = " file called VERNSIX.DVP in the current directory " ac_Msg[03] = " and then press ALT-H while VERNDEMO.EXE is running. " DISPMSG(ac_Msg,3," MAKEHLP ", " Press any key to continue ",5) INKEY(0) PUTSCRN() CASE n_opt = 60 && ADD_FLD() ac_Msg[1] = " ADD_FLD() adds a field to a 'structure extended' database. " ac_Msg[2] = " ADD_FLD() saves you from having to issue several APPEND " ac_Msg[3] = " BLANKS and REPLACE statements when creating a 'structure " ac_Msg[4] = " extended' database." DISPMSG(ac_Msg,4," ADD_FLD() ", " Press any key to continue ") INKEY(0) CASE n_opt = 61 && OPEN_DBF() ac_Msg[1] = " OPEN_DBF() uses a database dictionary to open a specified " ac_Msg[2] = " database and all its associated index files. OPEN_DBF() " ac_Msg[3] = " is primarily used to allow several different database " ac_Msg[4] = " applications to access common databases and maintain " ac_Msg[5] = " common index files without having to re-compile and link " ac_Msg[6] = " each application." DISPMSG(ac_Msg,6," OPEN_DBF() ", " Press any key to continue ") INKEY(0) CASE n_opt = 62 && SHOW_NTX() GRABSCRN() ac_Msg[01] = " Provides the programmer with a non-screen " ac_Msg[02] = " desctructuve 'gas guage' type of chart to show the " ac_Msg[03] = " user what percentage of the index operation is " ac_Msg[04] = " complete. " DISPMSG(ac_Msg,4," SHOW_NTX() ", " Press any key to continue ") INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[01] = " One of the biggest disadvantages of Clipper is the " ac_Msg[02] = " inability to show the progress of an index " ac_Msg[03] = " operation. While it can be argued that the hard " ac_Msg[04] = " drive access light is sufficient to tell the user " ac_Msg[05] = " that something is happening, a far greater number " ac_Msg[06] = " of users will argue to the contrary. In fact, " ac_Msg[07] = " several users have been known to turn the machine " ac_Msg[08] = " off while in the middle of a large index " ac_Msg[09] = " operation. SHOW_NTX() provides a user-friendly " ac_Msg[10] = " 'gas gauge' type of display telling the user " ac_Msg[11] = " exactly how things are progressing. " ac_Msg[12] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[13] = " Press any key to see a demonstration of SHOW_NTX() " DISPMSG(ac_Msg,13," SHOW_NTX() ", "",5) INKEY(0) PUTSCRN() SHOW_NTX("SAMPLE","AUTHORLAST+AUTHORFRST") ***** * SHOW_NTX() acts just like "INDEX ON" in that it locks the database * so we need the following code to UNLOCK it ***** BEGIN SEQUENCE IF .NOT. V_USE("SAMPLE",.F.) GRABSCRN() ac_Msg[1] = "Could not gain access to 'SAMPLE.DBF'" ac_Msg[2] = " " ac_Msg[3] = " Program aborted! " DISPMSG(ac_Msg,3,""," Press any key to continue ") INKEY(0) PUTSCRN() BREAK ENDIF SET INDEX TO SAMPLE END SEQUENCE CASE n_opt = 63 && VEDIT() ac_Msg[01] = " Emulates the dBASE III+ 'Edit' command by allowing " ac_Msg[02] = " the user to page back and forth through the " ac_Msg[03] = " database records and optionally editing the " ac_Msg[04] = " selected record. " ac_Msg[05] = " " ac_Msg[06] = " VEDIT() is very useful for working with a 'flat' " ac_Msg[07] = " database. VEDIT() controls all the moving around " ac_Msg[08] = " inside your database and will handle SEEKs based " ac_Msg[09] = " on a pressed key, etc. " ac_Msg[10] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " ac_Msg[11] = " Press any key to see a demonstration of VEDIT() " DISPMSG(ac_Msg,11," VEDIT() ", "",5) INKEY(0) DO VEDITDEMO CASE n_opt = 64 && VFILT() GRABSCRN() ac_Msg[01] = " Provides a non-screen-destructive user interface " ac_Msg[02] = " to allow the user to select a list of fields, " ac_Msg[03] = " logical connectives, and comparison constants from " ac_Msg[04] = " pop up light bar windows. " ac_Msg[05] = " " ac_Msg[06] = " VFILT() draws information from the database open " ac_Msg[07] = " in the work area currently selected when it is " ac_Msg[08] = " invoked. " DISPMSG(ac_Msg,8," VFILT() ", " Press any key to continue ") INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[01] = " VFILT() is designed to provide the uninitiated " ac_Msg[02] = " user with an easy interface to 'filter' " ac_Msg[03] = " specification building. It is database " ac_Msg[04] = " independent and limits the choices available in " ac_Msg[05] = " the light bar menus to those that are applicable " ac_Msg[06] = " to the variable type selected. As the user " ac_Msg[07] = " selects fields, relational operators and " ac_Msg[08] = " comparison constants, the string VFILT() builds is " ac_Msg[09] = " also displayed on the screen. " DISPMSG(ac_Msg,9," VFILT() ", " Press any key to continue ") INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[01] = " VFILT() alone is not a powerful function but when " ac_Msg[02] = " combined with the macro substitution capabilities " ac_Msg[03] = " of Clipper, the two become very powerful indeed. " ac_Msg[04] = " The string returned by VFILT() is suitable for " ac_Msg[05] = " macro substitution in the SET FILTER TO command as " ac_Msg[06] = " well as in any FOR clause in any Clipper command " ac_Msg[07] = " supporting that clause (such as REPORT, SORT, " ac_Msg[08] = " COPY, LIST, etc..). " DISPMSG(ac_Msg,8," VFILT() ", " Press any key to continue ") INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[01] = " A demonstration of VFILT() can be found within the " ac_Msg[02] = " VEDIT() demonstration." DISPMSG(ac_Msg,2," VFILT() ", " Press any key to continue ") INKEY(0) PUTSCRN() CASE n_opt = 65 && VPICK() ac_Msg[01] = " Allows the user to select a record from currently " ac_Msg[02] = " selected database. " ac_Msg[03] = " ΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ " DISPMSG(ac_Msg,2," VPICK() ", " Press any key to see a demo of VPICK() ") INKEY(0) DO VPICKDEMO CASE n_Opt = 70 && Color settings GRABSCRN() VWIND(6,26,16,56," Which palette? ","") n_Palette = ACHOICE(7,28,15,54,ac_PalNames) IF n_Palette >= 1 .AND. n_Palette <= 9 PALETTE(n_Palette) GETCOLOR() ENDIF PUTSCRN() TEXTCOLR() CASE n_opt = 71 && Special Thanks ac_Msg[01] = " A special note of thanks is due to my very good " ac_Msg[02] = " friend Frank Grubbs, for his never ending support. " ac_Msg[03] = " If it weren't for Frank's continuing testing and " ac_Msg[04] = " support, this library would have never left my den. " DISPMSG(ac_Msg,4,""," Press any key to continue ") INKEY(0) CASE n_opt = 72 && Ordering Information GRABSCRN() ac_Msg[01] = " If you purchased VERNSIX.LIB directly from FrontLine Software in " ac_Msg[02] = " your own name for $39.95, then your copy is already registered " ac_Msg[03] = " and you will receive all the benefits of registration. You do " ac_Msg[04] = " not need to send in a registration form. " ac_Msg[05] = " " ac_Msg[06] = " If you received VERNSIX.LIB from a 'Users' Group', 'Software " ac_Msg[07] = " Library', 'SIG', 'Bulletin Board', etc. and have paid a small " ac_Msg[08] = " fee (usually either yearly dues or $3.00 to $10.00 per disk) you " ac_Msg[09] = " have NOT acquired a registration. The fee you paid was for the " ac_Msg[10] = " convenience of obtaining the diskette with VERNSIX.LIB on it. " ac_Msg[11] = " The fee does NOT apply to the registration fee. " DISPMSG(ac_Msg,11,""," Press any key to continue ",5) INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[01] = " If you received an evaluation copy of VERNSIX.LIB from FrontLine " ac_Msg[02] = " Software for a fee of $5.00, you have NOT acquired a " ac_Msg[03] = " registration. The $5.00 you paid was for the convenience of " ac_Msg[04] = " obtaining the diskette with VERNSIX.LIB on it. However, this " ac_Msg[05] = " $5.00 fee DOES apply toward your registration fee and you may " ac_Msg[06] = " deduct it from the $39.95 fee when you register. " ac_Msg[07] = " " ac_Msg[08] = " You may register your copy by filling out the enclosed form and " ac_Msg[09] = " mailing it to the listed address along with your check or money " ac_Msg[10] = " order for $39.95 (Texas residents add 8% sales tax). " DISPMSG(ac_Msg,10,""," Press any key to continue ",5) INKEY(0) PUTSCRN() GRABSCRN() ac_Msg[01] = " When you register your copy of VERNSIX.LIB, you will receive the " ac_Msg[02] = " latest version without the ten second 'advertisemnet' in it. You " ac_Msg[03] = " will also be granted a royalty free run-time license to use " ac_Msg[04] = " VERNSIX.LIB in any of your applications. " DISPMSG(ac_Msg,4,""," Press any key to continue ") INKEY(0) PUTSCRN() CASE n_opt = 73 && Quit IF ASK("Are you sure","YyNn") $ "Yy" SET CURSOR ON TEXTCOLR() CLEAR QUIT ENDIF ENDCASE ENDDO RETURN *** EOF: VERNDEMO.PRG ******************************************************* ************************************************ ************************************************ ** ** ** Supporting procedures and functions follow ** ** ** ************************************************ ************************************************ PROCEDURE VPICKDEMO ***** * Demonstration of VPICK() ***** PRIVATE c_FldList, n_retval TEXTCOLR() CLEAR SET FILTER TO GO TOP c_FldList = "AUTHORLAST + [ ] + AUTHORFRST + [ ] + SUBSTR(TITLE,1,15)" DO WHILE .T. NEWSCRN() gn_StartRec = RECNO() && What record to start on? n_retval = VPICK(5,5,15,c_FldList," VPICK() Demo ","",.T.) GRABSCRN() DO CASE CASE n_RetVal = 22 && [Insert] APPEND BLANK PICKEDIT() CASE n_RetVal = 13 && [Return] PICKEDIT() CASE n_retval = 27 && [Esc] EXIT CASE n_retval = 28 && F1 DO HELP WITH "VPICKDEMO",10,"KEY" CASE n_retval = 291 && ALT-H DO MAKEHLP WITH "VPICKDEMO",10,"KEY" ENDCASE PUTSCRN() ENDDO RETURN *** EOF: VPICKDEMO ********************************************************** PROCEDURE PICKEDIT ***** * Editing procedure for VPICKDEMO ***** PRIVATE c_temp TEXTCOLR() CLEAR @ 01,00 say [ΥΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΈ] @ 02,00 say [³ Sample Library Database ³] @ 03,00 say [ΖΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ΅] @ 04,00 say [³ About the author... ³] @ 05,00 say [³ Last Name: First Name: ³] @ 06,00 say [³ ³] @ 07,00 say [³ About the book... ³] @ 08,00 say [³ Title: ³] @ 09,00 say [³ Sub-Title: ³] @ 10,00 say [³ ³] @ 11,00 say [³ Publisher: City, St: ³] @ 12,00 say [³ ³] @ 13,00 say [³ Year: Class: Location: ³] @ 14,00 say [³ ³] @ 15,00 say [³ Comments... ³] @ 16,00 say [³ ³] @ 17,00 say [³ ³] @ 18,00 say [³ ³] @ 19,00 say [³ ³] @ 20,00 say [ΖΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ΅] @ 21,00 SAY "³ F1 - Help End - End of line ^T - Del word Del - Del Char ³" @ 22,00 SAY "³ ESC - Abort Edit ^Home - First field ^Y - Del to EOL Ins - Insert ³" @ 23,00 SAY "³ Home - Beg of line ^End - Last field ^U - Ooops PgDn - Save ³" @ 24,00 say [ΤΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΎ] IF RECNO() <= LASTREC() c_temp="Record # "+LTRIM( STR(RECNO()) ) IF DELETED() c_temp=c_temp+[*] ELSE c_temp=c_temp+[ ] ENDIF c_temp=c_temp+" of "+LTRIM( STR(RECCOUNT()) )+" " @ 02,02 SAY c_temp @ 05,14 get AUTHORLAST @ 05,49 get AUTHORFRST @ 05,65 get AUTHORMID @ 08,14 get TITLE @ 09,14 get SUBTITLE @ 11,14 get PUBLISHER @ 11,56 get CITYSTATE @ 13,14 get YEAR @ 13,32 get CLASS @ 13,64 get LOCATION @ 16,04 get COMMENT1 @ 17,04 get COMMENT2 @ 18,04 get COMMENT3 ELSE c_temp = "No records in database" GO BOTTOM SKIP @ 02,02 SAY c_temp ENDIF SET CURSOR ON READ SET CURSOR OFF RETURN *** EOF: PICKEDIT() ********************************************************* PROCEDURE VEDITDEMO ***** * Demonstrate VEDIT() use ***** PRIVATE c_Filter, n_RetVal, ac_Msg[4] TEXTCOLR() CLEAR c_Filter = "" SET FILTER TO GO TOP DISPTEXT() && Display normal text "shell" DO WHILE .T. DISPCURR() && Display the current record gn_StartRec = RECNO() n_RetVal = VEDIT(.T.) DO CASE CASE n_RetVal = 13 && [Return] EDITCURR() CASE n_RetVal = 22 && [Insert] IF .NOT. V_APPEND() ac_Msg[1] = " Could not append a blank record " ac_Msg[2] = " Please try again later " DISPMSG(ac_Msg,2,"","") SET CURSOR OFF INKEY(5) ELSE EDITCURR() ENDIF CASE n_RetVal = 7 && [Delete] IF .NOT. V_RLOCK() ac_Msg[1] = " Could not lock record " ac_Msg[2] = " Please try again later " DISPMSG(ac_Msg,2,"","") SET CURSOR OFF INKEY(5) ELSE IF DELETED() RECALL ELSE DELETE ENDIF ENDIF CASE n_RetVal = 27 && [Esc] EXIT CASE n_RetVal = 28 && F1 DO HELP WITH "VIEWSAMP",10,"KEY" CASE n_RetVal = 291 && ALT-H DO MAKEHLP WITH "VIEWSAMP",10,"KEY" CASE n_RetVal = -9 && F10 Change colors GETCOLOR() TEXTCOLR() CLEAR DISPTEXT() && Reflect changes in color settings CASE n_RetVal = -8 && F9 Selectively retrieve records c_Filter = VFILT() IF .NOT. EMPTY(c_Filter) SET FILTER TO &c_Filter ELSE SET FILTER TO ENDIF ENDCASE ENDDO SET FILTER TO RETURN *** EOF: VEDITDEMO ********************************************************** FUNCTION DISPTEXT ***** * Draws original screen for VEDIT() (the "text shell") ***** TEXTCOLR() CLEAR @ 01,00 say [ΥΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΈ] @ 02,00 say [³ Sample Library Database ³] @ 03,00 say [ΖΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ΅] @ 04,00 say [³ About the author... ³] @ 05,00 say [³ Last Name: First Name: ³] @ 06,00 say [³ ³] @ 07,00 say [³ About the book... ³] @ 08,00 say [³ Title: ³] @ 09,00 say [³ Sub-Title: ³] @ 10,00 say [³ ³] @ 11,00 say [³ Publisher: City, St: ³] @ 12,00 say [³ ³] @ 13,00 say [³ Year: Class: Location: ³] @ 14,00 say [³ ³] @ 15,00 say [³ Comments... ³] @ 16,00 say [³ ³] @ 17,00 say [³ ³] @ 18,00 say [³ ³] @ 19,00 say [³ ³] @ 20,00 say [ΖΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝ΅] @ 21,00 SAY "³ ³" @ 22,00 SAY "³ ³" @ 23,00 SAY "³ ³" @ 24,00 say [ΤΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΝΎ] CLEAR GETS RETURN(.T.) *** EOF: DISPTEXT() ********************************************************* FUNCTION DISPCURR ***** * Display current record ***** TEXTCOLR() @ 02,61 SAY "*** View Mode ***" DISPFLDS() && Eliminates redudant code @ 21,00 SAY "³ Esc - Exit F10 - Colors Home - First Rtrn - Edit ³" @ 22,00 SAY "³ F1 - Help PgDn - Next End - Last Del - Delete ³" @ 23,00 SAY "³ F9 - Filter Pgup - Previous Alpha - Seek Ins - Append ³" CLEAR GETS SET CURSOR OFF RETURN(.T.) *** EOF: VIEWSAMP *********************************************************** FUNCTION EDITCURR ***** * Edit current record ***** TEXTCOLR() @ 02,61 SAY "*** Edit Mode ***" DISPFLDS() && Eliminates redudant code @ 21,00 SAY "³ F1 - Help End - End of line ^T - Del word Del - Del Char ³" @ 22,00 SAY "³ ESC - Abort Edit ^Home - First field ^Y - Del to EOL Ins - Insert ³" @ 23,00 SAY "³ Home - Beg of line ^End - Last field ^U - Ooops PgDn - Save ³" SET CURSOR ON READ SET CURSOR OFF RETURN(.T.) *** EOF: EDITSAMP *********************************************************** FUNCTION DISPFLDS ***** * Common "@ SAY ... GET" routine for VIEW and EDIT modes ***** PRIVATE c_temp TEXTCOLR() IF RECNO() <= LASTREC() c_temp="Record # "+LTRIM( STR(RECNO()) ) IF DELETED() c_temp=c_temp+[*] ELSE c_temp=c_temp+[ ] ENDIF c_temp=c_temp+" of "+LTRIM( STR(RECCOUNT()) )+" " @ 02,02 SAY c_temp @ 05,14 get AUTHORLAST @ 05,49 get AUTHORFRST @ 05,65 get AUTHORMID @ 08,14 get TITLE @ 09,14 get SUBTITLE @ 11,14 get PUBLISHER @ 11,56 get CITYSTATE @ 13,14 get YEAR @ 13,32 get CLASS @ 13,64 get LOCATION @ 16,04 get COMMENT1 @ 17,04 get COMMENT2 @ 18,04 get COMMENT3 ELSE c_temp = "No records in database" GO BOTTOM SKIP @ 02,02 SAY c_temp ENDIF RETURN(.T.) *** EOF: DISPFLDS() *********************************************************