Página 1 de 3

Backup com Arj e Clipper

Enviado: 22 Jun 2007 11:29
por miracle
Bom dia!

Tenho uma rotina de backup escrita em Clipper 5.01 usando Arj. Só que eu gostaria de, em vez de limpar a tela e acionar o Arj pelo comando RUN, de ter um programa usando o próprio Clipper para ler os disquetes, pedir o disquete seguinte e dizer que o backup está concluído / restaurado. Alguém sabe de um modo de fazer isso? Não consigo achar um jeito de ler o retorno do Arj e saber se ele está pedindo um novo disquete ou não....

Muito Obrigado!

Re: Backup com Arj e Clipper

Enviado: 22 Jun 2007 11:34
por Maligno
miracle escreveu:Alguém sabe de um modo de fazer isso?
Pra fazer isso você teria que ter uma biblioteca que implementasse as funções de compactação do ARJ, da mesma forma que ele próprio fizesse. Nunca vi algo do tipo. Entretanto, se você não fizer questão do ARJ e puder usar ZIP, há uma biblioteca muito simples que lhe permite trabalhar com o ZIP dentro de seu programa. Mão não espere dela o mesmo nível de compactação que o produto comercial.

Re: Backup com Arj e Clipper

Enviado: 22 Jun 2007 12:06
por sygecom
miracle escreveu:Bom dia!

Tenho uma rotina de backup escrita em Clipper 5.01 usando Arj. Só que eu gostaria de, em vez de limpar a tela e acionar o Arj pelo comando RUN, de ter um programa usando o próprio Clipper para ler os disquetes, pedir o disquete seguinte e dizer que o backup está concluído / restaurado. Alguém sabe de um modo de fazer isso? Não consigo achar um jeito de ler o retorno do Arj e saber se ele está pedindo um novo disquete ou não....

Muito Obrigado!
Tche, foi como o Maligno postou...se quiser que seja algo totalmente feito pelo seu sistema.....tera que usar alguma LIB de terceiro....se não me falha a memoria...tenho isso no meu micro...assim que eu chegar até ele...posto um link para vc baixar...
Obs: Meus Sistemas sempre deixou para fazer o Backup....por fora do sistema....ou seja uso sempre um programa de terceiro...para fazer Backup.

Abraços
Leonardo Machado

Enviado: 22 Jun 2007 12:35
por Maligno
Eu também faço assim. Uso o PKZip (ou WZZip - o usuário escolhe). No meu programa apenas criei uma forma do usuário configurar diversos scripts de backup. Quando aciona o back-up com certo script, o programa monta a linha de comando do PKZip/WZZip. A estética fica feia, claro. Mas funciona 100%. Acho bem melhor.

Backup com ARJ

Enviado: 22 Jun 2007 12:43
por Pablo César
Eu tenho uma rotina que faz backup pelo ARJ versão 2.50a que tem várias opções de comando. Primeiro eu gero um arquivo texto (chamado FASE_001.LST e FASE_002.LST... quando a lista fica muito extensa), onde contém todos os arquivos que serão compactados (com o caminho completo onde se encontram). Depois executo o seguinte arquivo BAT:

Código: Selecionar todos

@ECHO OFF
CLS
IF EXIST CONTADOR.MEM DEL CONTADOR.MEM
SET BACKUP=DC01801 - FASE UNICA
ARJ a -vazMANUAL.EXE -jyv -i1 -jl -jk -m2 A:\DC01801.001 !FASE_001.LST
IF EXIST A:\ARJTEMP.$00 GOTO ERRO
IF ERRORLEVEL 1 GOTO ERRO
IF NOT EXIST A:\DC01801.001 GOTO ERRO
BKP_OK
MSG_BKP COM
GOTO FIM
:ERRO
IF EXIST A:\ARJTEMP.$00 DEL A:\ARJTEMP.$00
MSG_BKP SEM
GOTO FIM
:FIM
SET BACKUP=
DEL FASE_*.LST
O aplicativo MANUAL.EXE, serve para aparecer na tela uma janelinha que solicita a inserção de disquetes e aguarda confirmação:

Código: Selecionar todos

/*
TITULO     : Sistema de loca‡„o de filmes
DESDE      : 18/12/99
PROGRAMA   : MANUAL.PRG
COMENTARIO : Solicita disquetes para o backup manual
             Compilar manualmente sem op‡„o /B e com CT.LIB
*/

#include "loca.ch"

