Página 1 de 1

Variaveis no include - Como fazer?

Enviado: 17 Mar 2007 22:14
por emanuelrdantas
Olá Pessoal,
Desculpem as perguntas simples, mas estou comecando agora. É o seguinte, compilei meu programa normalmente e sem problemas, mas eu tive que retirar uma linha : "include sic.ch", onde continha as variáveis do sistema. Mas no xharbour, ele nao aceita esse include. Tive que tirar, deixando meu sistema sem variaveis e, por isso, dando erro ao entrar no programa, que ao executar pede as variaveis. O que fazer nesse caso??
Obrigado a todos antecipadamente
Emanuel

Enviado: 19 Mar 2007 08:38
por vailton
O xHarbour aceita normalmente este comando. Talvez o prolema esteja em algum outro detalhe. Qual a msg de erro que lhe aparece?

Enviado: 20 Mar 2007 15:27
por vagucs
sempre use assim

#include "arquivo.ch"

Ou

#include <arquivo.ch>

A dirença entre "" e <> é que com "" o compilador procura o arquivo relacionado na pasta local primeiro e depois no diretorio INCLUDE, e com <> so procura no diretorio include.

Arquivo.ch

Enviado: 20 Mar 2007 18:56
por emanuelrdantas
Olá, não sei o que deu, mas inseri novamente a linha do #include e funcionou. No entanto, ocorre o mesmo problema, compila normal, mas ao ser executado ele pede uma variável que está dentro do sic.ch. No hbmake, ele me da uma lista somente dos .prg, sera que eu tenho que adicionar em algum lugar o sic.ch??
Vou colocar aqui o codigo.
Embaixo está o programa principal, onde mando ele executar a função "do janela with..." que esta na procedure sicrot. Função esta que pede uma define que está no sic.ch.
Agradeço a imensa colaboração de todos aqui neste fórum.
Obrigado mesmo pessoal.

Código: Selecionar todos

#include "sic.ch"
clear all
set console off
set intensity on
set dele on
set bell off
set score off
set date british
set message to 24 center
set wrap on
set confirm off
set exclu off
set century on
set procedure to sicrot

*************************   VARIÁVEIS (PÚBLICAS/PRIVADAS) ******************
dTSYSTEM = DATE()
wSAIR = SPACE(01)



*********************** AREAS DE TRABALHO *****************
SELE 01
USE GRCA00 INDEX GRCA0001 ALIAS GRCA00

***************************      MENU    ************************************

set color to w+/b
@ 00,00 clear to 24,79
@ 00,00  SAY 'FISCAL - SISTEMA DE GERENCIAMENTO'
@ 00,63  SAY 'Data.:'
@ 00,70  SAY DATE()
@ 01,63  SAY 'Prog.:'
@ 02,00  TO 02,79
@ 23,00  TO 23,79

   Sistema:="SISTEMA INTEGRADO - Versao 6.00"
VarTipPa:=VarCorPa:=1
FUNDO(VarTipPa,03,00,22,80,VarCorPa)
do cabecalho with 'Opcoes Gerais do Sistema','LOJA2'
SAVE SCREE TO Tela_Princ

SELE GRCA00 
SEEK "01"
if dgr00dtsys<>dTSYSTEM
   @ 12,25 say 'Informe data Atual..:'
   @ 12,47 get dTSYSTEM valid dTSYSTEM<>ctod('  /  /    ')
   read
   if lastkey()=27
      close data
      return
   endif
   wconf='N'
   @ 24,00
   @ 24,00 say 'Confirma Atualizacao da DATA DO SISTEMA [S/N]'
   @ 24,47 get wconf pict '@!' valid wconf$'SN'
   read
   if wconf= 'N'
      close data
      return
   ELSE
      DO RRLOC
      REPL DGR00DTSYS WITH dTSYSTEM
      UNLOCK
   endif
ENDIF
RESTORE SCREEN FROM TELA_PRINC

