Salvar screen
Moderador: Moderadores
Salvar screen
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
by: IMATECH
IMATION TECNOLOGIA
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Salvar screen
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
Dessa forma removo os caracteres especiais que não podem ser impressos. Espero ter contribuído para algo mais simples e prático.
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 NILUm 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.
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.
Salvar screen
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
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
- Pablo César
- Usuário Nível 7

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

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Salvar screen
Analisando...
WVW_SetMainCoord( .t. ) Para quê sirve isto ? Pode remover e testar sem isso ?
Peguei o seu arquivo Tela.mem que você disponibilizou. Desta forma:Carreguei na tela e olha o que apareceu:

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: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:

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):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.
WVW_SetMainCoord( .t. ) Para quê sirve isto ? Pode remover e testar sem isso ?
Veja o que eu fiz: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.
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)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 Vtela4.034 Tela.mem
4.034 TELA2.MEM
Porém o seu conteúdo não. Abri em editor hexadecimal e veja a comparação:
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
NEXTA 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.
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.
Salvar screen
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. )
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
by: IMATECH
IMATION TECNOLOGIA
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Salvar screen
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(...
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.
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.
Salvar screen
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 )
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
by: IMATECH
IMATION TECNOLOGIA
Salvar screen
Bom, fiz oq vcs falaram, mudei p/ .f.
nao apareceu nada na dialog....
escrevi no código:
o resultado foi:
Max ROW: 10
Max COL: 30
nao apareceu nada na dialog....
escrevi no código:
Código: Selecionar todos
? "Max ROW: " + str(maxrow())
? "Max COL: " + str(maxcol())
Max ROW: 10
Max COL: 30
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Salvar screen
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 ?
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.
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.
Salvar screen
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
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...
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
by: IMATECH
IMATION TECNOLOGIA
Salvar screen
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)
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)