NOMECOR := { "FUNDO DA TELA","MENU","DESTAQUE DO MENU","JANELA DE DIALOGO","BOX DA JANELA DE DIALOGO","BOTOES","BOTAO EM DESTAQUE","GETS","GET EM DESTAQUE","REGISTROS MARCADOS","JANELA EM DESTAQUE","CERCADURAS","TITULO" }
CONTECOR := {}
TONACOR := {{},{},{}}
IF FILE( "C:LOCA.CFG" )
   VAR := MEMOREAD( "C:LOCA.CFG" )
   FOR CONTAR = 1 TO 13
      AADD( CONTECOR, SUBS( VAR, ( CONTAR * 5 ) - 4, 5 ) )
   NEXT
   FOR I=1 TO 16
       AADD(TONACOR[1], VAL(SUBS( VAR, ((I*6)-5)+105, 2 )) )
       AADD(TONACOR[2], VAL(SUBS( VAR, ((I*6)-3)+105, 2 )) )
       AADD(TONACOR[3], VAL(SUBS( VAR, ((I*6)-1)+105, 2 )) )
   NEXT
ENDIF
IF !FILE("CONTADOR.MEM")
   WNUM=1
   WDIA=DATE()
   WHORA=TIMETOSEC(TIME())
ELSE
   RESTORE FROM CONTADOR ADDI
   WNUM=WNUM+1
ENDIF
VQBACK=GETENV("BACKUP")
CLS
ObjBotao := botao:LIMPA()
SET DELE ON
SET DATE TO BRIT
SET CENTURY ON
SET CURSOR OFF
SAVE SCREEN TO PER_TELA
DO WHILE .T.
   BEEP()
   IF LEN(VQBACK)=0
      JANELA(12,37,18,72,"Backup do Sistema")
      @ 14,38 SAY PADC("Insira o disquete n§ "+ALLTRIM(STR(WNUM)),33) COLOR CONTECOR[4]
   ELSE
      JANELA(11,37,18,72,"Backup do Sistema")
      @ 13,38 SAY PADC("Insira o disquete n§ "+ALLTRIM(STR(WNUM)),33) COLOR CONTECOR[4]
      @ 14,38 SAY PADC(VQBACK,33) COLOR CONTECOR[4]
   ENDIF
   botao:ADD( 16,42, "Pronto   " )
   botao:ADD( 16,57, "Cancelar " )
   SIM_NAO := botao:RODA()
   IF LASTKEY()=27
      SIM_NAO=2
   ENDIF
   RESTORE SCREEN FROM PER_TELA
   IF SIM_NAO=2
      @ 12,00 SAY ""
      KBDEMULATE(CHR(3)+" "+CHR(13))
      QUIT
   ELSE
      CLS
      IF !DISKREADY("A")
         LOOP
      ELSE
         IF !DISKREADYW("A")
            BEEP()
            JANELA(12,37,16,72,"Aten‡„o",.T.)
            @ 14,39 SAY "Retire a prote‡„o do disquete !" COLOR CONTECOR[11]
            INKEY(5)
            LOOP
         ENDIF
      ENDIF
      VA:=DIRECTORY("A:\*.*","D")
      VARQS:={}
      N=1
      FOR I=1 TO LEN(VA)
          IF !(SUBSTR(VA[I,1],1,1)=".")
             AADD(VARQS,{VA[I,1],VA[I,3],VA[I,4],VA[I,5]})
             N++
          ENDIF
      NEXT
      RELEASE VA
      IF LEN(VARQS)>0
         IF MOSTRA(VARQS)=.T.
            IF WNUM=1
               SAVE TO CONTADOR ALL LIKE W*
            ELSE
               SAVE TO CONTADOR ALL LIKE W*
            ENDIF
            @ 00,00 SAY ""
            QUIT
         ELSE
            LOOP
         ENDIF
      ENDIF
      IF WNUM=1
         SAVE TO CONTADOR ALL LIKE W*
      ELSE
         SAVE TO CONTADOR ALL LIKE WNUM*
      ENDIF
      @ 00,00 SAY ""
      QUIT
   ENDIF
ENDDO

 
FUNCTION MOSTRA(VARQS)
VT=LEN(VARQS)
VNAR=SUBSTR(RIGHT(ALLTRIM(LEFT(VQBACK,8)),5),1,3)
VFAR=ALLTRIM(LEFT(VQBACK,8))
VOQUE=""
IF "P" $ VFAR
   VOQUE=VOQUE+"P"
ENDIF
IF "D" $ VFAR
   VOQUE=VOQUE+"D"
ENDIF
N=0
FOR I=1 TO VT
    IF SUBSTR(RIGHT(VARQS[I,1],9),1,3)=VNAR .AND. VOQUE $ VARQS[I,1]
       N++
    ENDIF