do janela with 08,27,15,46
WOPCAO = 1
DO WHILE WOPCAO <> 0
   @ 24,00
   @ 09,28 promp 'CONTROLE ESTOQUE  ' MESS 'Controla Atualizacao/Movimento do Estoque '
   @ 10,28 promp 'CONTAS A PAGAR    ' MESS 'Controle de Contas Para Pagamento'
   @ 11,28 promp 'CONTAS A RECEBER  ' MESS 'Controle de Contas a Receber/Cobranca'
   @ 12,28 promp 'UTILITARIOS       ' MESS 'Modulo Para Auxilio na Operacao do Sistema'
   @ 13,28 promp 'ANALISE DE VENDAS ' MESS 'Estudo das Vendas na LJ1 e LJ2'
   @ 14,28 promp 'ANALISE DE ESTOQUE' MESS 'Estudo do Estoque e sua Rotatividade na LJ1 e LJ2'
   MENU TO WOPCAO
   SAVE SCREEN TO TELAM
   DO CASE
      CASE WOPCAO = 0
           CRESP = 'N'
           ?CHR(7)
           @ 24,00
           @ 24,22 SAY 'Confirme Saida do Sistema (S/N) ? [ ]'
           @ 24,57 GET CRESP PICT '!' VALID CRESP $ 'SN*'
           READ
           @ 24,00
           IF CRESP='N'
              RESTORE SCREEN FROM TELAM
              WOPCAO = 1
           else
              set exclu on
              EXIT
           ENDIF
      CASE WOPCAO = 1
           DO MENU1
*     CASE WOPCAO = 2
*          DO MENU2
*     CASE WOPCAO = 3
*          DO MENU3
      CASE WOPCAO = 4
           DO MENU4
*     CASE WOPCAO = 5
*          DO MENU5
      CASE WOPCAO = 6
           DO MENU6

    ENDCASE
   RESTORE SCREEN FROM TELAM
CLOSE DATA
ENDDO
CLOSE DATABASE                  
Aqui está o sic.ch fonte.

Código: Selecionar todos

// Cores (Avisos e Mensagens)

#define COR_Aviso         IF(ISCOLOR(),"N/W","N/W")      // Cor Relativa ao Aviso Simples Emitido Pela Funcao 'AVISO()'
#define COR_Mensag        IF(ISCOLOR(),"N/W","N/W")      // Cor Relativa a Mensagem de Alerta Emitido Pela Funcao 'MENSAGEM()'

// Cores Relativa as Bordas

#define COR_BordS1        IF(ISCOLOR(),"N/W","W+/W")     // Cor Relativa a Borda Superior 1
#define COR_BordS2        IF(ISCOLOR(),"W+/B","W+/R")    // Cor Relativa a Borda Superior 2
#define COR_BordS3        IF(ISCOLOR(),"N/W","W+/W")     // Cor Relativa a Borda Superior 3
#define COR_BordIn        "W+/W"   // Cor Relativa a Borda Inferior

// Cores Relativa aos Menus e Janelas

#define COR_Menu          IF(ISCOLOR(),"W","W+")         // Cor Relativa ao Menu Principal
#define COR_PrptSS        IF(ISCOLOR(),"N/W","N/W")      // Cor Relativa a Barra de Status do PROMPT Superior
#define COR_PrptSD        IF(ISCOLOR(),"W+/W","W+/W")    // Cor Relativa a Barra de Status do PROMPT Superior (DESTAQUE)
#define COR_PrptIS        IF(ISCOLOR(),"W","W")          // Cor Relativa a Barra de Status do PROMPT Inferior
#define COR_PrptID        IF(ISCOLOR(),"B/W","W+/W")     // Cor Relativa a Barra de Status do PROMPT Inferior (DESTAQUE)
#define COR_JANEDI        IF(ISCOLOR(),"B+/B","W+/W")    // Cor Relativa a Janela de Edicao
#define COR_FJaneE        IF(ISCOLOR(),"W+/B","W+/R")    // Cor do Fundo da Janela de Edicao
#define COR_JanHel        IF(ISCOLOR(),"W+/W","W+/R")    // Cor Relativa a Janela de Helps
#define COR_FJaneH        IF(ISCOLOR(),"W+/W","W+/R")    // Cor Relativa a Janela de Helps
#define COR_Get1          IF(ISCOLOR(),"W/N","W/N")      // Cor dos GET'S (Sempre Nada)
#define COR_Get2          IF(ISCOLOR(),"W+/R","W+/R")    // Cor dos GET'S (Cor Digitacao)
#define COR_Get3          IF(ISCOLOR(),"W/N","W/N")      // Cor dos GET'S (Cor Apos Digitacao)

// Cores Relativa a Sombra das Janelas

