Página 1 de 4

Salvar screen

Enviado: 30 Mai 2012 14:12
por bencz
Olá, gostaria de saber, como posso fazer p/ salvar a tela em um txt.....
bom, basicamente oq quero dizer é, tenho uma tela em wvw, por exemplo:

Código: Selecionar todos

Function Main()
   local cTela := ""

  WVW_SetMainCoord( .T. )
  WVW_nOpenWindow("MEU TESTE", 10, 20, 20, 50)

  @ 11,21 SAY "OLA MUNDO"
  @ 12,21 SAY "lalas"
  @ 13,21 SAY MAXROW()+1
  @ 13,50 say MAXCOL()+1
  @ 15,21 SAY "---------"

  x := SaveScreen(0,0,maxrow(),maxcol())
  save screen to x
  wait
  @ 11,21 clear to 15,79
  ? "limpou"
  wait
  restscreen(,,,,x)
  setpos(18,00)
  ? "restaurou"

  for I:=1 to len(x) step+2
     cTela += SubStr(x, i, 1)
  next
  
  memowrit("teste.txt", cTela)

  WAIT 
Return
Bom, mas o arquivo q ele gera, ta tendo coisa duplicada... veja:

Código: Selecionar todos

                                OLA MUNDO                      lalas             OLA MUNDO                      lalas                                  25        lalas                                  25                           80                  25                           80                       ---------               80                       ---------                                        ---------                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
Então, gostaria de saber, como posso fazer p/ q ele nao duplique ?
depois q o wvw teve uma atualização, começou a acontecer isso, creio eu, q o primeiro 'ola mundo'...'lalas', seja do console do DOS, e o outro, seja do console do wvw....
quanto testo, só com o console do dos, ele nao duplica...

