Página 1 de 3
RestScreen() falhando com UTF8
Enviado: 19 Fev 2025 18:43
por Softwhouse
Alguém teria uma luz de como resolver o problema dessa rotina ? A função RestScreen() falha ao usar Menu To ou Achoice(). Estou usando UTF8 ou UTF8EX por causa dos acentos e caracteres para desenho das telas, o editor é o NotePad++
Código: Selecionar todos
#include 'inkey.ch'
#include 'hbgtinfo.ch'
Request HB_CODEPAGE_UTF8EX
Request HB_GT_WVT_DEFAULT
Function Main()
Public cSistema:= 'SISTEMA TESTE'
Public cEmpresa:= 'EMPRESA ABC'
HB_CDPSELECT('UTF8EX')
HB_GTINFO(HB_GTI_ISFULLSCREEN, .T.)
HB_GTINFO(HB_GTI_MAXIMIZED, .T.)
HB_GTINFO(HB_GTI_FONTNAME, 'Lucida Console')
Set Century On
Set ScoreBoard Off
Set Wrap On
Tela(cEmpresa,cSistema)
SetCursor(0)
Do While .T.
If InKey() == 27
If Confirma('Abandonar o sistema ?')==1
Return(.T.)
EndIf
EndIf
EndDo
Return(.T.)
Function Tela()
@ 00,00 Say Replicate('█',80) Color('N')
SetColor('W+/N')
@ 00,00 Say SubStr(cEmpresa,1,27)
@ 00,27 Say '|'
@ 00,28 Say PadC(cSistema,30)
@ 00,57 Say '|'
@ 00,59 Say Date()
@ 00,70 Say '|'
@ 01,00 Say Replicate('█',80) Color('W')
@ 02,00,23,79 Box Replicate(Chr(219),80) Color('N+')
@ 24,00 Say Replicate('█',80) Color('W')
Return(Nil)
Function Confirma(cTexto)
Local cOldTela:= SaveScreen(24,00,24,79)
cColor:= SetColor()
SetColor('N/W,W+/N')
nCol:= (80-Len(cTexto))/2-6
@24,00 Clear To 24,79
@24,nCol Say cTexto
@24,nCol+Len(cTexto)+2 Prompt 'Sim'
@24,nCol+Len(cTexto)+7 Prompt 'Não'
Menu To Confirm
SetColor(cColor)
RestScreen(24,00,24,79,cOldTela)
Return(Confirm)
RestScreen() falhando com UTF8
Enviado: 19 Fev 2025 19:14
por JoséQuintas
Softwhouse escreveu:lguém teria uma luz de como resolver o problema dessa rotina ? A função RestScreen() falha ao usar Menu To ou Achoice(). Estou usando UTF8 ou UTF8EX por causa dos acentos e caracteres para desenho das telas, o editor é o NotePad++
Se é só pra isso que usa UTF-8, não invente moda, pra não ter outros problemas.
Quanto a salvar/restaurar telas
RestScreen() falhando com UTF8
Enviado: 19 Fev 2025 19:38
por JoséQuintas
Um jeito prático de mostrar os caracteres:
Ao invés de:
use
Vai funcionar em qualquer codepage.
Letra acentuada... é usar mesma codepage no editor e no fonte.
Aqui uso PTISO, mesma do WINDOWS PT-BR.
E programmers notepad, que tem opção ANSI ou UTF-8, sendo que ANSI usa o padrão do Windows.
No notepad++ é selecionar talvez ISO8859 ou sei lá qual, não uso, não faço questão de saber.
Depois no PDF use WinAnsi, mesma coisa, Ansi do Windows.
Por acaso vai usar DBF, e já considerou que campos em DBF tem tamanho fixo e isso não serve pra UTF-8 que tem tamanho variável ?
RestScreen() falhando com UTF8
Enviado: 20 Fev 2025 10:54
por Softwhouse
Valou Quintas, adicionado hb_gtInfo( HB_GTI_COMPATBUFFER, .F. resolveu.
Quanto aos caracteres acentuados são só para as telas mesmo, não serão utilizados nos dbfs.
Obrigado.
RestScreen() falhando com UTF8
Enviado: 20 Fev 2025 14:02
por developer
É só uma sugestão, aliás, o José Quintas já falou, mas gostaria de reforçar baseado na minha experiência pessoal.
Quer acentos funcionando e não ter dor-de-cabeça, adote o PTISO (ISO 8859-1 Latin-1) como padrão, tudo vai funcionar 100%, vai ser compatível com tudo que existe, o próprio Windows usa o padrão Windows-1252 (CP1252), também conhecido como ANSI.
Veja tabela de diferenças aqui
Eu já tentei usar o UTF-8 e abandonei
the ripe ain't worth the pick, ou seja, não teve vantagem alguma no meu caso, não valeu a pena.
O meu único uso para UTF-8 é para gerar HTML ou PHP, mas até neste caso, sugiro usar o editor em ANSI/ISO, gerar o código neste modo e usar PTISO como sugerido e para gerar qualquer coisa externa em UTF-8 use hb_translate() e seja feliz.
RestScreen() falhando com UTF8
Enviado: 21 Fev 2025 09:30
por Softwhouse
Mas nessa codificação os caracteres para desenho de tela não funcionam.
Chr(195), Chr(197), Chr(180) .....
RestScreen() falhando com UTF8
Enviado: 21 Fev 2025 09:32
por Softwhouse
O programa foi escrito usando o Edit do DOS. Alguém sabe qual código usar ?
RestScreen() falhando com UTF8
Enviado: 21 Fev 2025 11:01
por developer
De acordo com a
a documentação da MS ele cria e edita somente código ASCII, que é o nosso EN ou CP437.
Qual é a sua necessidade? Converter o código antigo para UTF-8, ou manter em ASCII? Ou ainda outro objetivo?
Eu fiz um teste com PTISO ( também adicionei SETMODE(25,80) ):
Código: Selecionar todos
#include 'inkey.ch'
#include 'hbgtinfo.ch'
Request HB_CODEPAGE_PTISO
Request HB_GT_WVT_DEFAULT
Function Main()
Public cSistema:= 'SISTEMA TESTE'
Public cEmpresa:= 'EMPRESA ABC'
HB_CDPSELECT('PTISO')
HB_GTINFO(HB_GTI_ISFULLSCREEN, .T.)
HB_GTINFO(HB_GTI_MAXIMIZED, .T.)
HB_GTINFO(HB_GTI_FONTNAME, 'Lucida Console')
hb_gtInfo( HB_GTI_COMPATBUFFER, .F. )
Set Century On
Set ScoreBoard Off
Set Wrap On
SETMODE(25,80)
Tela(cEmpresa,cSistema)
SetCursor(0)
Do While .T.
If InKey() == 27
If Confirma('Abandonar o sistema ?')==1
Return(.T.)
EndIf
EndIf
EndDo
Return(.T.)
Function Tela()
//@ 00,00 Say Replicate(chr(219),80) Color('N')
SetColor('W+/N')
@ 00,00 Say SubStr(cEmpresa,1,27)
@ 00,27 Say '|'
@ 00,28 Say PadC(cSistema,30)
@ 00,57 Say '|'
@ 00,59 Say Date()
@ 00,70 Say '|'
@ 1, 0, 1, MaxCol() BOX Chr(219)
@ 02,00,23,79 Box Replicate(Chr(219),80) Color('N+')
@ 24, 0, 24, MaxCol() BOX Chr(219)
Return(Nil)
Function Confirma(cTexto)
Local cOldTela:= SaveScreen(24,00,24,79)
cColor:= SetColor()
SetColor('N/W,W+/N')
nCol:= (80-Len(cTexto))/2-6
@24,00 Clear To 24,79
@24,nCol Say cTexto
@24,nCol+Len(cTexto)+2 Prompt 'Sim'
@24,nCol+Len(cTexto)+7 Prompt 'Não'
Menu To Confirm
SetColor(cColor)
RestScreen(24,00,24,79,cOldTela)
Return(Confirm)
No editor que usei (no caso usei o
VSCode), salvei em ISO-8859-1 (ou Windows-1252 / ANSI)
Eis o resultado:
RestScreen() falhando com UTF8
Enviado: 21 Fev 2025 11:24
por Jairo Maia
Softwhouse escreveu:O programa foi escrito usando o Edit do DOS. Alguém sabe qual código usar ?
O Edite do DOS usava
DOS 850 - Europa Ocidental
RestScreen() falhando com UTF8
Enviado: 21 Fev 2025 11:26
por JoséQuintas
E tem outra também: tem lib que não muda codepage automático, como WVW, só complica mais ainda.
Mas era UTF-8, depois DOS, deve estar tudo misturado agora, e por isso complicou pra corrigir.
RestScreen() falhando com UTF8
Enviado: 21 Fev 2025 14:42
por developer
Uma prática que ajuda a minimizar problemas é evitar, na medida do possível, usar caracteres especiais.
O código abaixo fará a mesma coisa sem usar CHR()
Código: Selecionar todos
#include 'inkey.ch'
#include 'hbgtinfo.ch'
Request HB_CODEPAGE_PTISO
Request HB_GT_WVT_DEFAULT
PROCEDURE Main()
Public cSistema:= 'SISTEMA TESTE'
Public cEmpresa:= 'EMPRESA ABC'
HB_CDPSELECT('PTISO')
HB_GTINFO(HB_GTI_ISFULLSCREEN, .T.)
HB_GTINFO(HB_GTI_MAXIMIZED, .T.)
HB_GTINFO(HB_GTI_FONTNAME, 'Lucida Console')
hb_gtInfo( HB_GTI_COMPATBUFFER, .F. )
Set Century On
Set ScoreBoard Off
Set Wrap On
SETMODE(25,80)
Tela(cEmpresa,cSistema)
SetCursor(0)
Do While .T.
If InKey() == 27
If Confirma('Abandonar o sistema ?')==1
Return(.T.)
EndIf
EndIf
EndDo
RETURN
Function Tela()
SetColor('N/N*')
@ 02,00 CLEAR TO 23,79
SetColor('W+/N')
@ 00,00 Say SubStr(cEmpresa,1,27)
@ 00,27 Say '|'
@ 00,28 Say PadC(cSistema,30)
@ 00,57 Say '|'
@ 00,59 Say Date()
@ 00,70 Say '|'
@ 01,00 Say Replicate( ' ', 80 ) Color 'N/W*'
@ 24,00 Say Replicate( ' ', 80 ) Color 'N/W*'
Return(Nil)
Function Confirma(cTexto)
Local cOldTela:= SaveScreen(24,00,24,79)
cColor:= SetColor()
SetColor('N/W*,W+/N')
nCol:= (80-Len(cTexto))/2-6
@24,00 Clear To 24,79
@24,nCol Say cTexto
@24,nCol+Len(cTexto)+2 Prompt 'Sim'
@24,nCol+Len(cTexto)+7 Prompt 'Não'
Menu To Confirm
SetColor(cColor)
RestScreen(24,00,24,79,cOldTela)
Return(Confirm)
RestScreen() falhando com UTF8
Enviado: 21 Fev 2025 16:28
por JoséQuintas
Apesar do fonte funcionar, até acho estranho, mas considero que tem coisa errada.
Passa 2 parâmetros, mas na função não recebe nenhum.
Tenho sugestões pra esse fonte, talvez goste.
Testar aqui e postar em seguida.
RestScreen() falhando com UTF8
Enviado: 21 Fev 2025 16:50
por developer
Apesar do fonte funcionar, até acho estranho, mas considero que tem coisa errada.
Passa 2 parâmetros, mas na função não recebe nenhum.
De fato é estanho, somente funcona porque ele declarou como variáveis públicas:
Código: Selecionar todos
Public cSistema:= 'SISTEMA TESTE'
Public cEmpresa:= 'EMPRESA ABC'
Apesar que deveria dar algum erro de variáveis púlbicas e parâmetros locais entrando em choque...
Aparece somente na opçao -w1(+) como "
Ambiguous reference"
Código: Selecionar todos
t.prg(8) Warning W0002 Ambiguous reference, assuming memvar 'CSISTEMA'
t.prg(9) Warning W0002 Ambiguous reference, assuming memvar 'CEMPRESA'
t.prg(22) Warning W0001 Ambiguous reference 'CEMPRESA'
t.prg(22) Warning W0001 Ambiguous reference 'CSISTEMA'
t.prg(28) Warning W0006 Procedure returns value
t.prg(39) Warning W0001 Ambiguous reference 'CEMPRESA'
t.prg(41) Warning W0001 Ambiguous reference 'CSISTEMA'
t.prg(51) Warning W0001 Ambiguous reference 'CCOLOR'
t.prg(53) Warning W0001 Ambiguous reference 'NCOL'
t.prg(55) Warning W0001 Ambiguous reference 'NCOL'
t.prg(56) Warning W0001 Ambiguous reference 'NCOL'
t.prg(57) Warning W0001 Ambiguous reference 'NCOL'
t.prg(58) Warning W0001 Ambiguous reference 'CONFIRM'
t.prg(58) Warning W0001 Ambiguous reference 'CONFIRM'
t.prg(58) Warning W0001 Ambiguous reference 'CONFIRM'
t.prg(59) Warning W0001 Ambiguous reference 'CCOLOR'
t.prg(61) Warning W0001 Ambiguous reference 'CONFIRM'
RestScreen() falhando com UTF8
Enviado: 21 Fev 2025 17:17
por JoséQuintas
Sugestões
use MaxRow() e MaxCol(), assim fica preparado pra qualquer mudança que faça depois.
25 x 80 é coisa do passado nuito distante, no DOS já dava pra usar 28 X 80 ou mais, e os monitores deixaram de ser quadrados.
- Já que a rotina é pra Sim ou Não, e vai usar muito, reduza necessidade de fonte extra no aplicativo
Bastou alterar o retorno
E declarar variáveis, e com nomes fáceis de mexer, principalmente essa Sim ou não que vai usar em todo aplicativo.
Aqui as cores ficaram malucas, nem perdi tempo em entender, talvez WVT, sei lá.
Ia postar o fonte com ajustes, inclusive o uso de Chr(176)
RestScreen() falhando com UTF8
Enviado: 22 Fev 2025 04:22
por JoséQuintas
Código: Selecionar todos
#include 'inkey.ch'
#include 'hbgtinfo.ch'
REQUEST HB_CODEPAGE_PTISO
REQUEST HB_GT_WVT_DEFAULT
#include "inkey.ch"
#define BOX_CHAR Replicate( Chr(177), 9 )
MEMVAR cSistema, cEmpresa
FUNCTION Main()
PUBLIC cSistema := 'SISTEMA TESTE'
PUBLIC cEmpresa := 'EMPRESA ABC'
SetMode(33,100)
HB_GTINFO( HB_GTI_ISFULLSCREEN, .T. )
HB_GTINFO( HB_GTI_MAXIMIZED, .T. )
HB_GTINFO( HB_GTI_FONTNAME, 'Lucida Console' )
hb_gtInfo( HB_GTI_COMPATBUFFER, .F. )
SET CENTURY ON
SET DATE BRITISH
SET SCOREBOARD OFF
SET WRAP ON
Set( _SET_CODEPAGE, "PTISO" )
Tela()
DO WHILE .T.
IF Inkey() == K_ESC
IF Confirma( 'Abandonar o sistema ?' )
RETURN .T.
ENDIF
ENDIF
ENDDO
RETURN .T.
FUNCTION Tela()
@ 00, 00, 00, MaxCol() BOX BOX_CHAR Color( 'N' )
SetColor( 'W+/N' )
@ 00, 00 SAY Substr( cEmpresa, 1, 27 )
@ 00, 27, 00, 27 BOX BOX_CHAR
@ 00, 28 SAY Padc( cSistema, MaxCol() - 49 )
@ 00, MaxCol() - 22, 00, MaxCol() - 22 BOX BOX_CHAR
@ 00, MaxCol() - 20 SAY Date()
@ 00, MaxCol() - 9, 00, MaxCol() - 9 BOX BOX_CHAR
@ 01, 00, 01, MaxCol() BOX BOX_CHAR Color( 'W' )
@ 02, 00, MaxRow() - 1, MaxCol() Box BOX_CHAR Color( 'N+' )
@ MaxRow(), 00, MaxRow(), MaxCol() BOX BOX_CHAR Color( 'W' )
RETURN Nil
FUNCTION Confirma( cTexto )
LOCAL cOldTela := SaveScreen( MaxRow(), 00, MaxRow(), MaxCol() )
LOCAL cColor, nCol, nOpc := 1
cColor:= SetColor()
SetColor( 'N/W,W+/N' )
nCol:= ( MaxCol() - Len( cTexto ) ) / 2 - 6
@ MaxRow(), 00 CLEAR TO MaxRow(), MaxCol()
@ MaxRow(), nCol SAY cTexto
@ Row(), nCol + Len( cTexto ) + 2 Prompt 'Sim'
@ Row(), nCol + Len( cTexto ) + 7 Prompt 'Não'
MENU To nOpc
SetColor( cColor )
RestScreen( MaxRow(), 00, MaxRow(), MaxCol(), cOldTela )
RETURN nOpc == 1