NEXT
IF N>0
   BEEP()
   ALERT("N„o pode gravar neste disquete !.;Este disquete pertence ao backup.")
   RETURN .F.
ENDIF
SAVE SCREEN TO PER_TELA1
IF VT>28
   VTAM=28
ELSE
   VTAM=VT
ENDIF
JANELA(00,31,ROUND((VTAM/2),0)+1,79,ALLTRIM(STR(VT))+(IF(VT=1," Arquivo encontrado"," Arquivos encontrados")))
IF VT>VTAM
   @ 15,72 SAY "mais..."
ENDIF
VX=1
FOR I=1 TO VTAM STEP 2
    IF I>VT
       @ VX,33 SAY SPACE(21) COLOR CONTECOR[4]
    ELSE
       IF VARQS[I,4]="D"
          @ VX,33 SAY PADR(VARQS[I,1],12)+" <DIR>  " COLOR CONTECOR[4]
       ELSE
          @ VX,33 SAY PADR(VARQS[I,1],12)+" "+SUBSTR(DTOC(VARQS[I,2]),1,6)+RIGHT(DTOC(VARQS[I,2]),2) COLOR CONTECOR[4]
       ENDIF
    ENDIF
    IF I+1>VT
       @ VX,57 SAY SPACE(21) COLOR CONTECOR[4]
    ELSE
       IF VARQS[(I+1),4]="D"
          @ VX,57 SAY PADR(VARQS[(I+1),1],12)+" <DIR>  " COLOR CONTECOR[4]
       ELSE
          @ VX,57 SAY PADR(VARQS[(I+1),1],12)+" "+SUBSTR(DTOC(VARQS[(I+1),2]),1,6)+RIGHT(DTOC(VARQS[(I+1),2]),2) COLOR CONTECOR[4]
       ENDIF
    ENDIF
    VX++
NEXT
JANELA(17,42,23,72,"Aten‡„o",.T.)
@ 19,43 SAY PADC((IF(VT=1,"Pode remove-lo ?","Pode remove-los ?")),28) COLOR CONTECOR[11]
botao:ADD( 21,47, "Sim    " )
botao:ADD( 21,58, "N„o    " )
SIM_NAO := botao:RODA()
RESTORE SCREEN FROM PER_TELA1
IF SIM_NAO=1
   FILEDELETE("A:\*.*")
   VRET=.T.
ELSE
   VRET=.F.
ENDIF
RETURN VRET

FUNCTION BOTAO( LINHA_SUPERIOR, COLUNA_ESQUERDA, NOME_BOTAO )
LOCAL TIPO_OPERACAO, LARGURA_BOTAO, CONTAR, TECLA, PONTEIRO := 1
VQCOR=NTOCOLOR(SCREENATTR((OBJBOTAO[1,1])-1,OBJBOTAO[1,2]),.F.)
IF PCOUNT() = 0
   TIPO_OPERACAO := EDITA_BOTOES
ELSEIF PCOUNT() = 1
   TIPO_OPERACAO := EDITA_BOTOES
   PONTEIRO := LINHA_SUPERIOR
ELSEIF PCOUNT() = 2
   TIPO_OPERACAO := MOSTRA_BOTOES
ELSEIF PCOUNT() = 3
   TIPO_OPERACAO := MOVIMENTA_BOTAO
ENDIF
IF TIPO_OPERACAO = MOVIMENTA_BOTAO
   LARGURA_BOTAO := LEN( NOME_BOTAO ) + 2
   SETCOLOR(VQCOR)
   @ LINHA_SUPERIOR, COLUNA_ESQUERDA SAY " "
   @ LINHA_SUPERIOR + 1, COLUNA_ESQUERDA - 1 SAY SPACE( LARGURA_BOTAO )
   @ LINHA_SUPERIOR, COLUNA_ESQUERDA + LARGURA_BOTAO - 1 SAY " "
   SETCOLOR(CONTECOR[07]+"*")
   @ LINHA_SUPERIOR, COLUNA_ESQUERDA - 1 SAY " " + NOME_BOTAO + " "
   INKEY( .2 )
   COR( "BOTOES" )
   @ LINHA_SUPERIOR, COLUNA_ESQUERDA SAY " " + NOME_BOTAO + " "
   SETCOLOR( "N/" + ALLTRIM( SUBS( VQCOR, 4 ) ) )
   @ LINHA_SUPERIOR, COLUNA_ESQUERDA - 1 SAY "Ü"
   @ LINHA_SUPERIOR + 1, COLUNA_ESQUERDA - 1 SAY REPL( "ß", LARGURA_BOTAO ) + " "
   INKEY( .2 )
