Você está na página 1de 14

Free Pascal

Pgina 1

Desenvolvimento Multiplataforma Com O Free Pascal


Fernando Lozano <fsl@centroin.com.br> Verso expandida do artigo publicado originalmente na revista PC Master em 2001

1.

Introduo

O Free Pascal Compiler (FPC) foi criado para fornecer um compilador portvel compatvel com os populares Turbo Pascal, Borland Pascal e Object Pascal (Delphi) da Borland. Hoje estamos em sua verso 1.0.4, com suporte a Linux, FreeBSD, OS/2, Amiga, e DOS extendido (32 bits, semelhante a jogos como o DOOM) e capaz de gerar cdigo otimizado para CPUs da linha Intel i386 e da linha Motorola 68K. Programas escritos com o Turbo Pascal normalmente compilam no FPC sem modificaes, pois ele fornece clones das Units padro Crt, Dos e Graph, inclusive quando voc utiliza outros sistemas operacionais como o Linux, utilizando os recursos do SO para implementar a mesma funcionalidade de maneira nativa. Entretanto, o FPC um compilador de 32 bits, de modo que mesmo no DOS voc no tem problemas como a barreira dos 640Kb e aproveita toda a capacidade da sua CPU Pentium ou superior. O Free Pascal fornece ainda um clone da biblioteca Turbo Vision, muito popular para a gerao de sofisticadas interfaces em modo texto para o DOS, e a FCL ou Free Component Library, que fornece clones dos objetos no-visuais fornecidos com o Delphi, como TDatabase e TStrings. Projetos paralelos, como o Lazarus, esto criando clones dos objetos visuais da VCL do Delphi e tambm do IDE. Se voc est utilizando Linux, OS/2 ou Amiga, o Free Pascal fornece Units especficas para acesso a recursos especficos de cada sistema operacional. Por exemplo, a Unit Linux fornece acesso s chamadas ao sistema para manipulao de permisses de arquivos, criao de pipes, fork, sinais e etc. Ou ento, a Unit Sockets fornece a capacidade de se escrever aplicaes cliente ou servidor em uma rede TCP/IP. Melhor ainda, o Free Pascal capaz de chamar qualquer biblioteca escrita para a linguagem C, e inclusive ele fornece um header para transformar um header C (*.h) em uma Unit Pascal, e assim o Free Pascal j traz Units para acesso biblioteca GTK+, ao MySQL, Interbase, PostgreSQL, Svgalib, Zlib e diversas outras bibliotecas populares em sistemas abertos. Imagine as possibilidades: voc pode escrever uma aplicao GUI utilizando o GTK+ no Linux, utilizando um banco de dados MySQL, e pode recompilar esta aplicao, sem modificar os fontes, para rodar nativamente no Windows 98/ME, pois existem portes tanto da GTK+ quanto do MySQL para Win32, e o FPC traz as Units correspondentes em sua verso Windows. Ou ento voc pode escrever a prxima "killer app" para a Internet e graas ao Free Pascal liberar imediatamente verses para quatro sistemas operacionais diferentes. Na verdade, j existe uma grande comunidade em torno do Free Pascal explorando estas possibilidades. Se voc visitar a seo de "Contributed Units" no site do Free Pascal, encontrar Units prontas para criptografia, DirectX do Windows, manipulao de arquivos ZIP, acesso biblioteca GD (gerao de imagens GIF ou PNG on-the-fly para programas CGI) e outros recursos. Neste artigo, iremos focar o uso do Free Pascal em ambientes Windows e Linux. Os exemplos em geral seguiro a verso Windows, para apresentar os "macetes" necessrios ao seu funcionamento. Os programas exemplo fornecido funcionam da mesma forma no Linux, e os comandos so exatamente os mesmos salvo ressalvas no decorrer deste artigo. Por fim, uma boa notcia que recebi na lista de mail do Free Pascal quando estava fechando este artigo: saiu tambm uma verso BeOS!

2.

Free Pascal x Kylix

Agora que a Borland lanou o Kylix, que seria o Delphi para Linux, muitos podem se perguntar se ainda existe raso para utilizar e continuar evoluindo com o Free Pascal. A resposta sim, existem muitas rases, inclusive para se optar pelo Free Pascal em detrimento do Kylix. Vamos analisar os recursos e caractersticas dos dois produtos e ver como eles se comparam: O Kylix software proprietrio, enquanto que o Free Pascal software livre. Isto significa no s que o FPC tem custo zero contra R$ 600,00 ou mais para o Kylix, mas que a comunidade pode inteferir na evoluo do Free Pascal de um modo que ela no pode no Kylix. Alm disso, o FPC tende a ser mais confivel como compilador otimizador e a ter outras vantagens tcnicas inerentes ao processo de desenvolvimento do software livre O Kylix um IDE completo, enquanto que o FPC apenas um compilador e bibliotecas. Para quem est acostumado ao processo editar / compilar / depurar na linha de comando do Unix, isto no problema, mas para aqueles habituados aos ambientes de desenvolvimento do

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal

Pgina 2

