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:
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