Jump to content
Fivewin Brasil

Alterar linhas do prg já gravado


mkyx

Recommended Posts

Boa tarde, fivewinner.

Eu sempre usei o comando @ l,c Label, nos meus programas, então, todas as molduras, dentro dos window e dialog, foram feitas com esse comando: @ label

Agora, estou precisando alterar todos os comandos @ label, para o @ GROUP, essa rotina de alteração já está ok, mas, o problema está na leitura dos PRGs e regravação,

pois, quando uso o comando memoread, mlcount, memoline, e memowrite, não grava a linha inteira, só 79 caracteres, ou só 254 caracteres, e nos meus módulos tem linhas que chega a 500 caracteres por linha

como resolver esse problema de ler e regravar linhas com mais de 254 caracteres?

como estou fazendo:

   SS0:=CURDRIVE()+":\"+CURDIR()+"\WINCOM.PRG"
   arq_prg:=memoread(SS0)
   NOVO_ARQ:=""
   QTL := MLCount(arq_prg,500, 8, .T. ) // aqui vc pode alterar para o valor que vc quiser, que não funciona - MLCount(arq_prg) esse comando não funciona tbm
   FOR I=1 TO QTL
       APCODE:= MemoLine( arq_prg, 500, i, 8, .T. )
       APCODE1:=APCODE
       if alltrim(upper(oque))$upper(apcode) .and. OQUE_1="@" .AND. "@"$APCODE .AND. !("GROUP"$upper(apcode))
          nreg:=nreg+1
          SS:="OGRP"+ALLTRIM(STR(NREG))+" "
          p:=at("TO",UPPER(APCODE))
          if p>0
             APCODE=STUFF(APCODE,P,0,"GROUP "+SS)
          endif
       ENDIF
       APCODE:=ALLTRIM(APCODE)+chr(13)+chr(10)
       NOVO_ARQ:=NOVO_ARQ+APCODE
   NEXT   
   SS1:="D:\WINPRG\WINCOM.PRG"
   MEMOWRIT(SS1,NOVO_ARQ)

   ? "O arquivo "+ss0+" foi gravado em "+ss1
 

Já testei tbm com os camandos, que tbm não funcionam?

       OFILE:=TTXTFILE():NEW("&SS0.")
       DO WHILE .NOT. OFILE:LEOF()
          apCode:=OFILE:READLINE()
          .

          .

          .

 

 

 

Link to comment
Share on other sites

Você se refere a isso? Sabeis usar um EDITOR MODO CONSOLE, é simples de carregar todos os .PRGS e dar um REPLACE neles.

[code]
#include "FiveWin.ch"

FUNCTION Main()

   LOCAL oDlg
   LOCAL lFivePro  := .T.
   LOCAL lDialog   := .T.
   LOCAL lObjects  := .F.
   LOCAL nNivel    := 1
   LOCAL cName     := Space( 10 )
   LOCAL cAddress  := Space( 30 )
   LOCAL oBtn, oGet1, oGet2

   DEFINE DIALOG oDlg FROM 8, 2 TO 25, 50 TITLE "SetFocus test"

   @ 1,  1 SAY "&Name:" OF oDlg

   @ 1,  6 GET oGet1 VAR cName OF oDlg

   @ 2,  1 SAY "&Address:" OF oDlg

   @ 2,  6 GET oGet2 VAR cAddress OF oDlg

   @ 3,  1 GROUP TO 7, 8 LABEL "&Products" OF oDlg

   @ 4,  2 CHECKBOX lFivePro PROMPT "&FivePro" OF oDlg SIZE 60, 17

   @ 5,  2 CHECKBOX lDialog  PROMPT "&Dialog"  OF oDlg SIZE 60, 17

   @ 6,  2 CHECKBOX lObjects PROMPT "O&bjects" OF oDlg SIZE 60, 17

   @ 3,  9 GROUP TO 7, 17 LABEL "&Nivel" OF oDlg

   @ 4,  9 RADIO nNivel PROMPT "&Novice", "A&vanced", "&Expert" OF oDlg

   @ 6,  5 BUTTON oBtn PROMPT "&Ok"  OF oDlg SIZE 50, 12 ACTION ( oGet2:ctext( "OK ACTION RUN ON " + Time() ), oGet2:SetFocus() ) DEFAULT

   @ 6, 17 BUTTON "&Cancel" OF oDlg SIZE 50, 12 ACTION oDlg:End()

   ACTIVATE DIALOG oDlg CENTERED