#define COR_Sombra         CHR(8)  // Cor Relativa a Sobra das Janelas

// Tempo de Execucao

#define TEM_Mensagem      3.0      // Tempo Relativo a FUNCAO Mensagem

// Configuracao de Efeitos da Impressora

#define A_Italic CHR(27)+"4"        // Ativa Qualidade Italico
#define D_Italic CHR(27)+"5"        // Desativa Qualidade Italico
#define A_Qcarta CHR(27)+"G"        // Ativa Qualidade Carta
#define D_Qcarta CHR(27)+"H"        // Desativa Qualidade Carta
#define A_Expand CHR(14)            // Ativa Qualidade Expandido
#define D_Expand CHR(20)            // Desativa Qualidade Expandido
#define A_Compri CHR(15)            // Ativa Qualidade Comprimido
#define D_Compri CHR(18)            // Desativa Qualidade Comprimido
#define A_Sublin CHR(27)+"-"+CHR(1) // Ativa Qualidade Sublinhado
#define D_Sublin CHR(27)+"-"+CHR(0) // Desativa Qualidade Sublinhado
#define A_Enfati CHR(27)+"E"        // Ativa Qualidade Enfatiado
#define D_Enfati CHR(27)+"F"        // Desativa Qualidade Enfatiado
#define A_Expoen CHR(27)+"S"        // Ativa Qualidade Expoente
#define D_Expoen CHR(27)+"T"        // Desativa Qualidade Expoente


Enviado: 20 Mar 2007 23:48
por vagucs
Fiote,

Chame a rotina de modo costumeiro como JANELA(PAR1,PAR2,PARN), da forma normal, o comando DO foi abolido e tive muitos problemas em empresas que usavam muito este comando, tivemos que modificar ele, sugiro que faça o mesmo.

Não resolveu

Enviado: 21 Mar 2007 17:30
por emanuelrdantas
Pessoal, desculpem a insistência ou até mesmo burrice. Fiz o que foi dito, tirei tudo que era "do" e ficou como abaixo. No entanto, o programa insiste em pedir essa variável COR_JANEDI. No Hbmake precisa fazer alguma alteração para incluir esse sic.ch??? Acredito que o hbmake não esteja "enchergando" o sic.ch, por isso, fica sem variavel, dando erro ao ser executado.
Obrigado pela paciência
Emanuel

Código: Selecionar todos

function main()
* SISTEMA     : FISCAL - Sistema de Gerenciamento
* PROGRAMA    : FISCAL - Emanuel Dantas
* OBJETIVO    : Menu Principal
* DATA        : 03/03/07
******************************************************************************
#include "sic.ch"
clear all
set console off
set intensity on
set dele on
set bell off
set score off
set date british
set message to 24 center
set wrap on
set confirm off
set exclu off
set century on
set procedure to sicrot

*************************   VARIÁVEIS (PÚBLICAS/PRIVADAS) ******************
dTSYSTEM = DATE()
wSAIR = SPACE(01)



*********************** AREAS DE TRABALHO *****************
SELE 01
USE GRCA00 INDEX GRCA0001 ALIAS GRCA00

***************************      MENU    ************************************

set color to w+/b
@ 00,00 clear to 24,79
@ 00,00  SAY 'FISCAL - SISTEMA DE GERENCIAMENTO'
@ 00,63  SAY 'Data.:'
@ 00,70  SAY DATE()
@ 01,63  SAY 'Prog.:'
@ 02,00  TO 02,79
@ 23,00  TO 23,79

   Sistema:="SISTEMA INTEGRADO - Versao 6.00"
VarTipPa:=VarCorPa:=1
FUNDO(VarTipPa,03,00,22,80,VarCorPa)
cabecalho ('Opcoes Gerais do Sistema','LOJA2')
SAVE SCREE TO Tela_Princ

SELE GRCA00 
SEEK "01"
if dgr00dtsys<>dTSYSTEM
   @ 12,25 say 'Informe data Atual..:'
   @ 12,47 get dTSYSTEM valid dTSYSTEM<>ctod('  /  /    ')
   read
   if lastkey()=27
      close data
      return
   endif
   wconf='N'
   @ 24,00
   @ 24,00 say 'Confirma Atualizacao da DATA DO SISTEMA [S/N]'
   @ 24,47 get wconf pict '@!' valid wconf$'SN'
   read
   if wconf= 'N'
      close data
      return
   ELSE
      RRLOC()
      REPL DGR00DTSYS WITH dTSYSTEM
      UNLOCK
   endif
