Página 3 de 4

Salvar screen

Enviado: 30 Mai 2012 17:59
por bencz
qnd salvei, ele criou uma linha em branco...

Salvar screen

Enviado: 30 Mai 2012 18:37
por Imatech
Se faz necessário o tratamento de Caracteres que irão ser salvos na função...

Código: Selecionar todos


*--------------------------------------------------------------*
* RM_MVSAVE()
*--------------------------------------------------------------*
FUNCTION RM_MVSAVE()
 LOCAL i := 0
 LOCAL nForLoop := 0
 LOCAL b := MAXROW()
 LOCAL r := MAXCOL()
 LOCAL cScreen := SAVESCREEN(0, 0, b, r) //
 LOCAL nCellSize := INT( len( Savescreen( 0, 0, 0, 0 ) ) * 2 )
 LOCAL nStart := 1
 LOCAL nRange := INT( ( ( r + 1 ) * nCellSize ) * 1 )
 LOCAL cSubString := ''
 LOCAL cOutString := ''
 
 For i := 1 To ( b + 1 )
  cOutString := ''
  cSubString := Substr( cScreen, nStart, nRange )
  For nForLoop := 1 To nRange step nCellSize
   cOutString += F_Tab_Ascii( Substr( cSubString, nForLoop, 1 ) )
  Next
  sAux += ( cOutString ) + CHR(13) + CHR(10)
  nStart += nRange
 Next
 
RETURN( cOutString )

*------------------------------------------*
* CARACTERES DESEJADOS NA TABELA ASCII
*------------------------------------------*
FUNCTION F_Tab_Ascii( cStr )
  LOCAL i := 0
  LOCAL cAux := ''

  FOR i := 33 TO 180 // 33 ... 255
    cAux += CHR( i )
  NEXT

  IF !( cStr $ cAux )
    cStr := ' '
  ENDIF

RETURN( cStr )




Salvar screen

Enviado: 30 Mai 2012 18:54
por Pablo César
Puxa este tópico ficou comprido... não sei ao certo o que está ocorrendo... mas vou dar um pitaco sem ter lido o tópico por completo. Eu acostumo a capturar a tela dentro do Clipper e claro também serve para o Harbour pois utiliza as principais funções da CT lib: CHARODD e SCREENSTR

Código: Selecionar todos

FUNCTION COM_F10
SET ALTERNATE TO C:TELA.PRN
SET ALTERNATE ON
?? "  Nome da empresa -  Sistema de Contas a Receber"
?
? PADC("Tela impressa em "+DTOC(DATE()),80)
FOR PI=4 TO 20
    ? CHARODD(SCREENSTR(PI,01,78))
NEXT
SET ALTERNATE OFF
SET ALTERNATE TO
COPY FILE("C:TELA.PRN") TO ("LPT1")
ALERT("Tela a ser impressa com sucesso, aguarde a impress„o...")
DELETE FILE("C:TELA.PRN")
RETURN NIL
Dessa forma removo os caracteres especiais que não podem ser impressos. Espero ter contribuído para algo mais simples e prático.

Salvar screen

Enviado: 31 Mai 2012 08:24
por bencz
jovemxxx
Quando usei seu código, ele criou varias linhas em branco :/

Pablo César
Seu código funcionou, mas, deu o msm problema, ele "duplicava"... ;x

Salvar screen

Enviado: 31 Mai 2012 09:05
por Pablo César
Você poderia salvar a tela em arquivo e anexar em mensagem aqui no fórum ?

Vtela:=SaveScreen(00,00,24,79)
Save to Tela all like Vtela

Aí mande o tela.mem e faça também um Alt PrintScreen e salve no Paint.

Salvar screen

Enviado: 31 Mai 2012 09:35
por bencz
Imagem

Salvar screen

Enviado: 31 Mai 2012 10:16
por Pablo César
Analisando...

WVW_SetMainCoord( .t. ) Para quê sirve isto ? Pode remover e testar sem isso ?
acelconsultoria escreveu:neste tópico

WvW_SetMainCoord( .T. ) // trabalhar sob as mesmas coordenadas da janela principal do programa