Windows ser uma adaptao difcil. Apesar do FPC no fornecer os componentes de um IDE, outros softwares livres comuns no Linux (e que tambm tem portes ou simulares para as outras plataformas suportadas pelo FPC) fornecem o depurador, editor de programas com realce de sintaxe e etc. O Kylix orientado para a sua biblioteca proprietria de componentes visuais, a CLX (evoluo da antiga VCL). Apesar de existir uma verso livre da CLX, hospedada como um projeto no SourceForge, ela no contm os objetos para bancos de dados e outros objetos importantes para a confeco de uma aplicao real. A Borland abriu este subset do CLX de modo a evitar crticas da comunidade Linux de que no seria possvel desenvolver software livre utilizando o Kylix devido incompatibiliadde de licensas. O Free Pascal pode utilizar a FreeCLX (mas voc ter que baixar e compilar voc mesmo), pode utilizar o clone da VCL desenvolvido como parte do projeto Lazarus (cujo objetivo criar um clone do Delphi utilizando o FPC) ou pode utilizar o GTK+. Enquanto o Lazarus ou outro IDE visual (como o Glade) no estiverem estveis e suportando o FPC, ser bem mais fcil desenvolver uma aplicao GUI com o Kylix. Por outro lado, a arquitetura do CLX da Borland, que coloca uma nova camada sobre os toolkits Qt e GTK+, tende a gerar programas mais pesados e lentos do que escrever diretamente para o GTK+ ou para o LCL (Lazarus Component Library) quando este estiver estvel. Ah, o Lazarus tambm ir rodar em Windows, utilizando o porte do GTK+ para esta plataforma. O FPC fornece desde j suporte a outros software livres importantes, coisa que o Kylix apenas promete para o futuro. Por exemplo, o Kylix no fornece hoje suporte a PostgreSQL ou ao IPC do Linux no estilo do Unix System V. Alm dos motivos expostos acima, temos o fato do Free Pascal suportar mais plataformas do que o Delphi/Kylix.

3.

Instalando o Free Pascal

Para instalar o FPC, voc pode compilar os fontes (o que costuma no ser uma opo vivel para usurios de sistemas que no o Linux) ou pode baixar uma das distribuies prontas para a sua plataforma. As verses para DOS-extendido ou para Windows trazem um instalador em modo texto, e o beta de um IDE em modo texto semelhante ao do Borland Pascal para DOS. J a verso Linux pode ser baixada como vrios pacotes tar.gz ou como trs pacotes RPM, um contendo o compilador e Units, outro contendo a extensa documentao (quatro livros de 400+ pginas, em formato PDF e HTML) e o pacote SRPM com os fontes de tudo. Se voc no utilizou a verso em RPM (ou est instalando em DOS/Windows) lembre-se de incluir o diretrio de programas do FPC (default c: \pp\bin\win32 no Windows) em seu PATH de comandos, caso contrrio o compilador e o IDE em beta no funcionaro adequadamente. Abaixo do diretrio onde voc instalou o FPC (ou no diretrio /usr/doc/fpc-1.0.4 se voc optou pela instalao em RPM) temos os diretrios "demo" e "examples", que demonstram desde programas simples at acesso a bancos de dados ou construo de GUIs utilizando GTK+ ou a API do Windows. Tenha certeza de estudar estes programas para ter uma idia do que se pode fazer com o Free Pascal.

4.

Compilando Programas com o Free Pascal

Vamos iniciar com o exemplo clssico de todo curso de programao, apenas para ver como se compila e como se executa um programa com o Free Pascal. Neste artigo, no pretendo ensinar programao em Pascal, e tambm no pretendo ensinar programao em GTK+, MySQL e outros softwares abordados. O objetivo mostrar, para quem j tem conhecimento destas linguagens, bibliotecas e ferramentas, como usufruir delas em programas compilados com o Free Pascal. Ento vamos iniciar. Abra o seu editor de textos favorito e digite o famoso programa "oi", salvando como "oi.pas": program oi; begin writeln ('Oi!'); end. Agora compile com o comando: fpc oi.pas O resultado ser o arquivo "oi.exe" em Windows ou apenas "oi" no Linux, que pode ser executado diretamente na linha de comando (lembre-se de executar como "./oi" pois o diretrio corrente no faz parte do PATH default no Linux).

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal

Pgina 3

Os usurios do Turbo Pascal podero ter problemas com o fato do Free Pascal no considerar os comandos program, unit ou library apenas como comentrios. No Turbo Pascal, eu posso criar um programa "teste" e declarar tambm um procedimento "teste" ou uma varivel "teste". No Free Pascal, isto gera um erro de compilao. Se o seu programa formado por vrios mdulos, cada qual uma Unit no bom estilo do Turbo Pascal ou Delphi, voc pode compilar todo o programa especificando a opo -B na linha de comando e indicando apenas o arquivo-fonte do programa principal; o FPC ir automaticamente compilar todas as Units referenciadas pelo programa, recursivamente, dispensando a utilizao de Makefiles para a maioria dos projetos. Por exemplo, crie a seguinte Unit no arquivo "uteste.pas": unit uteste; interface procedure dizOi; implementation procedure dizOi; begin writeln ('Oi da unit!'); end; end. E digite tambm o seguinte programa, que utiliza a nossa Unit de teste (salve como "teste.pas") : program teste; uses uteste; begin writeln ('Oi do programa'); dizOi; end. Agora voc pode compilar tanto o programa como a unit com o comando: fpc -B teste.pas J que estamos fanado das opes de linha de comando do fpc, eis algumas que seguramente lhe sero teis: -? exibe o help para o comando fpc, ou seja, todas as opes aceitas -Fu indica diretrios adicionais onde procurar por units -Fl indica diretrios adicionais onde procurar por bibliotecas -S2 habilita a compatibilidade com o Object Pascal

5.

Depurando Programas em Free Pascal

