Como mostrar un Archivo Texto Plano
Como mostrar un Archivo Texto Plano
Buenas Tardes
Tengo la necesidad de mostrar un archivo Texto "listado.txt" que puede ser bastante grande, la idea es abrir una ventana para poderlo leer desde Fivewin o tal vez llamar desde Fivewin a otro programa externo que se encarge de visualizarlo(que programa podria ser???) , El punto es que solo se pueda mostrar , NO SE PUEDA MODIFICAR, por ello descarte llamar al Block de Notas por ejemplo, pues en el se puede modificar.
Les agradesco cualquier idea
Lubin
Tengo la necesidad de mostrar un archivo Texto "listado.txt" que puede ser bastante grande, la idea es abrir una ventana para poderlo leer desde Fivewin o tal vez llamar desde Fivewin a otro programa externo que se encarge de visualizarlo(que programa podria ser???) , El punto es que solo se pueda mostrar , NO SE PUEDA MODIFICAR, por ello descarte llamar al Block de Notas por ejemplo, pues en el se puede modificar.
Les agradesco cualquier idea
Lubin
Re: Como mostrar un Archivo Texto Plano
Lubin
Tendrías que pasarlo a una DBF temporal con un solo campo de caracter con un ancho de 140
Luego el DBF mostrarlo en un browse
algo asi:
USE REPORTE ALIAS REPORTE NEW EXCLUSIVE
ZAP
APPE FROM LISTADO.TXT SDF
El browse
DEFINE DIALOG oDlg FROM 0,0 TO 800,600 PIXEL TITLE "Vista Preliminar de: LISTADO.TXT"
oBrw1 := TXBrowse():New( oDlg )
oBrw1:nMarqueeStyle := MARQSTYLE_HIGHLROW
oCol := oBrw1:AddCol()
oCol:bStrData := { || REPORTE->LINEA }
oBrw1:CreateFromCode()
ACTIVATE DIALOG oDlg ON INIT (oBrw1:Move(33,0,( oDlg:nRight-oDlg:nLeft)-26,(oDlg:nBottom-oDlg:nTop)-75))
Espero te sirva
Saludos
Adhemar
Tendrías que pasarlo a una DBF temporal con un solo campo de caracter con un ancho de 140
Luego el DBF mostrarlo en un browse
algo asi:
USE REPORTE ALIAS REPORTE NEW EXCLUSIVE
ZAP
APPE FROM LISTADO.TXT SDF
El browse
DEFINE DIALOG oDlg FROM 0,0 TO 800,600 PIXEL TITLE "Vista Preliminar de: LISTADO.TXT"
oBrw1 := TXBrowse():New( oDlg )
oBrw1:nMarqueeStyle := MARQSTYLE_HIGHLROW
oCol := oBrw1:AddCol()
oCol:bStrData := { || REPORTE->LINEA }
oBrw1:CreateFromCode()
ACTIVATE DIALOG oDlg ON INIT (oBrw1:Move(33,0,( oDlg:nRight-oDlg:nLeft)-26,(oDlg:nBottom-oDlg:nTop)-75))
Espero te sirva
Saludos
Adhemar
Saludos,
Adhemar C.
Adhemar C.
- Willi Quintana
- Posts: 1025
- Joined: Sun Oct 09, 2005 10:41 pm
- Location: Cusco - Perú
- Contact:
Re: Como mostrar un Archivo Texto Plano
Hola sr.
Levanta el texto en un array y luego lo visualizas con un listbox....
aTexto := LeerTxt("listado.txt")
If LEN(aTexto) = 0
Return(Nil)
EndIf
... aqui ya lo tratas el array que s
@10,10 LISTBOX oLista ........
Salu2
Levanta el texto en un array y luego lo visualizas con un listbox....
aTexto := LeerTxt("listado.txt")
If LEN(aTexto) = 0
Return(Nil)
EndIf
... aqui ya lo tratas el array que s
@10,10 LISTBOX oLista ........
Salu2
Code: Select all | Expand
//------------------------------------------------------------------------------------
Function LeerTxt(cFile,nModo)
local oFile,cLinea := "", aLinea := {}, nRec, nCont
DEFAULT cFile := ""
DEFAULT nModo := 0
If Empty(cFile) .OR. !File(cFile)
Return({})
EndIf
oFile := TTxtFile():New( cFile )
nRec := oFile:RecCount()
Do while !oFile:EOF()
cLinea := oFile:ReadLine() //cLine
cLinea := STRTRAN(cLinea, CHR(13), "")
cLinea := STRTRAN(cLinea, CHR(10), "")
AaDd(aLinea, cLinea)
oFile:Skip()
EndDo
oFile:End()
Return(aLinea)
Re: Como mostrar un Archivo Texto Plano
Hola Willi como veras volviendo al barrio ...
Gracias por la respuesta,,, solo una aclaracion...
y q me comentas de la capacidad del array.. para un texto bastante grande .. unas 200 paginas..??
Lubin
Gracias por la respuesta,,, solo una aclaracion...
y q me comentas de la capacidad del array.. para un texto bastante grande .. unas 200 paginas..??
Lubin
Re: Como mostrar un Archivo Texto Plano
Gracias por tu respuesta Adhemar
Podria ser una alternativa, Le dare una probada, pues el texto puede ser bastante grande y ancho, casi siempre unas 200 a 300 paginas de 240 carac. de ancho.
q tal manejara esto el Browse.???
Lubin
Podria ser una alternativa, Le dare una probada, pues el texto puede ser bastante grande y ancho, casi siempre unas 200 a 300 paginas de 240 carac. de ancho.
q tal manejara esto el Browse.???
Lubin
- Willi Quintana
- Posts: 1025
- Joined: Sun Oct 09, 2005 10:41 pm
- Location: Cusco - Perú
- Contact:
Re: Como mostrar un Archivo Texto Plano
Si no va bien con un array,, puedes crear una DBF de un colo campo con 256 caracteres de ancho,,, y le vas haciendo append en vez de AaDd(aLinea, cLinea)
asi lo manejes con un browse, le quitas las lineas de division de cada registro y te parecera un editor de texto,,
Salu2
asi lo manejes con un browse, le quitas las lineas de division de cada registro y te parecera un editor de texto,,
Salu2
Re: Como mostrar un Archivo Texto Plano
Hola, buen día.
Se me ocurre que podrías hacerlo con la TRichedit.
Cargar el archivo de text en el oRich y luego lo hojeas tranquilamente.
Para evitar que sea modificado haces
Mira los samples de la richedit, ahí encontrarás todo.
Rolando![Very Happy :D](./images/smilies/icon_biggrin.gif)
Se me ocurre que podrías hacerlo con la TRichedit.
Cargar el archivo de text en el oRich y luego lo hojeas tranquilamente.
Para evitar que sea modificado haces
Code: Select all | Expand
oRich:lReadOnly:=.t.
Mira los samples de la richedit, ahí encontrarás todo.
Rolando
![Very Happy :D](./images/smilies/icon_biggrin.gif)
Re: Como mostrar un Archivo Texto Plano
Gracias RolandoCreo que seria posible ante un texto q no fuera muy largo
Veremos como le Va.. y lo cometare mas adeltna
Gracias a ti y a todos los que opinaron,... y a los que intentaron ayudar,, ello vale
Lubin
Veremos como le Va.. y lo cometare mas adeltna
Gracias a ti y a todos los que opinaron,... y a los que intentaron ayudar,, ello vale
Lubin
Re: Como mostrar un Archivo Texto Plano
Buen dia a todos
De Regreseo con el tema para visualizar el Archivo texto,
Logre cargar el texto en el Browse pero cuando es un texto con columnas numericas, salen desalineado las columnas donde van los numeros, algo asi...
vvvvvvvvvvvvvvvvvvvvvvvvvv 455.05
xxxxxxxxxxxxxxxxxxxx 90.09
ppppppppppppppppppp 6778.09
he probado cambiar el Font al Browse pero no me resulta, alguna idea.
Gracias por la ayuda..
Lubin
De Regreseo con el tema para visualizar el Archivo texto,
Logre cargar el texto en el Browse pero cuando es un texto con columnas numericas, salen desalineado las columnas donde van los numeros, algo asi...
vvvvvvvvvvvvvvvvvvvvvvvvvv 455.05
xxxxxxxxxxxxxxxxxxxx 90.09
ppppppppppppppppppp 6778.09
he probado cambiar el Font al Browse pero no me resulta, alguna idea.
Gracias por la ayuda..
Lubin
- jrestojeda
- Posts: 601
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: Como mostrar un Archivo Texto Plano
Hola amigo...
Usa el FONT "Courier New" que es un font proporcional donde todos los caracteres ocupan el mismo espacio.
Espero te sirva la idea.
Saludos,
Usa el FONT "Courier New" que es un font proporcional donde todos los caracteres ocupan el mismo espacio.
Espero te sirva la idea.
Saludos,
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Re: Como mostrar un Archivo Texto Plano
Lubin,
cuando programaba en Clipper, lo hacía muy facil. Simplemente llamaba a un 3º programa. LIST.COM
LIST.COM nombrearchivo.txt
... y listo el pollo...
Ya puedes moverte con el cursor por todo el archivo a lo largo y ancho y sin poder modificarlo.
Adjunto te lo envio al email que registras en este foro.
Un saludo.
LORENZO.
cuando programaba en Clipper, lo hacía muy facil. Simplemente llamaba a un 3º programa. LIST.COM
LIST.COM nombrearchivo.txt
... y listo el pollo...
Ya puedes moverte con el cursor por todo el archivo a lo largo y ancho y sin poder modificarlo.
Adjunto te lo envio al email que registras en este foro.
Un saludo.
LORENZO.
Re: Como mostrar un Archivo Texto Plano
Hola Lorenzo
Es cierto, yo tambien hacia lo mismo en clipper, e inclusive llegue a encontrar en uno de los foros un textView.obj (hecho en C ) que lo compilabas y enlazabas con el clipper y te mostraba perfectamente un archivo texto sin importar el tamaño, pues ni si quiera lo cargabas en una variable como se hacia con el memoedit ,, (ello te restringia el tamaño del archivo) si no de frente le ponias el Nombre del Archivo como parametro : (TextView("mitexto.txt") ) y listo te abria la ventana... bueno lamentablemente con FiVeWin,Harbour no funciona. se cuelga.
He estado buscando y he probado inclusive con el Notepad.exe del Windows mismo. y si funciona, el inconveniente que tambien pueden MODIFICAR el texto, y esto no lo deseo, solo deberian de poder verlo
Gracias por el comentario, y si en caso sabes de algun programa externo que permita leer desde FWH un archivo texto sin posibilidad de editarlo seria de mucha ayuda.
Lubin
Es cierto, yo tambien hacia lo mismo en clipper, e inclusive llegue a encontrar en uno de los foros un textView.obj (hecho en C ) que lo compilabas y enlazabas con el clipper y te mostraba perfectamente un archivo texto sin importar el tamaño, pues ni si quiera lo cargabas en una variable como se hacia con el memoedit ,, (ello te restringia el tamaño del archivo) si no de frente le ponias el Nombre del Archivo como parametro : (TextView("mitexto.txt") ) y listo te abria la ventana... bueno lamentablemente con FiVeWin,Harbour no funciona. se cuelga.
He estado buscando y he probado inclusive con el Notepad.exe del Windows mismo. y si funciona, el inconveniente que tambien pueden MODIFICAR el texto, y esto no lo deseo, solo deberian de poder verlo
Gracias por el comentario, y si en caso sabes de algun programa externo que permita leer desde FWH un archivo texto sin posibilidad de editarlo seria de mucha ayuda.
Lubin
Re: Como mostrar un Archivo Texto Plano
Amigo prueba con esto:
DEFINE FONT oFont NAME "Courier New" SIZE 0,-10
REPORT oRep CAPTION "Listado de Litros de Petroleo Mensual.." PREVIEW FONT oFont
COLUMN DATA " " SIZE nWidth
END REPORT
oRep:nTitleUpLine:=RPT_NOLINE
oRep:nTitleDnLine:=RPT_NOLINE
oRep:Margin(.25,RPT_LEFT ,RPT_INCHES)
oRep:Margin(.10,RPT_RIGHT ,RPT_INCHES)
oRep:Margin(.30,RPT_TOP ,RPT_INCHES)
oRep:Margin(.20,RPT_BOTTOM,RPT_INCHES)
ACTIVATE REPORT oRep ON INIT SayReport(nWidth,"Litros.txt")
oFont:End()
Return nil
STAT FUNC SayReport(nWidth,cFile)
LOCAL lContinue, cLine, lMore, lEoL, nLeng
LOCAL hPrnt, nBlok, cTxt, nCurr, nLMax
DEFAULT cFile:="Report.Prt"
nLeng:=nWidth+2
lContinue:=.T.
nBlok:=4096
hPrnt:=FOPEN(cFile,0)
nLMax:=FSEEK(hPrnt,0,2)
FSEEK(hPrnt,0)
nCurr:=FSEEK(hPrnt,0,1)
DO WHILE lContinue
SysRefresh()
cTxt=Space(nBlok)
FSEEK(hPrnt,nCurr,0)
IF FREAD(hPrnt,@cTxt,nBlok)<>nBlok
lContinue:=.F.
ENDIF
lMore :=.T.
WHILE lMore
lEoL:=SeekBreak(cTxt,nLeng)
IF lEoL<>0 .AND. nCurr<=nLMax
cLine=Left(cTxt,lEoL)
cTxt=SubStr(cTxt,lEoL+1)
cLine:=ClearBreak(@cLine)
nCurr+=lEoL
oRep:StartLine() // Para TReport
oRep:Say(1,cLine)
oRep:EndLine()
ELSE
lMore:=.F.
ENDIF
ENDDO
IF !lContinue // Finaliza el reporte
oRep:lBreak:=.T.
ENDIF
ENDDO
SysRefresh()
FClose(hPrnt)
RETURN (NIL)
STAT FUNC SeekBreak(cTxt,nLeng) // Busca caracteres de terminaci¢n
LOCAL cFF:=AT(Chr(12),cTxt)
LOCAL cLF:=AT(Chr(10),cTxt)
LOCAL cLine:=0
IF cFF>0 .AND. cLF>0
cLine:=Min(Min(cFF,cLF),nLeng)
ELSEIF cFF>0 .OR. cLF>0
cLine:=Min(Max(cFF,cLF),nLeng)
ELSEIF Len(cTxt)>=nLeng
cLine:=nLeng
ENDIF
RETURN (cLine)
STAT FUNC ClearBreak(cLine) // Elimina caracteres de terminaci¢n
cLine=StrTran(cLine,Chr(10),' ') // LF
cLine=StrTran(cLine,Chr(12),' ') // FF
cLine=StrTran(cLine,Chr(13),' ') // CR
cLine=StrTran(cLine,Chr(26),' ') // EOF
cLine=StrTran(cLine,Chr(27),' ') // ESC
RETURN (cLine)
Saludos
DEFINE FONT oFont NAME "Courier New" SIZE 0,-10
REPORT oRep CAPTION "Listado de Litros de Petroleo Mensual.." PREVIEW FONT oFont
COLUMN DATA " " SIZE nWidth
END REPORT
oRep:nTitleUpLine:=RPT_NOLINE
oRep:nTitleDnLine:=RPT_NOLINE
oRep:Margin(.25,RPT_LEFT ,RPT_INCHES)
oRep:Margin(.10,RPT_RIGHT ,RPT_INCHES)
oRep:Margin(.30,RPT_TOP ,RPT_INCHES)
oRep:Margin(.20,RPT_BOTTOM,RPT_INCHES)
ACTIVATE REPORT oRep ON INIT SayReport(nWidth,"Litros.txt")
oFont:End()
Return nil
STAT FUNC SayReport(nWidth,cFile)
LOCAL lContinue, cLine, lMore, lEoL, nLeng
LOCAL hPrnt, nBlok, cTxt, nCurr, nLMax
DEFAULT cFile:="Report.Prt"
nLeng:=nWidth+2
lContinue:=.T.
nBlok:=4096
hPrnt:=FOPEN(cFile,0)
nLMax:=FSEEK(hPrnt,0,2)
FSEEK(hPrnt,0)
nCurr:=FSEEK(hPrnt,0,1)
DO WHILE lContinue
SysRefresh()
cTxt=Space(nBlok)
FSEEK(hPrnt,nCurr,0)
IF FREAD(hPrnt,@cTxt,nBlok)<>nBlok
lContinue:=.F.
ENDIF
lMore :=.T.
WHILE lMore
lEoL:=SeekBreak(cTxt,nLeng)
IF lEoL<>0 .AND. nCurr<=nLMax
cLine=Left(cTxt,lEoL)
cTxt=SubStr(cTxt,lEoL+1)
cLine:=ClearBreak(@cLine)
nCurr+=lEoL
oRep:StartLine() // Para TReport
oRep:Say(1,cLine)
oRep:EndLine()
ELSE
lMore:=.F.
ENDIF
ENDDO
IF !lContinue // Finaliza el reporte
oRep:lBreak:=.T.
ENDIF
ENDDO
SysRefresh()
FClose(hPrnt)
RETURN (NIL)
STAT FUNC SeekBreak(cTxt,nLeng) // Busca caracteres de terminaci¢n
LOCAL cFF:=AT(Chr(12),cTxt)
LOCAL cLF:=AT(Chr(10),cTxt)
LOCAL cLine:=0
IF cFF>0 .AND. cLF>0
cLine:=Min(Min(cFF,cLF),nLeng)
ELSEIF cFF>0 .OR. cLF>0
cLine:=Min(Max(cFF,cLF),nLeng)
ELSEIF Len(cTxt)>=nLeng
cLine:=nLeng
ENDIF
RETURN (cLine)
STAT FUNC ClearBreak(cLine) // Elimina caracteres de terminaci¢n
cLine=StrTran(cLine,Chr(10),' ') // LF
cLine=StrTran(cLine,Chr(12),' ') // FF
cLine=StrTran(cLine,Chr(13),' ') // CR
cLine=StrTran(cLine,Chr(26),' ') // EOF
cLine=StrTran(cLine,Chr(27),' ') // ESC
RETURN (cLine)
Saludos
Re: Como mostrar un Archivo Texto Plano
lubin wrote:Hola Lorenzo
Es cierto, yo tambien hacia lo mismo en clipper, e inclusive llegue a encontrar en uno de los foros un textView.obj (hecho en C ) que lo compilabas y enlazabas con el clipper y te mostraba perfectamente un archivo texto sin importar el tamaño, pues ni si quiera lo cargabas en una variable como se hacia con el memoedit ,, (ello te restringia el tamaño del archivo) si no de frente le ponias el Nombre del Archivo como parametro : (TextView("mitexto.txt") ) y listo te abria la ventana... bueno lamentablemente con FiVeWin,Harbour no funciona. se cuelga.
He estado buscando y he probado inclusive con el Notepad.exe del Windows mismo. y si funciona, el inconveniente que tambien pueden MODIFICAR el texto, y esto no lo deseo, solo deberian de poder verlo
Gracias por el comentario, y si en caso sabes de algun programa externo que permita leer desde FWH un archivo texto sin posibilidad de editarlo seria de mucha ayuda.
Lubin
Hola Lubin buenos dias como esta amigo, les dejo unas funciones que a mi me sirvio de mucho en clipper 5.3, que se puede leer el texto y visualizarlo y asi como tambien enviar a la impresora , espero que les sirva de mucho y lo puedan adaptar al FWH, que yo no he tenido tiempo de adaptarlo y asi como tambien un ejemplo de como llamar de un archivo texto.
Code: Select all | Expand
/***
* Fbrwsdef.ch
*
* Translates para simular la sub-clase del browse de ficheros
*/
#xtranslate :fileHandle => :cargo\[1\]
#xtranslate :fileLine => :cargo\[2\]
#xtranslate :lineOffset => :cargo\[3\]
* Futils.ch
// Posici¢n actual del fichero
#xtranslate FTell(<fHandle>) => FSeek(<fHandle>, 0, 1)
IF SINO = 1
FIN_REP()
IF !EMPTY(ARCH_EXP)
bDEVICE = SET(20)
COPY FILE (VER_REP) TO (ARCH_EXP)+".TXT"
MENSAJE("SE CREO EL ARCHIVO "+ALLTRIM(ARCH_EXP)+".TXT"+" "+"EN EL DIRECTORIO "+CURDIR())
ENDIF
VER(VER_REP, 0,0,22,79)
ELSE
RUN NODOSIMP &WREPORTE
CERRAR('R_ANTSDO')
ENDIF
SELECT 99
USE
FERASE(NEWDBF1)
FERASE(NEWNTX1)
FERASE(VER_REP)
ENDIF
**************************************************************
*--------- FUNCION QUE LEE ARCHIVOS ASCI A 64 BITS ----------*
**************************************************************
#include "Fbrwsdef.ch"
// El nombre del fichero es pasado como par metro
*-----------------------------------------
FUNCTION VER(cFname, LIN1,COL1, LIN2,COL2)
LOCAL COLORc:=SetColor('W/N ,N/W,,,W/B')
LOCAL oTbr, oTbc
LOCAL lExitRequested := .F.
LOCAL cSearcher, nSavefPos
LOCAL nKey
LOCAL GetList := {}
SET SCOREBOARD OFF
IF cFname == NIL .OR. !File(cFname)
Alert("Sintaxis: FBTest <cFileName>")
QUIT
ENDIF
SUBSTm:='P_'+SUBSTR(cFNAME,3,10)
*COPY FILE (cFNAME) TO (SUBSTm)
* @ 23,1 SAY "F2-B£squeda adelante F3-B£squeda atr s Pgup-Arriba PgDn-Abajo " COLOR 'N/W'
CAJACONV(LIN1,COL1,LIN2,COL2,'W+/W','N/W','')
@ 23,1 SAY "F2-B£squeda adelante F3-B£squeda atr s Pgup-Arriba PgDn-Abajo " COLOR 'N/W'
IF (oTbr := FBrowseNew()) != NIL
FBrowseOpen(oTbr, cFname)
oTbr:nTop := 1
oTbr:nLeft := 1
oTbr:nBottom := 21
oTbr:nRight := 78
oTbc:= TBColumnNew(, {|| SubStr(oTbr:fileLine, oTbr:lineOffset) })
*oTbr:colorSpec ="G/N,W+/R,N,N,B/W,R/B,B/R,R/B,B/R"
oTbr:colorSpec ="W/B,W+/R,N,N,B/W,R/B,B/R,R/B,B/R"
oTbc:width := 78
oTbr:addColumn(oTbc)
cSearcher := Space(20)
DO WHILE !lExitRequested
DO WHILE !oTbr:stabilize()
ENDDO
SET CURSOR OFF
nKey := InKey(0)
DO CASE
CASE nKey == 27
lExitRequested := .T.
CASE nKey == 19 //IZQUIERDA
IF oTbr:lineOffset > 1
oTbr:lineOffset--
oTbr:refreshall()
ENDIF
CASE nKey == 4 // DERECHA
IF oTbr:lineOffset < len(oTbr:fileLine)
oTbr:lineOffset++
oTbr:refreshall()
ENDIF
CASE nKey == 1 // INICIO
oTbr:lineOffset := 1
oTbr:refreshall()
CASE nKey == 6 // FIN
oTbr:lineOffset := Max(1, Len(oTbr:fileLine) - oTbc:width + 1)
oTbr:refreshAll()
CASE nKey == 9 // TABULADOR
IF oTbr:lineOffset <= Len(oTbr:fileLine) - 10
oTbr:lineOffset += 10
oTbr:refreshAll()
ENDIF
CASE nKey == 271 // TABULADOR
oTbr:lineOffset := MAX(1, oTbr:lineOffset - 10)
oTbr:refreshall()
CASE nKey == -1 // F2
SET CURSOR ON
@ 24, 0
@ 24, 10 SAY "Introduzca la clave de b£squeda hacia delante" GET cSearcher PICT '@K'
READ
@ 24, 0
IF FrwdSrch(oTbr, Trim(cSearcher))
oTbr:refreshAll()
ELSE
MENSAJE('No Encontrado')
ENDIF
CASE nKey == -2 // F3
SET CURSOR ON
@ 24, 0
@ 24, 10 SAY "Introduzca la clave de b£squeda hacia atras" GET cSearcher PICT '@K'
READ
@ 24, 0
IF BkwdSrch(oTbr, Trim(cSearcher))
nSavefPos := FilePos(oTbr)
oTbr:refreshAll()
DO WHILE !oTbr:stabilize()
ENDDO
DO WHILE FilePos(oTbr) != nSavefPos
oTbr:up()
DO WHILE !oTbr:stabilize()
ENDDO
ENDDO
ELSE
MENSAJE('No Encontrado')
ENDIF
*CASE nKey == -4 // F5
*TYPE (SUBSTm) TO PRINTER
*CASE nKey == -8 // F9
* LB_CALCULADORA()
OTHERWISE
IF StdMeth(oTbr, nKey)
// Manejador est ndar de teclas
ELSE
// Se ignoran otras
ENDIF
ENDCASE
ENDDO
* FERASE(SUBSTm)
SET CURSOR ON
SETCOLOR(COLORc)
CLEAR SCREEN
SET PRINTER TO
ENDIF
RETURN NIL
*--------------------
FUNCTION FilePos(oTbr)
RETURN FTell(oTbr:fileHandle)
*-------------------
FUNCTION FBrowseNew
LOCAL oTbr := TBrowseNew()
oTbr:cargo := Array(3)
oTbr:lineOffset := 1
oTbr:goTopBlock := {| | FileGoFirst(oTbr) }
oTbr:goBottomBlock := {| | FileGoLast(oTbr) }
oTbr:skipBlock := {|n| FileSkip(n, oTbr) }
RETURN (oTbr)
*------------------------------------
FUNCTION FBrowseOpen(oTbr, cFileName)
LOCAL fHandle := FOpen(cFileName)
IF fHandle >= 0
oTbr:fileHandle := fHandle
FileGoFirst(oTbr)
ENDIF
RETURN ( fHandle > 0 )
// Ir a la primera l¡nea del fichero y leerla en oTbr:fileLine
*----------------------------------
STATIC PROCEDURE FileGoFirst(oTbr)
LOCAL cLine
LOCAL fHandle := oTbr:fileHandle
FSeek(fHandle, 0, 0)
* * FReadLn(fHandle, @cline, 256) * ( * MODIFICADO ADRIANO * )
FReadLn(fHandle, @cline, 512)
oTbr:fileLine := cLine
FSeek(fHandle, 0, 0)
RETURN NIL
// Ir a la £ltima l¡nea del fichero y leerla en oTbr:fileLine
*--------------------------------
STATIC PROCEDURE FileGoLast(oTbr)
FSeek(oTbr:fileHandle, 0, 2)
GoPrevLn(oTbr)
RETURN NIL
// Salta n l¡neas en el fichero. n puede ser positivo o negativo.
// Devuelve el n£mero de l¡neas que se ha movido
*---------------------------------
STATIC FUNCTION FileSkip(n, oTbr)
LOCAL nSkipped := 0
SET COLOR TO 'G/N'
IF n > 0
DO WHILE nSkipped != n .AND. GoNextLn(oTbr)
nSkipped++
ENDDO
ELSE
DO WHILE nSkipped != n .AND. GoPrevLn(oTbr)
nSkipped--
ENDDO
ENDIF
RETURN (nSkipped)
// Intenta moverse a la siguiente l¡nea del fichero
// Devuelve .T. si lo consigue, sino .F.
// Tiene que ser p£bica por la rutina de b£squeda
*-----------------------
FUNCTION GoNextLn(oTbr)
LOCAL fHandle := oTbr:fileHandle
LOCAL nSavePos := FTell(fHandle), cBuff := "", lMoved, nNewPos
FSeek(fHandle, Len(oTbr:fileLine) + 2, 1)
nNewPos := FTell(fHandle)
* * IF FReadLn(fHandle, @cBuff, 256) * ( * MODIFICADO ADRIANO * )
IF FReadLn(fHandle, @cBuff, 512)
lMoved := .T.
oTbr:fileLine := cBuff
FSeek(fHandle, nNewPos, 0)
ELSE
lMoved := .F.
FSeek(fHandle, nSavePos, 0)
ENDIF
RETURN (lMoved)
// Tiene que ser p£blica por las rutinas de b£squeda
*----------------------
FUNCTION GoPrevLn(oTbr)
LOCAL fHandle := oTbr:fileHandle
LOCAL nOrigPos := FTell(fHandle), nMaxRead, nNewPos, ;
lMoved, cBuff, nWhereCrLf, nPrev, cTemp
IF nOrigPos == 0
lMoved := .F.
ELSE
lMoved := .T.
// Comprobar los 2 caracteres precedentes para CR / LF
FSeek(fHandle, -2, 1)
cTemp := Space(2)
FRead(fHandle, @cTemp, 2)
IF cTemp == CHR(13)+CHR(10)
FSeek(fHandle, -2, 1)
ENDIF
nMaxRead := MIN(512, FTell(fHandle))
cBuff := Space(nMaxRead)
nNewPos := FSeek(fHandle, -nMaxRead, 1)
FRead(fHandle, @cBuff, nMaxRead)
nWhereCrLf := Rat(CHR(13)+CHR(10), cBuff)
IF nWhereCrLf == 0
nPrev := nNewPos
oTbr:fileLine := cBuff
ELSE
nPrev := nNewPos + nWhereCrLf + 1
oTbr:fileLine := SubStr(cBuff, nWhereCrLf + 2)
ENDIF
FSeek(fHandle, nPrev, 0)
ENDIF
RETURN (lMoved)
// Devuelve si lo encotr¢ o no - busca hacia adelante
// Si lo encuentra, asigna a cLine la l¡nea actual y
// coloca el puntero al comienzo de lo encontrado
// Si no se encuentra, no hay cambios
*-------------------------------
FUNCTION FrwdSrch(oTbr, cString)
LOCAL fHandle := oTbr:fileHandle
LOCAL lFound := .F.
LOCAL nSavePos := FTell(oTbr:fileHandle)
LOCAL cSavecLine := oTbr:fileLine
DO WHILE !lFound .AND. GoNextLn(oTbr)
lFound := cString $ oTbr:fileLine
ENDDO
IF !lFound
FSeek(fHandle, nSavePos, 0)
oTbr:fileLine := cSavecLine
ENDIF
RETURN (lFound)
// Devuelve si lo encotr¢ o no - busca hacia atras
// Si lo encuentra, asigna a cLine la l¡nea actual y
// coloca el puntero al comienzo de lo encontrado
// Si no se encuentra, no hay cambios
*--------------------------------
FUNCTION bkwdSrch(oTbr, cString)
LOCAL lFound := .F.
LOCAL fHandle := oTbr:fileHandle
LOCAL nSavePos := FTell(fHandle)
LOCAL cSavecLine := oTbr:fileLine
DO WHILE !lFound .AND. GoPrevLn(oTbr)
lFound := cString $ oTbr:fileLine
ENDDO
IF !lFound
FSeek(fHandle, nSavePos, 0)
oTbr:fileLine := cSavecLine
ENDIF
RETURN (lFound)
/***
* FReadLn(fHandle, cBuffer, nMaxLine)
*
* --> Lógico - .T. Si se ha leido total o parcialmente.
* .F. implica fin de fichero
*
* fHandle - El devuelto por FOpen()
* cBuffer - Buffer para la l¡nea (pasado por referencia)
* nMaxLine - Longitud de la l¡nea m s larga
*
* La funci¢n intenta leer una l¡nea del fichero especificado
* por fHandle. Supone que la l¡nea esta terminada por un CR/LF.
* Devuelve la l¡nea en el par metro cBuffer, que debe ser
* pasado por referencia. Esta versi¢n utiliza un buffer para
* mejorar el rendimiento.
*/
*--------------------------------------------
FUNCTION FReadLn(fHandle, cBuffer, nMaxLine)
LOCAL cLine, nEol, nNumRead, nSavePos
cLine := Space(nMaxLine)
cBuffer := ""
// Guardar la posici¢n actual para b£squeda posterior
nSavePos := FTell(fHandle)
nNumRead := FRead(fHandle, @cLine, nMaxLine)
IF (nEol := At(CHR(13)+CHR(10), SubStr(cLine, 1, nNumRead))) == 0
cBuffer := cLine
ELSE
cBuffer := SubStr(cLine, 1, nEol - 1) // Copiar hasta fin de l¡nea
// Nos posicionamos en la siguiente l¡nea (saltamos LF)
FSeek(fHandle, nSavePos + nEol + 1, 0)
ENDIF
RETURN (nNumRead != 0) //NOTA: Si no se pudo leer la £ltima l¡nea, eof
*---------------------------
FUNCTION StdMeth(oTbr, nKey)
LOCAL lKeyHandled := .T.
DO CASE
CASE nKey == 24; oTbr:down()
CASE nKey == 5; oTbr:up()
CASE nKey == 3; oTbr:pageDown()
CASE nKey == 18; oTbr:pageUp()
CASE nKey == 31; oTbr:goTop()
CASE nKey == 30; oTbr:goBottom()
CASE nKey == 4; oTbr:right()
CASE nKey == 19; oTbr:left()
CASE nKey == 1; oTbr:home()
CASE nKey == 6; oTbr:end()
CASE nKey == 26; oTbr:panLeft()
CASE nKey == 2; oTbr:panRight()
CASE nKey == 29; oTbr:panHome()
CASE nKey == 23; oTbr:panEnd()
OTHERWISE; lKeyHandled := .F.
ENDCASE
RETURN lKeyHandled
Atte: Adrian C. C.
Re: Como mostrar un Archivo Texto Plano
Hola Adrian,
Gracias por la publicacion, creo q si sera posible aplicarlo, dejame darle una revisada y les comento
Lubin
Gracias por la publicacion, creo q si sera posible aplicarlo, dejame darle una revisada y les comento
Lubin