SUBSTRING NA EDIÇÃO MEMOEDIT (ALINHAR TEXTO P/JUSTIFICADO)

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

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á

SUBSTRING NA EDIÇÃO MEMOEDIT (ALINHAR TEXTO P/JUSTIFICADO)

Mensagem por Pablo César »

Pessoal eu estou con dificuldades em atribuir a uma variável cujo conteúdo faz parte de um texto (isto é: SUBSTRING), estou intentando dentro da função_do_usuário do MEMOEDIT(), mas nada !

Parece ser fácil mas não descobrí até agora. Conseguir uma substring da variavel em edição até que consigo, mas só consigo quando ela já estava originalmente. Quando é digitado algo na 2ª linha e quero pegar uma substring dessa mesma linha me vem em branco.

Vou colocar um exemplo:

Código: Selecionar todos

#include "memoedit.ch"

VWRAP:=.T.
TEXTO:="1ª LINHA"+CHR(13)+CHR(10)+"2ª LINHA"
TEXTO:=MEMOEDIT(TEXTO,00,00,20,78,.T.,"CONTROL",120)

FUNCTION CONTROL(MODO,LINHA,COLUNA)
PUBLIC INS_MUDA,MODET
IF MODO=ME_INIT
   INS_MUDA=.F.
   MODET=.F.
   SETCURSOR(1)
   IF VWRAP=.T.
      // VWRAP:= .F.
      // RETURN (ME_TOGGLEWRAP)
   ENDIF
ENDIF
IF MODO=0
   @ 21,50 SAY " Linha: "+STRZERO(LINHA,3,0)+" " COLOR "W+/B"
   @ 21,63 SAY " Coluna: "+STRZERO(COLUNA,3,0)+" " COLOR "W+/B"
   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 INS_MUDA=.T.  // Acerta o Ins
   READINSERT(.T.)
   INS_MUDA=.F.
ENDIF
DO CASE
   CASE LASTKEY()=-2 // F3
        MEMOWRIT("TEXTO.TMP",TEXTO)
        TMP:=MEMOREAD("TEXTO.TMP")
        NPOS:=MLCTOPOS(TMP,148,LINHA,0,,.T.)
        // ALERT(STR(NPOS))
        // VLIN:=MEMOLINE(TEXTO,148,NPOS,,.T.)
        VLIN:=SUBSTR(TEXTO,NPOS,148)
        IF CHR(13) $ VLIN
           VLIN:=SUBSTR(VLIN,1,(AT(CHR(13),VLIN))-1)
        ENDIF
        ALERT(VLIN)
ENDCASE
RETURN 0
Alguém conhece algum jeito de conseguir essa SUBSTRING dentro do EDITOR de texto (MEMOEDIT)?

:-o
Editado pela última vez por Pablo César em 22 Mar 2007 17:16, em um total de 1 vez.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1299
Registrado em: 06 Jul 2004 00:44
Contato:

Mensagem por ANDRIL »

Ola Pablo,

Veja se o codigo abaixo modificado lhe serve.

#include "memoedit.ch"

VWRAP:=.T.
Altera=.f.
TEXTO:="1¦ LINHA"+CHR(13)+CHR(10)+"2¦ LINHA"
linhai:=colunai:=1 //parametros para o memoedit
QTECLA:=0
do while .t.

TEXTO:=MEMOEDIT(TEXTO,00,00,20,78,.T.,"CONTROL",120,,linhai,colunai,linhai,colunai)

if lastkey()=27
exit

elseif qtecla=-2
@24,00 say linhai
@24,col()+1 say colunai
MEMOWRIT("TEXTO.TMP",TEXTO)
TMP:=MEMOREAD("TEXTO.TMP")
NPOS:=MLCTOPOS(TMP,148,LINHAi,0,,.T.)

VLIN:=SUBSTR(TEXTO,npos,148)
IF CHR(13) $ VLIN
VLIN:=SUBSTR(VLIN,1,(AT(CHR(13),VLIN))-1)
ENDIF
ALERT(VLIN)
endif
enddo

FUNCTION CONTROL(MODO,LINHA,COLUNA)
PUBLIC INS_MUDA,MODET
linhai=linha
colunai=coluna

IF MODO=ME_INIT
INS_MUDA=.F.
MODET=.F.
SETCURSOR(1)
ENDIF
*QTECLA:=LASTKEY()
IF MODO=0
@ 21,50 SAY " Linha: "+STRZERO(LINHA,3,0)+" " COLOR "W+/B"
@ 21,63 SAY " Coluna: "+STRZERO(COLUNA,3,0)+" " COLOR "W+/B"
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 lastkey()=-2 //LASTKEY()=-2
qtecla=-2
keyb chr(23)
RETURN 0
ENDIF


IF INS_MUDA=.T. // Acerta o Ins
READINSERT(.T.)
INS_MUDA=.F.
ENDIF

RETURN 0

Até mais,
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
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á

Mensagem por Pablo César »