O IDE beta que vem com as verses DOS e Windows do FPC inclui um depurador, que nos meus testes no se mostrou muito estvel, mas aplicaes FPC podem ser depuradas com qualquer depurador externo. Inclusive, as verses DOS e Windows trazem o GDB, entre outras ferramentas GNU para garantir que o programador tenha um ambiente completo de desenvolvimento a la Unix. Da mesma forma como faramos com um programa em C, temos que compilar nosso programa incluindo informaes para depurao, o que feito pela opo -g. Para experimentar, vamos digitar o seguinte programa: program loop; var i : integer; begin for i := 1 to 10 do

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal writeln ('contando: ', i:2); end. Agora vamos compilar com informaes de depurao fpc -g loop.pas

Pgina 4

E vamos iniciar o depurador. Neste exemplo, estamos utilizando a verso Windows do Free Pascal, mas a operao do depurador a mesma no Linux, trocando apenas o nome do comando "gdbpasw" para "gdb". Note que, na verso Linux, o GDB no parte do Free Pascal, mas deve ser instalado partir do CD da sua distribuio. No se esqueca de mudar o diretrio corrente da sua janela do DOS para o diretrio onde esto o fonte e o executvel do programa. gdbpasw loop.exe Usurios de Linux podem usar o comando gdb ou o seu depurador favorito (xxgdb, kdb, ddd, ...). Um deles certamente faz parte da sua distribuio, mas o pacote correspondente pode no fazer parte da instalao padro. O gdb exibe algumas mesagens informativas e fica aguardando no seu prompt de comandos (gdbpas). O comando "list" mostra as primeiras linhas do programa: (gdbpas) list 1 program loop; 2 3 var i : integer; 4 5 begin 6 for i := 1 to 10 do 7 writeln ('contando: ', i:2); 8 end. 9 (gdbpas) Ento vamos inserir um breakpoint no comando "for", que est na linha 6: (gdbpas) break 6 Breakpoint 1 at $40102a: file loop.pas, line 6. (gdbpas) 2.

E vamos iniciar a execuo do programa


(gdbpas) run Starting program: /Lozano/pcmaster/pas/loop.exe bfe80000:C:/WINDOWS/SYSTEM/ADVAPI32.DLL bff20000:C:/WINDOWS/SYSTEM/GDI32.DLL bff50000:C:/WINDOWS/SYSTEM/USER32.DLL bff70000:C:/WINDOWS/SYSTEM/KERNEL32.DLL Breakpoint 1, main () at loop.pas:6 6 for i := 1 to 10 do (gdbpas)

Neste momento vale uma observao quanto natureza do Free Pacal: mesmo que voc opere a veso Windows em um aviso de comandos do DOS, ele um programa Windows e gera executveis Windows. A maioria das pessoas associa o modo texto com o antigo DOS e seus limites, e o modo grfico com o Windows e novos recursos, o que no verdade. Um programa Windows pode operar em modo texto e ainda assim ter acesso a todos os recursos do ambiente, como rede, odbc, ole e etc. Notem acima como o nosso programa texto compilado com o FPC carrega e utiliza diversas DLLs do Windows, como qualquer aplicao nativa Win32 tem que fazer. J para os usurios Linux no existe diferena entre uma aplicao texto e uma aplicao grfica. O comando "run" executa o programa at o seu encerramento, ou at que seja atingido um breakpoint. Alm de especificar breakpoints em linhas do programa, voc pode especificar breakpoints em variveis, funes ou procedimentos. Os comandos "help" e "help break" fornecem mais informaes sobre a sintaxe para especificar diferentes tipos de breakpoints. Que tal ver o valor da varivel "i" ? (gdbpas) print i $1 = 0 (gdbpas)

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal

Pgina 5

Note que a verso modificada do GDB includa no FPC para Windows ir reconhecer variveis independente de maisculas e minsculas. J a verso comum do GDB diferencia maisculas e minsculas, de modo que o comando teria que ser digitado como "print I" pois o FPC converte todos os smbolos do programa em maisculas para compatibilidade com C. O comando "step" executa uma linha do programa (gdbpas) step 7 writeln ('contando: ', i:2); (gdbpas) Seria muito chato digitar o comando "print" a cada iterao do loop para ver o valor da varivel "i", portanto vamos utilizar o comando "display" para tornar isto automtico: (gdbpas) display i 1: I = 1 (gdbpas) step contando: 1 6 for i := 1 to 10 do 1: I = 1 (gdbpas) step 7 writeln ('contando: ', i:2); 1: I = 2 (gdbpas) step contando: 2 6 for i := 1 to 10 do 1: I = 2 (gdbpas) step 7 writeln ('contando: ', i:2); 1: I = 3 (gdbpas) Em relao ao comando "display" vale a mesma observao que fizemos no comando "print" quanto a ser ncessrio, no Linux, digitar o nome das variveis e procedimentos em letras maisculas. Parece que nosso programa de testes est funcionando a contento. Podemos deixar-lo rodar at o final, lembrando antes de desligar o display da varivel: (gdbpas) undisplay 1 (gdbpas) continue Continuing. contando: 3 contando: 4 contando: 5 contando: 6 contando: 7 contando: 8 contando: 9 contando: 10 Program exited normally. (gdbpas) Observe que, enquanto no comando "display" utilizamos o nome da varivel, no comando "undisplay" utilizamos o nmero de display da varivel. Neste momento podemos digitar o comando "quit" para encerrar o depurador. Esta seo de depurao foi apenas para mostar o bsico de se operar o GDB. A maioria dos depuradores grficos do Linux, como o xxgdb, o kdb ou o ddd so apenas front-ends paa o GDB, utilizando os mesmos comandos que vimos acima mas apresentando uma interface mais amigvel. O prprio IDE beta do Free Pascal em Windows tambm um front-end para o GDB, e por isso que ele fornecido com o FPC para Windows.

