* * Name : Array Browser * : This is a development tool that allows to view an array in the Browse window * * Note 1 : The colum Name format : <T>_<C>_<L> * T - Column type, V if there are diff types of values in the column * C - Column Number * L - Max len requered to represent value in this column. * Add only in the columns with data types of variable size. * * Note 2 : The BrowseArrayCursor cursor isn't closed to allow BROWSE NOWAIT * * Author : Sergey Berezniker * : Version 1.0.12 07/26/2007 * Email : sergeyber@gmail.com * : This program is placed into Public domain. Comments and suggestions are welcome. * * Change : 19.03.2002 by Daniel Gramunt: Optional parameter < tcCaption > added * 03/19/2002 by --SB-- : Modified the BROWSE command to display in the desktop. * 04/24/2002 by --SB-- : Fixed problem with the objects in the array. * 04/25/2002 by --SB-- : The size isn't added to the column name with fixed size data types in it * 07/26/2007 by --SB-- : Fixed bug with SET FIXED ON reported by Agnes Beste on UT LPARAMETER taArray, tcCaption LOCAL lcTalkOld, lcOldArea, lcFixedOld LOCAL lnRows, lnCols, lnI, lnJ, lcType, lnSize, ll1d, lnDec, lcRow, llAddSize, lvValue, laStru[1], lcCaption lcTalkOld = SET("TALK") SET TALK OFF lcFixedOld = SET("Fixed") SET FIXED OFF lcOldArea = SELECT() * Make sure that parameter passed is an array IF TYPE("taArray[1]") = "U" MessageBox("Please pass array by reference!", 48, PROGRAM() + " - Array Browser") SET TALK &lcTalkOld RETURN .F. ENDIF lcCaption = IIF(TYPE("tcCaption")="C" AND NOT EMPTY(tcCaption),; tcCaption, "BrowseArrayCursor" ) * Makes a cursor out of a one or two-dimensional array and browses it * Controls if the MAX size of the value in the column is added * to the column name llAddSize = .T. * Figure out the size of an array lnRows = ALEN(taArray,1) lnCols = MAX( ALEN(taArray,2), 1 ) ll1d = (lnCols = 1) && Is array 1D? DIMENSION laStru(lnCols+1, 16) lcRow = "" laStru = "" * Create an array with cursor structure definition FOR lnI = 1 TO lnCols lcCol = Transform(lnI) lvValue = taArray( 1, lni ) laStru[ lnI, 1 ] = VARTYPE(lvValue ) laStru[ lnI, 2 ] = "C" lnSize = 1 FOR lnJ = 1 TO lnRows IF ll1d lvValue = taArray( lnJ ) ELSE lvValue = taArray( lnJ, lnI ) ENDIF IF laStru[ lnI, 1 ] <> TYPE( "lvValue" ) laStru[ lnI, 1 ] = "V" ENDIF * --sb-- 04/24/2002 -- Fixed a problem with an object in array element lnSize = MAX( lnSize, LEN( B_R_Transform( lvValue))) ENDFOR laStru[ lnI, 1 ] = laStru[ lnI, 1 ] + "_" + lcCol * --sb-- 04/25/2002 -- Don't add size if it's fixed for that data type IF llAddSize AND NOT Inlist(Left(laStru[ lnI, 1],1), "L", "D", "I", "T", "O", "G") laStru[ lnI, 1 ] = laStru[ lnI, 1 ] + "_" + Transform(lnSize) ENDIF lnSize = MIN( 254, lnSize) laStru[ lnI, 3 ] = lnSize laStru[ lnI, 4 ] = 0 laStru[ lnI, 5 ] = .F. laStru[ lnI, 6 ] = .F. * Create "insert into" values clause * --sb-- 04/24/2002 -- Fixed problem with an object in array element lcRow = lcRow + IIF(EMPTY( lcRow ), "", ", ") + ; "B_R_Transform( taArray[lnI" + IIF(ll1d, "", "," +lcCol) + "] )" ENDFOR lnI = ALEN(laStru,1) laStru[ lnI, 1 ] = "Row_______" laStru[ lnI, 2 ] = "N" laStru[ lnI, 3 ] = 7 laStru[ lnI, 4 ] = 0 laStru[ lnI, 5 ] = .F. laStru[ lnI, 6 ] = .F. lcRow = lcRow + ", 0" * Make a cursor with fields defined by laStru CREATE CURSOR BrowseArrayCursor FROM ARRAY laStru * Add rows into cursor FOR lnI = 1 TO lnRows INSERT INTO BrowseArrayCursor VALUES ( &lcRow ) ENDFOR REPLACE ALL Row_______ WITH RECNO() GO TOP *KEYBOARD "{CTRL+F10}" CLEAR BROWSE NOWAIT IN SCREEN NORMAL TITLE (lcCaption) SELECT (lcOldArea) SET FIXED &lcFixedOld SET TALK &lcTalkOld RETURN *------------------------------------------------------- * Function returns "(Obj)" if the passed value is an object * otherwise it works like Transform() w/o 2nd parameter FUNCTION B_R_Transform(tvVal) RETURN Iif(Vartype(tvVal)="O", "(Obj)", Transform(tvVal))