ENDIF
IF TIPO_OPERACAO = EDITA_BOTOES .OR. TIPO_OPERACAO = MOSTRA_BOTOES
   FOR CONTAR := 1 TO LEN( ObjBotao )
      LARGURA_BOTAO := LEN( ObjBotao[ CONTAR ][ 3 ] ) + 2
      COR( "BOTOES" )
      @ ObjBotao[ CONTAR ][ 1 ], ObjBotao[ CONTAR ][ 2 ]  SAY " "+ObjBotao[ CONTAR ][ 3 ] + " "
      SETCOLOR( "N/" + ALLTRIM( SUBS( VQCOR, 4 ) ) )
      @ ObjBotao[ CONTAR ][ 1 ], ObjBotao[ CONTAR ][ 2 ] - 1 SAY "Ü"
      @ ObjBotao[ CONTAR ][ 1 ] + 1, ObjBotao[ CONTAR ][ 2 ] - 1 SAY REPL( "ß", LARGURA_BOTAO ) + " "
   NEXT
ENDIF
IF TIPO_OPERACAO = EDITA_BOTOES
   TECLA := 0
   WHILE .T.
      LARGURA_BOTAO := LEN( ObjBotao[ PONTEIRO ][ 3 ] ) + 2
      SETCOLOR(CONTECOR[07]+"*")
      @ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] SAY " "+ObjBotao[ PONTEIRO ][ 3 ] + " "
      SETCOLOR( "N/" + ALLTRIM( SUBS( VQCOR, 4 ) ) )
      @ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY "Ü"
      @ ObjBotao[ PONTEIRO ][ 1 ] + 1, ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY REPL( "ß", LARGURA_BOTAO ) + " "
      IF TECLA = T_ENTER
	 INKEY( .2 )
	 botao:LIMPA()
	 RETURN PONTEIRO
      ENDIF
      TECLA := INKEY( 0 )
      IF TECLA = T_F1
         botao:LIMPA()
         RETURN 28
      ENDIF
      IF TECLA = T_ESC
	 botao:LIMPA()
	 RETURN 0
      ENDIF
      COR( "BOTOES" )
      @ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] + 1 SAY ObjBotao[ PONTEIRO ][ 3 ]
      FOR CONTAR = 1 TO LEN( ObjBotao )
	 IF SUBS( ObjBotao[ CONTAR ][ 3 ], 1, 1 ) = UPPER( CHR( TECLA ) )
	    PONTEIRO := CONTAR
	    TECLA := T_ENTER
	    EXIT
	 ENDIF
      NEXT
      IF TECLA = T_ENTER
	 LARGURA_BOTAO := LEN( ObjBotao[ PONTEIRO ][ 3 ] ) + 2
         SETCOLOR( "N/" + ALLTRIM( SUBS( VQCOR, 4 ) ) )
	 @ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] SAY " "
	 @ ObjBotao[ PONTEIRO ][ 1 ] + 1, ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY SPACE( LARGURA_BOTAO )
	 @ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] + LARGURA_BOTAO - 1 SAY " "
	 SETCOLOR(CONTECOR[07]+"*")
	 @ ObjBotao[ PONTEIRO ][ 1 ], ObjBotao[ PONTEIRO ][ 2 ] - 1 SAY " " + ObjBotao[ PONTEIRO ][ 3 ] + " "
	 INKEY( .2 )
	 LOOP
      ENDIF
      IF TECLA = T_ESQUERDA .OR. TECLA = T_CIMA
	 PONTEIRO--
      ELSEIF TECLA = T_DIREITA .OR. TECLA = T_BAIXO
	 PONTEIRO++
      ENDIF
      PONTEIRO := IIF( PONTEIRO < 1, LEN( ObjBotao ),IIF( PONTEIRO > LEN( ObjBotao ), 1, PONTEIRO ) )
   ENDDO
ENDIF
botao:LIMPA()
RETURN NIL

FUNCTION COR( NOM_COR )
QUAL_COR := ASCAN( NOMECOR, UPPER( NOM_COR ) )
IF QUAL_COR != 0
   IF QUAL_COR = 2
      SETCOLOR( CONTECOR[ 2 ] + "," + CONTECOR[ 3 ] + ",,," + CONTECOR[ 2 ] )
   ELSEIF QUAL_COR = 8
      SETCOLOR( CONTECOR[ 11 ] + "," + CONTECOR[ 9 ] + ",,," + CONTECOR[ 8 ] )
   ELSE
      SETCOLOR( CONTECOR[ QUAL_COR ] )
   ENDIF
