MEMOEDIT() Não fecha sem salvar

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

Moderador: Moderadores

andersondecamargo
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 23 Dez 2010 17:20
Localização: Jandira / São Paulo

MEMOEDIT() Não fecha sem salvar

Mensagem por andersondecamargo »

Olá.

Estou entrando agora neste mundo de clipper e harbour. Hoje fiquei enrolado num problema e não consegui solucionar.

Construí um MEMOEDIT com uma função de controle.
Coloquei uma legenda abaixo do MEMOEDIT escrita "PRESSIONE CTRL+X PARA SAIR"
Dentro da função de controle, há as intruções abaixo:

Código: Selecionar todos

IF LASTKEY()==24 // CTRL+X
  salvar = caixaSimNao(10,10,"Deseja Salvar as alteracoes?","",1)
  IF salvar
    KEYBOARD CHR(23) //ctrl+w
  ELSE
     KEYBOARD CHR(27) //esc
  ENDIF
ENDIF
Esta caixaSimNao() é bem óbvia. Exibe um "popup" com um PROMPT de sim/não e retorna .T. para SIM e .F. para NÃO.
Ela em sí estáfuncionando perfeitamente.

###### PROBLEMA: O MEMOEDIT não fecha quando o usuário seleciona NÃO.

Outra informação: Se eu teclo ESC no teclado, o MEMOEDIT também não fecha. Mas se eu teclo CTRL+W ele GRAVA e FECHA normalmente.


O que diabos eu fiz de errado???

Tenho a impressão de que a solução é bem óbvia e, pelo fato de não manjar muito (ainda... me aguardem) eu não encontro a saída.

Valew!


ps.: Eu pesquisei por soluções no fórum e não achei. Não queria ter que utilizar outras opções, como o TBROWSE que encontrei por aqui (que por sinal é muito daHora). Mas eu quero realmente dissecar o básico até poder usufruir de coisas prontas com consciência de que realmente são melhores.
esgici
Usuário Nível 1
Usuário Nível 1
Mensagens: 34
Registrado em: 27 Ago 2012 14:51
Localização: Turkiye
Contato:

MEMOEDIT() Não fecha sem salvar

Mensagem por esgici »

Ola Anderson

Did you tried returning 23 / 27 ( as numeric value, no char ) from user / control function instead of using KEYBOARD command ?

I hope this method will be appropriate to your need.

Saudação

--

Esgici
Saudação
Esgici
Viva Clipper !
andersondecamargo
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 23 Dez 2010 17:20
Localização: Jandira / São Paulo

MEMOEDIT() Não fecha sem salvar

Mensagem por andersondecamargo »

Sim. Infelizmente sim.

Tentei agora mesmo, e não funcionou.

Veja abaixo... eu usei as duas formas:

Código: Selecionar todos


IF LASTKEY()==24 // CTRL+X
 salvar = caixaSimNao(10,10,"Deseja Salvar as alteracoes?","",1)
 IF salvar
   KEYBOARD CHR(23) //ctrl+w
 ELSE
    KEYBOARD CHR(27) //esc
    retorno = 27 // esta variável será utilizada no fim da função
 ENDIF
ENDIF

No fim da função de controle...

Código: Selecionar todos

 
 RETURN retorno
Não acontece nada.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

MEMOEDIT() Não fecha sem salvar

Mensagem por alxsts »

Olá!

Habitue-se a usar as constantes manifestas para verificação de teclas. Estas constantes estão contidas no arquivo Inkey.Ch, na pasta include, e aumentam muito a legibilidade do código. Veja exemplo abaixo. Note que os nomes das constantes são case sensitive.

No Inkey.Ch do [x]Harbour, há novas definições para algumas teclas, incluindo a tecla Control+X que tem o valor de 536 em teclados com mais de 84 teclas

Faça um teste e troque o 24 pelo 536. Veja se ele captura o Control+X.

Código: Selecionar todos

#include "inkey.ch"

IF LASTKEY()== K_CTRL_X // CTRL+X
 salvar = caixaSimNao(10,10,"Deseja Salvar as alteracoes?","",1)
 IF salvar
 KEYBOARD CHR(K_CTRL_W) //ctrl+w
 ELSE
  KEYBOARD CHR(K_ESC) //esc
  retorno = 27 // esta variável será utilizada no fim da função
 ENDIF
