Salvar screen

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Salvar screen

Mensagem por bencz »

qnd salvei, ele criou uma linha em branco...
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Salvar screen

Mensagem 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 )



M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Salvar screen

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Salvar screen

Mensagem 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
Imagem
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Salvar screen

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Salvar screen

Mensagem por bencz »

Imagem
Anexos
Desktop.zip
(9.93 KiB) Baixado 104 vezes
Imagem
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Salvar screen

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Salvar screen

Mensagem 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. )
M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Salvar screen

Mensagem 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(...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Salvar screen

Mensagem 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 )

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Salvar screen

Mensagem 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
Imagem
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Salvar screen

Mensagem 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 ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Salvar screen

Mensagem 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
Imagem
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Salvar screen

Mensagem 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...
M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Salvar screen

Mensagem 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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder