quarta-feira, 18 de março de 2009

Se Você utiliza programas desenvolvido em Cliper no Windows XP, estas dicas podem ser uteis

Clipper com Windows XP


Quem utiliza sistemas em Clipper sobre Windows 98 e resolve migrar a plataforma para Windows XP passa por algumas dificuldades. Tem gente que chega a afirmar que o Clipper não funciona no Windows XP. É verdade mesmo que programas em Clipper não rodam ou rodam mal no Windows XP? É verdade que nem mesmo compilam? Será que existe algo no ”mundo novo” que não conseguimos mais realizar com o bom e velho Clipper? Tudo mentira. Mas para isso é preciso preparar o ambiente do Windows XP. Abaixo, relaciono os problemas em tópicos com a solução de cada um deles em seguida. Fique tranqüilo. O Clipper roda e roda bem no Windows XP.


1 – Onde crio as variáveis de ambiente necessárias para compilar o Clipper e as necessárias para executa-lo?

No Windows XP, os velhos conhecidos AUTOEXEC.BAT e CONFIG.SYS que ficavam na pasta raiz da máquina com Windows 98 foram renomeados para AUTOEXEC.NT e CONFIG.NT e transferidos para a pasta C:\WINDOWS\SYSTEM32.
Assim sendo, é neles que você tem que criar suas variáveis de ambiente. Acrescente-as no final deles, conforme descritas abaixo:

1 – Variáveis necessárias para compilação do Clipper:

1.1 – No AUTOEXEC.NT:

SET PATH=%PATH%;C:\CLIPPER5\BIN

SET INCLUDE=C:\CLIPPER5\INCLUDE

SET LIB=C:\CLIPPER5\LIB

SET OBJ=C:\CLIPPER5\OBJ

2 – Variáveis necessárias para execução dos programas em Clipper:

2.1 – No AUTOEXEC.NT:

SET CLIPPER=//F:255 //DYNF:8 //SWAPK:65535
//SWAPPATH:”C:\” //TEMPPATH:”C:\”

2.2 – No CONFIG.NT:

FILES=255
BUFFERS=40

Além do AUTOEXEC.NT e do CONFIG.NT, para executar um sistema em Clipper no Windows XP é necessário um último ajuste, desta vez no arquivo SYSTEM.INI, que fica em C:\WINDOWS:

1 – Abra o arquivo C:\WINDOWS\SYSTEM.INI e inclua logo abaixo da
chave [386enh] a seguinte instrução:

PerVMFiles=255


2 – A tela não fica no formato correto (80 colunas por 25 linhas). Como faço para
que meus programas em Clipper rodem na tela padrão do DOS?

Este problema, apesar de parecer banal, foi trabalhoso para resolver. Temos que realizar 3 procedimentos para resolve-lo. Veja:

1 – Acrescente a seguinte instrução no arquivo
C:\WINDOWS\SYSTEM32\AUTOEXEC.NT:

C:\WINDOWS\SYSTEM32\MODE CON COLS=80 LINES=25

2 – Crie um arquivo em lote (.BAT) para chamar o seu programa através dele.
Por exemplo, se seu programa se chama MyProg.exe, crie um arquivo chamado
MyStart.bat com o conteúdo abaixo e passe a chamá-lo ao invés de chamar
diretamente seu executável:

@Echo Off
Cls
C:\Windows\System32\Mode Con Cols=80 Lines=25
MyProg.exe %1

3 – Se você usa um atalho no seu desktop para chamar seu programa MyProg.exe,
substitua a linha de comando para MyStart.bat, ou seja, passe a chamar a batch
e não mais o executável diretamente. Altere também, clicando com o botão
direito do mouse sobre o atalho, na guia “Compatibilidade”, as configurações
correntes do atalho, ou seja, marque as caixinhas “Executar este programa em
modo de compatibilidade -> Windows 95”, “Executar em 256 cores”,
“Executar em resolução de tela 640 x 480”, “Desativar temas visuais” e
“Desativar serviços de texto avançados para este programa”.


3 – A impressão fica lenta pelo Clipper. Como resolver?

É preciso priorizar a impressão pelo DOS para resolver o problema. Para isto, diminuímos o tempo do buffer de impressão e o timeout da porta LPT no registro do Windows XP. Veja como proceder:

1 – Abra o arquivo C:\WINDOWS\SYSTEM.INI e inclua abaixo da chave [386enh]
os seguintes valores:

[Network]
PrintBufTime=1

[IFSMGR]
PrintBufTime=1

2 – Execute o Regedit (Menu Iniciar -> Executar -> Regedit.exe) e pesquise pela
chave LPT_TIMEOUT. Quando encontrá-la, clique 2 vezes sobre ele e altere
seu valor para 1. Repita a busca pressionando F3 e altere o valor de todas as
ocorrências de LPT_TIMEOUT para 1.

3 – Coloque a instrução SET PRINTER TO LPT1 antes dos seus comandos de
impressão e a instrução SET PRINTER TO no final delas, para forçar o
esvaziamento do spooler de impressão. Ou então, use as duas funções abaixo,
que eu uso e são muito úteis para realizar impressão pelo Clipper.
Uma delas prepara a impressão e a outra restaura as configurações após
o seu último comando de impressão ser enviado:

Exemplo de utilização:

If Inicia_Impressao()
@ Prow(), Pcol() Say “teste de impressão...”
Finaliza_Impressao()
EndIf


*----------------------------------------------------------
Function Inicia_Impressao(cDispositivo)

Local lOk := .T.