1.

Instalando e Configurando o SciTE

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal

Pgina 6

Trabalhar sempre na linha de comando desconfortvel, embora muitas vezes seja necessrio. Enquando ainda no temos o Lazarus ou outro IDE integrado com todas as verses do Free Pascal, podemos obter um conforto bem maior utilizando algum editor de textos escrito especialmente para programao. Os usurios de vi ou de emacs podem configurar seus editores para realce de sintaxe da linguagem Pascal e para executar o make para o seu projeto (sim, podemos compilar grandes programas Free Pascal com auxlio de makefiles, mas em geral a opo -B suficiente). Dica: instale os pacotes vim-enhanced-*.rpm e vim-X11-*.rpm ou os equivalentes fornecidos com a sua distribuio do Linux. Usurios do Windows podem at mesmo buscar a verso Win32 do vim e operar como se estivessem em ambiente Unix. Mas existe no mercado uma srie de editores GUI mais intuitivos do que o vi e o emacs e que fornecem algum suporte ao Free Pascal. O meu preferido o editor SciTE, que suporta realce de sintaxe para Pascal desde a verso 1.37 e com pequenas edies nos seus arquivos de configurao pode suportar a compilao e execuo de programas em Free Pascal. Melhor ainda, o SciTE tem verses para Windows e para Linux com a mesma funcionalidade. O nico problema do SciTE que ele no tem ainda um instalador. Portanto, usurios Windows tero que descompactar os binrios fornecidos em um arquivo ZIP e criar manualmente o atalho no Desktop ou no menu de programas. J os usurios de Linux tero que descompactar (tar xzvf) o tarball com os binrios e copiar os arquivos *.properties para o diretrio /usr/share/scite, enquanto que o executvel SciTE pode ir para qualquer diretrio de programas, por exemplo /usr/bin. claro teremos que fazer isto como root. Uma vez instalado, voc vai querer editar o arquivo SciTEGlobal.properties para definir um tamanho inicial de janela melhor e ativar por default a visualizao do toolbar e do statusbar. Voc tambm vai querer editar o arquivo pascal.properties para incluir os comandos necessrios para utilizar o Free Pascal em vez do Virtual Pascal. Edite as linhas conforme indicado abaixo, na verso Windows: ... filter.pascal=Pascal (.pas;.inc;.pp)|*.pas;*.inc;*.pp| file.patterns.pascal=*.pas;*.inc;*.pp ... # compile command.compile.*.pas=fpc $(FileName).pas # normal execute command.go.*.pas="$(FileName).exe" command.go.subsystem.*.pas=2 #build=compile ... command.build.*.pas=fpc -B $(FileName).pas Ou ento conforme o modelo que se segue, para a verso Linux: ... filter.pascal=Pascal (.pas;.inc;.pp)|*.pas;*.inc;*.pp| file.patterns.pascal=*.pas;*.inc;*.pp ... # compile command.compile.*.pas=fpc $(FileName).pas # normal execute command.go.*.pas=kvt -e $(FileName) command.go.subsystem.*.pas=2 # build command.build.*.pas=fpc -B $(FileName).pas Ento s falta associar a extenso .pas ao SciTE, para que voc possa trabalhar quase com o mesmo conforto de um IDE. OBS: Versses recentes do SciTE j incorporam a maioria das minhas modificaes para suporte ao Free Pascal.

2.

Criando Bibliotecas Dinmicas

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal

Pgina 7

Um recurso bastante interessante do Free Pascal a capacidade de gerar bibliotecas compartilhadas (arquivos *.dll no Windows ou *.so no Linux). Se voc tomar o devido cuidado, estas bibliotecas podem at mesmo ser chadas por programas escritos em C, Visual Basic ou outras ferramentas. Tanto no Windows quanto no Linux foi definido que bibliotecas dinmicas utilizariam a conveno de chamada da linguagem C, portanto todas as funes pblicas ou entry-points da sua biblioteca dinmica devem ser declarados com o modificador cdecl. Veja, por exemplo, uma verso dll (ou so) da unit que construmos acima: library lteste; function porcento (p, t : integer): integer; cdecl; begin porcento := round ((p * t) / 100); end; exports porcento; begin end. Salve o fonte acima no arquivo "lteste.pas" e compile normalmente com o comando fpc, e o resultado ser a biblioteca dinmica pronta para uso. Agora vamos ver como seria o programa que utiliza esta biblioteca: program teste2; function porcento (n, p : integer) : integer; cdecl; external 'lteste'; begin writeln ('10% de 50 vale: ', porcento (10, 50)); end. Note a presena de uma declarao extena neste programa. comum reunir estas declaraes em um arquivo de incluso para Pascal (*.inc), similar ao arquivo de incluso do C (*.h) apenas como comodidade, ou ento definir uma unit contendo estas declaraes em sua seo de interface. Se voc est em Windows, basta executar normalmente o programa teste2.exe j que o arquivo lteste.dll est no mesmo diretrio. J no Linux temos um problema similar ao PATH, mas em relao varivel do ambiente LD_LIBRARY_PATH que indica os diretrios onde o sistema procura por bibliotecas dinmicas. Portanto, para executar o nosso exemplo no Linux voc dever fazer: $ export LD_LIBRARY_PATH=$ LD_LIBRARY_PATH:. $ ./teste2 Apenas a ttulo de curiosidade, eis um programa em C (para Linux) que chama a nossa biblioteca dinmica. #include <stdio.h> extern int porcento (int p, int t); int main (int argc, char* argv[]) { printf ("20%% de 50 vale: %d\n", porcento (20, 50)); } Para compilar o programa acima, o comando no Linux seria: cc -g -o teste3 teste3.c -L. -llteste Note que foi necessrio especificar o diretrio corrente para busca de bibliotecas (-L.). Da mesma forma que chamamos funes em bibliotecas dinmicas construdas com o Free Pascal, podemos chamar funes em bibliotecas dinmicas escritas em C ou outras linguagens. Para facilitar este trabalho, o Free Pascal traz o utilitrio "h2pas" que converte um arquivo header de C (*.h) em um arquivo de incluso Pascal declarando as mesmas funes. Na verdade, grande parte das units fornecidas com o Free Pascal so apenas a converso de um *.h, fornecendo assim acesso fcil a um recurso do sistema ou a uma biblioteca de terceiros.

