Página 1 de 1

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

Enviado: 20 Mar 2007 17:08
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

Enviado: 21 Mar 2007 16:20
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,

Enviado: 21 Mar 2007 17:56
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

Enviado: 22 Mar 2007 17:19
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