WvW_SetMainCoord( .F. ) // cada janela terá sua coordenada independente da janela principal.
Veja o que eu fiz:
Peguei o seu arquivo Tela.mem que você disponibilizou. Desta forma:

Código: Selecionar todos

Restore from tela2
RestScreen(00,00,24,79,VTELA)
inkey(0)
Carreguei na tela e olha o que apareceu:
Imagem
Imagens triplicadas até.

Então decidi fazer o mesmo em Clipper e gravar em arquivo Tela2.mem para comparar tamanhos e conteúdo. Dai fiz este Teste.prg em Clipper:

Código: Selecionar todos

cls
@ 11,21 SAY "OLA MUNDO"
@ 12,21 SAY "lalas"
@ 13,21 SAY MAXROW()+1
@ 14,21 say MAXCOL()+1
@ 15,21 SAY "---------"
inkey(0)
Vtela:=SaveScreen(00,00,24,79)
Save to Tela2 all like Vtela
Pois ambos arquivos .mem tem o mesmíssimo tamanho:
4.034 Tela.mem
4.034 TELA2.MEM

Porém o seu conteúdo não. Abri em editor hexadecimal e veja a comparação:
Imagem
Esse comando WVW_SetMainCoord do WVW estaria bagunçando a tela ou faria o display de forma diferente.

Então na minha opinião ou é defeito ou efeito desse comando. Se não puder ver livre desse comando. Tentei fazer outro teste mas não irá dar certo nunca !
Lendo suas mensagens atrás, tente então criar a janela com:
WVW_nOpenWindow("MEU TESTE").

Note que aquele meu exemplo (leia os comentários aqui abaixo):

Código: Selecionar todos

FOR PI=4 TO 20                      // começa na linha 4 até a linha 20 (isso você pode mudar)
    ? CHARODD(SCREENSTR(PI,01,78))   // e aqui pega da coluna 1 até a 78
NEXT
Então sendo assim, você poderia apenas pegar a parte que deseja, quem sabe dê certo.

A solução deverá estar em WVW, está fora do meu conhecimento.

Salvar screen

Enviado: 31 Mai 2012 11:07
por Imatech
Bom dia !

Só 1 pequeno detalhe:

Observar que a Tela a Ser capturada não é tamanho 25x80

...Window( 10, 20, 20, 50 , ... ) = 10 x 30


Depurando o código seria interessante saber o retorno de: b, r [ MAXROW(), MAXCOL() ]

Vefificar com WVW_SetMainCoord( .t. ) e depois com WVW_SetMainCoord( .f. )

Salvar screen

Enviado: 31 Mai 2012 11:18
por Pablo César
Isso mesmo ! Foi tudo isso que eu quis dizer em outras palavras. O tamanho da janela em modo console, pode ser um problema atípico para resolver... por isso indiquei não passar o tamanho com WVW_nOpenWindow("MEU TESTE")