ENDIF
RETURN .T.

FUNCTION JANELA( PJAN1, PJAN2, PJAN3, PJAN4, PJAN5, PJAN6 )
IF PJAN5=NIL
   PJAN5 := ""
ENDIF
SOMBRA( PJAN1, PJAN2, PJAN3, PJAN4 )
IF PJAN6=NIL
   SETCOLOR( CONTECOR[ 4 ] )
ELSE
   SETCOLOR( CONTECOR[ 11 ] )
ENDIF
@ PJAN1, PJAN2 CLEAR TO PJAN3, PJAN4
SETCOLOR( CONTECOR[ 5 ] )
@ PJAN1, PJAN2, PJAN3, PJAN4 BOX " "
@ PJAN1, PJAN2 SAY "þ"
IF LEN( TRIM( PJAN5 ) ) > 0
   @ PJAN1, PJAN2 + ( ( ( PJAN4 + 1 - PJAN2 ) - LEN( PJAN5 ) ) / 2 ) SAY PJAN5
ENDIF
RETURN NIL

FUNCTION SOMBRA( LIN_SUP, COL_SUP, LIN_INF, COL_INF )
IF PCOUNT() = 2 .OR. PCOUNT() = 3
   C_SOM := COL_SUP; L_SOM := LIN_SUP
   LIN_SUP := VAL( SUBS( C_SOM, 1, 2 ) )
   COL_SUP := VAL( SUBS( C_SOM, 3, 2 ) )
   LIN_INF := VAL( SUBS( C_SOM, 5, 2 ) )
   COL_INF := VAL( SUBS( C_SOM, 7, 2 ) )
   COL_SOM := SUBS( C_SOM, 9 )
   LIN_SOM := L_SOM
ENDIF
IF COL_SUP < 2 .OR. LIN_INF > 22
   C_SOM := ""; L_SOM := ""
   RETURN .F.
ENDIF
IF PCOUNT() = 3
   RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
   RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
   RETURN .F.
ENDIF
IF PCOUNT() != 2
   COL_SOM := SAVESCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1 )
   LIN_SOM := SAVESCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2 )
ENDIF
IF SUBS( COL_SOM, 2, 1 ) != CHR( 8 )
   C_SOM := STR( LIN_SUP, 2 ) + STR( COL_SUP, 2 ) + STR( LIN_INF, 2 ) + STR( COL_INF, 2 ) + COL_SOM
   L_SOM := LIN_SOM
ENDIF
FOR I = 2 TO LEN( COL_SOM ) STEP 2
   COL_SOM := STUFF( COL_SOM, I, 1, CHR( 8 ) )
NEXT
FOR I = 2 TO LEN( LIN_SOM ) / 2 STEP 2
   LIN_SOM := STUFF( LIN_SOM, I, 1, CHR( 8 ) )
NEXT
RESTSCREEN( LIN_SUP + 1, COL_SUP - 2, LIN_INF + 1, COL_SUP - 1, COL_SOM )
RESTSCREEN( LIN_INF + 1, COL_SUP - 2, LIN_INF + 2, COL_INF - 2, LIN_SOM )
RETURN .T.

* Final do programa MANUAL.PRG
O arquivo LOCA.CH contém alguma diretrizes como:

Código: Selecionar todos

/*
TITULO     : Sistema de Loca‡„o de filmes
DATA       : 30/09/95
PROGRAMA   : LOCA.CH
COMENTARIO : DIRETIVAS DE PRE-PROCESSADOR
*/
 
