RestScreen() falhando com UTF8

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

Moderador: Moderadores

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 »

As melhorias do José são boas, para mim este foi um exercício interessante, até me ajudou a relembrar algumas idéias perdidas no tempo, realmente foi divertido.
A idéias de colocar textura ficou interessante, deu um "ar" legado ao programa apesar que eu pessoalmente preferir mais o estilo "liso":
Capture.PNG
Capture2.PNG
Capture3.PNG
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 »

Developer, qual o código vc usou ? Desenhou os quadros digitando ALT + Chr(xxx) ? Meu problema está justamente nisso, desenhar os quadros e acentuar as telas.
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 »

Quintas, obrigado pelas sugestões. Não consegui entender o funcionamento da função Confirma. Se opc retorna sempre 1 como vai saber quando a opção for 2 ?
Quanto ao recebimentos dos parâmetros na função Tela(cEmpresa, cSistema) foi esquecimento na digitação. 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 »

Developer, qual o código vc usou ? Desenhou os quadros digitando ALT + Chr(xxx) ? Meu problema está justamente nisso, desenhar os quadros e acentuar as telas.
Rapaz, deu um trabalho adicionar assinatura pois não funcionava de jeito nenhum, finalmente consegui! Agora o nome aparece também.

Não uso ALT, sendo que isso só funciona se você usar um editor de código em CP437 (EN) que não é o meu caso (exceto quando tenho que editar algum código antigo que foi feito naquele editor), então acabo tendo que usar CHR()
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

RestScreen() falhando com UTF8

Mensagem por alxsts »

Olá!
Softwhouse escreveu:Developer, qual o código vc usou ? Desenhou os quadros digitando ALT + Chr(xxx) ?
A forma mais fácil de desenhar um Box na tela é usando a função DispBox(). Os conjuntos de caracteres usados para o contorno dos boxes estão no arquivo "Box.ch", e são formados por 8 caracteres cada. O arquivo, por padrão, fica na pasta include. É possível adicionar um nono caracteres à string, que servirá para preencher o interior do Box.

Código: Selecionar todos

#include "Box.ch"

Function Main()

   // Desenhar um Box com bordas simples, preenchido com espaços 
   DispBox( 0, 0, MaxRow(), MaxCol, B_SINGLE + Space( 1 ) )

   Inkey(0)

RETURN NIL
Softwhouse escreveu:Se opc retorna sempre 1 como vai saber quando a opção for 2 ?
Repare que o retorno da função é uma expressão lógica... não retorna sempre 1 e sim um valor .T. ou .F. É equivalente a:

Código: Selecionar todos

If nOpc == 1
   RETURN .T.
Else
   RETURN .F.
Endif
DispBox
Displays a box on the screen.

Syntax

DispBox( <nTop>, <nLeft>, <nBottom>, <nRight>, ;
[<cnBoxString>] , [<cColor>] ) --> NIL
Arguments

<nTop> and <nLeft> : screen coordinates for the upper left corner of the DispBox()output

<nBottom> and <nRight> : screen coordinates for the lower right corner of the DispBox()output

<cnBoxString> : The appearance of the box to display can either be specified as numeric 1 (single line box), numeric 2 (double line box), or as a character string holding up to nine characters. The first eight characters define the border of the box while the ninth character is used to fill the box. #define constants to be used for <cnBoxString> are available in the BOX.CH #include file.

Pre-defined box strings for DispBox()

Constant Description
--------------- ----------------------------------------
B_SINGLE Single-line box
B_DOUBLE Double-line box
B_SINGLE_DOUBLE Single-line top, double-line sides
B_DOUBLE_SINGLE Double-line top, single-line sides

If no <cnBoxString> is specified, a single-line box is drawn. <cColor> : SetColor() compliant color string; default is the standard color of SetColor().

Return

DispBox() returns always NIL.

Description

The function DispBox() displays a box on the screen as specified with <cnBoxString>, using the standard color of SetColor() or <cColor>, if specified.

If a character string is used for <cnBoxString>, the first eight characters define the border of the box in clockwise direction, beginning with the upper left corner. An optional ninth character fills the area inside the box. Alternatively, a single character can be passed which is used to draw the entire box border. When the box is completely drawn, the cursor is positioned at the coordinates <nTop>+1 and <nLeft>+1, so that a subsequent DispOut() call starts displaying in the upper left corner of the box area.

Example

// The example demonstrates how characters are used to draw a box.
// Alphabetic characters define <cnBoxString> instead of characters
// holding graphic signs.

#include "Box.ch"

PROCEDURE Main
CLS
DispBox( 10,10,20,50, "AbCdEfGhi", "W+/R" )

Inkey(0)

DispBox( 10,10,20,50, B_DOUBLE + Space(1) )
DispOut( "Using #define constant" )
[]´s
Alexandre Santos (AlxSts)
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 »

Opcionalmente voce pode criar funções MsgYesNo() e MsgNoYes().
Uma com default em SIM e outra com default em NÃO.
Sim retorna .T.
Não retorna .F.

Código: Selecionar todos

IF MsgYesNo( "xxxx" )
Também não precisa colocar IF MsgYesNo( "xxx" ) == .T.

Retorno idêntico nas duas, pra não ficar preso a retornos diferentes.

Costumo usar funções padrão com nome em inglês, pra facilitar post em fórum internacional.
Pra algumas LIBs isso dá conflito, porque elas também usam kkkk

Opcionalmente também, se for Windows, tem a Messagebox() da API Windows, na lib hbwin do harbour.

Código: Selecionar todos