3.

Acessando Bancos de Dados com o Free Pascal


14/08/2013 10:30:33

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

Free Pascal

Pgina 8

Como exemplo do uso de bibliotecas externas em aplicaes Free Pascal, vamos escrever um programa simples capaz de acessar bancos de dados Interbase. O Interbase um bom exemplo, pois um banco open source em sua verso 6.0, disponvel para Linux e Windows e velho conhecido dos desenvolvedores Delphi. Utilizaremos a unit especfica para o Interbase 4.0, mas esta unit funciona sem problemas tanto com a verso 5.0/5.5 do Interbase (fornecida junto com o Delphi Professional ou Enterprise) quanto com a verso 6.0 (download gratuito e irrestrito da Borland). A unit especfica para o Interbase 6.0 tem um bug na distribuio binria para o Windows, fornando o usurio a recompilar os fontes ou a aguardar pela liberao da prxima verso do Free Pascal, por isso ficamos com a unit para o 4.0.

Criando o banco de dados


Primeiro, precisamos criar o banco de dados que ser acessado. Voc deve estar com o Interbase ativo (rodando o Interbase Guardian no Windows ou rodando o dameon ??? no Linux). Ento voc deve executar o programa "isql", o front-end modo texto para o Interbase (ou qualquer outro front-end que seja do seu agrado) e dentro dele executar o seguinte comando SQL: SQL> create database 'c:\temp\agenda.gdb' user 'sysdba' COM> password 'masterkey' ; O comando pode ser digitado em vrias linhas, pois o isql s ir enviar o comando ao servidor quando encontrar o sinal de ponto-e-vrgula. O nome do arquivo, "c:\agenda.gdb" pode ser qualquer outro que voc julgue conveniente. No Linux, poderia ser algo como /home/lozano/ agenda.gdb. O usurio "sysdba" com senha "masterkey" o padro na instalao do Interbase. Se voc modificou a senha deste usurio, que o administrador do banco, no se esquea de mudar tambm nos comandos apresentados neste exemplo. Agora temos que conectar ao banco de dados recm-criado, criar tabelas neste banco e inserir alguns dados para teste. SQL> connect 'c:\temp\agenda.gdb' user 'sysdba' COM> password 'masterkey' ; E ento vamos executar o script SQL que cria as tabelas e insere os dados de teste: SQL> input 'c:\temp\agenda.sql ' ; Apenas para verificar se tudo funcionou corretamente, vamos executar uma consulta: SQL> select * from depto ; ID NOME ============ ============================== 1 Marketing 2 Contabilidade 3 Recursos Humanos

Finalmente, podemos encerrar o isql com o comando "exit;" (no se esquea do ponto-e-vrgula ao final do comando); Usurios da verso Windows do Interbase tem acesso a font-ends grficos (mesmo que o Interbase esteja na realidade em um servidor Linux), que pode ser utilizada para executar o script de criao do banco de dados.

O programa em Free Pascal

Segue agora o programa Pascal escrito para acessar a base de dados Interbase que criamos acima. Ele uma pequena adaptao do programaexemplo fornecido com o Free Pascal, que acredito tornem o programa mais claro. Antes de examinar o programa, voc deve notar que a biblioteca de cliente do Interbase, assim como a maioria das bibloitecas de desenvolvimento existentes tanto para Windows quanto para Linux, foi escrita em linguagem C. O Free Pascal no tem dificuldades com essas

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal bibliotecas, mas o estilo de programao exigido por elas pode ser um tanto estranho para programadores Pascal, fora os detalhes como diferenas entre representao de strings.

Pgina 9