Meu ! Show de bola !. Você é um gênio Andril... :)Pos

Já sabemos que não dá para pegar uma SUBSTRING da variavel que está sendo editada no MEMOEDIT. Ou se dá, é um mistério. Mas a sua idéia de colocar o MEMOEDIT em looping resolveu, porque na hora que pressiono o F3 sai gravando e daí sim dá para pegar a SUBSTRING.

Aproveitando essa solução, estou colocando a disposição no Código Fonte do FORUM, um programa onde é utilizado o MEMOEDIT com pesquisa e capturando detalhes de uma STRING que exibe o conteúdo de um segundo arquivo. Muito útil, porque a medida que você digita é vai se posicionando e após de un ENTER exibe detalhes daquele "REGISTRO" (vamos dizer). Utilizo o mesmo recurso que você me indicou e espero que gostem:

SUBSTRINGS NO MEMOEDIT

Valeu Andril !. GOSTEI !. Obrigado por ter me atendido e eu devo uma pra você.

Um clip-abraço, :D :)) :* :)Pos
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á

Mensagem por Pablo César »

Graças as dicas do colega Andril, conseguí acrescentar uma rotina de alinhamento de texto que faz de forma JUSTIFICADO, isso dentro da edição do MEMOEDIT. Acho que isto irá ajudar a muitos. espero que gostem:

Código: Selecionar todos

#include "memoedit.ch" 
#include "inkey.ch"

VWRAP:=.T. 
Altera=.f. 
TEXTO:="1¦ LINHA"+CHR(13)+CHR(10)+"2¦ LINHA" 
linhai:=colunai:=1 //parametros para o memoedit 
QTECLA:=0 
do while .t. 

   TEXTO:=MEMOEDIT(TEXTO,00,00,20,78,.T.,"CONTROL",120,,linhai,colunai,linhai,colunai)

   if lastkey()=27
      exit
   elseif lastkey()=-2
      NPOS:=MLCTOPOS(TEXTO,120,LINHAi,0,,.T.)
      VLIN:=SUBSTR(TEXTO,npos,120)
      IF CHR(13) $ VLIN
         VLIN:=SUBSTR(VLIN,1,(AT(CHR(13),VLIN))-1)
      ENDIF
      INKEY()
      IF LEN(VLIN)>0
         KEYBOARD CHR(9)
         QTECLA:=9
      ENDIF
   endif
enddo 


FUNCTION CONTROL(MODO,LINHA,COLUNA) 
PUBLIC INS_MUDA,MODET 
linhai:=linha
colunai:=coluna

IF MODO=ME_INIT 
   INS_MUDA=.F.
   MODET=.F.
   SETCURSOR(1)
ENDIF 
IF MODO=0 
   @ 21,50 SAY " Linha: "+STRZERO(LINHA,3,0)+" " COLOR "W+/B"
   @ 21,63 SAY " Coluna: "+STRZERO(COLUNA,3,0)+" " COLOR "W+/B"
   IF !(LASTKEY()=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 
DO CASE
   CASE LASTKEY()=-2 // F3
        KEYBOARD CHR(23)
        RETURN 23
   CASE LASTKEY()=9 // Tab
        cTexto:=VLIN
        vTexto:=cTexto
        VFALTA:=120-LEN(cTexto)
        VQTOS:=0
        VP:=0
        FOR I=1 TO LEN(cTexto)
            IF SUBSTR(cTexto,I,1)=" "
               VQTOS++
               IF VP=0
                  VP:=I
               ENDIF
            ENDIF
        NEXT
        VP1:=VP
        IF VP=0
           VQT:=VFALTA+1
        ELSE
           VQT:=0
        ENDIF
        DO WHILE VQT<VFALTA
           cTexto := STUFF( cTexto, VP, 0, " " )
           VIN:=VP
           FOR I=1 TO LEN(cTexto)
               IF !(SUBSTR(cTexto,I,1)=" ") .AND. I>VP
                  VIN:=I
                  EXIT
               ENDIF
           NEXT
           VESQ:=SUBSTR(cTexto,1,(VIN-1))
           VDIR:=SUBSTR(cTexto,VIN,len(cTexto))
           vpegou:=.f.
           FOR I=1 TO LEN(vdir)
               IF SUBSTR(vdir,I,1)=" "
                  VP:=I+LEN(VESQ)+1
                  vpegou:=.t.
                  EXIT
               ENDIF
           NEXT
           IF vpegou=.f.
              VTEXTO:=cTexto
              FOR I=1 TO LEN(vTexto)
                  IF SUBSTR(vTexto,I,1)=" "
                     VP:=I
                     EXIT
                  ENDIF
              NEXT
           ENDIF
           VQT++
        ENDDO
        KEYBOARD CHR(1)+cTexto
ENDCASE
IF INS_MUDA=.T. // Acerta o Ins
   READINSERT(.T.)
   INS_MUDA=.F.
ENDIF 
RETURN 0
Um clip-abraço, :)Pos
Responder