RETURN NIL
[/code]

Regards, saludos.

Link to comment
Share on other sites

Amiguinhos,

mykxAPCODE é um campo em alguma tabela, se for tem tamanho 79a?

ao usar variáveis adote diferenciá-las de campos em tabela por exemplo use sAPCODE para uma variável String, nAPCODE para uma variável Numeric, dAPCODE para uma variável Data, aAPCODE para Array, lAPCODE para Logic e mAPCODE para Memo. Não é obrigatório mas define visualmente e previne nossos erros de atribuição.

Tenha certeza de não estar trabalhando sobre uma tabela que tem um campo com nome APCODE pois é bem dificil o MLCount() ou Memoline() falharem na largura do texto.

Link to comment
Share on other sites

Boa noite,

De acordo com o manual do xharbour, a função mlcount, só processa linhas ate 254 caracteres, e o padrão desse comando é 79.

Assim, enquanto a rotina pegava linha por linha do prg, só conseguia processar até 254, e eu preciso que precesse a linha inteira.

Nos meus prgs, tem linhas até 400 caracteres por linha (linhas com mais de 254 caracteres). Logo, se a função só manipula até 254 caracteres, essas linha ficam truncadas.

só B.O.

Vou testar essas funçoes: FOpen(), FRead(), FSeek(), FWrite() e FClose()

 

 

Link to comment
Share on other sites

Boa noite rochina,

A variável apcode, recebe o resultado da função memoline

APCODE:= MemoLine( arq_prg, 500, i, 8, .T. )

Só que memoline, só lê linha de ate 254, e o padrão é 79, se não foi mencionado nenhum valor.

e eu preciso de uma função que leia linhas com mais de 254 caracteres.

obrigado.

Link to comment
Share on other sites

Pessoal, resolvido, usando o comando TTXTFILE():NEW(), acho que eu estava "viajando", (pode ser sobrecarga de serviços a fazer) quando testei esse comando na primeira, pra ter dado errado.

Ficou assim:

   P_DESTINO:="D:\WINSQL"  // pasta destino
   oque_2:="CC.PRG"  // nome do prg a ser alterado
   oque:="LABEL"   // comando a ser localizado dentro da linha e alterado para GROUP
   OQUE_1:="@"   // complemento do comando label: @ LI,CI TO LF,CF LABEL "TITULO" OF ODLG PIXEL
   SS0:=CURDRIVE()+":\"+CURDIR()+"\"+OQUE_2    //arquivo fonte, original
   ARQ_SPED:=P_DESTINO+"\"+oque_2  // arquivo destino
       IF !FILE("&ARQ_SPED.")
          ARQ00=FCREATE("&ARQ_SPED.",0)
          FCLOSE(ARQ00)
       ENDIF
       num:=0
       OFILE:=TTXTFILE():NEW("&SS0.")
       DO WHILE .NOT. OFILE:LEOF()
          apCode:=OFILE:READLINE()
          if alltrim(upper(oque))$upper(apcode) .and. OQUE_1="@" .AND. "@"$APCODE .AND. !("GROUP"$upper(apcode))
             num:=num+1
             SS:="OGRP"+ALLTRIM(STR(NUM))+" "
             p:=at("TO",UPPER(APCODE))
             if p>0
                APCODE=STUFF(APCODE,P,0,"GROUP "+SS)
             endif
          ENDIF   
          APCODE:=APCODE+chr(13)+chr(10)
          ARQ00=FOPEN("&ARQ_SPED.",2)
          FSEEK(ARQ00,0,2)
          FWRITE(ARQ00,APCODE,LEN(APCODE))
          FCLOSE(ARQ00)
          OFILE:SKIP()
       ENDDO
       OFILE:END()
   USE
   DBCLOSEALL()
   ? "FIM"


Essa rotina substitue do PRG, o comando:

@ LI,CI TO LF,CF LABEL "TITULO" OF ODLG PIXEL

por esse:

@ LI,CI GROUP OGRP1 TO LF,CF LABEL "TITULO" OF ODLG PIXEL 

Obrigado a todos, pela contribuição.

Até a próxima.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...