O Delphi resolve este problema fornecendo uma extensa biblioteca de classes em Object Pascal (a VCL, trocada pela CLX no Kylix e Delphi 6) que encapsula estas bibliotecas em objetos Pascal. O projeto Free Pascal e outros projetos relacionados, como o Lazarus, esto progessivamente criando estas bibliotecas de classes. Se voc no quiser, ou no puder, esperar por essas bibliotecas de classes, pode usar diretamente as bibliotecas para C, como neste exemplo. Mas em breve dever ser liberada a verso 1.0.6 do FPC, que incluir a classe TDatabaset como no Delphi e subclasses especficas para Interbase e MySQL, tornando o acesso a esses bancos bem mais simples. Ento, eis o nosso programa para acesso ao Interbase:
program testib; { modificado partir do exemplo fornecido com o Free Pascal } uses Ibase40, strings; {$h-} Const { database server, neste caso local } ServerDb : pchar = 'agenda.gdb'; { usurio e senha default da instalao do Interbase 5 } username = 'SYSDBA'; PWD = 'masterkey'; { para uso da biblioteca do Interbase } dbinfo : array [1..3] of byte = (isc_info_page_size,isc_info_num_buffers,isc_info_end); query : pchar = 'select id, nome, email from func;'; flag : array[0..2] of shortint = (0,0,0); Type TStatusArray = Array[0..19] of ISC_Status; Var DB : Tisc_db_handle; TA : TISC_tr_handle; statement : TISC_stmt_handle; DPB : String; Status : TStatusArray; sqlda : PXSQLDA; name,email : String; i,id : longint; fs : longint; Function CheckIBstatus (Const Status : TStatusArray) : Boolean; begin CheckIBstatus:=Not ((Status[0]=1) and (status[1]<>0)) end; Procedure DoError (Const status : TStatusArray); begin Writeln ('Failed:'); isc_print_status(@status); halt(1); end; begin db:=Nil; dpb:=chr(isc_dpb_version1); If UserName<>'' then begin dpb:=dpb+chr(isc_dpb_user_name)+chr(length(UserName))+username; If pwd<>'' then dpb:=dpb+chr(isc_dpb_password)+chr(length(pwd))+pwd; end; Write ('Connecting to ',serverdb,': '); isc_attach_database(@Status[0],strlen(serverdb),serverdb,@db,length(dpb),@dpb[1]); if Not CheckIBStatus(Status) then DoError(status) else Writeln ('OK.'); Write ('Starting Transaction : '); If ISC_start_transaction (@status[0],@ta,1,@db,0,Nil)<>0 then DoError(Status) else

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal
Writeln ('OK.'); getmem (sqlda,XSQLDA_Length(3)); { so trs campos } sqlda^.sqln:=3; sqlda^.sqld:=3; sqlda^.version:=1; Write('Allocating statement : '); If isc_dsql_allocate_statement(@status ,@db,@statement)<>0 then DoError(Status) else Writeln ('OK.'); Write ('Preparing statement : '); if ISC_dsql_prepare(@status,@ta,@statement,0,query,1,sqlda)<>0 then DoError(Status) else Writeln ('OK.'); I:=0; With sqlda^.sqlvar[i] do begin sqldata := @id; sqltype := sql_long; sqlind := @flag[0]; end; inc(i); With sqlda^.sqlvar[i] do begin sqldata := @name[1]; sqltype := sql_text; sqlind := @flag[1]; end; inc(i); With sqlda^.sqlvar[i] do begin sqldata := @email[1]; sqltype := sql_text; sqlind := @flag[2]; end; Write ('Executing statement : '); if isc_dsql_execute(@status,@ta,@statement,1,Nil)<>0 then DoError(Status) else Writeln ('OK.'); Writeln ('Fetching rows :'); Repeat FS:=isc_dsql_fetch(@status,@statement,1,sqlda); If FS=0 then begin { acerta o tamanho das strings } setlength(Name,strlen(@Name[1])); setlength(email,strlen(@email[1])); { o Interbase retorna varchar preenchidos com espaos??? } Writeln ('(',ID,',',name,',',email,')'); end; until FS<>0; If FS<>100 then DoError(status) else Writeln ('At end.'); Write ('Freeing statement : '); if isc_dsql_free_statement(@status,@statement,DSQL_Close)<>0 then DoError(Status) else Writeln ('OK.'); Write ('Committing transaction : '); If ISC_Commit_transaction(@status,@ta)<>0 then DoError(status) else Writeln ('OK.'); Write ('Disconnecting from database: '); isc_detach_database(@status,@db); If CheckIBStatus (Status) Then Writeln ('OK.') else DoError(status); end.

Pgina 10

Para compilar este programa, voc tem duas opes:

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal

Pgina 11

