mkyx Posted April 13 Report Share Posted April 13 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() . . . Quote Link to comment Share on other sites More sharing options...
vagner Posted April 15 Report Share Posted April 15 Bom dia. Use o FOpen(), FRead(), FSeek(), FWrite() e FClose() para arquivos grandes. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted April 15 Report Share Posted April 15 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. Quote Link to comment Share on other sites More sharing options...
rochinha Posted April 15 Report Share Posted April 15 Amiguinhos, mykx, APCODE é 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. Quote Link to comment Share on other sites More sharing options...
mkyx Posted April 16 Author Report Share Posted April 16 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() Quote Link to comment Share on other sites More sharing options...
mkyx Posted April 16 Author Report Share Posted April 16 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. Quote Link to comment Share on other sites More sharing options...
mkyx Posted April 17 Author Report Share Posted April 17 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.