Tu pregunta me ha hecho recordar el cΓ³digo que publicΓ³ Rick Spence para hacer browse de un texto sin importar la longitud que este tenga
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: BrowText() β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 12, 1994 β
Β¦β β
Β¦β Notes.........: Browsing of a text file. β
Β¦β β
Β¦β β
Β¦β Parameters....: nTop NUMERIC β
Β¦β Top Row Position on Screen β
Β¦β nLeft NUMERIC β
Β¦β Left Column Position on Screen β
Β¦β nBottom NUMERIC β
Β¦β Bottom Row Position on Screen β
Β¦β nRight NUMERIC β
Β¦β Right Column Position on Screen β
Β¦β cFileName CHARACTER β
Β¦β Name of file to browse β
Β¦β [lFrame] LOGICAL β
Β¦β Display a frame around the browse window β
Β¦β β
Β¦β Returns.......: NIL β
Β¦β β
Β¦β Functions.....: FileInit(), Skipper(), GetLast(), β
Β¦β GetFirst(), GoPrevLn(), GoNextLn(), β
Β¦β FReadLn(), TBrowse(), StdMeth() β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
#include "inkey.ch"
#xtranslate FALSE => .F.
#xtranslate TRUE => .T.
#xtranslate CR => Chr(13)
#xtranslate LF => Chr(10)
#xtranslate CRLF => CR + LF
#command DEFAULT <variable1> TO <value1> [, <variableN> TO <valueN> ] => ;
IF <variable1> == NIL; <variable1> := <value1>; END;
[; IF <variableN> == NIL; <variableN> := <valueN>; END ]
STATIC cLine, ; // Current Line
nFileSize // File Size
#include "fileio.ch"
#define FTELL(nHandle) FSEEK(nHandle, 0, FS_RELATIVE)
#define MAX_LINE_LEN 256
FUNCTION BrowText( nTop, nLeft, nBottom, nRight, cFileName, lFrame )
LOCAL oBrowse, ; // Browse Object
oCol, ; // Browse Column Object
nHandle // File Handle
DEFAULT nTop TO 0, nLeft TO 0, nBottom TO MAXROW(), nRight TO MAXCOL(), ;
lFrame TO TRUE
// Open the file
nHandle := FileInit(cFileName)
IF nHandle == 0
RETURN NIL
ENDIF
// Display the frame adjust the coordinates for the browse object
IF lFrame
DISPBOX(nTop, nLeft, nBottom, nRight)
nTop++
nLeft++
nBottom--
nRight--
ENDIF
// Create the browse object
oBrowse := TBROWSENEW(nTop, nLeft, nBottom, nRight)
// Create the first column object
oCol := TBCOLUMNNEW(, {|| cLine })
oCol:width := (nRight - nLeft) + 1
oBrowse:addColumn(oCol)
// Create the second column object
oCol := TBCOLUMNNEW(, {|| SUBSTR(cLine, (nRight - nLeft) + 2) })
oCol:width := (nRight - nLeft) + 1
oBrowse:addColumn(oCol)
// Browse movement blocks
oBrowse:goBottomBlock := {|| GetLast(nHandle) }
oBrowse:goTopBlock := {|| GetFirst(nHandle) }
oBrowse:skipBlock := {|n| Skipper(n, nHandle) }
// Activate it...
TBrowse(oBrowse)
// Close the file
FCLOSE(nHandle)
RETURN NIL
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: Skipper() β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 10, 1994 β
Β¦β β
Β¦β Notes.........: Attempts to skip a specified number of rows in the β
Β¦β browse window. β
Β¦β β
Β¦β β
Β¦β Parameters....: nSkip NUMERIC β
Β¦β Number of rows to skip β
Β¦β nHandle NUMERIC β
Β¦β File Handle β
Β¦β β
Β¦β β
Β¦β Returns.......: Number of rows successfully skipped β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
STATIC FUNCTION Skipper( nSkip, nHandle )
LOCAL nSkipped := 0
// Skip down
IF nSkip > 0
DO WHILE nSkipped != nSkip .AND. GoNextLn( nHandle )
nSkipped++
ENDDO
// Skip Up
ELSE
DO WHILE nSkipped != nSkip .AND. GoPrevLn( nHandle )
nSkipped--
ENDDO
ENDIF
RETURN (nSkipped)
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: FileInit β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 12, 1994 β
Β¦β β
Β¦β Notes.........: Initialize the file to browse β
Β¦β β
Β¦β β
Β¦β Parameters....: nFname CHARACTER β
Β¦β Name of file to initialize β
Β¦β β
Β¦β β
Β¦β Returns.......: File Handle β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
STATIC FUNCTION FileInit( nFname )
LOCAL nHandle // File Handle
IF (nHandle := FOPEN(nFname)) > 0
FSEEK(nHandle, 0, FS_END)
nFileSize := FTELL(nHandle)
GetFirst(nHandle)
ENDIF
RETURN (nHandle)
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: GetLast() β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 10, 1994 β
Β¦β β
Β¦β Notes.........: Moves to the last line of the file β
Β¦β β
Β¦β β
Β¦β Parameters....: nHandle NUMERIC β
Β¦β File Handle β
Β¦β β
Β¦β Returns.......: NIL β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
STATIC FUNCTION GetLast( nHandle )
FSEEK(nHandle, -1, FS_END)
GoPrevLn( nHandle )
RETURN NIL
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: GetFirst() β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 10, 1994 β
Β¦β β
Β¦β Notes.........: Moves the file pointer to the first line of the file. β
Β¦β β
Β¦β β
Β¦β Parameters....: nHandle NUMERIC β
Β¦β File Handle β
Β¦β β
Β¦β β
Β¦β Returns.......: NIL β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
STATIC FUNCTION GetFirst( nHandle )
FSEEK(nHandle, 0, FS_SET)
FReadLn(nHandle, @cline)
FSEEK(nHandle, 0, FS_SET)
RETURN NIL
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: GoPrevLn β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 10, 1994 β
Β¦β β
Β¦β Notes.........: Move the file pointer to the previous line of the file.β
Β¦β β
Β¦β β
Β¦β Parameters....: nHandle NUMERIC β
Β¦β File Handle β
Β¦β β
Β¦β β
Β¦β Returns.......: TRUE if move was successful, or FALSE otherwise. β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
STATIC FUNCTION GoPrevLn( nHandle )
LOCAL nOrigPos, ; // Original File Pointer Position
nMaxRead, ; // Maximum Line Length
nNewPos, ; // New File Pointer Position
lMoved, ; // Pointer Moved
cBuff, ; // Line buffer
nWhereCrLf, ; // Position of CRLF
nPrev // Previous File Pointer Position
// Save Original file position
nOrigPos := FTELL(nHandle)
IF nOrigPos = 0
lMoved := FALSE
ELSE
lMoved := TRUE
IF nOrigPos != nFileSize
// Skip over preceeding CR / LF
FSEEK(nHandle, -2, FS_RELATIVE)
ENDIF
nMaxRead := MIN(MAX_LINE_LEN, FTELL(nHandle))
// Capture the line into a buffer, strip off the CRLF
cBuff := SPACE(nMaxRead)
nNewPos := FSEEK(nHandle, -nMaxRead, FS_RELATIVE)
FREAD(nHandle, @cBuff, nMaxRead)
nWhereCrLf := RAT(CRLF, cBuff)
IF nWhereCrLf = 0
nPrev := nNewPos
cLine = cBuff
ELSE
nPrev := nNewPos + nWhereCrLf + 1
cline := SUBSTR(cBuff, nWhereCrLf + 2)
ENDIF
// Move to the beginning of the line
FSEEK(nHandle, nPrev, FS_SET)
ENDIF
RETURN (lMoved)
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: GoNext β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 10, 1994 β
Β¦β β
Β¦β Notes.........: Try to move the File Pointer to the next line of the β
Β¦β file. β
Β¦β β
Β¦β β
Β¦β Parameters....: nHandle NUMERIC β
Β¦β File Handle β
Β¦β β
Β¦β β
Β¦β Returns.......: TRUE if move was successful, or FALSE otherwise. β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
STATIC FUNCTION GoNextLn( nHandle )
LOCAL nSavePos, ; // Save File pointer position
cBuff := "", ; // Line Buffer
lMoved, ; // Pointer Moved
nNewPos // New File Pointer Position
// Save the file pointer position
nSavePos := FTELL(nHandle)
// Find the end of the current line
FSEEK(nHandle, LEN(cLine) + 2, FS_RELATIVE)
nNewPos := FTELL(nHandle)
// Read in the next line
IF FReadLn(nHandle, @cBuff)
lMoved := TRUE
cLine := cBuff
FSEEK(nHandle, nNewPos, FS_SET)
ELSE
lMoved := FALSE
FSEEK(nHandle, nSavePos, FS_SET)
ENDIF
RETURN (lMoved)
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: FReadLn() β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 10, 1994 β
Β¦β β
Β¦β Notes.........: Reads the current line of the file into a buffer β
Β¦β β
Β¦β β
Β¦β β
Β¦β Parameters....: nHandle NUMERIC β
Β¦β File Handle Number β
Β¦β cBuffer CHARACTER β
Β¦β Line Buffer β
Β¦β β
Β¦β Returns.......: TRUE if anything was read in. β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
STATIC FUNCTION FReadLn( nHandle, cBuffer )
LOCAL nEOL, ; // End Of Line Postion
nRead, ; // Number of characters read
nSaveFPos // Saved File Postion
cBuffer = SPACE(MAX_LINE_LEN)
// First save current file pointer
nSaveFPos = FTELL(nHandle)
nRead = FREAD(nHandle, @cBuffer, MAX_LINE_LEN)
IF (nEOL := AT(CRLF, SUBSTR(cBuffer, 1, nRead))) = 0
// Line overflow or eof
// Cline has the line we need
ELSE
// Copy up to EOL
cBuffer = SUBSTR(cBuffer, 1, nEOL - 1)
// Position file pointer to next line
FSEEK(nHandle, nSaveFPos + nEOL + 1, FS_SET)
ENDIF
RETURN (nRead != 0)
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: TBrowse() β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 10, 1994 β
Β¦β β
Β¦β Notes.........: Pass tbrowse() a tbrowse object, and up to three code β
Β¦β blocks. The first is the code block to check for keys β
Β¦β before checking the standard keys, the second β
Β¦β indicates how long the user stays in the browse, the β
Β¦β third code block to check keys after the standard β
Β¦β keys have been checked. β
Β¦β β
Β¦β Parameters....: oBrowse OBJECT β
Β¦β TBrowse Object β
Β¦β [bBefore] BLOCK β
Β¦β Block to handle before keys β
Β¦β [bWhileCond] BLOCK β
Β¦β Block to exit of browse β
Β¦β [bAfter] BLOCK β
Β¦β Block to handle after keys β
Β¦β β
Β¦β Returns.......: NIL β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
STATIC FUNCTION TBrowse( oBrowse, bBefore, bWhileCond, bAfter )
LOCAL nKey, ; // ASCII Key Pressed
lExitRequested // Exit Requested
DEFAULT bBefore TO {|nKey| IF(nKey == K_ENTER .OR. nKey == K_ESC, ;
lExitRequested := TRUE, FALSE) }
DEFAULT bWhileCond TO {|| !lExitRequested}
DEFAULT bAfter TO {|| FALSE}
lExitRequested := FALSE
DO WHILE EVAL(bWhileCond, oBrowse)
DO WHILE NEXTKEY() = 0 .AND. !oBrowse:stabilize()
ENDDO
nKey = INKEY(0)
IF EVAL(bBefore, nKey, oBrowse)
// Processed key as before key
ELSEIF StdMeth(nKey, oBrowse)
// Processed key as standard key
ELSEIF oBrowse:stable .AND. EVAL(bAfter, nKey, oBrowse)
// Processed key as after key
ENDIF
ENDDO
RETURN NIL
/*
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β Function......: StdMeth β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Β¦β ORIGINAL β
Β¦β Programmer....: Rick Spence β
Β¦β Date..........: NA β
Β¦β β
Β¦β LAST MODIFICATION β
Β¦β Author........: Mark Nowakowski β
Β¦β Date..........: May 10, 1994 β
Β¦β β
Β¦β Notes.........: Process standard keys of browse β
Β¦β β
Β¦β β
Β¦β β
Β¦β Parameters....: nKey NUMERIC β
Β¦β ASCII Code of key pressed β
Β¦β oBrowse OBJECT β
Β¦β Tbrowse Object β
Β¦β β
Β¦β Returns.......: TRUE if key handled correctly. β
Β¦β β
Β¦ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
*/
STATIC FUNCTION StdMeth( nKey, oBrowse )
LOCAL lKeyHandled := TRUE // Key Processed
DO CASE
CASE nKey = K_DOWN
oBrowse:down()
CASE nKey = K_UP
oBrowse:up()
CASE nKey = K_PGDN
oBrowse:pageDown()
CASE nKey = K_PGUP
oBrowse:pageUp()
CASE nKey = K_CTRL_PGUP
oBrowse:goTop()
CASE nKey = K_CTRL_PGDN
oBrowse:goBottom()
CASE nKey = K_RIGHT
oBrowse:right()
CASE nKey = K_LEFT
oBrowse:left()
CASE nKey = K_HOME
oBrowse:home()
CASE nKey = K_END
oBrowse:end()
CASE nKey = K_CTRL_LEFT
oBrowse:panLeft()
CASE nKey = K_CTRL_RIGHT
oBrowse:panRight()
CASE nKey = K_CTRL_HOME
oBrowse:panHome()
CASE nKey = K_CTRL_END
oBrowse:panEnd()
OTHERWISE
lKeyHandled := FALSE
ENDCASE
RETURN (lKeyHandled)