Primeiro, voc pode especificar na linha de comando o diretrio que contm as bibliotecas do Interbase. Elas s existiro se voc instalou o Interbase selecionando a opo "Software Development Support". O comando seria: fpc -FlC:\soft\InterBase\SDK\lib testib.pas Note que eu instalei o Interbase em "c:\Interbase" no Windows. Em Linux, se voc instalou o Interbase partir dos arquivos RPM fornecidos pela Borland, o comando seria fpc testib.pas Pois o pacote RPM do Interbase j instala as bibliotecas para programao nos diretrios padro do Linux. Se voc no utilizou o RPM do Interbase, ter que especificar o diretrio onde se encontram as bibliotecas libgdb.so.0 e libib_util.so Para evitar a digitao de linhas de comando extensas e para facilitar o uso de editores de programas como o SciTE, voc pode editar o arquivo ppc386.cfg de modo a tornar esta opo default. Este arquivo se encontra no subdiretrio "\bin\win32" no Windows ou /etc no Linux. Basta acrescentar a seguinte linha, dentro da seo "Set Filenames and Paths" -FlC:\soft\InterBase\SDK\lib Ou ento, para Linux: -Fl/opt/interbase/lib O programa resultante poder ser executado normalmente, e se algo sair errado verifique que voc criou o banco de dados O programa inicia incluindo as units ibase40 (a unit de acesso ao banco de dados), strings e sysutils (que contm rotinas para manipulao de strings no padres pascal e C). Depois so definidas vrias constantes e variveis para uso do programa. O tipo pchar, da mesma forma que no Delphi, representa uma string no padro C. Note que aqui definimos o nome do arquivo de banco de dados Interbase que ser aberto, o login e a senha para conexo. Todos os procedimentos, funes e tipos de dados definidos pela unit do Interbase tem o prefixo "isc_". No, no sei o que signifca esta sigla. Para manipular uma base de dados Interbase, voc necessita de trs objetos, definidos como tisc_*_handle no programa: 1. Tisc_db_handle, que representa a conexo ao servidor de banco de dados 2. Tisc_tr_handle, que representa uma transao ou unidade de trabalho. As operaes de commit e rollback so realizadas sobre um tisc_tr_ handle e no sobre a conexo, como feito em outros bancos 3. Tisc_stmt_handle, que representa um "statement" ou um comando SQL. Alm destes trs objtos, necessitamos de uma estrutura de comunicao com o banco de dados, na qual so passados parmetros para stored procedures e so retornados os resultados de consultas. Esta estrutura de tamanho varivel, por isso definimos um ponteiro PXSQLDA. Depois de duas funes utilitrias, inicia-se o programa principal, que monta em dpb uma string de conexo ao Interbase e realiza a conexo chamando isc_attach_database. Sempre que voc encontrar algo do tipo @dpb[1] onde dpb uma varivel string, o que voc est fazendo obter o ponteiro para o primeiro carter da string, ou seja, gerando a string C equivalente string pascal. Uma vez conectado, o programa inicia uma transao (isc_start_transaction) e aloca a estrutura sqlda para trs campos, conforme o comando SELECT que ser executado. Ento alocamos um statement (isc_dsql_allocate_statement) e "preparamos" este statement (isc_dsql_prepare). Observe que, neste momento, associamos a estrutura sqlda ao statement. "Preparar" um statement compilar o comando SQL, verificando a sua sintaxe e a existncia de todos os objetos (tabelas, campos, etc) referenciados. Antes de executar o statement, temos que inicializar a estrutura sqlda para apontar para as variveis do nosso programa (id, nome e email) que recebero os valores lidos de cada linha retornada pelo comando SELECT. Por isso fazemos trs vezes "with sqlda^.sqlvar[i]". Finalmente podemos executar o statement com isc_dsql_execute. Depois nosso programa permanece em um loop repeat..until chamando isc_dsql_fetch para retornar cada linha obtida pelo comando SELECT. Note que o Interbase retorna strings C, e que portanto temos que "conserta-las" para que possam ser manipuladas como strings pascal. Aps o loop, temos que liberar a memria alocada para o statement (isc_dsql_free_statement) e encerrar a transao (isc_commit_transaction), para ento poder encerrar a conexo ao Interbase (isc_detach_database). A documentao destas funes pode ser encontrada no site da Borland como parte da documentao do Interbase. O que a unit ibase40 fornece apenas a traduo das declaraes C para declaraes pascal, de modo que voc possa usar a biblioteca do Interbase em seus programas. Note que, para acessar outros bancos de dados, voc dever utilizar a unit correspondente e chamar as funes definidas por esta unit. Ou ento, voc dever declarar as funes externas fornecidas pela biblioteca C de conexo ao banco de dados. Mesmo que no exista no Free Pascal uma unit para acesso ao Oracle, por exemplo, nada impede que voc traduza as declaraes da biblioteca OCI do Oracle para o Free Pascal e utilize o banco em seus programas, ou ento utilize o programa h2pas para gerar estra traduo automaticamente. Da mesma forma seria possvel chamar as funes de ODBC do Windows e assim utilizar qualquer banco de dados sem ter que modificar o seu programa.

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal

Pgina 12

4.

Aplicaes CGI com o Free Pascal

Quem conhece programao para a web sabe que podemos escrever aplicaes CGI em qualquer linguagem, basta ter acesso entrada padro, sada padro e s variveis do ambiente. As units DOS e Linux fornecem estes recursos, mas decodificar um QUERY_STRING gerado por uma requisio GET ou os dados na entrada padro gerados por uma requisio POST no nada confortvel. Por isso o Free Pascal fornece a unit "uncgi", que realiza esta decodificao para voc. A unit uncgi fornece a funo cgi_init, que seu programa deve chamar para decodificar os dados de uma requisio GET ou POST, e a funo get_value, que retorna um valor passado via CGI. Alm disso, as variveis de ambiente padro do HTTP so pr-declaradas e inicializadas por cgi_init. Segue um programa exemplo de como usar a unit uncgi: program testcgi; uses uncgi; begin cgi_init; Writeln ('User agent = ',http_useragent); Writeln ('Referer = ',http_referer); Writeln ('Name = ',get_value('name')); Writeln ('Address = ',get_value('address')); Writeln ('City = ',get_value('city')); end. Compile o programa e copie o executvel como testcgi.cgi no diretrio de pginas do weu web server (Apache, Xitami, PWS, IIS, etc), tomando o cuidado de se certificar de que o seu servidor est configurado para reconhecer arquivos *.cgi como programas CGI e executa-los. No mesmo diretrio, salve a seguinte pgina de teste como testecgi.htm: <HTML> <BODY> <H1>Teste de CGI do Free Pascal</H1> <FORM action="testcgi.cgi" method="get"> <TABLE border=0> <TR><TD>Nome: <TD><INPUT name="name" size=30> <TR><TD>Endereo: <TD><INPUT name="address" size=50> <TR><TD>Cidade: <TD><INPUT name="city" size=25> </TABLE> <INPUT type="submit" value="OK"> <FORM> </BODY> </HTML> Aponte o seu navegador para esta pgina, por exemplo "http://localhost/testecgi.htm" e veja a pgina gerada pelo programa Free Pascal.

