README About this report. Report Name: CL5103 Report Date: 08/22/91 Author: Compiled by Jo W. French dba Practical Computing of La Canada 290 Starlight Crest Drive La Canada, CA 91011 (818) 790-3699 CompuServe ID: 74730,1751 Note: Supercedes CL5102. ^b*^b indicates corrections and additions. This report pertains to Clipper(r) 5.01. Each item herein contains the applicable version number. It has been compiled from messages posted on CompuServe forums from 04/19/91 through 08/21/91. The author has verified most, but not all, of the stated anomalies. The severity of each item is best left to the reader's judgement. Verification Conditions. a) COMPILER: Clipper 5.01 version 1.29 dtd 04/15/91. b) LINKER: RTLINK version 3.13, as supplied by lanquage vendor. c) SYSTEM: IBM PS/2 Model 80 with 4Mb RAM, 222 Mb Fixed Disk. d) DOS Version: IBM DOS version 3.30. e) CONFIG.SYS: DEVICE=c:\dos\vdisk.sys 1536 512 128 /E DEVICE=c:\qemm\qemm.sys RAM SHELL=c:\command.com /E:512 /P FILES=51 BUFFERS=8 f) ENVIRONMENT COMSPEC=C:\COMMAND.COM PROMPT=$p$g PATH=C:\dos;C:\bat;C:\;C:\me;C:\ws5;F:\clipper5\bin;D:\trh; C:\qemm;F:\ng; LIB=F:\clipper5\lib; INCLUDE=F:\clipper5\include; OBJ=F:\clipper5\obj; PLL=F:\clipper5\pll; CLIPPER=F21; g) EXTENDED MEMORY: 1536Kb (DOS VDISK) h) EXPANDED MEMORY: 1536Kb (QEMM vs. 5.0) i) TSR's: All TSR's are loaded above 9FFF using QEMM's LOADHI. ============================================================================== |D|A|M|N| | | | | New since last release. | | | Miscellaneous comments. | | Anomaly. | Documentation error / omission. ============================================================================== ============================================================================== AEVAL() Undocumented return reference. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b AEVAL() documentation does not mention the presence of a second return reference; i.e., the element number. ^bCause^b Documentation omission. ^bWork Around(s)^b Annotate your documentation. ============================================================================== ALERT() Undocumented features. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b ALERT()'s prompt is limited to 4 choices. There is also an undocumented third parameter, cColorString, which may be a color pair such as "W/N". ^bCause^b Documentation omission. ^bWork Around(s)^b Annotate your documentation. ============================================================================== APPEND FROM Append From Delimited with Character Numbers. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b APPEND FROM DELIMITED does not translate numbers enclosed in quotes to numerics for input to a numeric field. ^bCause^b Unknown ^bWork Around(s)^b Unknown. ============================================================================== ATAIL() Miscellaneous comment. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b Per the documentation, ATAIL(aArray) 'gets' the value of the last element in the array. It may NOT be used to 'set' the value and will return Compiler error 2042, Invalid lvalue, if you attempt to use it in this fashion. ^bCause^b N/A. ^bWork Around(s)^b Use aArray[ Len(aArray) ] := something to 'set' a value. ============================================================================== BOF() Set to .T. on LastRec() + 1 access. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b BOF() will return .T. under the following example: USE test GO LASTREC() + 1 ? BOF() // => .T. ^bCause^b Unknown. ^bWork Around(s)^b Don't 'Jump' to LastRec() + 1 and test for BOF(). Skip works ok. ============================================================================== BREAK/RECOVER May not return code block. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The BREAK / RECOVER USING methodology may not return a code block. Here's one example from Jeff Cheney [72570,675] : ********************* ** PRNERROR.PRG ** ** compile with /N ** ********************* FUNCTION prnError LOCAL lErrorObj SET DEVICE TO PRINT DO WHILE .T. // begin trapping printer errors BEGIN SEQUENCE // make sure printer is turned off to invoke handler @ 1,0 SAY "!!!!!" RECOVER USING lErrorObj // set a break point here and have a look at lErrorObj with // Monitor Locals under the debugger, it's NOT AN OBJECT anymore! IF lErrorObj:cargo LOOP ELSE EXIT ENDIF END SEQUENCE ENDDO SET DEVICE TO SCREEN RETURN NIL ********************** ** ERROR.prg ** ** compile with /N ** ********************** #include "Error.Ch" FUNCTION errorsys // set up new error handler ERRORBLOCK( { | lErrorObj | ErrorTest( lErrorObj ) } ) RETURN NIL FUNCTION ErrorTest( lErrorObj ) LOCAL lChoice,lSetDevice IF lErrorObj:genCode == EG_PRINT .AND. lErrorObj:canRetry lSetDevice := SET( _SET_DEVICE,"SCREEN" ) lChoice := ALERT( "Printer Error", { "Abort","Retry","Restart" } ) SET( _SET_DEVICE,lSetDevice ) IF lChoice <> 2 lErrorObj:cargo := ( lChoice == 3 ) BREAK // I also tried BREAK( lChoice == 3 ) ENDIF // and BREAK( lErrorObj ) but it acts ENDIF // the same way RETURN ( lChoice == 2 ) ^bCause^b Unknown. ^bWork Around(s)^b Code would be unique to each incidence. ============================================================================== CLD Debugger anomalies. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b 1) The debugger will indicate incorrect variable values following a PARAMETERS statement. 2) The debugger will not return the values stored in cargo when the values are contained in a multi-dimensioned array; e.g: ? oTb:cargo[1,1] no workee. 3) The debugger returns the row/column in the debugger when queried, not the ROW() / COL() in the application. ^bCause^b 1 - 3 Unknown. ^bWork Around(s)^b 1) If possible, avoid using the PARAMETERS statement. 2) & 3) Assign to a variable, then query the variable; e.g.; #ifdef TEST aVar := oTb:cargo #endif Then ? aVar[1,1] when in the debugger. ============================================================================== COL() COL() returns 0 after MENU TO. ^bClipper Version^b 1.29 dtd 04/15/91. ^bGeneral Statement^b COL() will return the column at the end of the prompt if queried before the MENU TO. It returns 0 after the MENU TO. ============================================================================== Browse:footSep Documentation ommission. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b browse:footSep is missing from the documentation. This is a footing separator for the browse object. It may be overridden by a col:footSep. ^bCause^b Documentation ommission. ^bWork Around(s)^b Annotate your manual to include this Instance Variable. ============================================================================== CLOSE-UP Problem with CLOSE-UP remote operation. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b Keys may not be recognized when using CLOSE-UP remote operation. ^bCause^b Incorrect CLOSE-UP settings. ^bWork Around(s)^b Set CLOSE-UP keys to Advanced (requires version 3.0A). ============================================================================== COMPILER Miscellaneous observations. ^bClipper Version^b 1.29 dtd 04/15/91. ^bObservations^b 1) IF the /P parameter is used in SET CLIPPERCMD and in the command line, the result is no .ppo file. 2) Reminder, per the manual, pg. 3-2, SET CLIPPERCMD or command line options MUST be separated by a space (or the remainder will be ignored). 3) /O Compiler Option ( Programming and Utilities Guide, pg 3-10) If only a path is supplied, it must end with \. 4) Compiler error documentation is incomplete; e.g., Fatal error 3039, phase error is not documented. ============================================================================== DBCREATEIND() Requires parameter. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The NG states that the third parameter, , is optional. ^bWork Around(s)^b Revise your documentation. ============================================================================== DBEDIT()* Locks up with return value of 2. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b When a UDF returns a value of 2, DBEdit locks up. ^bCause^b Unknown. ^bWork Around(s)^b 1) Use TBrowse. 2) If you still want to use DBEdit, then: a) save the recno() of the following record b) "go top" c) go to the saved recno() d) _then_ refresh your screen. ============================================================================== DBF FILES Assure proper closing. ^bClipper Version^b 1.29 dtd 04/15/91. ^bGeneral Comment^b 5.01 is very sensitive about work area management. Assure that files, including indices, are properly closed before attempting things such as APPEND FROM. ============================================================================== DBU Locks up with empty file. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The "Getting Started" manual, page 4-8, indicates, to add a record to an empty file, 'just start typing'. This will cause a lock-up. ^bCause^b Documentation error. ^bWork Around(s)^b Press K_DOWN, before typing other characters. ============================================================================== Division by Zero Results in zero. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b Division by zero results in zero vis-a-vis a run time error in S'87. ^bWork Around(s)^b a) Test divisors for zero and return whatever you desire. b) See Clipper 5.01 ErrorSys for trapping this occassion. ============================================================================== DOS 5.0 Using PLL's with DOS 5.0. ^bClipper Version^b 1.29 dtd 04/15/91. ^bGeneral Comment^b If you encounter a problem executing an application.EXE and you are using a PLL try: a) LOADFIX App b) Re-making the PLL file under DOS 5.0 c) Executing the application from a batch file which 'eats up' some of the memory in the first 64Kb segment; e.g., @echo off command /e:32000 /c %1 %2 %3 %4 %5 %6 %7 ============================================================================== DOS ERROR 4 Encountered on a network. ^bClipper Version^b 1.29 dtd 04/15/91. ^bGeneral Comment^b If you encounter DOS Error 4 on a network, check that your SHELL.CFG file has a sufficent number of files specified. Without a FILES= statement, the default will be 40 (Novell). ============================================================================== FIELDBLOCK() Does not return NIL for invalid cFieldName ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The NG erroneously states that FIELDBLOCK will return NIL if is not in the current work area. FIELDBLOCK will return a code block, which, when evaluated, will cause a runtime error. ^bWork Around(s)^b Verify fields, before using FIELDBLOCK. ============================================================================== ============================================================================== FIELDWBLOCK() Does not return NIL for invalid cFieldName ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The NG erroneously states that FIELDWBLOCK will return NIL if is not in the designated work area. FIELDBLOCK will return a code block, which, when evaluated, will cause a runtime error. ^bWork Around(s)^b Verify fields, before using FIELDWBLOCK. ============================================================================== ============================================================================== ERRORSYS.PRG Not compatible with S'87. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b Clipper 5.0's ERRORSYS.PRG is incompatible with S'87 routines. ^bWork Around(s)^b Use the new ErrorSys. ^bNote:^b You may wish to download ERS501.ZIP from Nanforum for S'87 to 5.01 compatibilty solutions. ============================================================================== Get:Delete() Documentation omission. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b Get:Delete() Syntax is not in documentation. ^bCause^b Documentation omission. ^bWork Around(s)^b Annotate your documentation to add the definition to the GET Class, Cursor Movement Methods definitions delete() Deletes the character under the cursor ============================================================================== Get:Subscript() Works the same on any dimension array. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The NG states that Get:Subscript() returns a number for a single dimension array. Get:Subscript() returns an array of number(s) for any dimension array. ^bCause^b Documentation error. ^bWork Around(s)^b Annotate your documentation. ============================================================================== INTERNAL ERRORS No documentation. See User-upload, CL5IEn.ZIP ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b Nantucket(r) has not supplied Internal Error documentation. ^bWork Around^b None; however, CL5IEn.ZIP in the NanForum library may be of some help. ============================================================================== JOIN FIELDS statement required for secondary fields. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b Join will not incorporate secondary file fields, unless so specified by the FIELDS argument. This is different than S'87, but noted in the docs. ^bWork Around^b Use FIELDS argument if you want to include secondary fields in your resultant .dbf. ============================================================================== LOCAL Inline assignment clarification. ^bClipper Version^b 1.29 dtd 04/15/91. ^bClarification:^b Inline assignments of the following form: LOCAL a := b := c:= 0 result in LOCAL a and PRIVATE b and c. Use: LOCAL a, b, c a := b := c := 0 Further, LOCAL x := 1, y := x + 2, z := y + 4 will cause a run-time error: BASE/1081 Argument Error: +. Use: LOCAL x, y, z x := 1; y := x + 2; z := y + 4 or LOCAL x := 1 LOCAL y := x + 2 LOCAL z := y + 4 ============================================================================== Macro Compiler Unacceptable codeblock contents. ^b^CB3D^CB3 ^CB3 ^CB3 ^CB3^b ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The macro compiler cannot handle the following types of things when attempting to compile a code block: 1) Assignment, Increment and Decrement Operators; e.g., :=, ++. 2) A nested code block. ^bCause^b Unknown. ^bWork Around(s)^b When possible, substitute an acceptable expression; e.g., var + 1. ============================================================================== MISC Miscellaneous clarification/anomalies. ^bClipper Version^b 1.29 dtd 04/15/91. 1) NDX File Support ( Card contained with Clipper 5.0 ) You must request this feature from Nantucket(r). Not available as of early June. 2) MEMVARBLOCK() (NG Function Description) MEMVARBLOCK() cannot be used to create set-get blocks for LOCAL or STATIC variables. 3) Code block parameter visibility - documentation anomaly. Page 1-21 of the Clipper 5 Reference, last sentence, 2nd paragraph reads: "....a declaration that occurs within a code block (a block parameter), applies to that code block and any code blocks nested within it.". The block parameter IS NOT visible to nested code blocks, unless you pass it. 4) Menu.prg example on page 1-2 of the Reference Manual has as its first line '#include "Database.prg" ...'. This directive should be placed at the end of the program (it includes generic database functions). 5) STATIC arrays. Documentation anomaly, pg. 1-57. Contrary to the documentation, STATIC arrays are also dynamic. 6) The following program results in a run-time error because x was not initialized; however, the error message, "Error BASE/1087 Argument error: -- " should reference ++ instead. function main local x x++ return nil 7) The COPY FILE command doesn't throw an error to the error handler if there is an "out of drive space" error. 8) An corrupted index error may refer to the prior index in a list. 9) There _is_ a, to be defined, limit to what TBrowse can handle in terms of number of fields versus screen display rows. 10) A memory overbooked error may be caused by too many #define statements. 11) When using @ .. GET aArray[nCtr] VALID SomeFunc(oGet) in a FOR nCtr .. loop, the nCtr can't be used in SomeFunc(oGet), (it will have a value of n + 1). Use oGet:getVar() to retrieve the get value for validation. ============================================================================== MEMORY() Memory(3) and (4) undocumented. ^bClipper Version^b 1.29 dtd 04/15/91. Memory(3) returns the approximate amount of memory allocated to the SVOS. Memory(4) returns the amount of Expanded Memory available. ============================================================================== MEMOLINE() Minimum is 1. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The minimum for the parameter has been reduced to 1. This has not been documented. ^bCause^b N/A. ^bWork Around(s)^b Annotate your documentation. ============================================================================== MLCOUNT() Minimum is 1. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The minimum for the parameter has been reduced to 1. This has not been documented. ^bCause^b N/A. ^bWork Around(s)^b Annotate your documentation. ============================================================================== MLCTOPOS() Position reporting error. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b If Word Wrap is ON _and_ the line preceeding the one for which the position is being determined is either the same length or length -1 of the line length specified in the function call. ( For example, if nLine_Len is specified as 66 and a call is made to a row/columnn where the previous physical line is either 65 or 66 characters long.) - per DORMAN BLACKMAN 73047,177. MLCTOPOS() will report the position of the previous chr(141) character, regardless of where the cursor is on the line. ^bCause^b Unknown. ^bWork Around(s)^b Unknown. ============================================================================== ============================================================================== MLPOS() Position reporting error. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b If Word Wrap is ON _and_ the line preceeding the one for which the position is being determined is either the same length or length -1 of the line length specified in the function call. ( For example, if nLine_Len is specified as 66 and a call is made to a row/columnn where the previous physical line is either 65 or 66 characters long.) - per DORMAN BLACKMAN 73047,177. MLPOS() will report a position that is 2 less than the actual line starting position. This only applies to the 1st line following the 'long line'. It corrects itself on the 2nd and subsequent lines (as long as there are no more 'long lines'). ^bCause^b Unknown. ^bWork Around(s)^b Use MLPOS() to determine nlOffset (line offset) and add 2 if SUBSTR(cMemo, nlOffset, 1) == Chr(141). ============================================================================== ============================================================================== MPOSTOLC() Position reporting error. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b If Word Wrap is ON _and_ the line preceeding the one for which the position is being determined is either the same length or length -1 of the line length specified in the function call. ( For example, if nLine_Len is specified as 66 and a call is made to a row/columnn where the previous physical line is either 65 or 66 characters long.) - per DORMAN BLACKMAN 73047,177. MPOSTOLC() has an offset error of plus 3. ^bCause^b Unknown. ^bWork Around(s)^b Unknown. ============================================================================== ============================================================================== MULTI-STATEMENT Multi-statement lines, CAUTION. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b When using multiple statements on one programming line; i.e.; separating commands with a semi-colon; there are several commands which will cause erroneous results, if they are not at the end of line. ^bCause^b Pre-processor action. ^bWork Around(s)^b Make sure that the following commands, if used, appear at the end of the line, ONLY. ENDDO <*x*> SET STEP <*x*> ENDIF <*x*> SET SAFETY <*x*> ENDCASE <*x*> SET TALK <*x*> ENDFOR <*x*> SET PATH TO <*path*> SET ECHO <*x*> SET COLOR TO <*spec*> SET HEADING <*x*> SET COLOUR TO <*spec*> SET MENU <*x*> RUN <*cmd*> SET STATUS <*x*> ! <*cmd*> COPY TO <(file)> DELIMITED WITH <*delim*> APPEND FROM <(file)> DELIMITED WITH <*delim*> ============================================================================== NETWORKS Seeks and Indexing comments. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b per Darren DeLoach [76264,1042] 1) A bug exists which can result in failed SEEK statements on a workstation whenever _another_ workstation on the network edits the logical top record in the file to have a new index key which moves it in the index such that it is no longer at the logical top-of-file. Other stations do not see the new index value in the NTX pages, and so incorrectly perform SEEKs in the file. The problem only occurs with the logical first record in the file; adding new records does not cause the problem, even if you are adding the first record in the file. 2) General comment on indexing (see workaround #2). ^bCause^b 1) Unknown. 2) N/A ^bWork Around(s)^b 1) Setting SOFTSEEK ON seems to make SEEK perform correctly. A GO TOP before the SEEK worked in one specific case, but is not guaranteed to work in all situations. 2) A user has reported that the following methodology has eliminated problems he was having with indices: Lock the File Index the File Close the Index UnLock the File Set Index to ... ============================================================================== NG MODE Un-documented Norton(r) Guide Mode. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b NG can be executed in a mode which will permit it to unload from memory when F10 or Escape is used to exit the program. ^bCause^b Documentation omission. ^bWork Around(s)^b Enter NG TEST.NG at the DOS prompt. When NG receives the specific parameter TEST.NG, it will load in the above described mode. Annotate your documentation. ^bNote^b TEST.NG is the specific parameter to be used. This is NOT the name of an existing file. ============================================================================== NOSNOW() Returns lState, not NIL ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b NOSNOW( ) returns a logical value indicating current setting, not NIL, as stated in the NG. ^bCause^b N/A. ^bWork Around(s)^b Annotate your documentation. ============================================================================== PICTURE Comments on 5.01's PICTURE clause. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b 1) The PICTURE clause will not increase a variable's length. Example: cVar := "" @ row, col get cVar PICTURE "!!!!!" // Does not work. 2) The PICTURE format function, "@Z #" does not perform per S'87. Assuming the get variable is zero, the active get will display 0. Note: Clipper 5.01 documentation has been changed. 3) The GET PICTURE format function, "@S" performs differently than S'87; i.e., large values of will not wrap to the next line(s). Clipper 5.01 documentation reflects this change. 4) The PICTURE format function "@( " does not work correctly with commas in the picture clause; e.g., try entering -100 below: LOCAL x:= -10, Getlist := {} @ 10, 10 SAY "Enter" GET x PICTURE "@( 99,999" READ 5) The PICTURE format function "@R " may not work correctly with character strings; e.g.: LOCAL x:= "213", Getlist := {} @ 10, 10 SAY "Enter" GET x PICTURE "@R (999)" READ Note: numerical vars are formatted correctly. ============================================================================== PROMPT MESSAGE Comments on usage. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b 1) Undocumented feature. @...PROMPT...[MESSAGE] documentation does not indicate that the message may be a code block as well as a . 2) The CENTER clause is off by one column; i.e., a centered message will be 1 column to the left of the desired position. ^bCause^b 1) N/A. 2) Nan Goof. ^bWork Around(s)^b 1) Annotate your documentation. 2) Use the undocumented feature to call a function which centers the message correctly. Example: @ 10, 10 PROMPT "Hello" MESSAGE {|| Showit("John") } MENU TO nChoice FUNCTION ShowIt(cString) LOCAL nRow := SET(_SET_MESSAGE), nCol nCol := INT( (MAXCOL() + 1 - LEN(TRIM(cString))) / 2 ) DEVPOS( nRow, nCol ) ; QQOUT( TRIM(cString) ) RETURN ("") ============================================================================== RANGE Not verified unless 'get' is changed. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b When using @...[SAY]...GET...RANGE, the range will not be verified unless the get is changed. ^bCause^b RangeCheck() function in GETSYS.PRG ^bWork Around(s)^b Modify your copy of GetSys.prg, if this action is unacceptable. ============================================================================== RESTORE Problem with change to higher level privates. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b RESTSTORE FROM ADDITIVE may change the value(s) of higher level privates. An example: // Run this as a standalone program: Procedure MemSave Memvar VarA Private VarA VarA := 'ABCDEF' Save to Test All Like VarA Return // Then run this: Procedure A Memvar V1 Private V1 V1 = 1 ? 'Procedure A, V1 Should be 1, V1=',V1 // => 1 Do B ? 'Procedure A, V1 Should be 1, V1=',V1 // => 2 Return *********** Procedure B Memvar V1 Private V1 V1 = 2 ? 'Procedure B, V1 Should be 2, V1=',V1 // => 2 Do C ? 'Procedure B, V1 Should be 2, V1=',V1 // => 3 Return *********** Procedure C MemVar V1 Private V1 V1 = 3 ? 'Procedure C, V1 Should be 3, V1=',V1 // => 3 RESTORE FROM Test ADDITIVE Return ^bCause^b Unknown ^bWork Around(s)^b Don't store variables in .MEM files. ============================================================================== RESTSCREEN() Undocumented defaults. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b RESTSCREEN() defaults to 0, 0, MaxRow(), MaxCol() if these parameters are NIL. ^bCause^b N/A. ^bWork Around(s)^b Annotate your documentation. ============================================================================== ============================================================================== RMAKE > Omit spaces when re-directing error output. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b This re-direction of error output statement does not work: // Inference rule to compile .prg.obj: clipper $** $(options) > comperr.txt ^bCause^b N/A. ^bWork Around^b Remove the spaces surrounding the >; i.e., clipper $** $(options)>comperr.txt ============================================================================== REINDEX Does not re-create index file header. ^bClipper Version^b 1.29 dtd 04/15/91 (and Summer '87) ^bProblem Statement^b REINDEX uses the existing index file header. If this is corrupted, the resultant index file will also be invalid. ^bCause^b N/A ^bWork Around(s)^b 1) Use INDEX ON to create new indices. Some users have suggested erasing the existing index file prior to INDEX ON usage. ============================================================================== REPORT FORM Anomalies with Report forms. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b 1) Multi-line reports cannot be printed using the string +";"+ string method. 2) REPORT ... HEADING ".." cannot be printed using the +";"+ method. 3) The Group Eject option is not implemented. 4) Command line parameters NOEJECT and SUMMARY incorrectly implemented. 5) SubSubTotal problem. 6) First page line counting error. 7) Wasted header spacing. 8) SET PATH problem in FRMBACK.PRG. 9) Potential run-time error due to ListAsArray() in FRMBACK.PRG. ^bCause^b Errors and Ommissions ^bWork Around(s)^b 8) Edit Line 154 in FRMBACK.PRG as follows: Change: paths := ListAsArray( s ) To read: paths := ListAsArray( s, ";") 9) Edit ListAsArray() to check for nWidth > 0. The following works for me: FUNCTION ListasArray(cList, cDelim, nWide) LOCAL aList := {}, lNum cDelim := IF(VALTYPE(cDelim) == 'C', cDelim, ";") cList := TRIM( STRTRAN(cList, cdelim, chr(13)+chr(10)) ) nWide := IF( (lNum := (VALTYPE(nWide) == 'N' .and. nWide > 0 )), ; nWide, LEN(cList) ) aList := ARRAY(MLCOUNT(cList,nWide,1,.T.)) AEVAL(aList, {|a,e| ; aList[e] := IF(lNum, MEMOLINE(cList,nWide,e,1,.T.),; TRIM(MEMOLINE(cList,nWide,e,1,.T.)))}) RETURN aList ^bNotes^b C5REP6.ZIP, on NANFORUM, contains a FrmRun.prg which fixes 1 - 7, above. ============================================================================== RESERVED WORDS Comments on reserved words. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b Numerous users have reported problems which have been traced to the use of variable names which conflict with Clipper 5.0 commands or statements. ^bWork Around(s)^b Exercise caution in the choice of variable names. Remember, if your variable name is four characters long and these characters match the first four letters of a Clipper 5.0 or UDC command, you've got problems. Just avoid this situation as well as names that match Clipper 5.0 commands and statements. Remember also, If you create a UDF of the same name as a Clipper 5.0 function, its action will supersede Clipper's. ============================================================================== RL Use with caution. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b 5.01's RL utility is a warmed over Summer '87. It inherits the anomalies of it's parent. F1 Help is not incorporated. Some of the things to watch out for are: 1) Adding an extra column inadvertently. 2) Totaling the last column. 3) The eject before/after print options. ^bCause^b Programming errors. ^bWork Around(s)^b Use PgUp to save 'gets'. On item 2, save the report without indicating totals and then try a second time. Re-write RL. ============================================================================== ROUND() Returns unpredictable results. ^bClipper Version^b 1.29 dtd 04/15/91 (and Summer '87). ^bProblem Statement^b The ROUND() function, like its predecessor in S'87, does not return the desired result, in certain cases. ^bCause^b Unknown. ^bWork Around(s)^b The following function seems to do the trick: FUNCTION ROUNDIT(nNumber, nPlaces) nPlaces := IF( nPlaces == NIL, 0, nPlaces ) RETURN IF(nNumber < 0.0, -1.0, 1.0) * ; INT( ABS(nNumber) * 10 ^^ nPlaces + 0.50 + 10 ^^ -12 ) / 10 ^^ nPlaces ^bNotes^b FYI, here are some particularly unique numbers which do not Round() up. 1.265 146.795 8.245 18.435 10.165 16.685 1.025 4.645 8.155 35.105 286.335 4.515 4.225 ============================================================================== SAVESCREEN() Undocumented defaults. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b SAVESCREEN() defaults to 0, 0, MaxRow(), MaxCol() if these parameters are missing. ^bCause^b N/A. ^bWork Around(s)^b Annotate your documentation. ============================================================================== ============================================================================== SCREEN Misc. SETMODE(), SETBLINK(), SETCOLOR() ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b 1) Cursor anomalies. Try using SET CLIPPER=CGACURS if you are experiencing cursor anomalies. Reference: NG Environment. 2) A 'splash of color' may remain at 0, 65 after using SETCOLOR() and GET. This can be eliminated by SET SCOREBOARD OFF. 3) SETBLINK(), SETMODE() (NG Function Descriptions) These are environmental or screen attributes; hence, they will change the full screen when invoked. You may want to save the screen before invoking either of these functions. SETMODE() should be followed by a CLS or CLEAR SCREEN. The following routine will put the display in 50 row mode and turn off the cursor - on an IBM PS/2 Model 80. SetMode(50,80) Cls SetCursor(1) FOR nI := 1.0 to 250; NEXT // Adjust delay as required. SetCursor(0) Similar programming is required when returning to 25 row mode. SETBLINK() is a tricky little devil. Despite the fact that its alleged default is .T., it may be necessary to issue SetBlink(.T.) before any blinking will occur. Further, it may be necessary to re-issue a SetColor(cVar) after the SetBlink(lVar) call. Takes a little experimentation . Note that a string saved by Set(_SET_COLOR), containing an * will end up with a + in its place. ============================================================================== SET() Missing Documentation. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b 1) SET(_SET_EXTRA, ) and SET(_SET_TYPEAHEAD, ) are missing from the documentation. 2) SET(_SET_EXTRA) always returns NIL, not it's present state. ^bCause^b Unknown. ^bWork Around(s)^b SET(_SET_EXTRA) is similar to SET(_SET_ALTERNATE) and SET(_SET_TYPEAHEAD) is similar to SET TYPEAHEAD TO. Annotate your documentation. ============================================================================== SET CLIPPER SET CLIPPER syntax ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b There is a problem in 5.01 with how Clipper applications read the CLIPPER environment variable. ^bCause^b Unknown. ^bWork Around(s)^b Prefix all settings with a // and put a space between them. Put a colon between the setting and its value. For example: SET CLIPPER=//F:50 //SWAPPATH:'C:\TEMP' //TEMPPATH:'C:\TEMP' ============================================================================== SET COLOUR Incorrect syntax in STD.CH. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b SET COLOUR directives in STD.CH need to be changed to enable command recognition. ^bCause^b Incorrect programming. ^bWork Around(s)^b #command SET COLOUR TO [<*spec*>] => SetColor( # ) or #command SET COLOUR TO [<*spec*>] => SET COLOR TO ============================================================================== SWAPPATH 60 Character limit. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The SWAPPATH environmental statement is limited to 60 characters. ^bCause^b Unknown ^bWork Around(s)^b Annotate your documentation. ============================================================================== ============================================================================== TBROWSE Miscellaneous Comments ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b 1) oTb:Freeze must be defined _after_ the column to be frozen is added to the browse object. 2) oTb:setColumn returns the browse object, not the column object as stated in the NG. 3) oTb:colorSpec affects the color outside the browse window. Use SetColor() before writing to this area. ============================================================================== TEMPPATH 60 Character limit. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The TEMPPATH environmental statement is limited to 60 characters. ^bCause^b Unknown ^bWork Around(s)^b Annotate your documentation. ============================================================================== ============================================================================== TEXT* TO PRINTER _or_ TO FILE ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b The syntax description, in the documentation, indicates [TO PRINTER] [TO FILE ()]. Only one of these options may be used at a time. ^bCause^b STD.CH or documentation error. ^bWork Around(s)^b Unknown. ============================================================================== TYPE() Comments on Clipper 5.0 return values. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b 1) TYPE("LocalVar" or "StaticVar") returns 'U'. 2) Successive uses of TYPE may produce erroneous values; e.g., ? TYPE( "{| a | Foo( a ), }" ) // Prints "UE", syntax error. ? TYPE( "{| a | Foo( a ), .T. }" ) // Error has been corrected, but // TYPE() still returns "UE". ? TYPE( "{| a | Foo( a ), .T. }" ) // This time, TYPE() returns "B". ^bCause^b 1) TYPE("xVar") uses macro expansion to evaluate variables. 2) Unknown. ^bWork Around(s)^b 1) Use VALTYPE(var) 2) Use a function; e.g., the following by Michael Vivino 72210,2630 FUNCTION ChkBlock( cBlock ) TYPE( "{|| .T. }" ) // reset any prior error by passing // a valid block to type() RETURN TYPE( cBlock ) == [B] // Now syntax-check the passed block ^bNotes^b TYPE("Undeclared_Var") Returns 'U' VALTYPE("Undeclared_Var") Returns runtime error ============================================================================== TYPEAHEAD Typeahead cannot be set in the 1 to 15 range. ^bClipper Version^b 1.29 dtd 04/15/91. ^bProblem Statement^b SET TYPEAHEAD TO or SET(_SET_TYPEAHEAD, ) do not react to numbers less than the DOS buffer (except 0). ^bCause^b Unknown. ^bWork Around(s)^b per Chuck Friedel [76467,706] *--------------- FUNCTION strokes ( nCount ) *--------------- * retain specified number of keystrokes (oldest) *--------------- LOCAL nKey, cChrs := "" DO WHILE nCount-- > 0 .AND. ( nKey := INKEY() ) # 0 IF nKey < 0 .OR. nKey > 255 // outside CHR()'s range RETURN NIL ENDIF cChrs += CHR( nKey ) ENDDO KEYBOARD ( cChrs ) RETURN NIL ============================================================================== \SOURCE\SYS Comments on \CLIPPER5\SOURCE\SYS\ Files. The following files in the \CLIPPER5\SOURCE\SYS sub-directory are hard coded in CLIPPER.EXE. They may be modified, compiled and linked to make changes. FRMDEF.CH LBLBACK.PRG FRMBACK.PRG LBLRUN.PRG FRMRUN.PRG ERRORSYS.PRG LBLDEF.CH GETSYS.PRG Credits That's Thanks Folks! My Thanks to the Sysops and Members of CompuServe for their countless hours of cussing, working and losing sleep to present solutions to the anomalies presented herein. Keep up the Good Work! This is NOT an official Nantucket(r) publication. Please report errors and ommissions to: Jo W. French 74730,1751