#define DESLIGA  0
#define LIGA     1
#define CURSOR(P_CUR) (SETCURSOR( IIF( P_CUR = 0, 0, IIF( READINSERT(), 3, 1 ) ) ))
#define HELP()         HELP(PROCNAME(),PROCLINE(),READVAR())
#define BEEP()         TONE( 250, 4 )
#define T_ENTER         13
#define T_ESC           27
#define T_INSERT        22
#define T_CIMA           5
#define T_BAIXO         24
#define T_ESQUERDA      19
#define T_DIREITA        4
#define T_HOME           1
#define T_END            6
#define T_PGUP          18
#define T_PGDN           3
#define T_BACKSPACE      8
#define T_CTRL_W        23
#define T_F1            28
#define T_F2            -1
#define T_F3            -2
#define T_F4            -3
#define T_F5            -4
#define T_F6            -5
#define T_F7            -6
#define T_F10           -9
#define T_CTRL_PGDN     30
#define T_CTRL_PGUP     31
#define T_DEL            7
#define T_CTRL_HOME     29
#define T_CTRL_END      23
#define T_CTRL_ESQUERDA 26
#define T_CTRL_DIREITA   2
#define T_TAB            9
#define T_SH_TAB       271
#define TB_COR_DEL      CONTECOR[ 4 ]  // Cor dos registros DELETADOS
#define TB_RODAPE       "ÄÁÄ"  // Caracteres para o rodape do TBROWSE
#define TB_SEP_LIN      " ³ "  // Separadores de coluna do TBROWSE
#define TB_SEP_CAB      "ÄÂÄ"  // Separadores do cabecalho do TBROWSE
#define TB_JANELA       "ÚÄ¿³´³ÙÄÀ³Ã³"
#define _TIPO_MENU     1
#define _OPCOES_MENU   2
#define _CHAMADA_MENU  3
#define MOSTRA_PAG_1      "M"
#define CONSULTA          "C"
#define ALTERACAO         "A"
#define EXCLUSAO          "E"
#define INCLUSAO          "I"
#define SUB_MENU       1
#define MENU_PRINCIPAL 0

#define SIM  .T.
#define NAO  .F.

#translate AKill( <a>, <e> ) => asize( adel( <a>, <e> ), len( <a> ) - 1 )
#translate menu:LIMPA() => ObjMenu := { 0, {}, {}, {} }
#translate menu:TIPO_MENU  =>  ObjMenu\[ _TIPO_MENU ]
#translate menu:RODA()  =>  MENU( ObjMenu, PROCNAME(), PROCLINE() )
#translate menu:ADD( <X1>, <X2>[, <X3> ] )  => AADD( ObjMenu\[ _OPCOES_MENU ], <X1> )\; AADD( ObjMenu\[ _CHAMADA_MENU ], &("{ ||"+<X2>[, <X3> ]+" }") )\;AADD(OBJMENU\[4],<X2>)
#translate menu:ADD( <X1> )  => AADD( ObjMenu\[ _OPCOES_MENU ], <X1> )\; AADD( ObjMenu\[ _CHAMADA_MENU ], { || NIL } )
#translate menu:CONTEUDO()  =>  ObjMenu
#define MOSTRA_BOTOES    0
#define EDITA_BOTOES     1
#define MOVIMENTA_BOTAO  2
#translate botao:LIMPA()     =>  ObjBotao := {}
#translate botao:RODA()      =>  BOTAO()
#translate botao:RODA( <X> ) =>  BOTAO( <X> )
#translate botao:MOSTRA()  =>  BOTAO( .T., .T. )
#translate botao:MOVIMENTA( <X1>, <X2>, <X3>[, <X4> ] )  =>  BOTAO( <X1>, <X2>, <X3>[, <X4> ])
#translate botao:ADD( <X1>, <X2>, <X3>[, <X4> ])  => AADD( ObjBotao, { <X1>, <X2>, <X3>[, <X4> ] } )
#translate botao:CONTEUDO()  =>  ObjBotao
 
/* Final LOCA.CH */
O MSG_BKP.EXE, serve para dar mensagem na tela se o backup foi realizado com ou sem sucesso:

Código: Selecionar todos

/*
TITULO     : Sistema de loca‡„o de filmes
DESDE      : 26/07/2005
PROGRAMA   : BKP_OK.PRG
COMENTARIO : Mensagem do Backup (COPIA.BAT)
             Clipper5
*/

PARAMETERS VCOK
IF VCOK="COM" .OR. VCOK="SEM"
   IF VCOK="COM"
      VCOR:="15/02"
      VGAPALETTE(02,00,20,00)
      VGAPALETTE(15,20,63,40)
   ELSE
      VCOR:="15/04"
      VGAPALETTE(04,35,00,00)
      VGAPALETTE(15,63,40,45)
   ENDIF
ELSE
   ? "Falta parametro. Exemplo:"
   ? "                         MSG_BKP COM"
   ? "                         MSG_BKP SEM"
   QUIT