Aplicaes Windows GUI

O Free Pascal gera aplicaes nativas da plataforma onde o programa compilado, com acesso a todos os recursos do sistema. Em geral, temos units prontas para acesso a estes recursos, mas por vezes podemos ter que criar nossas prprias declaraes externas. Como exemplo, vamos criar uma aplicao grfica para o Windows, aproveitando a chance para ver alguns macetes envolvidos. Primeiro, eis um programa que nada faz alm de gerar um message box na tela. Este seria o menor programa Windows possvel de ser feito:

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal
program msgbox; function MessageBox (HWnd: Integer; Text, Caption: Pchar; Flags: Integer): Integer; stdcall; external 'user32.dll' name 'MessageBoxA'; begin MessageBox (0, 'Teste do FreePascal', 'MsgBox', 0); end.

Pgina 13

Note que fornecemos uma declarao externa para a funo MessageBox da API do Windows, que faz parte do arquivo USER32.DLL. Como esta funo foi escrita em C, temos que indicar "stdcall" em nossa declarao. partir de ento o nosso programa pode chamar a funo normamente, como se ela fosse parte do Pascal. Na verdade, as funes definidas como parte da API do Windows esto todas declaradas na unit "windows" fornecida com o Free Pascal, ento bastaria Ter includo esta unit. Voc pode encontrar exemplos mais interessantes do que este no subdiretrio "source\demo\win32" da sua instalao do Free Pascal, por exemplo o arquivo "edit.pp" que um Notepad (Bloco de Notas do Windows) escrito em Pascal. Continuando com nosso exemplo, voc pode compila-lo normalmente com o comando "fpc msgbox.pas" e ento rodar o executvel "msgbox.exe" para ver a mensagem e o boto de "ok" que encerra o programa. Experimente agora executar o msgbox.exe por um clique duplo no Windows Explorer, em vez de executa-lo pelo aviso de comandos do DOS (ou pelo SciTE, ou pelo seu editor de programas favorito). Note que ser exibida a janela de mensagens, mas tambm ser aberta uma janela de comandos do DOS. Os usurios e programadores Windows so levados erroneamente a pensar que aplicaes em modo texto so aplicaes DOS de 16 bits e que aplicaes Windows de 32 bits tem que ser necessariamente em modo grfico. Na verdade, voc pode ter aplicaes Windows em modo texto com total acesso aos recursos da plataforma, incluindo Active Directory no Windows 2000. A nica diferena entre aplicaes texto ou grficas para o Windows um flag no cabealho do arquivo *.EXE que diz ao Windows se ele deve ou no abrir uma janela de comandos (ou console) para executar a aplicao dentro de um ambiente de modo texto. Podemos instruir o Free Pascal a gerar este flag no executvel com a diretiva de compilao {$apptype gui}, portanto nosso programa pode ser reescrito como: program msgbox2; {$APPTYPE GUI} uses windows; begin MessageBox (0, 'Teste do FreePascal', 'MsgBox', 0); end. Verifique que o executvel msgbox2.exe no provoca a criao de uma janela de comandos quando executado partir do Windows Explorer.

5.

Concluso

O Free Pascal um compilador estvel e maduro, com um bom otimizador de cdigo nativo, suportando uma verso do Pascal rica em recursos, inclusive de orientao a objetos, adequado para projetos de sistemas e aplicaes de qualquer porte. Esta concluso reforada pelo extenso conjunto de Units fornecido com o pacote, e pela facilidade com que se pode utilizar outras bibliotecas fornecidas com o seu sistema operacional ou por terceiros. claro, o Free Pascal no ser a melhor opo para todos os usurios. Muitos iro preferir ferramentas RAD com o Delphi/Kylix, mas o Free Pascal possui recursos ainda no disponveis nestas ferramentas como acesso direto ao PostgreSQL e ao GTK+. No incio do ano que vem, quando o Lazarus estiver estvel, o Free Pascal poder ser uma opo real at mesmo para os desenvolvedores que procuram por ferramentas RAD. Desenvolvedores buscando capacidade de desenvolvimento multi-plataforma entre Windows e Linux, ou entre estas plataformas e OS/2, BeOS e Amiga, ou desenvolvedores que estejam buscando uma linguagem de programao mais fcil do que C/C++ ou mais leve do que Java devem definitivamente experimentar o Free Pascal.

Links

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33

Free Pascal

Pgina 14

Site do Free Pascal http://www.freepascal.org/

SciTE http://www.scintilla.org

Free Pascal Editor para Windows ftp://ftp.miraclec.com/pub/fpe-1.35.zip

Lazarus (Free IDE e VCL estilo Delphi) http://www.lazarus.freepascal.org/

GTK com FreePascal http://www.geocities.com/mazen_neifer/GTK_help.html

Interbase Open Source http://www.borland.com/devsupport/interbase/opensource/

Contributed Units for FPC (Zip files, GD, JPG, CD-Recording, DES, DirectX, ...) http://www.freepascal.org/contrib/db.php3

FreeCLX (Verso Livre da biblioteca visual do Kylix) http://freeclx.sourceforge.net http://sourceforge.net/projects/freeclx/

http://www.quartzo.net/informatica/apostilas/conteudo/dmufpc_-_lozano_fernando/

14/08/2013 10:30:33