ENDIF
RESTORE SCREEN FROM TELA_PRINC

janela (08,27,15,46)
WOPCAO = 1
DO WHILE WOPCAO <> 0
   @ 24,00
   @ 09,28 promp 'CONTROLE ESTOQUE  ' MESS 'Controla Atualizacao/Movimento do Estoque '
   @ 10,28 promp 'CONTAS A PAGAR    ' MESS 'Controle de Contas Para Pagamento'
   @ 11,28 promp 'CONTAS A RECEBER  ' MESS 'Controle de Contas a Receber/Cobranca'
   @ 12,28 promp 'UTILITARIOS       ' MESS 'Modulo Para Auxilio na Operacao do Sistema'
   @ 13,28 promp 'ANALISE DE VENDAS ' MESS 'Estudo das Vendas na LJ1 e LJ2'
   @ 14,28 promp 'ANALISE DE ESTOQUE' MESS 'Estudo do Estoque e sua Rotatividade na LJ1 e LJ2'
   MENU TO WOPCAO
   SAVE SCREEN TO TELAM
   DO CASE
      CASE WOPCAO = 0
           CRESP = 'N'
           ?CHR(7)
           @ 24,00
           @ 24,22 SAY 'Confirme Saida do Sistema (S/N) ? [ ]'
           @ 24,57 GET CRESP PICT '!' VALID CRESP $ 'SN*'
           READ
           @ 24,00
           IF CRESP='N'
              RESTORE SCREEN FROM TELAM
              WOPCAO = 1
           else
              set exclu on
              EXIT
           ENDIF
      CASE WOPCAO = 1
           MENU1()
*     CASE WOPCAO = 2
*          MENU2()
*     CASE WOPCAO = 3
*          DO MENU3
      CASE WOPCAO = 4
           MENU4()
*     CASE WOPCAO = 5
*          DO MENU5
      CASE WOPCAO = 6
           MENU6()

    ENDCASE
   RESTORE SCREEN FROM TELAM
CLOSE DATA
ENDDO
CLOSE DATABASE                  

Enviado: 21 Mar 2007 17:48
por vagucs
Mas seu programa não tem citação desta DEFINE COR_JANEDI, onde daria este erro? so s for em outro fonte.

Enviado: 21 Mar 2007 17:48
por MARCELOG
Qual é a mensagem de erro que está aparecendo?
O sic.ch tá mesmo no diretório atual?
Experimente colocá-lo do diretório include do xharbour.

MarceloG

Enviado: 21 Mar 2007 17:51
por vagucs
Repare tambem que defines nao são variaveis e sim definições que so existem no momento da compilação, assim este codigo em um PRG puro daria um erro

? COR_JANEDI

Ja assim funcionaria

#define COR_JANEDI "GR+/B"
? COR_JANEDI

Porem pode ver que no segundo exemplo nao existe mais a variavel COR_JANEDI incluida no EXE final, vc pode ver isto usando um descompilador ou abrindo o EXE diretamente, ou seja, a "variavel" só existe no momento da compilação, assim se sua rotina JANELA estiver em outro fonte, a include tem que estar declarada nele, os includes atuam independentemente em cada PRG.

Fonte das funcoes

Enviado: 21 Mar 2007 23:38
por emanuelrdantas
Olá colegas, agradeço primeiramente a imensa atenção que estão me dando aqui.
Bom, a função janela está dentro de um arquivo chamado sicrot.prg que vc pode ver no prg principal declarado como procedure. Eu vou colocar o cabeçaho dele mais a função da janela, pois ele é muito grande.

Código: Selecionar todos

#include "SIC.CH"
.
.
.
*************************************************************
FUNCTION Janela(PJAN1,PJAN2,PJAN3,PJAN4,PJANMENS,PCORJ,PCORF)
*************************************************************
#define COR_JANEDI        IF(ISCOLOR(),"B+/B","W+/W")    // Cor Relativa a Janela de Edicao
SaveCorJ=SETCOLOR()