ENDIF
SET CURSOR OFF
SETCOLOR(VCOR)
CLEAR SCREEN
@ 05,14 SAY "ÛÛÛÛÛÜ    ÛÛÛÛÛÛ    ÛÛÛÛÛ    ÛÛ  ÛÛ    ÛÛ  ÛÛ    ÛÛÛÛÛÛ"
@ 06,14 SAY "ÛÛ  ÛÛ    ÛÛ  ÛÛ    ÛÛ       ÛÛ ÛÛ     ÛÛ  ÛÛ    ÛÛ  ÛÛ"
@ 07,14 SAY "ÛÛÛÛÛÜ    ÛÛÛÛÛÛ    ÛÛ       ÛÛÛÛ      ÛÛ  ÛÛ    ÛÛÛÛÛÛ"
@ 08,14 SAY "ÛÛ  ÛÛ    ÛÛ  ÛÛ    ÛÛ       ÛÛ ÛÛ     ÛÛ  ÛÛ    ÛÛ    "
@ 09,14 SAY "ÛÛÛÛÛß    ÛÛ  ÛÛ    ÛÛÛÛÛ    ÛÛ  ÛÛ    ÛÛÛÛÛÛ    ÛÛ    "
IF VCOK="COM"
   @ 15,02 SAY "ÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜ   ÜÜ      ÜÜÜÜÜÜ ÜÜ  ÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜ"
   @ 16,02 SAY "ÛÛ     ÛÛ  ÛÛ ÛÛÛÜÛÛÛ      ÛÛÜÜÜÜ ÛÛ  ÛÛ ÛÛ     ÛÛÜÜÜ  ÛÛÜÜÜÜ ÛÛÜÜÜÜ ÛÛ  ÛÛ"
   @ 17,02 SAY "ÛÛÜÜÜÜ ÛÛÜÜÛÛ ÛÛ ß ÛÛ      ÜÜÜÜÛÛ ÛÛÜÜÛÛ ÛÛÜÜÜÜ ÛÛÜÜÜÜ ÜÜÜÜÛÛ ÜÜÜÜÛÛ ÛÛÜÜÛÛ"
ELSE
   @ 15,02 SAY "ÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜ   ÜÜ      ÜÜÜÜÜÜ ÜÜ  ÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜ ÜÜÜÜÜÜ"
   @ 16,02 SAY "ÛÛÜÜÜÜ ÛÛÜÜÜ  ÛÛÛÜÛÛÛ      ÛÛÜÜÜÜ ÛÛ  ÛÛ ÛÛ     ÛÛÜÜÜ  ÛÛÜÜÜÜ ÛÛÜÜÜÜ ÛÛ  ÛÛ"
   @ 17,02 SAY "ÜÜÜÜÛÛ ÛÛÜÜÜÜ ÛÛ ß ÛÛ      ÜÜÜÜÛÛ ÛÛÜÜÛÛ ÛÛÜÜÜÜ ÛÛÜÜÜÜ ÜÜÜÜÛÛ ÜÜÜÜÛÛ ÛÛÜÜÛÛ"
ENDIF
@ 24,00 SAY PADC("Pressione qualquer tecla...",80) COLOR "N/W"
INKEY(0)
SET COLOR TO
CLS
VGAPALETTE()

* Final do programa MSG_BKP.PRG
Espero que tenha servido para o se propósito, vale a pena compilar.

Enviado: 22 Jun 2007 14:51
por Maligno
Mais uma mensagem apta a reclassificação. :)

Enviado: 22 Jun 2007 16:11
por Pablo César
Maligno, você está tão incomodado na reclassificação de mensagens, que até parece que você não gostou de eu ter exposto a minha solução com código e explicações. O colega apresentou a sua difculdade:
Não consigo achar um jeito de ler o retorno do Arj e saber se ele está pedindo um novo disquete ou não....
E ainda perguntou como:
Alguém sabe de um modo de fazer isso?
Não porque aqui estamos na seção Clipper, que eu e demais não devessemos colocar os fontes também. Eu não tenho meu proprio site para apontar com link e dizer... faça aqui o download...

Eu apresentei apresentei uma solução, e espero sinceramente que sirva bem para o colega e para os demais e também espero que faça-se justiça quanto ao seu tópico WAPI e volte para aqui na seção Clipper que será mais atuante a participação de outros colegas do que estar lá onde está.

Enviado: 22 Jun 2007 19:27
por Maligno
Pablo César escreveu:Maligno, você está tão incomodado na reclassificação de mensagens, que até parece que você não gostou de eu ter exposto a minha solução com código e explicações.
Absolutamente. Me entendeu errado. Apenas fiz uma observação a respeito da possibilidade desta thread também ser reclassificada. Se bem que é capaz disso não acontecer. Dois pesos, duas medidas.
Se bem que, agora que você falou, lembrei que você poderia ter aberto uma thread na seção de códigos fontes e ofertado seu código lá, informando o colega sobre o link. Mas não esquenta. Você não agiu errado.