FUNCTION MsgYesNo( cText )

   LOCAL lValue

   //hb_ThreadStart( { || PlayText( cText ) } )
   lValue := wapi_MessageBox( wapi_GetActiveWindow(), cText, AppEmpresaApelido() + " Confirmação", WIN_MB_YESNO + WIN_MB_ICONQUESTION + WIN_MB_DEFBUTTON2 + WIN_MB_TOPMOST ) == WIN_IDYES

   RETURN lValue

FUNCTION MsgExclamation( cText )

   //hb_ThreadStart( { || PlayText( cText ) } )
   wapi_MessageBox( wapi_GetActiveWindow(), cText, AppEmpresaApelido() + " Atenção", WIN_MB_ICONASTERISK + WIN_MB_TOPMOST )

   RETURN Nil

FUNCTION MsgWarning( cText )

   //hb_ThreadStart( { || PlayText( cText ) } )
   wapi_MessageBox( wapi_GetActiveWindow(), cText, AppEmpresaApelido() + " Atenção", WIN_MB_ICONEXCLAMATION + WIN_MB_TOPMOST )

   RETURN Nil

FUNCTION MsgStop( cText )

   //hb_ThreadStart( { || PlayText( cText ) } )
   wapi_MessageBox( wapi_GetActiveWindow(), cText, AppEmpresaApelido() + " Atenção", WIN_MB_ICONHAND + WIN_MB_TOPMOST )

   RETURN Nil
jpa.png
Então... no final, aproveitar tela é relativo.
Com a mensagem da API Windows, não precisa salvar/restaurar tela por exemplo.
Se for GTWVG, ela tem o Alert() também.
E por aí vai.

De repente, quebrando a cabeça à toa pra manter caracteres especiais, salvar/restaurar tela, etc.
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 »

Também em GTWVG você tem o recurso de janelas.
Pra usar o termo GUI, podemos chamar de DIALOGS.
É o fim de usar save/restore screen.
E já separa as "dialogs" da mesma forma que vai precisar fazer com lib GUI.
Faço uso restrito disso, mas nada impede usar no aplicativo inteiro.
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 »

Não uso ALT, sendo que isso só funciona se você usar um editor de código em CP437 (EN) que não é o meu caso (exceto quando tenho que editar algum código antigo que foi feito naquele editor), então acabo tendo que usar CHR()
Sim, mas qual código usou ? Aquí configurei o Notepad++ p/ 8859-1 e no fonte coloquei REQUEST HB_CODEPAGE_PTISO e HB_SETCODEPAGE('PT_ISO') e não funcionou, configurei o Notepad++ para ANSI e também não deu certo.
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 »

Pera aí... é harbour ou xharbour ?

E tem mais outra pra ficar feliz:
Ao postar o fonte no fórum, corre o risco dele virar UTF-8, deixa de ser o fonte original.
Codepage aí... ferrou...
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 »

hbmk2 -find codepage


gtwvg.hbc (installed):
wvt_SetCodepage()

gtwvw.hbc (not installed):
wvw_SetCodepage()

xhb.hbc (installed):
hb_SetCodepage()

Harbour core (installed):
...
Sei lá se WVT tem tratamento especial...
Mas hb_SetCodePage() é compatibilidade com xharbour, essa lib deve ser evitada ao máximo.
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 »

E na dúvida....

Código: Selecionar todos

PROCEDURE HB_GTSYS

   REQUEST HB_GT_WVG_DEFAULT

   RETURN
Pelo menos nessa eu sei que funciona conforme padrão.

Código: Selecionar todos

Set( _SET_CODEPAGE, "PTISO" )
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 »

Sim, mas qual código usou ? Aquí configurei o Notepad++ p/ 8859-1 e no fonte coloquei REQUEST HB_CODEPAGE_PTISO e HB_SETCODEPAGE('PT_ISO') e não funcionou, configurei o Notepad++ para ANSI e também não deu certo.
Não uso o Notepad++, estou usando o VSCode, sugiro você escolher o encoding que preferir, não tem que ser o ISO 8859-1 mas eu acho este a melhor escolha para o seu caso, porém pode ser qualquer um: ANSI, CP437, UTF-8, apenas mantenha tudo no mesmo código escolhido, inclusive o editor, assim não terá problemas e não ficará confuso, é uma boa prática (diria até essencial) ter uma definição clara do que vai fazer e manter-se naquilo (é bom documentar), faça o trabalho limpo que ficará mais fácil para você no futuro.
Screenshot_1.jpg

Código: Selecionar todos

B_DOUBLE 
CHR(199)
CHR(182)
CHR(179) 
CHR(209) 
CHR(207) 
CHR(197)
Box_Chars.jpg
Capture.PNG
PS: Estou procurando trabalho, se souber de alguma coisa, avise pelo PV. Sou bem flexível.
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 »

Quintas, estou usando Harbour.

Mário, não entendeu. O Editor está configurado como?

ANSI ?
ISO 8859-1 ?

No código fonte colocou o o que ?

REQUEST HB_CODEPAGE_PTISO ?
HB_CDPSELECT('PTISO')

REQUEST HB_CODEPAGE_PT850 ?
HB_CDPSELECT(PT850) ?

Pode colocar seu código fonte ?
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 »

O Editor está configurado como?
ISO 8859-1

Veja na imagem, usando VSCode, ISO 8859-1 (canto inferior direito):
Screenshot_1.jpg
No código fonte colocou o o que ?

Código: Selecionar todos

REQUEST HB_CODEPAGE_PTISO
HB_CDPSELECT('PTISO')
Pode colocar seu código fonte ?/
O código fonte é o seu próprio
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 »

Pois é, desta forma não funciona no NotePad++, acentua corretamente mas os caracteres para desenho das telas não funcionam.
Fernando
Responder