A tempos uso uma técnica para compilação de um mesmo .PRG contendo definições variadas para clientes diferentes.
Exemplo:
Tenho um .PRG em meus sistemas que imprime notas fiscais e suas rotinas são básicas, como:
- pegar dados do cliente
- pegar dados da transportadora
- pegar dados de produtos como ICMS, IPI, REDUCAO, etc
- pegar dados de fiscalização com natureza de operação, situação tributária, etc
- calcular os impostos.
Mas o problema é o posicionamento dos itens sendo impressos no corpo da nota, pois os mesmos tem posições variadas de coluna.
Então saquei a técnica usada nos .CH e do pré-processamento e posso compilar o mesmo .PRG para vários clientes tendo resultados diferentes, exemplo de um trecho:
// Este arquivo esta no diretorio de fontes do cliente e contem uma linha
// que define o seu nome, ex: #DEFINE CLIENTEa
#include "NOTA.CH"
//Nas linhas abaixo, conforme a definição contida dentro do NOTA.CH eu
//compilo o .PRG obtendo o resultado esperado.
#ifdef CLIENTEa
...
@ 10,10 say NOME
...
#endif
#ifdef CLIENTEb
...
@ 12,25 say NOME
...
#endif
Isto quer dizer, existe a possibilidade de compilar para duas plataformas diferentes num mesmo .PRG usado este método, ex:
#DEFINE MsDOS
#ifdef MsDOS
...
@ 10,10 say NOME
...
#else
...
REDEFINE say NOME
...
#endif
O que se deve levar em consideração é o uso de funções particulares, as UDFs( User Defined Functions ), funções feitas pelo usuário.
Estas muitas vezes possuem apresentação de mensagens na tela do DOS usando @...SAY, então todas funções e procedures que emitem texto no DOS devem ser modificadas para entenderem estar sendo usadas no Fivewin, assim:
...
FUNCTION mensagem( texto, tempo )
#ifdef MsDOS
@ 24,0 say texto
inkey( tempo )
#else
if tempo <> NIL
MsgStop( OemToAnsi( texto ) )
else
oWnd:SetMsg( OemToAnsi( texto ) )
endif
#endif
A variavel oWnd deve ser STATIC ou PUBLIC para ser carregada por todo o .PRG, exemplo:
[code]
#ifdef MsDOS
#else
#DEFINE "fivewin.ch
Static oWnd
#endif
@braços :?)