Enviado: 22 Jun 2007 19:29
por Eolo
O Maligno tá certo. O Miracle pediu:
...só que eu gostaria de, em vez de limpar a tela e acionar o Arj pelo comando RUN, de ter um programa usando o próprio Clipper para...
...aí o Pablo apresentou uma opção USANDO o ARJ...
Eu tenho uma rotina que faz backup pelo ARJ versão 2.50a que tem várias...
... só que O Miracle NÃO quer o ARJ.

Enviado: 22 Jun 2007 19:52
por sygecom
Para quem quiser....no link abaixo tem uma LIB para Backup-compactado....e tem um demo e uma documentação junto....eu nunca usei...mas dei uma olhada e me parece bem facil de usar....
http://www.sygecom.com.br/xharbour/bak_clipper.zip

Obs:Tem Lib para Clipper Sumer 87,5.0,5.2..

Abraços
Leonardo Machado

Enviado: 22 Jun 2007 19:57
por Maligno
Eolo escreveu:... só que O Miracle NÃO quer o ARJ.
O colega não disse isso explicitamente. O que entendi é que ele quer usar o ARJ (talvez outro compactador???) com a possibilidade de controlá-lo de dentro do seu programa. Talvez uma barra de progresso e coisas do tipo. Isso excluiria o exemplo do Pablo.
Até tenho, como eu disse, aquela LIB da PKware (revendida antigamente pela Mappe) que possibilita isso. Mas ela é muito simples, e o nível de eficiência de compactação está bem abaixo dos demais produtos. Eu próprio não tive coragem de usar. Preferi montar uma interface pro usuário criar seus scripts de back-up e executar os programas externamente. Esteticamente fica feio, mas é bem eficiente.

Enviado: 22 Jun 2007 20:00
por Maligno
sygecom escreveu:Para quem quiser....no link abaixo tem uma LIB para Backup-compactado
Interessante mesmo. Dando um tempinho vou testar pra saber qual o nível de eficiência.

Enviado: 22 Jun 2007 20:17
por Pablo César
Eolo escreveu:... só que O Miracle NÃO quer o ARJ.
Veja só eu não sabia que você Eolo pudesse afirmar o que o colega precisa ou não...

Eu sei que tudo isto acontece, por puras deduções e ficaria uma vez mais aqui neste tópico discutindo entre nós sem ter a opinião do autor do tópico ou até mesmo de algum outro interessado.

Talvez o colega miracle não queira mais usar o ARJ mas eu fui motivado a passar um exemplo da minha rotina sobre troca de disquetes analisando o que o próprio colega escreveu:
miracle escreveu:de ter um programa usando o próprio Clipper para ler os disquetes, pedir o disquete seguinte e dizer que o backup está concluído / restaurado.
Maligno escreveu:... lembrei que você poderia ter aberto uma thread na seção de códigos fontes e ofertado seu código lá, informando o colega sobre o link.
Não sei se viram o meu complemento em Críticas e/ou Sugestões onde declaro que eu não sou favorável com a existência de tantas seções daqui do FORUM. Portanto eu não considero benéfico insentivar a existência de uma seção como "Código Fonte", pois então deveria ter uma seção para xHarbour, Fivewin, Visual Objects, Mini GUI.... etc...

Sei lá pessoal... parece que todo este debate não tem a ver com o tópico inicialmente. Mas até parece que mostrar um outro exemplo venha a ser um crime...

Enviado: 22 Jun 2007 22:50
por Pablo César
Maligno escreveu:Interessante mesmo. Dando um tempinho vou testar pra saber qual o nível de eficiência.
Eu ja conhecia, mas assim como você disse Maligno, como muitos não tem grande compactação, pois eu fiz um teste compactando:

README.TXT
RBCKLIB.NG
RBCKDEMO.PRG
RBCKDEMS.PRG
RBCKLIB.DOC
RBCKLIB.REG

Total não compactado: 116.356 bytes
Compactado pelo RBCK_C52.LIB: 52.362 bytes
Compactado pelo ARJ v2.50a: 27.421 bytes

E outro contra-tempo é que a LIB força uma pausa de 9 segundos (por ser cópia DEMO, isto é cópia não registrada).

Estas observações (não são críticas) apenas faço para que obtenha-se referências sobre o produto indicado e de todas formas expresso meu apreço ao colega Leonardo pela sua indicação.

Enviado: 22 Jun 2007 23:03
por sygecom
Total não compactado: 116.356 bytes
Compactado pelo RBCK_C52.LIB: 52.362 bytes
Compactado pelo ARJ v2.50a: 27.421 bytes
Tche, foi como eu disse nunca usei a Tal.....pelos teste que vc fez e postou...acho que ela não vai servir muito util mesmo.......

Abraços
Leonardo Machado