Tive outra idéia também. Experimenta colocar SetMode(25,80) depois do WVW_nOpenWindow(...

Salvar screen

Enviado: 31 Mai 2012 11:50
por Imatech
No caso de [ b, r ] serem diferentes de [ 9, 29 ]

b := 9
r := 29

Então deve ajustar via codigo

... SaveScreen(00,00,b,r)

Passar parametros para a função...
... RM_MVSAVE( b, r )

Código: Selecionar todos


*--------------------------------------------------------------*
* RM_MVSAVE()
*--------------------------------------------------------------*
FUNCTION RM_MVSAVE( b, r )
 LOCAL i := 0
 LOCAL nForLoop := 0
 LOCAL cScreen := SAVESCREEN(0, 0, b, r) //
 LOCAL nCellSize := INT( len( Savescreen( 0, 0, 0, 0 ) ) * 1 )
 LOCAL nStart := 1
 LOCAL nRange := INT( ( ( r + 1 ) * nCellSize ) * 1 )
 LOCAL cSubString := ''
 LOCAL cOutString := ''
 
 For i := 1 To ( b + 1 )
 cOutString := ''
 cSubString := Substr( cScreen, nStart, nRange )
 For nForLoop := 1 To nRange step nCellSize
 cOutString += F_Tab_Ascii( Substr( cSubString, nForLoop, 1 ) )
 Next
 sAux += ( cOutString ) + CHR(13) + CHR(10)
 nStart += nRange
 Next
 
RETURN( sAux )

*------------------------------------------*
* CARACTERES DESEJADOS NA TABELA ASCII
*------------------------------------------*
FUNCTION F_Tab_Ascii( cStr )
 LOCAL i := 0
 LOCAL cAux := ''

 FOR i := 33 TO 180 // 33 ... 255
  cAux += CHR( i )
 NEXT

 IF !( cStr $ cAux )
  cStr := ' '
 ENDIF

RETURN( cStr )


Salvar screen

Enviado: 31 Mai 2012 14:22
por bencz
Bom, fiz oq vcs falaram, mudei p/ .f.

nao apareceu nada na dialog....

escrevi no código:

Código: Selecionar todos

  ? "Max ROW: " + str(maxrow())
  ? "Max COL: " + str(maxcol())
o resultado foi:

Max ROW: 10
Max COL: 30

Salvar screen

Enviado: 31 Mai 2012 14:33
por Pablo César
Teste1: Experimentou colocar SetMode(25,80) depois do WVW_nOpenWindow("MEU TESTE",10,20,20,50) ?

Teste2: E quanto a você fazer com WVW_nOpenWindow("MEU TESTE") e a função que passei ?

Salvar screen

Enviado: 31 Mai 2012 14:39
por bencz
Bom, nao tive muito sucesso... qnd usei o SetMode, nada aconteceu, o arquivo nao foi gravado nem nada, e usando a sua função la, o FOR, tudo foi uma coluna p/ a esquerda... ;x

Salvar screen

Enviado: 31 Mai 2012 15:03
por Imatech
Se o resultado foi:
Max ROW: 10
Max COL: 30
Então o erro é exatamente você estar tentando salvar uma tela maior que essa...

Faça os testes novamente a faça os devidos ajustes
... SaveScreen( 0, 0, maxrow(), maxcol() )

Passar parametros para a função...
... RM_MVSAVE( maxrow(),maxcol() )


** PS: Não há nada de errado com a implementação da wvw, a tela/dialogo gerado foi 10 x 30: nada demais...

Salvar screen

Enviado: 31 Mai 2012 16:45
por asimoes
Já tentaram a função ScreenFile e FileScreen ?
ScreenFile()
Writes the contents of the current screen to a file.
Syntax
ScreenFile( <cFileName>, ;
[<lAppend>] , ;
[<nOffSet>] , ;
[<lTruncate>] ) --> nBytesWritten

Arguments
<cFileName>
This is a character string holding the name of the file to save a screen to. It must include path and file extension. If the path is omitted from <cFileName>, the file is searched in the current directory. If the file does not exist, it is created.
<lAppend>
If .T. (true) is passed, the current screen is appended to <cFileName>. The default value is .F. (false), i.e. the file <cFileName> is overwritten.
<nOffSet>
If <lAppend> is set to .T. (true), this numeric parameter defines the file offset, or starting posiion, where the current screen contents are stored. The default is the end-of-file.
<lTruncate>
When <lTruncate> is set to .T. (true) and the file pointer is not at the end-of-file after writing, the file size is reduced to the current file pointer position. The default value is .F. (false), which leaves the file size unchanged. The parameter is only required when multiple screens are stored in one file. Return
The function writes the contents of the current screen to <cFileName> and returns the number of bytes written as a numeric value

FileScreen()
Reads the contents of a screen from a file.
Syntax
FileScreen( <cFileName>, [<nOffSet>]) --> nBytesRead

Arguments
<cFilename>
This is a character string holding the name of the file to load a screen from, previously saved with ScreenFile(). It must include path and file extension. If the path is omitted from <cFileName>, the file is searched in the current directory.
<nOffSet>
If multiple screens are saved to <cFileName> an offset of (nScreenNumber-1) * nScreenSize bytes must be specified for <nOffSet> to read consecutive screens from the file. The screen size in bytes can be calulated as follows: nScreenSize := 2 * (MaxRow()+1) * (MaxCol()+1)

Return
The function loads a saved screen from <cFileName>, displays it and returns the number of bytes read as a numeric value.