// Este parâmetro poderia ser o nome de um arquivo:
cDispositivo := If(Empty(cDispositivo), “LPT1”, Upper(cDispositivo))

If If(Left(cDispositivo, 3) = “LPT”, IsPrinter(), .T.)
Save Screen
@ 24, 0 Say PadC("Aguarde, imprimindo ...", 80)

Set Default To // Para corrigir um bug do Clipper, que conflita este comando com
// o SET PRINTER TO
Set Printer To (cDispositivo) // Para redirecionar os comandos de impressão para
// o dispositivo
Set Device To Printer // Para redirecionar os “@..Say” para o dispositivo
// selecionado
Set Printer On // Faz com os comandos de console ecoem no dispositivo
// selecionado
Set Console Off // Desliga a exibição dos comandos de console na tela

SetPrc(0, 0) // Seta os novos valores para PRow() e PCol(), movendo a cabeça
// de impressão da impressora para a posição 0, 0.

Else
Alert(“Impressora não preparada.;Veja se ela está ligada e se não acabou o papel”)
lOk := .F.
EndIf

Return lOk
*----------------------------------------------------------
Function Finaliza_Impressao()

Restore Screen // Restaura a tela por causa da mensagem “Aguarde, imprimindo…”

Set Printer Off // Faz com que os comandos de console voltem a ecoar no
// console
Set Printer To // Esvazia o spooler de impressão e retorna a seleção ao dispositivo
// default (PRN)
Set Device To Screen // Redireciona os “@..Say” para a tela novamente

Set Console On // Liga a exibição dos comandos de console na tela novamente

Return Nil
*----------------------------------------------------------


4 – Quando um programa em Clipper fica ocioso e aberto em segundo plano, o processador fica em carga máxima de utilização. Porquê isto ocorre se meu programa está ocioso?

Um sistema em Clipper, ainda que em estado de espera, devora recursos de uma máquina com a tecnologia NT (como é o caso do Windows XP) porque não libera os ciclos da CPU quando em estado de ociosidade (idle).
Para corrigir isto, um dos grandes nomes do Clipper internacional, Dave Pearson (http://www.davepearson.com), criou a OSLib. Ela foi escrita em C Ansi e libera os ciclos da CPU quando um sistema em Clipper fica ocioso, liberando os recursos da máquina NT e baixando sua utilização para algo em torno de 3%.
Procure pela OSLib na internet ou me envie um e-mail solicitando-a. Eu tenho a versão 1.05 dela.
Após linkar o arquivo OSLIB.LIB juntamente ao seu programa, basicamente o que se tem a fazer são duas coisas:

1 – Colocar o comando OL_AutoYield(.T.) no início do seu código-fonte;
2 – Reescrever a função Inkey() do Clipper (ex.: MyInkey()), utilizando a
função OL_Yield() da OSLib para liberar os ciclos no estado de espera e
substituir todas as chamadas de Inkey() no seu código-fonte por MyInkey().

Basta me pedir os exemplos (inclusive a função MyInkey), enviando-me um e-mail.

5 – Error 6003 - Divide by zero

Este erro ocorre quando um programa em Clipper roda numa máquina muito rápida. Na verdade, ele em nada tem a ver com o Windows XP e sim com máquinas do tipo Pentium II em diante, mas resolvi referenciá-lo aqui de qualquer forma.
No início da execução de um programa em Clipper, uma função é executada para obter um valor que será usado num loop de timming. Como a máquina é muito rápida, o resultado da função é zero, e isto causa o erro porque este valor é utilizado como divisor num cálculo seguinte.
Para resolver o problema, é necessário utilizar um dos 2 objetos desenvolvidos para cada versão do Clipper, como a seguir:
1 - No Clipper 5.0 e 5.2x:
Linkeditar o objeto _WAIT_B.OBJ junto com o programa
2 - No Clipper 5.3:
Linkeditar o objeto __WAIT_4.OBJ junto com o programa

3 - Complemento para processadores AMD:
Incluir no CONFIG.SYS/CONFIG.NT:
DEVICE=C:\\AMDBPOFF.SYS
4 - Usuários da biblioteca CA-Tools 3.0 devem baixar do site da
Computer Associates o path de correção que resolve este problema,
dentre outras coisas.





Esticando o Clipper


Sou responsável pelo sistema de PDV (sistema de caixa) de uma grande rede de lojas de varejo nos Estados do Rio de Janeiro e Espírito Santo. E adivinhem em que linguagem ele foi escrito? Isso mesmo: Clipper. Mais precisamente o Clipper 5.2e. E trata-se de um sistema turbinadíssimo! Além de realizar com segurança todas as transações TEF (pagamento das compras com cartão de crédito, débito, recarga de celular, etc.), nós ainda desenvolvemos diversas bibliotecas em C Ansi especialmente para o Clipper, que nos permitem zipar arquivos diretamente pelo aplicativo (sem usar o PKZIP e PKUNZIP), gerar criptografia no padrão MD5, Mouse e, para completar, acessar bancos de dados relacionais (no nosso caso, o SQL Server) de forma direta e intensiva, ou seja, usamos e abusamos de Selects, Inserts, Updates, executamos Stored Procedures, Views, etc.
Moral da conversa: o céu é o limite para esse super sistema feito nessa super linguagem.



Autor: Sávio Gonçalves
Analista de Sistemas Sênior
Programador C/C++, Clipper, Delphi
Rio de Janeiro-RJ
savio_goncalves@yahoo.com.br

Nenhum comentário:

Postar um comentário