Então, agradeço a ajuda (:

Salvar screen

Enviado: 30 Mai 2012 14:32
por Jairo Maia
Olá,

Você poderia explicar a razão para ter que salvar a tela em TXT? Pergunto porque tem outras alterantivas para você salvar a tela em disco.

Salvar screen

Enviado: 30 Mai 2012 14:35
por bencz
Olá...
é para q eu possa carregar ela depois, em uma outra dialog, mesmo depois de ter fechado o programa....

Salvar screen

Enviado: 30 Mai 2012 14:56
por Jairo Maia
Olá,

Pressupondo que seja Harbour (não xHarbour), para salvar, use assim:

Código: Selecionar todos

cTela1 := SaveScreen( 0, 0, MaxRow(), MaxCol() )
Hb_MvSave( "Nome_do_arquivo", cTela1 )
Para restaurar use assim:

Código: Selecionar todos

Hb_MvRestore( "Nome_do_Arquivo", .t. )

Salvar screen

Enviado: 30 Mai 2012 15:02
por bencz
Bom, estou usando o xharbour...

Salvar screen: xHarbour

Enviado: 30 Mai 2012 15:22
por Imatech
xH...

Código: Selecionar todos

*--------------------------------------------------------------*
* RM_MVSAVE() 
*--------------------------------------------------------------*
FUNCTION RM_MVSAVE()
    LOCAL i := 0
    LOCAL nForLoop := 0
    LOCAL t := 0
    LOCAL l := 0
    LOCAL b := MAXROW()
    LOCAL r := MAXCOL()
    LOCAL cScreen := SAVESCREEN(t, l, b, r)    //
    LOCAL nCellSize := len( Savescreen( 0, 0, 0, 0 ) )
    LOCAL nStart := 1
    LOCAL nRange := ( r + 1 ) * nCellSize
    LOCAL sAux := ''
    LOCAL cOutString := ''
    LOCAL cSubString := ''

    For i := 1 To b + 1
        cOutString := ''
        cSubString := Substr( cScreen, nStart, nRange )
        For nForLoop := 1 To nRange step nCellSize
           cOutString += Substr( cSubString, nForLoop, 1 )
        Next
        sAux += ( cOutString ) + CHR(13) + CHR(10)
        nStart += nRange
    Next

RETUNR( sAux )

Salvar screen

Enviado: 30 Mai 2012 15:27
por bencz
Ele nao deveria recerber alguns argumentos ?

Salvar screen

Enviado: 30 Mai 2012 15:30
por Jairo Maia
Olá,
Para xHarbour você pode também usar assim:

Para salvar:

Código: Selecionar todos

cTela1 := SaveScreen( 0, 0, MaxRow(), MaxCol() )
SAVE TO "Nome_do_arquivo.Mem" ALL LIKE cTela1
Para restaurar:

Código: Selecionar todos

RESTORE FROM "Nome_do_arquivo.Mem" ADDITIVE
NOTA: Neste caso, o nome da variável não pode ter mais que 10 caracteres. A extensão padrão do arquivo é .MEM, você pode alterar como quiser.

Salvar screen

Enviado: 30 Mai 2012 15:42
por bencz
A unica coisa q ele esta salvando no arquivo é o nome da viariavel... ;x

Salvar screen

Enviado: 30 Mai 2012 15:46
por bencz
bom... agora eu entendi o funcionamento desse comando... mas nao eh exatamente isso q estou tentando fazer, oq estou tentando fazer, é pegar o texto q esta dentro do dialog do wvw e salvar em txt, p/ q eu possa imprimir ou usar ele depois, em um outro dialog, entende ?
Mas, qnd eu salvo, ele salva com valores duplicados... ;x

Salvar screen

Enviado: 30 Mai 2012 15:57
por Imatech
Acredito que ainda não entendemos o seu objetivo

Código: Selecionar todos

*-----------------------------------------*
* x := TELA ATIVA
*-----------------------------------------*
 x := RM_MVSAVE()

*-----------------------------------------*
* SALVA EM ARQUIVO...
*-----------------------------------------*
MemoWrit( fname, x )

Salvar screen

Enviado: 30 Mai 2012 16:03
por bencz
Bom, quero salvar a tela, em um arquivo de texto, para q eu possa abrir ele em um outro form, msm depois de ter fechado o programa, e também, q eu possa imprimir o arquivo...

jovemxxx, qnd usei sua função, ele salvou assim:

Código: Selecionar todos


                                OLA MUNDO                      lalas
 OLA MUNDO                      lalas                                  25       
 lalas                                  25                           80         
         25                           80                       ---------        
       80                       ---------                                       
 ---------                                                                      


Salvar screen

Enviado: 30 Mai 2012 16:16
por Imatech
Vamos tentar novamente...
*** não é igual a que ele mantem em buffer
Então vamos limitar o salvamento a largura maxima de sua tela digamos 25 caracteres ( nRange := 25 )

Código: Selecionar todos

*--------------------------------------------------------------*
* RM_MVSAVE() 
*--------------------------------------------------------------*
FUNCTION RM_MVSAVE()
  LOCAL i := 0
  LOCAL nForLoop := 0
  LOCAL t := 0
  LOCAL l := 0
  LOCAL b := MAXROW()
  LOCAL r := MAXCOL()
  LOCAL cScreen := SAVESCREEN(t, l, b, r)  //
  LOCAL nCellSize := len( Savescreen( 0, 0, 0, 0 ) )
  LOCAL nStart := 1
  LOCAL nRange := ( r + 1 ) * nCellSize
  LOCAL sAux := ''
  LOCAL cOutString := ''
  LOCAL cSubString := ''

  *---------------------------------------------------* 
  * MOSTRAMOS OS VALORES PARA UTILIZAR NO LOOP
  *---------------------------------------------------* 
  ALERT( 'nRange: ' + STR( nRange ) + ';;' + 'nCellSize: ' + STR( nCellSize) )
  *---------------------------------------------------* 
  * AQUI LIMITAMOS O TAMANHO MAXIMO DA LINHA DE TELA
  *---------------------------------------------------* 
  nRange := IIF( nRange > 25, 25, nRange )

  For i := 1 To b + 1
    cOutString := ''
    cSubString := Substr( cScreen, nStart, nRange )
    For nForLoop := 1 To nRange step nCellSize
     cOutString += Substr( cSubString, nForLoop, 1 )
    Next
    sAux += ( cOutString ) + CHR(13) + CHR(10)
    nStart += nRange
  Next

RETUNR( sAux )

Salvar screen

Enviado: 30 Mai 2012 16:22
por bencz
bom, agora ele ficou assim ;x

Código: Selecionar todos




       OLA MU

             

      OLA MUN

            l

             

 25        la

             

25           

    80       

5            

   80        

   --------- 


E ele continua duplicando o texto...
e nao estou conseguindo depurar o código, pois qnd inicializa o debuger, recebo um erro ;x

Salvar screen

Enviado: 30 Mai 2012 16:30
por Imatech
Que valores foram exibidos na mensagem: ALERT...
ALERT( 'nRange: ' + STR( nRange ) + ';;' + 'nCellSize: ' + STR( nCellSize) )

Código: Selecionar todos

*--------------------------------------------------------------*
* RM_MVSAVE() 
*--------------------------------------------------------------*
FUNCTION RM_MVSAVE()
 LOCAL i := 0
 LOCAL nForLoop := 0
 LOCAL t := 0
 LOCAL l := 0
 LOCAL b := MAXROW()
 LOCAL r := MAXCOL()
 LOCAL cScreen := SAVESCREEN(t, l, b, r) //
 LOCAL nCellSize := len( Savescreen( 0, 0, 0, 0 ) )
 LOCAL nStart := 1
 LOCAL nRange := ( r + 1 ) * nCellSize
 LOCAL sAux := ''
 LOCAL cOutString := ''
 LOCAL cSubString := ''

 *---------------------------------------------------* 
 * MOSTRAMOS OS VALORES PARA UTILIZAR NO LOOP
 *---------------------------------------------------* 
 ALERT( 'nRange: ' + STR( nRange ) + ';;' + 'nCellSize: ' + STR( nCellSize) )

 *---------------------------------------------------* 
 * AQUI AJUSTAMOS nCellSize para vxh
 *---------------------------------------------------* 
 nCellSize := IIF( nCellSize < 4, 4, nCellSize  )

 For i := 1 To b + 1
  cOutString := ''
  cSubString := Substr( cScreen, nStart, nRange )
  For nForLoop := 1 To nRange step nCellSize
  cOutString += Substr( cSubString, nForLoop, 1 )
  Next
  sAux += ( cOutString ) + CHR(13) + CHR(10)
  nStart += nRange
 Next

RETUNR( sAux )