ENDIF
[]´s
Alexandre Santos (AlxSts)
andersondecamargo
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 23 Dez 2010 17:20
Localização: Jandira / São Paulo

MEMOEDIT() Não fecha sem salvar

Mensagem por andersondecamargo »

Então Alxsts,

Primeiramente valew pela dica das constantes... (parei com os númerozinhos..rs). Já substituí as deste código. Vou dar uma olhada no inkey.CH pra conhece-las melhor.


Quanto ao 536, o Harbour não associou ao CTRL+X quando eu teclei.
Mas a constante sim (K_CTRL_X).

Contudo, o ESC ainda não rola. Tanto TECLANDO quanto invocando KEYBOARD CHR(K_ESC) ou mesmo retornando 27 na função de controle. Nada muda. : (
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

MEMOEDIT() Não fecha sem salvar

Mensagem por Pablo César »

Oi Anderson, eu usava o KBDEMULATE(CHR(27)) para sair e o KBDEMULATE(CHR(23)) para gravar, essas eram funções da CT.LIB para Clipper. Mas agora vejo que no Harbour não possui equivalente ou com o mesmíssimo resultado.

Notei que não adianta utilizar simplesmente o KEYBOARD porque não funciona e pesquisando descobri que você pode substituir o KEYBOARD por HB_KEYPUT.

Veja o meu exemplo abaixo, você verá que funciona +/- como você quer, daí é só adaptar:

Código: Selecionar todos

#include "Set.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "Getexit.ch"
#include "memoedit.ch"
#include "hbinkey.ch"

#define CRLF            Chr(13)+Chr(10)

REQUEST HB_GT_WIN_DEFAULT

Function Main()
Private CONTECOR := { "09/01","00/07","15/04","15/01","00/03","00/07","04/07","08/07","15/03","15/02","15/04","14/07","15/03" }
SetMode(25,80)
SetColor("BG/BG")
Cls
If !File("OBS001.TXT")
   Hb_MemoWrit("OBS001.TXT","Teste1"+CRLF+"Teste2") // criando arquivo
Endif
ULT_CURSOR := SAVECURSOR()
VARQUIVO1:="OBS001.TXT"
IF !FILE(VARQUIVO1)
   TEXTO=CHR(255)
ELSE
   TEXTO:=MEMOREAD(VARQUIVO1)
ENDIF
SAVE SCREEN TO TELA8
XOBS=EDITA(TEXTO,"Recados para o cliente",05,09,21,67,VARQUIVO1)
RESTCURSOR(ULT_CURSOR)
RESTORE SCREEN FROM TELA8
Return Nil

FUNCTION EDITA(XOBS,XTIT,LT,CT,LB,CB,VARQUIVO)
VTAM=CB-CT
Set Color To (contecor[2])
@ LT,CT Clear To LB,CB
Set Color To (contecor[12])
@ LT,CT To LB,CB+1
Set Color To (contecor[2])
HB_SHADOW(LT,CT,LB,CB+1)
Set Color To (contecor[2] + "," + contecor[9])
setcursor(1)
MENSAGEM("Digite seu texto | <F3> ou <F4> Ajusta texto na linha")
SET CURSOR ON
@ LT,CT+1 SAY PADC(" "+XTIT+" ",VTAM,"Ä") COLOR CONTECOR[12]
SET KEY 27 TO VESI_GRAVA()
XOBS=MEMOEDIT(XOBS,LT+1,CT+2,LB-1,CB-1,.T.,"CONTROL",46)
IF !LASTKEY()=27
   IF LEN(ALLTRIM(XOBS))<4
      IF FILE(VARQUIVO)
	 DELETE FILE(VARQUIVO)
      ENDIF
   ELSE
      HB_MEMOWRIT(VARQUIVO,HARDCR(XOBS))
   ENDIF
ENDIF
SET KEY 27 TO
RETURN(XOBS)

FUNCTION VESI_GRAVA()
IF MODET=.T.
   IF ALERT("Gravar antes de sair ?",{"Sim","Nao"})=1
      // KBDEMULATE(CHR(23))
	  // KEYBOARD CHR(23)
	  HB_KEYPUT(23)
   ELSE
      IF LASTKEY()=28
	     // HELP(PROCNAME(),PROCLINE(),READVAR())
      ENDIF
      SET KEY 27 TO
      // KBDEMULATE(CHR(27))
	  // KEYBOARD CHR(27)
	  HB_KEYPUT(27)
   ENDIF
ELSE
   SET KEY 27 TO
   // KBDEMULATE(CHR(27))
   // KEYBOARD CHR(27)
   HB_KEYPUT(23)
ENDIF
RETURN

FUNCTION CONTROL(MODO,LINHA,COLUNA)
PUBLIC INS_MUDA,MODET
IF MODO=ME_INIT
   INS_MUDA=.F.
   MODET=.F.
   KSETINS(.F.)
   SETCURSOR(1)
ENDIF
IF MODO=0
   @ 21,40 SAY " Linha: "+STRZERO(LINHA,3,0)+" " COLOR CONTECOR[12]
   @ 21,53 SAY " Coluna: "+STRZERO(COLUNA,3,0)+" " COLOR CONTECOR[12]
   QTECLA:=LASTKEY()
   IF !(QTECLA=27)
      IF QTECLA=7 .OR. QTECLA=8 .OR. QTECLA=9 .OR. QTECLA=13 .OR. QTECLA=127 .OR. (QTECLA>32 .AND. QTECLA<255)
	 MODET=.T.
      ENDIF
   ENDIF
ENDIF
IF KSETINS()
   SETCURSOR(3)
ELSE
   SETCURSOR(1)
ENDIF
IF INS_MUDA=.T.  // Acerta o Ins
   READINSERT(.T.)
   INS_MUDA=.F.
ENDIF
DO CASE
   CASE LASTKEY()=11
	    VK=INKEY(0)
	    IF UPPER(CHR(LASTKEY()))="R" .OR. LASTKEY()=18
	       VMSG=SCREENSTR(24,11,58)
	       @ 24,11 SAY SPACE(58)
	       VARQ=GETINPUT(SPACE(30),24,11,,"Informe o nome do arquivo:","@!")
	       STRSCREEN(VMSG,24,11)
	       IF FILE(VARQ)
	          VINS=MEMOREAD(VARQ)
	          VINS=SUBSTR(VINS,1,LEN(VINS)-2)
	          IF KSETINS()=.F.
		         READINSERT(.T.)
		         OPOE=CHR(22)
	          ELSE
		         OPOE=""
	          ENDIF
	          MODET=.T.
	          KEYBOARD VINS+OPOE
	       ELSE
	          MENSAGEM("Arquivo "+ALLTRIM(VARQ)+" n„o encontrado !",5,)
	       ENDIF
	    ELSE
	       TONE( 250, 4 )
	    ENDIF
ENDCASE
RETURN 0

FUNCTION MENSAGEM( TEXTO, PAUSA )
STATIC ULT_MENSAGEM := ""
LOCAL ULT_CURSOR := SETCURSOR()
IF TEXTO = NIL; TEXTO := ""; ENDIF
SETCURSOR( 0 )
@ MAXROW(), 11 SAY PADC( TEXTO, 58 ) COLOR CONTECOR[ 2 ]
IF PAUSA = NIL
   ULT_MENSAGEM := TEXTO
ELSE
   INKEY( PAUSA )
   @ MAXROW(), 11 SAY PADC( ULT_MENSAGEM, 58 ) COLOR CONTECOR[ 2 ]
ENDIF
SETCURSOR( ULT_CURSOR )
RETURN NIL
Anexo também o executável para que possa ver o resultado do código-exemplo:
Demo.rar
(576.53 KiB) Baixado 102 vezes
Quanto ao 536, o Harbour não associou ao CTRL+X quando eu teclei.
Mas a constante sim (K_CTRL_X)
Senão me engano, o valor para Ctrl-X é 24
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.
andersondecamargo
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 23 Dez 2010 17:20
Localização: Jandira / São Paulo

MEMOEDIT() Não fecha sem salvar

Mensagem por andersondecamargo »

Valeu cara!


Teu código é legal. Me ensinou outras coisas q eu precisava aprender.

Quanto ao meu MEMOEDIT, havia um erro de lógica. Só notei quando ví que no teu código vc coloca um SET KEY fora da função de controle, antes de chamar o MEMOEDIT, para trabalhar o ESC.
Fiz o mesmo e funcionou bem!


Valeu!
Responder