PJANMENS=IF(PJANMENS=NIL,"",PJANMENS)
PCORJ=IF(PCORJ = NIL,IF(PROCNAME(1)="__XHELP" .OR. PROCNAME(2)="__XHELP" .OR. PROCNAME(3)="__XHELP" .OR. PROCNAME(4)="__XHELP"  .OR.;
         PROCNAME(1)="HELP"    .OR. PROCNAME(2)="HELP"    .OR. PROCNAME(3)="HELP"    .OR. PROCNAME(3)="HELP",COR_JanHel,COR_JanEdi),PCORJ)
PCORF=IF(PCORF = NIL,IF(PROCNAME(1)="__XHELP" .OR. PROCNAME(2)="__XHELP" .OR. PROCNAME(3)="__XHELP" .OR. PROCNAME(4)="__XHELP"  .OR.;
         PROCNAME(1)="HELP"    .OR. PROCNAME(2)="HELP"    .OR. PROCNAME(3)="HELP"    .OR. PROCNAME(3)="HELP",COR_FJaneH,COR_FJaneE),PCORF)

PLIN1=INT(((PJAN3 - PJAN1) / 2) + PJAN1)
PLIN2=INT(((PJAN4 - PJAN2) / 2) + PJAN2)
PLIN3=PLIN1
PLIN4=PLIN2
DO WHILE .T.
   SETCOLOR(PCORF)
   @ PLIN1,PLIN2 CLEAR TO PLIN3,PLIN4
   SETCOLOR(PCORJ)
   @ PLIN1,PLIN2,PLIN3,PLIN4 BOX "Û"
   SETCOLOR("")
   PLIN1-=IIF(PLIN1 > PJAN1,1,0)
   PLIN2-=IIF(PLIN2 > PJAN2,1,0)
   PLIN3+=IIF(PLIN3 < PJAN3,1,0)
   PLIN4+=IIF(PLIN4 < PJAN4,1,0)
   IF PLIN1 = PJAN1 .AND. PLIN2 = PJAN2 .AND. PLIN3 = PJAN3 .AND. PLIN4 = PJAN4
      EXIT
   ENDIF
ENDDO
SETCOLOR(PCORF)
@ PJAN1,PJAN2 CLEAR TO PJAN3,PJAN4
SETCOLOR(PCORJ)
@ PJAN1,PJAN2,PJAN3,PJAN4 BOX "Û"
SOMBRA(PJAN1,PJAN2,PJAN3,PJAN4)
IF LEN(TRIM(PJANMENS)) > 0
   @ PJAN1,PJAN2+(((PJAN4+1-PJAN2)-LEN(PJANMENS))/2) SAY PJANMENS COLOR PCORF
ENDIF
SETCOLOR(SaveCorJ)
RETURN(.T.)
Resumindo tudo, eu mando no prg principal executar uma função "janela" que está declarada na procedure sicrot (a qual está com o código em cima, em parte) no prg principal, sendo que esta também possui a "include sic.ch". Esta última possui os defines, entre eles a COR_JANEDI, variável esta solicitada ao ser executado o programa, dizendo que não existe. Portanto, o erro está ao ser executado o programa, ele dá a mensagem dizendo que a variável COR_JANEDI não existe.
Eu também já coloquei a sic.ch dentro da pasta include.
Obrigado a todos pela atenção
Emanuel

Resolvendo o problema

Enviado: 21 Mar 2007 23:48
por emanuelrdantas
Bom, apesar de não saber a causa do erro.
Perdi a paciência e criei todas as defines presentes no sic.ch necessarias para cada função dentro do prg que as chama.
Por exemplo, no prg principal, quando executa a funcao janela, preciso da variavél COR_JANDEI
Então, adicionei essa variável ao prg:
COR_JANEDI = "B+/B"
Acho que foi que descobrir o erro.
Obrigado pessoal
Emanuel

Enviado: 22 Mar 2007 02:15
por vagucs
Repare que se vc definir algo como

#define WAGNER_NUNES 1

e fazer isto

? WAGNER_NUNES

O valor de WAGNER_NUNES será substituido por 1

Mas se fizer isto

? WAGNER_nunes

Ai terei o erro de variavel nao existente, acontece que as defines tem que ser tratadas no fonte extamente como são criadas e na sua rotina vc fez o seguinte:

OR. PROCNAME(3)="HELP",COR_JanHel,COR_JanEdi),

Vc usou COR_JanEdi enquanto devia estar usando COR_JANEDI exatamente como no arquivo include, este é o problema, defines fazem distinção entre maiuscula e minuscula.