RestScreen() falhando com UTF8

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

Moderador: Moderadores

Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

RestScreen() falhando com UTF8

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


Fernando
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

RestScreen() falhando com UTF8

Mensagem 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

Código: Selecionar todos

   hb_gtInfo( HB_GTI_COMPATBUFFER, .F. )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

RestScreen() falhando com UTF8

Mensagem por JoséQuintas »

Um jeito prático de mostrar os caracteres:

Ao invés de:

Código: Selecionar todos

@ 0, 0 SAY Replicate( "X", 80 ) COLOR "N" )
use

Código: Selecionar todos

@ 0, 0, 0, MaxCol() BOX Chr(219)
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 ?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

RestScreen() falhando com UTF8

Mensagem 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.
Fernando
Avatar do usuário
developer
Usuário Nível 3
Usuário Nível 3
Mensagens: 149
Registrado em: 09 Nov 2024 23:45
Localização: Londrina/PR

RestScreen() falhando com UTF8

Mensagem 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.
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

RestScreen() falhando com UTF8

Mensagem por Softwhouse »

Mas nessa codificação os caracteres para desenho de tela não funcionam.
Chr(195), Chr(197), Chr(180) .....
Fernando
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

RestScreen() falhando com UTF8

Mensagem por Softwhouse »

O programa foi escrito usando o Edit do DOS. Alguém sabe qual código usar ?
Fernando
Avatar do usuário
developer
Usuário Nível 3
Usuário Nível 3
Mensagens: 149
Registrado em: 09 Nov 2024 23:45
Localização: Londrina/PR

RestScreen() falhando com UTF8

Mensagem 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:
Screenshot_2.jpg
Screenshot_3.jpg
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

RestScreen() falhando com UTF8

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

RestScreen() falhando com UTF8

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
developer
Usuário Nível 3
Usuário Nível 3
Mensagens: 149
Registrado em: 09 Nov 2024 23:45
Localização: Londrina/PR

RestScreen() falhando com UTF8

Mensagem 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)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

RestScreen() falhando com UTF8

Mensagem por JoséQuintas »

Apesar do fonte funcionar, até acho estranho, mas considero que tem coisa errada.

Código: Selecionar todos

   Tela(cEmpresa,cSistema)
...
FUNCTION Tela()
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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
developer
Usuário Nível 3
Usuário Nível 3
Mensagens: 149
Registrado em: 09 Nov 2024 23:45
Localização: Londrina/PR

RestScreen() falhando com UTF8

Mensagem por developer »

Apesar do fonte funcionar, até acho estranho, mas considero que tem coisa errada.

Código: Selecionar todos

   Tela(cEmpresa,cSistema)
...
FUNCTION Tela()
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'
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

RestScreen() falhando com UTF8

Mensagem 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

Código: Selecionar todos

         IF MsgYesNo( 'Abandonar o sistema ?' )
Bastou alterar o retorno

Código: Selecionar todos

FUNCTION MsgYesNo( cTexto )
...
   RETURN nOpc == 1
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)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

RestScreen() falhando com UTF8

Mensagem 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
tela.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder