portuguese:
pessoal, boa noite!
estou agora migrando aos poucos de CONSOLE p/ GUI, e, usando a HMG 3.0.xx descobri que é possível no lugar de usar mensagens comuns ao usuário, é possível que elas estejam já modo GRÁFICO. Isso é ótimo!
São as MSG + yesno, okcancel, info, exclamation, box, etc...
Estou implementando tudo aos poucos, e, a começar com a MSGYESNO e MSGINFO. Só que tem um problema.
Vejamos o código antigo abaixo no modo CONSOLE:
Code: Select all
function CONFIRMA (TEXTO)
local LIN := 16,;
COL := 0,;
CENTRO := 0,;
LARG_JAN := 0,;
CONTROLE := 2,;
SALVA_COR := setcolor (),;
SALVA_TELA := nil,;
SALVA_INTENSIDADE := set (_SET_INTENSITY)
if len (TEXTO) + 2 < 16
TEXTO := TEXTO + SPACE(16-(LEN(TEXTO)+2))
endif set (_SET_INTENSITY,.t.)
TEXTO := TEXTO + ' ? '
LARG_JAN = len (TEXTO) + 2
if LARG_JAN < 16
LARG_JAN = 16
endif
COL := (80 - LARG_JAN) / 2
SALVA_TELA := savescreen (LIN,0,LIN + 5,maxcol ())
setcolor (COR_CONFIRMA)
setcolor (COR_REVERSA ())
@ LIN,COL clear to LIN + 3,COL + LARG_JAN
SOMBRA (LIN,COL,LIN + 3,COL + LARG_JAN)
@ LIN,COL to LIN + 3,COL + LARG_JAN
setcolor (COR_CONFIRMA)
@ LIN + 1,COL + 2 say TEXTO
CENTRO := (LARG_JAN - 9) / 2
@ LIN + 2,COL + CENTRO prompt 'Sim'
@ LIN + 2,COL + CENTRO + 6 prompt 'N„o'
menu to CONTROLE
if CONTROLE = 1
CONTROLE := .t.
else
CONTROLE := .f.
endif
setcolor (SALVA_COR)
set (_SET_INTENSITY,SALVA_INTENSIDADE)
restscreen (LIN,0,LIN + 5,maxcol (),SALVA_TELA)
return (CONTROLE)
Agora observem que no modo GRÁFICO, eliminei bastante coisa:
Code: Select all
function CONFIRMA (TEXTO,PROGRAMA)
local LIN := 16,;
COL := 0,;
CENTRO := 0,;
LARG_JAN := 0,;
CONTROLE := 2,;
SALVA_COR := setcolor (),;
SALVA_TELA := nil,;
SALVA_INTENSIDADE := set (_SET_INTENSITY)
if len (TEXTO) + 2 < 16
TEXTO := TEXTO + SPACE(16-(LEN(TEXTO)+2))
endif
MsgYesNo (TEXTO,PROGRAMA)
return // (CONTROLE)
Na MSGYesNo, o resultado esperado às vezes não é o mesmo do modo CONSOLE.
Descobri que se eu usar .not. o resultado é estranho.
Por exemplo, no código abaixo:
Code: Select all
if .not. CONFIRMA ('Confirma Dados')
loop
endif
No modo CONSOLE tá tudo certo, o processador harbour no RUN-TIME entende corretamente que foi pressionado o não e então é pra desfazer um possível ESC que fo pressionado e volta para o do while .t. .
Mas essa mesma coisa no modo GUI, além de o pressionamento do SIM ele entender como NÃO, se pressionarmos NÃO (já que está aceitando o contrário), ele deveria apenas sair do GET em questão e ir para outro lugar, mas, estranhamente é como se fosse pressionado vários ESCs para sair de todas as telas e voltar ao início do módulo.
O código que contém o CONFIRMA acima e o while .t. é (só pra efeito didático):
Code: Select all
do while .t.
CAN_TECLA_F3 := .t.
set key TECLA_CONT_ANT to
mIND := achoice (12,01,16,77,mLINHA,.T.,'fACH_004',mIND)
set key TECLA_CONT_ANT to CONTEUDO_ANTERIOR
CAN_TECLA_F3 := .f.
if lastkey () = 27
SALVA_CP := savescreen (0,0,maxrow (),maxcol ())
// if .not. CONFIRMA ('Confirma Dados')
if CONFIRMA ('Confirma Dados')
exit
else
loop
endif
// exit
elseif lastkey () = 13
mCDPRODUTO := val (substr (mLINHA [mIND],01,13))
* Consulta se j existe o produto/grade na venda
EXISTE_PRD := EXISTE_PRDUTO ()
@ 12 + nLinGet,01 get mCDPRODUTO picture pCDPRODUTO when empty (mCDPRODUTO) valid fCDPRODUTO ()
read
mVT_MERCAD := 0
mVR_DESCON := 0
mVT_VENDA := 0
for mI = 1 to 15
*mQT_VENDA := val (substr (mLINHA [mI],52,06))
mQT_VENDA := val (substr (mLINHA [mI],51,07)) // Modificado p/Mim em 09/05/01, p/ poder func. cm,kg.
mVR_UNITAR := val (substr (mLINHA [mI],59,01) +;
substr (mLINHA [mI],61,03) + '.'+;
substr (mLINHA [mI],65,02))
mVR_TOTAL := val (str (mQT_VENDA * mVR_UNITAR,8,2))
mVT_MERCAD += mVR_TOTAL
next
mVR_DESCON := mVT_MERCAD * (mVR_PERDES/100)
mVT_VENDA := mVT_MERCAD - mVR_DESCON
MOSTRA_COMPLEMENTO ()
endif
enddo
Bom, alguém aqui, sabe me dizer por que isso acontece e como resolver?