Você está na página 1de 101

Pascal para Delphi

Sumrio
Introduo Pascal base para o delphi Object pascal Orientao para eventos Programas e units Viso geral Estrutura simplificada de um programa Units Estrutura da unit Programas e units no delphi Exemplo 1 Exemplo 2 Adicionando comentrios ao programa Exemplo 3 Tipos de dado, variveis e operadores Tipos de dados Variveis Exemplo 4 Exemplo 5 Convertendo dados Constantes Palavras reservadas Operadores e expresses Exemplo 6 Procedures e funes Introduo a procedures e funes Criando procedures Criando funes Posicionando a procedure ou funo na unit Exemplo 7 Chamando a procedure ou funo Exemplo 8 Passagem de parmetros por valor ou referncia Exemplo 9 Comandos condicionais Viso geral If...then Exemplo 10 Case...of Exemplo 11 Comandos de repetio Viso geral While...do Exemplo 12 For...do 1 03 03 03 03 04 04 04 05 05 05 07 10 11 11 12 12 12 13 14 14 16 16 17 18 19 19 19 21 23 23 25 25 27 27 30 30 30 31 34 35 38 38 38 38 40

Pascal para Delphi

Exemplo 13 Repeat...until Exemplo 14 Manipulando strings Viso geral Funes de manipulao de strings Procedure de manipulao de strings Rotinas aritimticas Viso geral Principais rotinas Exemplo 15 Outros tipos de dados Viso geral Arrays Exemplo 16 Exemplo 17 Strings Registros Exemplo 18 Tipo enumerado Tipo set Tipo intervalo Comandos de entrada e sada de arquivos Tipos de arquivos Trabalhando com arquivos texto Comandos de manipulao de arquivos texto Exemplo 19 Trabalhando com arquivos binrios Comandos de manipulao de arquivos binrios Exemplo 20 Manipulando arquivos no tipados Rotinas de gerenciamento de arquivos Exemplo 21 Outras rotinas de manipula co de arquivos Exemplo 22 Imprimindo arquivos Exemplo 23 Conceitos bsicos de orientao a objetos Objetos Atributos ou propriedades Servios ou mtodos Classes Relacionamento entre classes Menssagens Cdigo orientado a objetos em pascal Orientao a objetos em pascal Exemplo 24

41 42 43 45 45 45 48 50 50 50 54 55 55 55 55 56 57 57 57 58 59 59 60 60 60 61 70 71 71 79 79 81 89 89 91 91 91 93 93 93 94 95 96 98 100 100 101

Pascal para Delphi

Pascal - Base do Delphi


O lanamento do Delphi, em 1995, deu um novo estmulo ao uso do Pascal, j que esta a linguagem em que o Delphi se baseia. Na verdade, o Delphi um ambiente de programao, baseado na linguagem Pascal, e no uma nova linguagem de programao. Atualmente, a Borland oferece trs verses para o Pascal: o Turbo Pascal 7.0, para ambiente DOS, o Pascal for Windows 1.5, e o Delphi, j na verso 4.0. Como o Delphi se baseia na linguagem Pascal para a construo de programas, interessante conhecer a fundo esta linguagem, para que seu trabalho com o Delphi seja produtivo. O aprendizado do Delphi como ambiente de programao um pouco extenso; conhecer bem a linguagem em que este se baseia facilita a experincia.

O Object Pascal
Apesar de se basear na linguagem Pascal padro, o Delphi implementa alguns comandos novos, notadamente na parte de criao de classes e objetos. Estes novos comandos sero vistos neste livro, e o alertaremos quanto ao seu uso em outros compiladores Pascal. Por causa destes comandos adicionais, o Pascal do Delphi conhecido como Object Pascal. O segundo ponto que devemos ressaltar que, por ser um ambiente de programao que roda sobre o Windows, um programa em Delphi dificilmente usa os comandos de entrada e sada de dados em tela da linguagem Pascal, como Readln e Writeln, prprios para o ambiente DOS. A entrada e a sada de dados em tela esto ligadas aos componentes do Delphi inseridos no formulrio da aplicao, e s propriedades destes. Os comandos do Pascal s so usados quando desenvolvemos uma aplicao em Delphi para rodar em ambiente DOS, portanto sero vistos apenas superficialmente.

Orientao para Eventos


Por fim, vale lembrar que por rodar em ambiente Windows, o Delphi gera programas orientados para eventos. Eventos so aes geradas pelo usurio (como clicar em um boto, mover o mouse, selecionar uma caixa de checagem) ou pelo sistema (como o carregamento de um formulrio). Portanto, o cdigo do programa s executado se estiver associado a determinado evento. Como o objetivo deste livro no analisar os componentes do Delphi, apenas ensinar a base do Pascal, para executar os cdigos utilizados nos exemplos no usaremos nenhum componente do Delphi, utilizando apenas uma caixa de mensagem mostrada quando o aplicativo executado.

Pascal para Delphi

Viso Geral
Apesar de bem mais poderoso que qualquer outro compilador Pascal, como o Turbo Pascal, o ambiente de programao Delphi um pouco mais complexo do que os demais compiladores. Ou seja, no oferecido ao programador simplesmente uma tela em branco onde o cdigo em Pascal inserido. Ao contrrio, mesmo que nosso aplicativo Delphi no realize nenhuma operao, diversas linhas de cdigo so inseridas automaticamente pelo Delphi. Inserir seu prprio cdigo dentro do Delphi no uma tarefa simples. Por isso iniciamos este livro explicando de forma detalhada como o Delphi trabalha com programas e units. A partir deste captulo, poderemos dar nfase completa ao Pascal.

Estrutura Simplificada de um Programa


Um programa simples em Pascal possui um cabealho, e um corpo, com a seguinte estrutura:
program nome_do_programa; uses units_usadas_pelo_programa; begin end. .....

Iniciamos com o cabealho, que contm a palavra reservada program, seguida do nome que daremos ao programa, e um ponto e vrgula:
program nome_do_programa;

Por exemplo, se o nome que daremos para o programa for PrimeiroPrograma, faramos:
program PrimeiroPrograma;

Aps o cabealho do programa segue a seo uses. Nesta seo declaramos o nome das units usadas por nosso programa. Uma unit um conjunto de procedimentos e funes que realizam determinada operao, e sero vistas com mais detalhes na prxima seo. Se seu programa usa a unit PrimeiraUnit, por exemplo, teramos ento:
program PrimeiroPrograma; uses PrimeiraUnit;

Aps a seo uses, temos o corpo do programa, limitado pelas palavras reservadas begin e end:
begin

Pascal para Delphi ..... end.

Entre estas palavras colocamos a estrutura de nosso programa. Note que aps a palavra end colocamos um ponto final, que mostrar ao compilador que o programa terminou.

Units
Quando um programa muito extenso, podemos divid-lo em units. Uma unit um conjunto de procedures e funes que realizam determinada tarefa. Seu programa pode ser ento dividido em diversas units, cada uma com determinado objetivo. As units criadas podem ser usadas no s pelo seu programa, mas por qualquer outro que voc venha a desenvolver. Como voc imagina, isto torna seu trabalho bem mais produtivo. Basta voc criar um conjunto de units padres para clculos, acesso a dados, etc, e depois us-las em seus diversos programas, sem ter que reescrev-las.

Estrutura das units


Programas e Units no Delphi
Quando voc inicia um novo projeto no Delphi, ele j cria automaticamente um arquivo do tipo program e uma unit, denominada Unit1. Veja o arquivo do tipo program criado:

Este arquivo acessado atravs da opo Project | View Source. Note que na seo uses deste arquivo j est includa a Unit1, oferecida automaticamente pelo Delphi: 5

Pascal para Delphi uses Forms, Unit1 in 'Unit1.pas' {Form1};

Veja a unit criada automaticamente pelo Delphi, acessada atravs de um clique sobre a aba correspondente a Unit:

unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} end.

Esta unit possui um cabealho, que a identifica como Unit1. Na seo interface, usa trs clusulas: uses, type e var. A clusula uses define as units que esta Unit1 usar. So units padro do Delphi, que oferecem, por exemplo, funes de converso, quadros de mensagem, etc. Voc no deve apag-las. 6

Pascal para Delphi

J as clusulas type e var criam dados e variveis ligados ao formulrio, operao que veremos com mais detalhes posteriormente. Voc tambm no deve mexer nestas clusulas. Finalmente temos a seo implementation (sem nada implementado), uma diretiva de pr-processamento (que tambm no deve ser apagada) e a palavra reservada end, seguida de um ponto final que finaliza a unit. A estrutura da unit vista acima criada automaticamente pelo Delphi, e a estrutura mnima que uma unit deve ter para criar um aplicativo no Delphi. Ou seja, no Delphi voc no cria cdigo em um arquivo do tipo program, apenas nas units. O arquivo do tipo program serve apenas para inicializar a aplicao, e determinar que units fazem parte desta.

Exemplo 1
Vamos criar um programa que mostra em uma caixa de mensagem a frase 'Bem Vindo'. Para isso, vamos ter que associar o cdigo que mostra a frase a um evento. Para facilitar, vamos associar o cdigo ao evento de criao do formulrio, que ocorre logo que o programa executado, e o formulrio mostrado na tela. Siga ento os seguintes passos: 1) Entre no Delphi. 2) Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate:

3) Aparecem as seguintes linhas de cdigo:


procedure TForm1.FormCreate (Sender: TObject); begin end;

4) Clique sobre a linha em branco entre as palavras begin e end e escreva ento: 7

Pascal para Delphi ShowMessage('Bem Vindo');

ShowMessage uma rotina do Delphi que mostra uma caixa de dilogo na tela, com uma mensagem definida pelo programador. Note que aps a linha de comando colocamos um ponto e vrgula. Isto feito para indicar ao compilador que a linha de comando terminou. Note tambm que o texto da mensagem est entre aspas simples. 5) Aperte a tecla F9, para executar o exemplo. Aparece o seguinte quadro de mensagem:

6) Clique no boto OK, para fechar o quadro de mensagem. 7) Feche o formulrio, para voltar ao ambiente do Delphi. 8) Se quiser salvar seu programa, selecione no menu File a opo Save Project As:

Pascal para Delphi

9) D um nome para a unit, e clique no boto Salvar. D um nome para o projeto, e clique no boto Salvar. Note que a unit possui muito mais cdigo do que a linha inserida por voc:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate (Sender: TObject); begin ShowMessage('Bem Vindo'); end; end.

Como vimos, as demais linhas so necessrias para o funcionamento do programa, e so inseridas automaticamente pelo Delphi, portanto, no se preocupe com elas.

Exemplo 2
9

Pascal para Delphi

Vamos criar agora um progama que escreva seu nome e sobrenome na tela. Podemos usar o mesmo comando ShowMessage visto anteriormente: 1) Entre no Delphi. 2) Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate.

3) Clique sobre a linha em branco entre as palavras begin e end e escreva ento:
ShowMessage('Adelize Oliveira');

5) Aperte a tecla F9, para executar o exemplo:

10

Pascal para Delphi

6) Volte para o ambiente do Delphi.

Adicionando Comentrios ao Programa


Muitas vezes, ao escrevermos um programa, sentimos necessidade de comentar alguma linha de cdigo, seja para nos lembrarmos de nosso raciocnio posteriormente, seja para facilitar o entendimento do cdigo por parte de outros programadores. O Pascal permite que voc insira comentrios em seu cdigo, bastando para isso colocar seu comentrio entre chaves { }, ou entre os sinais (* e *). O texto delimitado pelas chaves no ser lido pelo compilador, servindo apenas como informao para o programador.

Exemplo 3
O cdigo abaixo ilustra o uso de comentrios no cdigo:
procedure TForm1.FormCreate(Sender: TObject); begin { Mostraremos uma mensagem} ShowMessage('Adelize Oliveira'); (* A mensagem foi mostrada *); end;

11

Pascal para Delphi

Tipos de Dados
Um tipo de dado define uma regio de valores que uma varivel capaz de armazenar, e tambm define um conjunto de operaes que as variveis daquele tipo so capazes de realizar. O Pascal oferece os seguintes tipos de dados:: Integer: inteiro. Ocupa somente 2 bytes de memria, e seu valor pode variar de -32.768 at 32.767. Shortint: inteiro curto. Ocupa somente 1 byte de memria, e seu valor pode variar de -128 at 127. Longint: inteiro longo. Ocupa 4 bytes de memria, e seu valor varia de - 2.147.483.648 at 2.147.483.647. Word: inteiro sem sinal. Ocupa 2 bytes da memria e seu valor varia de 0 at 65.535. Byte: inteiro sem sinal. Ocupa apenas 1 byte da memria e seu valor varia de 0 at 255. Real: nmero decimal. Ocupa 6 bytes da memria, e seu valor varia de 2.9E-39 at 1.7E+38, com 11 a 12 dgitos significativos. Single: nmero decimal. Ocupa 4 bytes da memria, e seu valor varia de 1.5E-45 at 3.4E+38, com 7 a 8 dgitos significativos. Double: nmero decimal . Ocupa 8 bytes da memria, e seu valor varia de 5.0E-324 at 1.7E+308, com 15 a 16 dgitos significativos. Extended: nmero decimal. Ocupa 10 bytes da memria, e seu valor varia de 3.4E-4932 at 1.1E+4932, com 19 a 20 dgitos significativos. Comp: um tipo real que ocupa 8 bytes da memria e que s armazena inteiros. Seu valor varia de -2E+63 +1 at 2E+63 -1 com 19 a 20 dgitos significativos. Char: assume caracteres do teclado como valores. Boolean: assume apenas True (verdadeiro) e False (falso) como valores. String: formado por um conjunto de elementos do tipo Char. O Delphi oferece tambm um outro tipo de dado, TDateTime, para manipular dados no formato de data e hora.

Variveis
Variveis so identificadores que mudam de valores de acordo com o programa.

Declarando Variveis
Voc precisa dar a uma varivel tanto um nome quanto um tipo. 12

Pascal para Delphi

Siga as seguintes regras na criao de variveis:


os nomes de variveis podem ter tamanho ilimitado, mas o compilador s l os primeiros 63 caracteres; voc pode utilizar letras e nmeros, e o caracter de sublinhado _; os nomes das variveis precisam comear com uma letra ou com o caracter de sublinhado _; cada varivel deve ter um nome nico, diferente das palavras reservadas do Pascal (veja lista a seguir); no h diferena entre maisculas e minsculas; no so permitidos espaos em branco no nome da varivel.

Uma vez que voc tenha determinado o nome da varivel, dever declarar seu tipo na seo var da unit:
unit Unit1; interface var nome: string; num: integer; x,y: real; implementation end.

Como vimos acima, a declarao feita definido-se um nome para a varivel, seguido de um sinal de dois pontos (:) e do tipo da varivel, terminando finalmente com um ponto e vrgula (;).

Atribuindo Valores a Variveis


Para atribuir valor a uma varivel, voc utiliza o operador de atribuio (:=). Por exemplo, para atribuirmos o valor 4 a uma varivel num, faramos:
num := 4;

As variveis declaradas na seo var podem ser utilizadas por todas as sub-rotinas e funes descritas no programa, ou seja, so globais. Como veremos, voc poder criar variveis locais, ou seja, variveis que s podero ser utilizadas na procedure ou funo onde so declaradas:
procedure Calculo; var A : integer; begin A := 4; end;

Exemplo 4
Vamos criar um programa que calcule o quadrado de uma determinado valor x, armazenando o resultado na varivel quadrado. Para isso: 1. Entre no Delphi. 2. Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate. 3. Clique sobre a linha em branco entre as palavras begin e end e escreva ento:
procedure TForm1.FormCreate(Sender: TObject);

13

Pascal para Delphi begin x := 2; quadrado := x * x; ShowMessage(InttoStr(quadrado)); end;

Usamos a funo de converso InttoStr para converter um valor inteiro para string. As funes de converso sero vistas com mais detalhes posteriormente. 4. Role a unit at a clusula var da seo implementation, e insira a declarao das variveis:
var Form1: TForm1; x, quadrado : integer;

5. Aperte a tecla F9, para executar o exemplo. 6. Volte para o ambiente do Delphi.

Exemplo 5
O programa a seguir soma os valores de X e Y, armazenando o total na varivel Conta, todas do tipo integer. Aps a soma, mostrado na tela o resultado, usando-se o comando ShowMessage: 1. Entre no Delphi 2. Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate. 3. Clique sobre a linha em branco entre as palavras begin e end e escreva ento:
procedure TForm1.FormCreate(Sender: TObject); begin X := 12; Y := 13; Conta := X + Y; ShowMessage('O valor de Conta '+ InttoStr(Conta)); end;

4. Role a unit at a clusula var da seo implementation, e insira a declarao das variveis:
var ..... Conta : integer; X,Y : integer;

5. Aperte a tecla F9, para executar o exemplo. 6. Volte para o ambiente do Delphi.

Convertendo Dados
O Pascal oferece diversos comandos para a converso de um tipo de dados em outro. Veja alguns:

Str
Converte um valor integer ou real para uma string, armazenando o resultado em uma varivel. 14

Pascal para Delphi

Sintaxe: Str(x, var s) onde x um nmero integer ou real, e var s a varivel do tipo string onde ser armazenada a converso.

Val
Converte uma string para um valor real. Sintaxe: Val (s: string, var v, var code) onde s a string a ser transformada, var v a varivel onde armazenado o resultado da converso, e var code a varivel onde armazenado o ndice do caracter que tornou impossvel a converso, caso ela seja impossvel.

IntToStr
Converte um nmero do tipo integer para uma string contendo uma representao decimal daquele nmero. Sintaxe: IntToStr(Valor: Longint) onde Valor o nmero a ser convertido. A funo retorna uma string, contendo a representao decimal daquele nmero.

FloatToStr
Converte um nmero do tipo real, single, double ou extended em uma string. Sintaxe: FloatToStr(valor: extended) onde valor o nmero a ser convertido. A funo retorna uma string, contendo a representao decimal daquele nmero.

StrToInt
Converte uma string representando um nmero integer em um nmero. Sintaxe: StrToInt(s: string) onde s a string a ser convertida. A funo retorna um valor Longint. Se a string no representa um nmero vlido, StrToInt retorna uma exceo.

StrToFloat
15

Pascal para Delphi

Converte uma string representando um nmero real, single, double ou extended em um nmero. Sintaxe: StrToFloat(s: string) onde s a string a ser convertida. A funo retorna um valor extended. Se a string no representa um nmero vlido, StrToFloat retorna uma exceo.

Constantes
So identificadores que no alteram seu valor durante a execuo do programa. Podem ser dos mesmos tipos descritos para variveis, e as regras descritas para criao dos nomes das variveis devem ser seguidas para a criao de constantes. As constantes so declaradas na clusula const:
unit Unit1; interface ..... const num = 350; nome = 'Pascal'; implementation ... end.

Como vimos acima, a declarao de constantes feita descrevendo seu nome, seguido de um sinal de igual (=), seu valor e um ponto e vrgula (;). Note que:

voc usa o operador = para atribuir valores constantes; para trabalhar com constantes do tipo string, voc dever colocar seu contedo entre aspas simples. as demais constantes sero classificadas de acordo com o que foi digitado. Por exemplo, um nmero 650000 muito grande para ser do tipo integer, logo s pode ser do tipo longint.

Palavras Reservadas
As palavras abaixo so reservadas pelo Pascal, no podendo ser usadas para nomes de variveis ou constantes: and case div except function inherited label object program set to uses as class do exports goto inline library of property shl try var asm const downto file if initialization mod or raise shr type while array constructor else finally implementation interface nil packed record string unit with begin destructor end for in is not procedure repeat then until xor 16

Pascal para Delphi

Operadores e Expresses
Uma expresso pode ser uma simples constante ou varivel, ou a combinao de variaveis e constantes usando operadores. Os operadores podem ser: aritmticos, relacionais, lgicos, e de string. Operadores Aritmticos + * / ^ div mod Funo Soma Diferena Multiplicao Diviso Exponenciao Diviso Mdulo

Operadores Relacionais = < > <= >= <>

Funo Igual Menor Maior Menor ou Igual Maior ou Igual Diferente

Operadores Lgicos and or not xor

Funo e ou no ou exclusivo

Operadores de Strings +

Funo concatena strings

Exemplo 6
Vamos criar um programa, que tire a raiz quadrada de um nmero, multiplique-a por 3, converta o valor em string e coloque o resultado na tela. Para isso, siga os seguintes passos: 1) Entre no Delphi. 2) Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate. 17

Pascal para Delphi

3) Clique sobre a linha em branco entre as palavras begin e end e escreva ento:
procedure TForm1.FormCreate(Sender: TObject); begin quadrado := square(x); mult := quadrado * 3; str(mult, result); ShowMessage('O valor '+ InttoStr(result)); end;

4) Role a unit at a clusula var da seo implementation, e insira a declarao das variveis:
var ..... x, quadrado, mult : real; result : string;

5) Aperte a tecla F9, para executar o exemplo. 6) Volte para o ambiente do Delphi.

Introduo a Procedures e Funes


Uma procedure ou uma funo representa um conjunto de comandos que realizam determinada tarefa:
function CalculaSoma(num1, num2: integer): longint; begin end; CalculaSoma := num1 + num2;

18

Pascal para Delphi

Voc pode criar suas prprias procedures e funes, para organizar o cdigo da aplicao de forma a facilitar sua leitura e manuteno, ou mesmo para reaproveitar procedures e funes em outras aplicaes. A diferena principal entre procedures e funes que funes retornam valores aps serem processadas, ao passo que procedures nada retornam.

Criando Procedures
Uma procedure composta de duas partes:

Um cabealho; Um bloco de cdigo.

Criando o Cabealho da Procedure


O cabealho identifica a procedure e lista os parmetros que a rotina usa, se usar. Uma procedure comea com a palavra reservada procedure.
procedure ValidaEntrada;

As procedures podem ter parmetros, ou seja, dados que so passados para a procedure quando esta chamada. Os parmetros, ou argumentos, so listados entre parnteses. Cada parmetro possui um identificador e um tipo, e so separados entre si por um ponto e vrgula (;):
procedure ValidaEntrada(num: integer; nome: string);

No exemplo acima, a procedure possui dois parmetros: num e nome. Ou seja, quando chamarmos a procedure ValidaEntrada em nosso programa, teremos que fornecer para ela um nmero inteiro e uma string.

Escrevendo o Corpo da Procedure


O corpo da procedure pode conter declaraes de variveis, constantes ou novos tipos de dados. A parte dos comandos inicia com a palavra reservada begin e termina com a palavra reservada end.
procedure ValidaEntrada(num: integer; nome: string); begin end; ....

Declarando Variveis e Constantes


Como vimos, voc tambm pode declarar variveis dentro de uma procedure, usando a palavra reservada var:
procedure ValidaEntrada(num: integer; nome: string);

19

Pascal para Delphi var resultado : string; dado : integer; begin end; ....

Neste caso, as variveis declaradas sero locais, ou seja, s podero ser utilizadas dentro da procedure. Se quiser que suas varveis sejam globais, deve declar-las na seo interface, clusula var da unit:
unit Unit1; interface var resultado : string;

implementation ... end.

O mesmo raciocnio vale para as constantes. Voc pode declar-las na seo const da procedure, e ento sero locais:
procedure ValidaEntrada(num: integer; nome: string); const pi = 3,14; begin end; ....

Se quiser que suas constantes sejam globais, deve declar-las na seo interface,clusula const da unit, e no da procedure.

Criando Funes
Uma funo composta de duas partes:

Um cabealho; Um bloco de cdigo.

Como vimos anteriormente, a diferena entre uma procedure e uma funo que a funo retorna algum valor, aps ser executada.

Criando o Cabealho da Funo


O cabealho identifica a funo e lista os parmetros que a rotina usa, se usar, assim como o tipo de dado de retorno. Uma funo comea com a palavra reservada function. 20

Pascal para Delphi function ValidaEntrada : boolean;

As funes podem ter parmetros, ou seja, dados que so passados para a funo quando esta chamada. Os parmetros, ou argumentos, so listados entre parnteses. Cada parmetro possui um identificador e um tipo, e so separados entre si por um ponto e vrgula (;):
function ValidaEntrada(num: integer; nome: string) : boolean;

No exemplo acima, a funo possui dois parmetros: num e nome. Ou seja, quando chamarmos a funoValidaEntrada em nosso programa, teremos que fornecer para ela um nmero inteiro e uma string.

Escrevendo o Corpo da Funo


O corpo da funo pode conter declaraes de variveis, constantes ou novos tipos de dados. A parte dos comandos inicia com a palavra reservada begin e termina com a palavra reservada end.
functionValidaEntrada(num: integer; nome: string) : boolean; begin end; ....

Declarando Variveis e Constantes


Como vimos, voc tambm pode declarar variveis dentro de uma funo, usando a palavra reservada var:
function ValidaEntrada(num: integer; nome: string): boolean; var resultado : string; dado : integer; ....

begin end;

Neste caso, as variveis declaradas sero locais, ou seja, s podero ser utilizadas dentro da fun Se quiser que suas varveis sejam globais, deve declar-las na seo interface, clusula var da unit:
unit Unit1; interface var resultado : string;

implementation ... end.

O mesmo raciocnio vale para as constantes. Voc pode declar-las na seo const da funo, e ento sero locais: 21

Pascal para Delphi function ValidaEntrada(num: integer; nome: string): boolean; const pi = 3,14; begin end; ....

Se quiser que suas constantes sejam globais, deve declar-las na seo interface,clusula const da unit, e no da funo.

Retornando uma Funo


Ao contrrio das procedures, as funes possuem tambm um tipo para o valor de retorno. Este tipo especificado no final do cabealho, separado deste por um sinal de dois pontos (:):
function CalculaSoma(num1, num2: integer): longint;

Se estiver construindo uma funo, o valor de retorno desta pode ser atribuido uma varivel com o nome da funo:
function CalculaSoma(num1, num2: integer): longint; begin end; CalculaSoma := num1 + num2;

O Delphi tambm aceita que voc atribua o retorno da funo varivel Result:
functionalculaSoma(num1, num2: integer): longint; begin end; Result := num1 + num2;

Posicionando a Procedure ou Funo na Unit


Como vimos, antes de utilizar qualquer identificador em Pascal, necessrio declar-lo. Portanto, antes de podermos usar uma procedure ou funo necessrio declar-la. A declarao de uma procedure ou funo posicionada aps todas as clusulas uses, var, const, e type da seo interface, e antes da seo implementation:
unit Unit1; interface uses .... type ... const ... var ...

22

Pascal para Delphi procedure ValidaEntrada(num:integer; nome: string); implementation .... end.

J o corpo da procedure ou funo deve ficar na seo implementation:


unit Unit1; interface ... procedure ValidaEntrada(num:integer; nome: string); implementation {$R *.DFM} procedure ValidaEntrada(num:integer; nome: string); begin ..... end; end.

Exemplo 7
A procedure abaixo calcula a diferena de duas variveis:
procedure CalculaDiferenca; var num1, num2 : integer; dif : integer; num1 := 10; num2 := 2; dif := num1 - num2;

begin

end;

Criamos a procedure acima iniciando-a com a palavra reservada procedure. CalculaDiferenca o nome da procedure. Iniciamos ento uma seo var, onde declaramos trs variveis locais procedure, todas do tipo integer: num1, num2 e dif. Aps a seo var, colocamos o corpo da procedure, entre as palavras reservadas begin e end. Atribumos valores para num1 e num2, e calculamos a diferena entre eles, atribuindo o resultado para a varivel dif. Se voc quiser utilizar o valor da varivel dif em outro local, deveria criar uma funo, ao invs de uma procedure:
Function CalculaDiferenca : integer; var begin num1 := 10; num1, num2 : integer;

23

Pascal para Delphi end; num2 := 2; CalculaDiferenca := num1 - num2;

Nesse caso, o retorno da funo dado atravs de uma varivel CalculaDiferenca, que possui o mesmo nome da funo. Note que especificamos no cabealho da funo que seu retorno um dado do tipo integer. Se os valores de num1 e num2 forem fornecidos por outra procedure, voc pode coloc-los como parmetros:
procedure CalculaDiferenca(num1,num2 : integer); var dif : integer; begin end; dif := num1 - num2;

Veja como ficaria posicionada a procedure CalculaDiferenca dentro da unit Unit1. Para efeito de ilustrao, vamos supor que a varivel dif uma varivel global:
unit Unit1; interface ...... var dif : integer; procedure CalculaDiferenca; implementation {$R *.DFM} procedure CalculaDiferenca; var num1, num2 : integer; begin num1 := 10; num2 := 2; dif := num1 - num2;

end; end.

<>

Chamando a Procedure ou Funo


Para chamar a procedure ou funo, basta digitar o nome da procedure ou funo, seguida dos parmetros, caso haja. Abaixo chamamos a funo ValidaEntrada, passando dois argumentos:
begin end. numero := StrToInt('1'); ValidaEntrada(numero, '2');

24

Pascal para Delphi

Exemplo 8
A unit abaixo possui duas procedures, MostraResultado e CalculaDiferenca. A procedure CalculaDiferenca calcula a diferenca entre dois valores, e a procedure MostraResultado mostra na tela esta diferena. Quando o formulrio criado (ou seja, quando o evento onCreate ocorre), chamamos a funo MostraResultado:
unit Unit1; interface var dif : integer; resultado : string; procedure CalculaDiferenca; procedure MostraResultado; implementation {$R *.DFM} procedure CalculaDiferenca; var num1, num2 : integer; begin num1 := 10; num2 := 2; dif := num1 - num2; str(dif, resultado); end; procedure MostraResultado; begin CalculaDiferenca; ShowMessage('A diferena : '+ resultado); end; procedure TForm1.FormCreate(Sender: TObject); begin MostraResultado; end; end.

Como vimos, a procedure MostraResultado chama a procedure CalculaDiferenca. O valor armazenado na varivel dif, global, ento mostrado na tela. Preste ateno em dois pontos:

Se a varivel dif ou a varivel resultado fossem declaradas na seo var da procedure CalculaDiferenca, no poderamos nos referir a elas na procedure MostraResultado. Como a procedure MostraResultado chama a procedure CalculaDiferenca, esta ltima deve ser declarada primeiro. Isto porque, se voc declarasse a procedure MostraResultado primeiro, o compilador acusaria um erro, dizendo que h uma procedure sendo usada (CalculaDiferenca) sem ser declarada.

Veja como ficaria a unit anterior se passssemos os valores de num1 e num2 como parmetros, na chamada da procedure CalculaDiferenca::
unit Unit1; interface

25

Pascal para Delphi var dif : integer; resultado : string; procedure CalculaDiferenca(num1, num2 : integer); procedure MostraResultado; implementation {$R *.DFM} procedure CalculaDiferenca(num1, num2 : integer); begin end; dif := num1 - num2; str(dif, resultado);

procedure MostraResultado; begin CalculaDiferenca(10,2); ShowMessage('A diferena : '+ resultado); end; procedure TForm1.FormCreate(Sender: TObject); begin MostraResultado; end; end.

Se a procedure CalculaDiferenca fosse uma funo, poderamos utilizar seu retorno, e nosso programa ficaria assim:
unit Unit1; interface var resultado : string; function CalculaDiferenca(num1,num2 : integer) : integer; procedure MostraResultado; implementation {$R *.DFM} function CalculaDiferenca(num1, num2 : integer) : integer; begin CalculaDiferenca := num1 - num2; end; procedure MostraResultado; begin resultado :=InttoStr(CalculaDiferenca ( 10,2)); ShowMessage('A diferena : '+ resultado); end; procedure TForm1.FormCreate(Sender: TObject); begin MostraResultado; end;

26

Pascal para Delphi end.

Passagem de Parmetros por Valor ou Referncia


Os parmetros (ou argumentos) dos procedimentos e das funes podem ser passados de duas forma: por valor ou por referncia.

Passagem de Parmetros por Valor


A passagem de parmetro por valor passa para a procedure apenas o valor atual da varivel. Quando acabarmos a procedure e voltarmos ao programa que a chamou, a varivel passada como parmetro ainda ter o mesmo valor.

Passagem de Parmetros por Valor


J na passagem por referncia, colocamos antes do parmetro a palavra var:
procedure VerificaParametro(var num : integer);

Desta forma, podemos no s passar como parmetro o valor original da varivel, como tambm modificar este valor dentro da procedure que a utiliza como parmetro. Uma referencia da varivel passada para a procedure.

Exemplo 9
O programa abaixo usa a passagem de parmetro por valor:
unit Unit1; inteface var Index : integer; procedure VerificaParametro(num : integer); implementation {$R *.DFM} procedure VerificaParametro(num : integer); begin num := 12; end; procedure TForm1.FormCreate(Sender: TObject); begin Index := 1; ShowMessage('O valor inicial de Index '+ IntToStr(Index)); VerificaParametro(Index); ShowMessage('Aps a procedure, o valor de Index ' + IntToStr(Index)); end; end.

Ou seja, quando chamamos a rotina VerificaParametro, passamos como parmetro a varivel Index, com valor inicial de 1. Como a passagem por valor, a varivel Index continua com valor 1 quando a procedure 27

Pascal para Delphi

acaba, mesmo que dentro da procedure VerificaParametro mudemos o valor de num (que representa a varivel Index) para 12. O resultado o programa acima o seguinte:
O valor inicial de Index 1 Aps a procedure, o valor de Index 1

Veja como ficaria o programa anterior se usssemos a passagem de parmetro por referencia:
unit Unit1; inteface var Index : integer; procedure VerificaParametro(varnum : integer); implementation {$R *.DFM} procedure VerificaParametro(varnum : integer); begin num := 12; end; procedure TForm1.FormCreate(Sender: TObject); begin Index := 1; ShowMessage('O valor inicial de Index '+IntToStr(Index)); VerificaParametro(Index); ShowMessage('Aps a procedure, o valor de Index ' + IntToStr(Index)); end; end.

Ou seja, quando chamamos a rotina VerificaParametro, passamos como parmetro a varivel Index, com valor inicial de 1. Como a passagem por referncia, a varivel Index muda de valor dentro da procedure, j que mudamos o valor de num (que representa a varivel Index) para 12. O resultado o programa acima o seguinte:
O valor inicial de Index 1 Aps a procedure, o valor de Index 12

28

Pascal para Delphi

Viso Geral
Com um comando condicional, voc poder forar o programa a executar um bloco de operaes de acordo com uma condio. O Pascal possui dois grupos de comandos condicionais:

If...then Case...of

If ... then
Este comando condicional utilizado quando precisamos avaliar uma determinada condio. Se esta for verdadeira, executaremos determinado comando. Sintaxe:
if expresso then comando;

Outra sintaxe para o comando If...then inclui o uso do comando else: Sintaxe: 29

Pascal para Delphi if expresso then comando1 else comando2;

Ou seja, se expresso for verdadeira, executaremos a linha de comando1. Se for falsa, executaremos os comandos posteriores ao else, ou seja, a linha de comando 2. Note que a linha imediatamente anterior a palavra else no termina com um ponto e vrgula! Quando o bloco de comandos a ser executado dentro de um if...then for muito extenso, voc deve inseri-los dentro de uma estrutura begin...end:
if expresso then begin bloco de comandos1; end else begin bloco de comandos2; end;

Comandos Aninhados
Voc pode aninhar um comando if...then dentro de um outro comando if...then:
if expresso then begin comando1; if expresso2 then comando 2; end else comando3;

O Comando Exit
Atravs do comando Exit voc pode sair de um bloco de comandos limitado por begin...end, evitando que as demais linhas aps o comando Exit sejam avaliadas:
if expresso then Exit;

O Comando GoTo
Este comando desvia o cdigo para um determinado rtulo: Sintaxe:
GoTo <rtulo>

Onde rtulo um rtulo numrico definido na clusula label da procedure:


unit Uni interface .....

30

Pascal para Delphi implementation procedure MinhaProcedure; label 210; begin end; end. ....

Exemplo 10
O programa abaixo mostrar uma frase na tela se a varivel x for maior que a varivel y:
unit Unit1; interface var x, y : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 15; y := 12; if (x > y) then ShowMessage('X maior do que Y'); end; end.

O programa abaixo mostrar uma frase na tela se a varivel x for maior que a varivel y, e outra se x for menor do que y:
unit Unit1; interface var x, y : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 15; y := 12; if (x > y) then ShowMessage('X maior do que Y') else ShowMessage('Y maior do que X'); end; end.

O programa abaixo mostrar uma frase na tela se a soma da varivel x for maior que 25, e outra se no for: 31

Pascal para Delphi unit Unit1; interface var x, y, soma : integer; resultado : string; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 15; y := 12; if (x + y > 25) then begin soma := x + y; str(soma, resultado); ShowMessage('A soma igual a '+resultado); end else ShowMessage('A soma menor que 25'); end; end.

O programa abaixo calcula a rea de um quadrado. Se a rea estiver entre 25 e 60 metros quadrados, a rea suficiente, e o programa mostra uma mensagem na tela. Seno, o programa verifica qual a metragem, e se for menor do que 10 metros quadrados, mostra uma mensagem avisando que a sala muito pequena:
unit Unit1; interface var x, area : integer; resultado : string;

implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 6; area := x * x; if (area > 25) and (area < 60)then begin str(area, resultado); ShowMessage('A rea suficiente!'); ShowMessage ('A rea de '+ resultado); end else begin if (area < 10) then ShowMessage('A rea muito pequena!') else ShowMessage('Ainda h possibilidades!'); end; end; end.

O programa abaixo verifica o valor de uma varivel, mostrando-a na tela somente se seu valor for diferente de 1: 32

Pascal para Delphi

unit Unit1; interface var x : integer; procedure VerificaValor; implementation {$R *.DFM} procedure VerificaValor; begin x := 1; if (x = 1) then exit else begin x := x + 3; end; ShowMessage('O valor de x foi acrescido de 3 unidades'); end; procedure TForm1.FormCreate(Sender: TObject); begin VerificaValor; end; end. Ou seja, quando x for igual a 1, a mensagem no mostrada, pois o comando Exit interrompe a execuo do bloco inserido entre o begin e o end da procedure. O programa abaixo desvia o programa para o rtulo 1, se o valor da varivel X for maior do que 10:
unit Unit1; interface var x : integer; implementation {$R *.DFM} produre TForm1.FormCreate(Sender: TObject); label 1; begin x := 20; if x > 10 then goto 1; ShowMessage('O programa no foi para o label'); 1: ShowMessage('O programa veio para c'); end;

33

Pascal para Delphi end.

Ou seja, se o valor de x for maior do que 10, o programa pula para a linha com o rtulo 1, definido na seo label do programa.

Case ... of
Este comando condicional permite a execuo de comandos de acordo com o resultado de uma expresso do tipo ordinal. Sintaxe:
case expresso of sequencias de constantes 1: comando 1; sequencias de constantes 2: comando 2; end;

As constantes da sequencia so separadas por vrgula. Voc pode definir um intervalo de constantes, usando dois pontos (..) entre elas:
case tecla of 'A'..'Z', 'a'..'z': ShowMessage('Letra');

Outra sintaxe para o comando Case...of inclui o uso do comando else:


case expresso of constantes 1: comando 1; constantes 2: comando 2; else comando 3; end;

Neste caso, se o valor de expresso no for igual as constantes 1 ou iguais as constantes 2, o bloco de comando 3 ser executado. Note que ao contrrio do comando if...then...else, a linha anterior a palavra else termina com um ponto e vrgula. Quando o bloco de comandos a ser executado dentro de um case...of for muito extenso, voc deve inser-los dentro de uma estrutura begin...end:
case expresso of constantes 1: begin comandos 1; end; constantes 2: begin comandos 2; end; begin end; comandos 3;

else

34

Pascal para Delphi end;

Exemplo 11
A unit abaixo faz determinado clculo de acordo com o valor de x:
unit Unit1; interface var x, y : integer;

implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 2; case x 1 2 3 end; end; end. of : y := x + x; : y := x * x; : y := x div x;

ShowMessage(InttoStr(y));

O programa abaixo avalia o valor da varivel Tecla:


unit Unit1; interface var tecla : char;

implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin tecla := 'a'; case tecla of 'A'..'Z', 'a'..'z':ShowMessage('Letra'); '0'..'9':ShowMessage('Nmero'); '+', '-', '*', '/':ShowMessage('Operador'); end; end; end.

A unit abaixo faz determinado clculo de acordo com o valor de x. Se este no foi igual a 1, 2 ou 3, os valores so subtrados: 35

Pascal para Delphi unit Unit1; interface var x, y : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 2; case x 1 2 3 else y end; end; end. of : y := x + x; : y := x * x; : y := x div x; := x - x;

ShowMessage(IntToStr(y));

O programa abaixo calcula o valor do salrio de um funcionrio, de acordo com seu cdigo de funo:
unit Unit1; interface var codo : integer; salario, desconto : real; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Cod := 2; desconto := 0; case Cod of 1 : begin salario := 1000; desconto := salario * 0.2; salario := salario-desconto; end; 2: begin salario := 2000; desconto := salario * 0.2; salario := salario-desconto;

end; 3:

36

Pascal para Delphi begin salario := 3000; desconto := salario *0.2; salario := salario-desconto;

end; else

end; end.

ShowMessage('Cdigo no existe!'); end; ShowMessage('O valor do desconto '+ FloatToStr(desconto));

Viso Geral
Os comandos de repetio repetem blocos de comando de acordo com determinada condio. Por exemplo, se voc precisa repetir uma soma enquanto o total no atende determinada condio, use comandos interativos. Entre os comandos de repetio oferecidos pelo Pascal temos:

while...do for...do repeat...until

While ... do
Este comando repete um bloco de comando enquanto determinada condio for verdadeira. Sintaxe:
while expresso do comando1;

Quando o bloco de comandos a ser executado dentro de um while...do for muito extenso, voc deve inserilos dentro de uma estrutura begin...end:
while expresso do begin comando 1; comando 2; comando n; end;

Interrompendo o Loop
Para interromper a repetio de um bloco de comandos dentro de uma estrutura while...do, use o comando Break: 37

Pascal para Delphi while expresso do begin comando1; break; end;

Exemplo 12
O programa abaixo multiplica os valores de dois nmeros at que o total atinja o valor de 1000:
unit Unit1; interface var x, total : integer

implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin total := 5; x := 2; while (total < 1000) do total := total * x; ShowMessage(IntToStr(total)); end; end.

O programa abaixo mostra na tela um aviso sobre a contagem sendo feita:


unit Unit1; interface var Contador : integer;

implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Contador := 4; while Contador < 20 do begin ShowMessage('O valor de Contador '+ IntToStr(Contador)); Contador := Contador + 2; end; end; end.

Veja como ficaria o programa anterior se usssemos um comando break para interromper a contagem se o valor da varivel Contador atingisse 10: 38

Pascal para Delphi unit Unit1; interface var Contador : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Contador := 4; while Contador < 20 do begin ShowMessage('O valor de Contador '+ IntToStr(Contador)); Contador := Contador + 2; if (Contador = 10) then break; end;

end; end.

For ... do
Com essa estrutura, voc poder repetir um bloco de comandos um nmero determinado de vzes. Sintaxe:
for variavel := expresso1 to expresso2 do comando;

Ao invs da palavra to, voc pode usar a palavra downto. Com downto, voc parar no passo anterior a expresso2:
for variavel := expresso1 downto expresso2 do comando;

Quando o bloco de comandos a ser executado dentro de um for...do for muito extenso, voc deve inseri-los dentro de uma estrutura begin...end:
for variavel := expresso to expresso do begin comando 1; comando 2; end;

Interrompendo o Loop
Para interromper a repetio de um bloco de comandos dentro de uma estrutura for...do, use o comando Break: 39

Pascal para Delphi for variavel := expresso to expresso do begin comando1; break; end;

Exemplo 13
O programa abaixo mostra uma lista de nmeros de 1 a 10:
unit Unit1; interface var Num : integer;

implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for num:= 1 to 10 do ShowMessage(InttoStr(num)); end; end.

O programa abaixo recalcula a rea de um quadrado, ao ampliarmos a sua rea at 10 metros quadrados:
unit Unit1; interface var area, x : integer; resultado : string;

implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for x:=1 to 10 do begin area := x * x; str(area, resultado); ShowMessage('A rea do quadrado igual a ' + resultado); end;

end; end.

40

Pascal para Delphi

Veja como ficaria o programa anterior se usssemos um comando break para interromper a contagem se o valor da rea atingisse 25:
unit Unit1; interface var area, x : integer; resultado : string;

implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for x:= 1 to 10 do begin area := x * x; if (area = 25) then break; str(area, resultado); ShowMessage('A rea do quadrado igual a ' + resultado); end;

end; end.

Repeat ... until


Este comando usado para se executar um grupo de comandos repetidas vezes, at determinada condio. Sintaxe:
repeat comando 1; until condio;

Quando o bloco de comandos a ser executado dentro de um repeat...until for muito extenso, voc deve inseri-los dentro de uma estrutura begin...end:
repeat begin comando 1; comando 2; comando n;

end; until condio;

Interrompendo o Loop
Para interromper a repetio de um bloco de comandos dentro de uma estrutura repeat...until, use o comando Break: 41

Pascal para Delphi repeat begin comando1; break;

end; until condio;

Exemplo 14
O programa abaixo multiplica os valores de dois nmeros at que o total atinja o valor de 1000:
unit Unit1; interface var x, total : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin total := 5; x := 2; repeat total := total * x; until (total < 1000); ShowMessage(IntToStr(total)); end; end.

O programa abaixo mostra na tela um aviso sobre a contagem sendo feita:


unit Unit1; interface var Contador : integer;

implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Contador := 4; repeat begin ShowMessage(IntToStr(contador)); Contador := Contador + 2; end; until Contador > 20;

end; end.

42

Pascal para Delphi

Veja como ficaria o programa anterior se usssemos um comando break para interromper a contagem se o valor da varivel Contador atingisse 10:
unit Unit1; interface var Contador : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Contador := 4; repeat begin ShowMessage(IntToStr(contador)); Contador := Contador + 2; if (Contador = 10) then break; end; until Contador > 20; end; end.

43

Pascal para Delphi

Viso Geral
O Pascal oferece inmeras funes e procedures pr-construdas para manipulao de strings. Com elas voc poder, por exemplo, extrair parte de uma string, verificar seu comprimento, convert-la para nmero, etc.

Funes de Manipulao de Strings


Concat
Esta funo junta duas ou mais strings, formando uma s: Sintaxe: Concat(s1 [, s2,..., sn]: String) : string; Onde s1, s2...sn so strings a serem concatenadas. Exemplo:
var begin end. S: String; S := Concat('ABC', 'DEF');

varivel S ser atribudo o valor ABCDEF.

Copy
Esta funo permite que voc isole um substring do meio de uma string. Sintaxe: Copy (expr,incio,num) : string; onde expr uma expresso do tipo string, incio a localizao do primeiro caracter a extrair, e num o nmero de caracteres a serem extrados. Esta funo retorna uma string. Exemplo:
Copy ('palavra',2,3)

retorna ala.

Length
Esta funo determina a largura do string. 44

Pascal para Delphi

Sintaxe: Length(s: string) : integer; onde s uma varivel do tipo string. A funo retorna um valor integer. Exemplo:
s := 'palavra'; Length (s);

retorna 7.

Pos
Esta funo permite que se procure um determinado substring em um string, mesmo sem saber se este substring ser encontrado. Sintaxe: Pos (s: string, d: string) : integer; onde s a substring a ser encontrada dentro da string d. A funo pos retorna um valor integer, referente ao ndice da primeira letr da substring. Se a substring no for encontrada, retorna-se 0. Exemplo:
palavra := 'felicidade' numero := Pos ('idade', palavra);

retorna 6.

UpperCase
Esta funo substitui todas as letras minsculas de uma string por letras maisculas. Sintaxe: UpperCase (s: string) : string; onde s a string que ter as letras convertidas. Esta funo retorna uma string igual a s, s que com todas as letras maisculas. Exemplo:
s := 'palavra'; UpperCase(s);

retorna PALAVRA.

LowerCase
Esta funo substitui todas as letras maisculas de uma string por letras minsculas. 45

Pascal para Delphi

Sintaxe: LowerCase (s: string) : string; onde s a string que ter as letras convertidas. Esta funo retorna uma string igual a s, s que com todas as letras maisculas transformadas em minsculas. Exemplo:
s := 'Palavra'; LowerCase(s);

retorna palavra.

IntToStr
Converte um nmero do tipo integer para uma string contendo uma representao decimal quele nmero. Sintaxe: IntToStr(Valor: Longint) : string; onde Valor o nmero a ser convertido. A funo retorna uma string, contendo a representao decimal daquele nmero. Exemplo:
s : string; num := 10; s := IntToStr(num);

retorna '10'.

FloatToStr
Converte um nmero do tipo real, single, double ou extended em uma string. Sintaxe: FloatToStr(valor: extended) : string; onde valor o nmero a ser convertido. A funo retorna uma string, contendo a representao decimal daquele nmero.

StrToInt
Converte uma string representando um nmero integer em um nmero. Sintaxe: StrToInt(s: string) : longint; onde s a string a ser convertida. A funo retorna um valor Longint. Se a string no representa um nmero vlido, StrToInt retorna uma exceo. 46

Pascal para Delphi

Exemplo:
num: integer; s := '10'; num := StrToInt (s);

retorna 10.

StrToFloat
Converte uma string representando um nmero real, single, double ou extended em um nmero. Sintaxe: StrToFloat(s: string) : extended; onde s a string a ser convertida. A funo retorna um valor extended. Se a string no representa um nmero vlido, StrToFloat retorna uma exceo

Procedures de Manipulao de String


Delete
Esta procedure remove uma substring de uma string. Sintaxe: Delete(palavra, ndice, quant); Onde palavra a string que ter parte extrada, ndice a partir de qual letra ser iniciada a extrao, e quant a quantidade de letras a ser extrada. Exemplo:
s := 'Florianpolis'; Delete(s,1,8)

A varivel s ter agora o valor ''polis'.

Insert
Esta procedure insere uma substring em uma string. Sintaxe: Insert(origem, palavra, indice); Onde origem a string a ser inserida, palavra a string em cujo interior inseriremos outra string, e ndice a partir de qual letra ser iniciada a insero. Exemplo:
s := 'Florianpolis'; Insert('Eu amo ',s,1)

47

Pascal para Delphi

A varivel s ter agora o valor 'Eu amo Florianpolis'.

Str
Esta sub-rotina converte um valor integer ou real para uma string, armazenando o resultado em uma varivel. Sintaxe: Str(x, var s); onde x um nmero integer ou real, e var s a varivel do tipo string onde ser armazenada a converso. Exemplo:
s: string; x := 10; str(x,s);

tem como resultado o armazenamento de 10 em s.

Val
Esta sub-rotina retira o valor numrico de um string. Sintaxe: Val (s: string, var v, var code); onde s a string a ser transformada, var v a varivel onde armazenado o resultado da converso, e var code a varivel onde arm o ndice do caracter que tornou impossvel a converso. Exemplo:
v,code: integer; s := '10'; val(s,v,code);

tem como resultado o armazenamento de 10 em v.

Viso Geral
O Pascal oferece uma srie de rotinas aritmticas para serem usadas em clculos matemticos. 48

Pascal para Delphi

Com elas voc pode, por exemplo, extrair a raiz quadrada de um elemento, seu valor absoluto, seu logartmo natural, etc.

Principais Rotinas Matemticas


Abs
Retorna o valor absoluto do argumento. Sintaxe: Abs(Variavel); Onde Variavel a varivel de onde ser retirado o valor absoluto. Exemplo:
var begin valor : real; valor := Abs(-3.5);

O valor de retorno ser igual a: 3.5.

ArcTan
Retorna a tangente do argumento. Sintaxe: ArcTan(Variavel); Onde Variavel a varivel de onde ser retirado o valor da tangente. Exemplo:
var begin num : extended; num := arctan(Pi);

O valor de retorno ser o valor da tangente de PI.

Cos
Retorna o cosseno do argumento. Sintaxe: Cos(Variavel); Onde Variavel a varivel de onde ser retirado o valor do coseno. Exemplo: 49

Pascal para Delphi var begin numero : extended; numero := cos(Pi);

O valor de retorno ser o valor do coseno de PI.

Exp
Retorna o exponencial do argumento. Sintaxe: Exp(Valor); Onde Valor o valor a ser calculado o exponencial. Exemplo:
var begin x : real; x := exp(1.0);

O valor de retorno ser: 2,71828182845905

Frac
Retorna a parte fracionria do argumento. Sintaxe: Frac(Valor); Onde Valor o valor de onde deve ser retirada a parte fracionria. Exemplo:
var begin fracao : real; fracao := Frac(12.32);

O Valor de retorno ser: 0.32.

Int
Retorna a parte inteira do argumento. Sintaxe: Int(Valor); Onde Valor o valor de onde deve ser obtida a parte inteira do argumento. 50

Pascal para Delphi

Exemplo:
var begin inteiro : real; inteiro := Int(19.82);

O Valor de retorno ser: 19.

Ln
Retorna o logartmo natural do argumento. Sintaxe: Ln(Variavel); Onde Variavel a varivel que contm o valor a ser calculado. Exemplo:
var begin loga : real; loga := Ln(1.82);

O valor de retorno ser aproximadamente: 0,598836501088704

Pi
Retorna o valor de Pi. Sintaxe: Variavel := Pi; Onde Variavel uma varivel onde ficar armazenado o valor de PI. Exemplo:
var begin valorpi : real; valorpi := Pi;

O valor de retorno ser aproximadamente: 3,14159265358979

Sin
Retorna o seno do argumento. Sintaxe: Sin(Variavel); 51

Pascal para Delphi

Onde Variavel uma varivel que contm o valor a ser calculado. Exemplo:
var begin seno : real; seno := Sin(45.27);

O Valor de retorno ser aproximadamente: 0,96019594136273

Sqr
Retorna o quadrado do argumento. Sintaxe: Sqr(Valor); Onde Valor o valor que deve ser elevado ao quadrado. Exemplo:
var begin quadrado: real; quadrado:= Sqr(11);

O Valor de retorno ser: 121.

Sqrt
Retorna a raiz quadrada do argumento. Sintaxe: Sqrt(Valor); Onde Valor o valor que deve ser calculada a raz quadrada. Exemplo:
var begin raiz : real; raiz := Sqrt(144);

O Valor de retorno ser: 12.

Exemplo 15
O programa abaixo realiza alguns clculos em cima do valor de uma varivel: 52

Pascal para Delphi unit Unit1; interface var x, y, z, w : real; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 16; y := abs(x); ShowMessage(FloattoStr(y)); z := sqrt(x); ShowMessage(FloattoStr(z)); w := ln(x); ShowMessage(FloattoStr(w)); end; end.

Viso Geral
Alm dos dados prprios do Pascal, o usurio pode criar novos tipos de dados:

array; enumerado; intervalo; set; record.

Arrays
53

Pascal para Delphi

Um array (ou vetor) uma coleo ordenada de um tipo de dado, com cada elemento da coleo especificado por sua posio numrica dentro da coleo. Um array criado na seo var do programa, e usa a seguinte sintaxe:
var num : array [1..10] of integer;

A varivel num se refere a uma lista de 10 variveis do tipo integer, cada uma com um nmero de indice de 1 a 10. Nos referimos a cada item do array atravs do seu ndice entre colchetes [ ]. Por exemplo:
num[5] := 250;

Exemplo 16
A unit abaixo escreve na tela uma lista dos anos dos carros armazenados em um array:
unit Unit1; interface var Index : integer; Automoveis : array[1..12] of integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for Index := 1 to 12 do begin Automoveis[Index] := Index + 1980; ShowMessage('O automvel de nmero ' + InttoStr(Index) + ' tem o valor ' + InttoStr(Automoveis[ Index])); end; ShowMessage('Fim do Programa!'); end; end.

Inicialmente, a varivel Index ser igual a 1. Atribuiremos ao primeiro item do array, Automoveis[1], o valor de 1980+1, ou seja, 1981. Escreveremos ento na tela a frase O automvel de nmero 1 tem o valor de 1981. Repetiremos a estrutura for, sendo que agora a varivel Index tem o valor de 2 (a estrutura for se autoincrementa de uma unidade). Atribuiremos ao segundo item do array, Automoveis[2], o valor de 1980+2, ou seja, 1982. Escreveremos ento na tela a frase O automvel de nmero 1 tem o valor de 1982. E assim sucessivamente.

Exemplo 17
Vamos criar um programa que liste a seguinte tabela na tela: Ano 1980 1981 1982 54

Pascal para Delphi

---------------------------------------------------------Motor 0 (Gasolina) 1900 1901 1902 1 (Alcool) 1901 1902 1903

unit Unit1; interface var Automoveis : array[0..1,1980..1982] of integer; Ano, Motor : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for Ano := 1980 to 1982 do begin for Motor := 0 to 1 do begin Automoveis[Motor,Ano] := Ano - 80 + Motor; ShowMessage('O valor do carro com motor ' + InttoStr(motor) + ' do ano '+ InttoStr(ano) + ' de ' + InttoStr( Automoveis[Motor, Ano])); end; end; end; end.

Inicialmente, atribumos varivel Ano o valor 1980, dentro da primeira estrutura for. Na segunda estrutura for, atribumos varivel Motor o valor 0. Atribuimos ao item Automoveis[0,1980] do vetor Automoveis o valor 1900, correspondente a conta 1980 - 80 + 0. Escrevemos ento na tela a frase O carro com motor 0 do ano 1980 possui valor de 1900. Acrescentamos 1 varivel Motor, e voltamos segunda estrutura for. Atribuimos ao item Automoveis[1,1980] do vetor Automoveis o valor 1901, correspondente a conta 1980 - 80 + 1. Escrevemos ento na tela a frase O carro com motor 1 do ano 1980 possui valor de 1901. Acabamos ento a segunda estrutura for, e voltamos para a primeira, sendo que agora a varivel Ano est acrescentada de uma unidade, valendo ento 1981. E voltamos ao raciocnio do pargrafo anterior.

Strings
Strings so arrays do tipo char. Quando voc declara uma varivel do tipo string, pode determinar o nmero de caracteres que esta contm:
var nome : string[30];

Na realidade os arrays de caracter so 1 byte maiores do que o tamanho especificado na string, porque a primeira posio da string um byte que contm o tamanho da string.

Registros

55

Pascal para Delphi

Registros (records) so colees de dados aos quais sua aplicao pode ser referir como um todo. Por exemplo, voc poderia criar um registro de nome Empregado, que contivesse os dados deste: ltimo nome, primeiro nome, ano do emprego. Cada um destes dados tambm conhecido como campo do registro. Os registros no so declarados na seo var do programa, e sim na seo type, usando a seguinte sintaxe:
type Nome_Registro = record Dado1 : tipo_dado; Dado2 : tipo_dado; ..... end;

Aps criar o tipo de dado registro, voc deve criar uma varivel do tipo do registro criado. Isto feito na seo var do programa, usando-se a sintaxe tradicional:
var nome_variavel : nome_registro

Voc pode acessar cada campo ou se referir ao registro como um todo, usando a seguinte sintaxe:
variavel_tipo_registro.campo

Exemplo 18
Vamos criar um registro de nome Empregado, que contenha os dados deste: ltimo nome, primeiro nome, ano do emprego.
type Empregado = Record UltimoNome :string[20]; PrimeiroNome : string[15]; AnoEmprego : string[4]; end;

Todos os dados so do tipo string, j que contero texto. Estamos estabelecendo tambm o nmero total de caracteres que cada string poder conter. Aps criarmos o registro Empregado, vamos criar uma varivel chamada Empreg1, do tipo Empregado:
type Empregado = Record UltimoNome :string[20]; PrimeiroNome : string[15]; AnoEmprego : string[4]; end;

var

Empreg1 : Empregado;

Vamos escrever na tela os valores dos dados de nosso primeiro empregado,


unit Unit1; interface type

56

Pascal para Delphi Empregado = Record UltimoNome :string[20]; PrimeiroNome : string[15]; AnoEmprego : string[4]; end; var Empreg1 : Empregado; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Empreg1.UltimoNome := 'Prado'; Empreg1.PrimeiroNome := 'Alyssa'; Empreg1.AnoEmprego := '1996'; ShowMessage(Empreg1.UltimoNome); ShowMessage(Empreg1. PrimeiroNome); ShowMessage(Empreg1.AnoEmprego); end; end.

Tipo Enumerado
Um dado do tipo enumerado (enumerated type) representa uma lista de valores. Na declarao do tipo de dado, so listados os valores possveis. Por exemplo:
type TDias = (Segunda, Tera,Quarta);

Para criar uma varivel do tipo acima, faramos:


var DiadaSemana : TDias;

Na lista, cada item corresponde a um valor inteiro, comeando por 0. Um item na lista de um tipo enumerado na verdade um identificador. Logo, voc no pode criar uma varivel com este nome. No exemplo acima, no poderia criar uma varivel com o nome Segunda.

Tipo Set
Um conjunto (set) uma coleo de elementos de um tipo que precisa ser byte, boolean, char, enumerado ou intervalo. Por exemplo:
type TVogais = set of char;

Para criar uma varivel do tipo acima:


var begin vogal : TVogais; texto := 'A'; Vogal := ['A' , 'E', 'I', 'O', 'U']; if texto in vogal then Writeln('OK') else Writeln('Tente de Novo');

end;

57

Pascal para Delphi

Use o operador in para verificar se um caracter membro de um conjunto de elementos.

Tipo Intervalo
Uma estrutura de dados do tipo intervalo (subrange type) contm uma regio de valores do tipo integer, boolean, char ou enumerado. So teis quando voc quer limitar o valor que uma varivel deve ter. Para criar um intervalo, especifique o valor mnimo e o valor mximo, com dois pontos (..) entre eles. Por exemplo:
type TLetraValida = `A' .. ` F' ;

Para criar uma varivel do tipo acima:


var Letra : TLetraValida;

Para que a verificao de regio seja feita, voc deve utilizar a diretiva {$R+} no cdigo da aplicao.

Tipos de Arquivos
Para tornar seu programa mais til, voc precisar de um meio para armazenar de forma permanente os dados, e recuper-los posteriormente. Isto feito atravs de arquivos. O Pascal suporta tanto arquivos texto quanto arquivos binrios.

Arquivos Texto
Nos arquivos texto, os dados so representados como caracteres do conjunto ASCII. Cada linha encerrada por um retorno de carro. Com este formato, as linhas podem variar de comprimento.

Arquivos Binrios
Os arquivos binrios armazenam os dados em uma representao binria compactada. Existem arquivos binrios tipificados e no-tipificados. Arquivos tipificados so arquivos binrios que s armazenam dados de um nico tipo. Arquivos no-tipificados so arquivos binrios que armazenam os dados em sequencia de bytes sem tipo.

Trabalhando com Arquivos Texto


58

Pascal para Delphi

Os arquivos texto, apesar de facilmente manipulveis, apresentam duas limitaes: Nem todos os caracteres podem ser armazenados em um arquivo texto (somente aqueles que podem ser exibidos na tela ou impressora, incluindo os caracteres de retorno de carro, de avano de linha e tabulao); No podem ser acessados aleatoriamente, ou seja, a leitura dos dados deve ser sempre feita a partir do incio do arquivo.

Variveis do Tipo Arquivo


Para acessar um arquivo texto voc deve declarar uma varivel do tipo arquivo. Para declarar variveis de arquivo texto, faa:
var nome_da_varivel : Text;

A atribuio do nome do arquivo varivel feita atravs do comando Assign ou AssignFile (especfico do Delphi):
AssignFile(varivel, 'nome_do_arquivo_extenso');

Aps atribuir o arquivo a uma varivel, voc pode utilizar as rotinas de manipulao de arquivo para abrir, ler e gravar no arquivo.

Manipulando Arquivos Texto


Entre as rotinas de manipulao de arquivos texto, temos:

Append
Abre um arquivo existente para a entrada dee novos dados no final do arquivo. Sintaxe: Append(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin arq: TextFile; if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); AssignFile(f); Append(f); Writeln(f, 'Texto a ser inserido no arquivo.'); Flush(f); CloseFile(f); end;

end;

59

Pascal para Delphi

O cdigo acima abre um arquivo texto e insere nele uma nova string.

CloseFile
Fecha um arquivo. Sintaxe: CloseFile(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var F: TextFile; S: string; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); Reset(F); Readln(F, S); Edit1.Text := S; CloseFile(F); end;

end;

O cdigo acima abre um arquivo inexistente.

EOF
Retorna o status de fim de arquivo. Sintaxe: Eof(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin arq : TextFile; nome : String; AssignFile(arq); Reset(arq); While not eof(arq) do begin Read(nome); end; CloseFile(arq);

end.

O cdigo acima l um nome enquanto no chegar ao fim do arquivo. 60

Pascal para Delphi

EOLN
Retorna o status de fim de linha de um arquivo texto Sintaxe: Eoln(Variavel); Onde Variavel uma varivel do tipo Text. Exemplo:
Writeln(Eoln);

O cdigo acima escreve uma linha no fim do arquivo.

Erase
Apaga um arquivo externo. Sintaxe: Erase(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin F: Textfile; OpenDialog1.Title := 'Delete File'; if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); try Reset(F); if MessageDlg('Deletar ' + OpenDialog1.FileName + '?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin CloseFile(F); Erase(F); end; except on EInOutError do MessageDlg('Erro de I/O.', mtError, [mbOk], 0); end; end;

end;

O cdigo acima simplesmente apaga um arquivo texto.

FileSize
Retorna o tamanho corrente de um arquivo. Sintaxe: 61

Pascal para Delphi

FileSize(Variavel); Onde Variavel uma varivel do tipo Integer. Exemplo:


var f: file of Byte; size : Longint; S: string; y: integer; begin AssignFile(f); Reset(f); size := FileSize(f); S := 'Tamanho dos arquivos em bytes: ' + IntToStr(size); y := 10; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; S := 'Verificando o restante do arquivo...'; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; Seek(f,size div 2); S := 'Posio ' + IntToStr(FilePos(f)); Canvas.TextOut(5, y, S); CloseFile(f);

end;

O cdigo acima pega e exibe o tamanho de um arquivo.

Flush
Esvazia o buffer de um arquivo texto aberto para output. Sintaxe: Flush(Variavel); Onde Variavel uma varivel do tipo TextFile; Exemplo:
var begin f: TextFile; if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Append(f); Writeln(f, 'Texto'); Flush(f); CloseFile(f); end;

end;

O cdigo acima esvazia o buffer de um arquivo.

IOResult
62

Pascal para Delphi

Retorna o status da tima operao I/O realizada. Sintaxe: IOResult : Integer; Exemplo:
var begin F: file of Byte; if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then MessageDlg('Tamanho do arquivo em bytes: ' + IntToStr(FileSize(F)), mtInformation, [mbOk], 0); else MessageDlg('Erro ao acessar arquivo ', mtWarning, [mbOk], 0); end; end;

O cdigo acima retorna o status da ltima operao I/O.

Read
L um elemento de dado de um arquivo. Sintaxe: Read(Variavel); Onde Variavel a varivel que ir conter os dados. Exemplo:
var nome : String; idade : Integer: begin end; read(nome); read(idade);

O cdigo acima faz a leitura de um nome e de uma idade qualquer.

Readln
L uma linha de dados de um arquivo. Sintaxe: Readln(Variavel); 63

Pascal para Delphi

Onde Variavel a varivel onde ficar armazenado um determinado valor. Exemplo:


var arq : TextFile; nome : String; idade : Integer; AssignFile(arq',Nome_do_Arquivo'); Reset(arq); While not eof(arq) do Begin readln(nome); readln(idade); end; CloseFile(arq); end;

begin

O cdigo acima l o nomes e idades armazenados em um arquivo texto.

Rename
Renomeia um arquivo externo. Sintaxe: Rename(Variavel); Onde Variavel uma varivel do tipo Pchar. Exemplo:
var begin f : file; OpenDialog1.Title := 'Escolha o arquivo... '; if OpenDialog1.Execute then begin SaveDialog1.Title := 'Renomear para...'; if SaveDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Canvas.TextOut(5, 10, 'Renomeando ' + OpenDialog1.FileName + ' para ' + SaveDialog1.FileName); Rename(f, SaveDialog1.FileName); end; end; end;

O cdigo acima muda o nome de um arquivo j existente.

Reset
Abre um arquivo existente. 64

Pascal para Delphi

Sintaxe: Reset(Variavel); Onde Variavel uma varivel do tipo File; Exemplo:


var begin F: file; {$I-} AssignFile(F, FileName); FileMode := 0; Reset(F); CloseFile(F); {$I+} FileExists := (IOResult = 0) and (FileName <> ''); if FileExists(ParamStr(1)) then Canvas.TextOut(10, 10, 'Arquivo Encontrado') else Canvas.TextOut(10, 10, 'Arquivo no Encontrado');

end; begin

end;

O cdigo acima abre um arquivo existente, caso ele no exista exibida uma mensagem.

Rewrite
Cria e abre um novo arquivo. Sintaxe: Rewrite(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin F: TextFile; AssignFile(F, 'ARQUIVO.XXX'); Rewrite(F); Writeln(F, 'Texto'); CloseFile(F);

end;

O cdigo acima cria um arquivo com o nome de "ARQUIVO.XXX".

SeekEof
Retorna o status de fim de arquivo de um arquivo. Sintaxe: 65

Pascal para Delphi

SeekEof(Variavel); Onde Variavel uma varivel do tipo Booleano. Exemplo:


var f : System.TextFile; i, j, Y : Integer; begin AssignFile(f,'TESTE01.TXT'); Rewrite(f); Writeln(f,'1 2 3 4 '); Writeln(f,'5 6 7 8 '); Reset(f); Y := 5; while not SeekEof(f) do begin Readln; Read(f,j); Canvas.TextOut(5, Y, IntToStr(j)); Y := Y + Canvas.TextHeight(IntToStr(j)) + 5; end;

end;

O cdigo acima l um determinado arquivo enquanto a condio no for satisfeita.

SeekEoln
Retorna o status de fim de linha de um arquivo. Sintaxe: SeekEoln(Variavel); Onde Variavel uma varivel do tipo Booleano. Exemplo:
var f : System.TextFile; i, j, Y : Integer; begin AssignFile(f,'TESTE02.TXT'); Rewrite(f); Writeln(f,'1 2 3 4 '); Writeln(f,'5 6 7 8 '); Reset(f); Y := 5; while not SeekEof(f) do begin if SeekEoln(f) then Readln; Read(f,j); Canvas.TextOut(5, Y, IntToStr(j)); Y := Y + Canvas.TextHeight(IntToStr(j)) + 5; end;

end;

66

Pascal para Delphi

SetTextBuf
Atribui um buffer de I/O para um arquivo texto. Sintaxe: SetTextBuf(Variaveis); Onde Variaveis so variveis do tipo TextFile, Char, e vetor. Exemplo:
var F, FTwo: System.TextFile; Ch: Char; Buf: array[1..4096] of Char; {buffer de 4K} if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); System.SetTextBuf(F, Buf); Reset(F); AssignFile(FTwo, 'WOOF.DOG'); Rewrite(FTwo); while not Eof(f) do begin Read(F, Ch); Write(FTwo, Ch); end; System.CloseFile(F); System.CloseFile(FTwo); end; end;

begin

O cdigo acima atribuir o buffer de I/O para um arquivo texto.

Write
Grava um ou mais elementos de dados para o arquivo. Sintaxe: Write(arq'Texto'); Onde arq o arquivo onde queremos escrever o "Texto". Exemplo:
var begin arq : TextFile; AssignFile(arq); Reset(arq); Write(arq,'Texto Qualquer'); CloseFile(arq);

O cdigo acima armazenar em um determinado arquivo a string desejada. 67

Pascal para Delphi

Writeln
Grava uma linha de dados de um arquivo. Sintaxe: Writeln(arq'Texto'); Onde arq o arquivo onde queremos escrever o "Texto". Exemplo:
var begin arq : TextFile; AssignFile(arq); Reset(arq); Writeln(arq,'Texto Qualquer 01'); Writeln(arq,'Texto Qualquer 02'); CloseFile(arq);

O cdigo acima escreve duas linhas em um determinado arquivo texto.

Exemplo 19
A unit abaixo atribui o arquivo doc1.txt varivel MeuTexto:
unit Unit1; interface var MeuTexto : TextFile; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin AssingFile(MeuTexto,'doc1.txt'); end; end.

O exemplo abaixo abre um arquivo texto (texto1.txt, que tem que existir) e copia seus dados para um segundo arquivo (texto2.txt, que criado, caso no exista):
unit Unit1; interface var F1, F2: TextFile; Ch: Char; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin AssignFile(F1, 'texto1.txt'); Reset(F1); AssignFile(F2, 'texto2.txt'); Rewrite(F2); while not Eof(F1) do begin Read(F1, Ch); Write(F2, Ch);

68

Pascal para Delphi end; CloseFile(F2); CloseFile(F1); end; end.

O exemplo abaixo coloca a primeira linha de um arquivo texto na tela:


unit Unit1; interface var F: TextFile; S: String; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin AssignFile(F, 'c:\texto1.txt'); <> Reset(F); Readln(F, S); ShowMessage(S); CloseFile(F); end; end.

O exemplo abaixo acrescenta o texto "texto includo" no final de um arquivo texto:


unit Unit1; interface var F: TextFile; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin AssignFile(F, 'texto1.txt'); Append(F); Writeln(F, ' texto incluido'); CloseFile(F); end;

end.

Trabalhando com Arquivos Binrios


Para acessar um arquivo binrio voc deve declarar uma varivel do tipo arquivo. Para declarar variveis de arquivo binrio tipificado, faa:
var nome_da_varivel : FILE OF tipo_de_dado;

Para declarar variveis de arquivo binrio no-tipificado, faa:


var nome_da_varivel : FILE;

A atribuio do nome do arquivo varivel feita atravs do comando Assign ou AssignFile:


AssignFile(varivel, 'nome_do_arquivo_extenso');

69

Pascal para Delphi

Aps estas tarefas, voc pode utilizar as rotinas de manipulao de arquivo para abrir, ler e gravar no arquivo.

Comandos de Manipulao de Arquivos Binrios


Entre as rotinas de manipulao de arquivos binrios, temos:

AssignFile
Atribui o nome de um arquivo externo a uma varivel de arquivo. Sintaxe: AssignFile(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var F: TextFile; S: string; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); Reset(F); Readln(F, S); CloseFile(F); end;

end;

O cdigo acima abre um arquivo l uma string e depois finalizado.

CloseFile
Fecha um arquivo aberto. Sintaxe: CloseFile(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin arq : TextFile; If OpenDialog.Execute Then begin AssignFile(arq, OpenDialog1.FileName); Reset(arq); CloseFile(arq); end; end;

70

Pascal para Delphi

O cdigo acima simplesmente abre e fecha um arquivo texto sem ao menos modific-lo.

EOF
Retorna o status de fim de arquivo. Sintaxe: Eof(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var arq : TextFile; nome : String; begin AssignFile(arq); Reset(arq); While not eof(arq) do begin Read(nome); end; CloseFile(arq);

end.

O cdigo acima l um nome enquanto no chegar ao fim do arquivo.

Erase
Apaga um arquivo externo. Sintaxe: Erase(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin F: Textfile; OpenDialog1.Title := 'Delete File'; if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); try Reset(F); if MessageDlg('Deletar ' + OpenDialog1.FileName + '?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin CloseFile(F); Erase(F); end; except on EInOutError do

71

Pascal para Delphi MessageDlg('Erro de I/O.', mtError, [mbOk], 0); end; end; end;

O cdigo acima simplesmente apaga um arquivo.

FilePos
Retorna a posio corrente de um arquivo. Sintaxe: FilePos(Variavel); Onde Variavel uma varivel do tipo Longint. Exemplo:
var f: file of Byte; size : Longint; S: string; y: integer; begin if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Reset(f); size := FileSize(f); S := 'Tamanho do arquivo em bytes: ' + IntToStr(size); y := 10; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; S := 'Localizando restante do arquivo...'; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; Seek(f,size div 2); S := 'A posio ' + IntToStr(FilePos(f)); Canvas.TextOut(5, y, S); CloseFile(f); end;

end;

O cdigo acima retorna a posio corrente de um arquivo.

FileSize
Retorna o tamanho corrente de um arquivo. Sintaxe: FileSize(Variavel); Onde Variavel uma varivel do tipo Integer. Exemplo: 72

Pascal para Delphi var f: file of Byte; size : Longint; S: string; y: integer; begin AssignFile(f); Reset(f); size := FileSize(f); S := 'Tamanho dos arquivos em bytes: ' + IntToStr(size); y := 10; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; S := 'Verificando o restante do arquivo...'; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; Seek(f,size div 2); S := 'Posio ' + IntToStr(FilePos(f)); Canvas.TextOut(5, y, S); CloseFile(f);

end;

O cdigo acima pega e exibe o tamanho de um arquivo.

IOResult
Retorna o status da tima operao I/O realizada. Sintaxe: IOResult : Integer; Exemplo:
var begin F: file of Byte; if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then MessageDlg('Tamanho do arquivo em bytes: ' + IntToStr(FileSize(F)), mtInformation, [mbOk], 0); else MessageDlg('Erro ao acessar arquivo ', mtWarning, [mbOk], 0); end;

end;

O cdigo acima retorna o status da ltima operao I/O.

Read
L um elemento de dado de um arquivo. Sintaxe: Read(Variavel); 73

Pascal para Delphi

Onde Variavel a varivel que ir conter os dados. Exemplo:


var nome : String; idade : Integer: begin end; read(nome); read(idade);

O cdigo acima faz a leitura de um nome e de uma idade qualquer.

Rename
Renomeia um arquivo externo. Sintaxe: Rename(Variavel); Onde Variavel uma varivel do tipo Pchar. Exemplo:
var begin f : file; OpenDialog1.Title := 'Escolha o arquivo... '; if OpenDialog1.Execute then begin SaveDialog1.Title := 'Renomear para...'; if SaveDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Canvas.TextOut(5, 10, 'Renomeando ' + OpenDialog1.FileName + ' to ' + SaveDialog1.FileName); Rename(f, SaveDialog1.FileName); end; end;

end;

O cdigo acima muda o nome de um arquivo j existente.

Reset
Abre um arquivo existente. Sintaxe: Reset(Variavel); Onde Variavel uma varivel do tipo File; Exemplo: 74

Pascal para Delphi var begin F: file; {$I-} AssignFile(F, FileName); FileMode := 0; Reset(F); CloseFile(F); {$I+} FileExists := (IOResult = 0) and (FileName <> ''); if FileExists(ParamStr(1)) then Canvas.TextOut(10, 10, 'Arquivo Encontrado') else Canvas.TextOut(10, 10, 'Arquivo no Encontrado');

end; begin

end;

O cdigo acima abre um arquivo existente, caso ele no exista exibida uma mensagem.

Rewrite
Cria e abre um novo arquivo. Sintaxe: Rewrite(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin F: TextFile; AssignFile(F, 'ARQUIVO.XXX'); Rewrite(F); Writeln(F, 'Texto'); CloseFile(F);

end;

O cdigo acima cria um arquivo com o nome de "ARQUIVO.XXX".

Seek
Move a posio corrente do arquivo at um "componente" especificado. Sintaxe: Seek(Variavel); Onde Variavel uma varivel do tipo Longint;
var f: file of Byte; size : Longint; S: string; y: integer;

75

Pascal para Delphi begin AssignFile(f); Reset(f); size := FileSize(f); S := 'Tamanho dos arquivos em bytes: ' + IntToStr(size); y := 10; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; S := 'Verificando o restante do arquivo...'; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; Seek(f,size div 2); S := 'Posio ' + IntToStr(FilePos(f)); Canvas.TextOut(5, y, S); CloseFile(f); end;

O cdigo acima pega e exibe o tamanho de um arquivo.

Truncate
Trunca o arquivo na posio corrente. Sintaxe: Truncate(Variavel); Onde Variavel uma varivel de arquivo exceto TextFile. Exemplo:
var f: file of Integer; i,j: Integer; begin AssignFile(f,'TESTE03.INT'); Rewrite(f); for i := 1 to 6 do Write(f,i); Writeln('Arquivo antes de ser truncado:'); Reset(f); while not Eof(f) do begin Read(f,i); Writeln(i); end; Reset(f); for i := 1 to 3 do Read(f,j); Truncate(f); Writeln; Writeln('Arquivo depois de ser truncado:'); Reset(f); while not Eof(f) do begin Read(f,i); Writeln(i); end; CloseFile(f); Erase(f);

end;

76

Pascal para Delphi

O cdigo acima trunca os arquivos na posio corrente.

Write
Grava um ou mais elementos de dados para o arquivo. Sintaxe: Write(arq'Texto'); Onde arq o arquivo onde queremos escrever o "Texto". Exemplo:
var begin arq : TextFile; AssignFile(arq); Reset(arq); Write(arq,'Texto Qualquer'); CloseFile(arq);

O cdigo acima armazenar em um determinado arquivo a string desejada.

Exemplo 20
Veja abaixo a declarao de uma varivel do tipo arquivo, e sua atribuio:
var begin end; MeuArq : FILE OF integer; AssingFile(MeuArq, `doc1.txt');

O programa abaixo abre um arquivo, verifica seu tamanho, e vai at a metade deste:
unit Unit1; interface var f: file of Byte; tamanho : Longint; S: String; y: integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin AssignFile(f, 'texto1.txt'); Reset(f); tamanho := FileSize(f); ShowMessage('Tamanho do Arquivo em Bytes ' + IntToStr(tamanho)); Seek(f,tamanho div 2); ShowMessage('A posio agora ' + IntToStr(FilePos(f))); CloseFile(f); end; end.

Manipulando Arquivos No-Tipados


77

Pascal para Delphi

Entre as rotinas de manipulao de arquivos binrios no tipados temos:

BlockRead
L um ou mais blocos de dados de um arquivo. Sintaxe: BlockRead(Variaveis); Onde Variaveis so variveis do tipo Integer, file e char. Exemplo:
var FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..2048] of Char; {buffer de 2K}

begin

if OpenDialog1.Execute then begin AssignFile(FromF, OpenDialog1.FileName); Reset(FromF, 1); if SaveDialog1.Execute then begin AssignFile(ToF, SaveDialog1.FileName); Rewrite(ToF, 1); Canvas.TextOut(10, 10, 'Copiando ' + IntToStr(FileSize(FromF))+ ' bytes...'); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); CloseFile(FromF); CloseFile(ToF); end; end; end;

O cdigo acima l um bloco de dados de 2K.

BlockWrite
Escreve um ou mais bloco de dados em um arquivo Sintaxe: BlockRead(Variaveis); Onde Variaveis so variveis do tipo Integer, file e char. Exemplo:
var FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..4096] of Char; {buffer de 4K}

begin

78

Pascal para Delphi if OpenDialog1.Execute then begin AssignFile(FromF, OpenDialog1.FileName); Reset(FromF, 1); if SaveDialog1.Execute then begin AssignFile(ToF, SaveDialog1.FileName); Rewrite(ToF, 1); Canvas.TextOut(10, 10, 'Copiando ' + IntToStr(FileSize(FromF))+ ' bytes...'); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); CloseFile(FromF); CloseFile(ToF); end; end; end;

No cdigo acima a funco BlockWrite grava 4K no arquivo..

Rotinas de Gerenciamento de Arquivos


O Pascal oferece inmeras rotinas para gerenciamento de arquivos. Atravs destas rotinas, voc pode criar, abrir ou apagar um arquivo, converter datas e extrair dados sobre um determinado arquivo.

ChangeFileExt
Muda a extenso do arquivo. Sintaxe: ChangeFileExt(Variavel); Onde Variavel uma varivel do tipo String. Exemplo:
INIFileName := ChangeFileExt(ParamStr(0), '.INI');

O cdigo acima muda a extenso de um arquivo para a extenso .INI.

DateTimeToFileDate
Converte a data do formato Delphi para o formato DOS. Sintaxe: DateTimeToFileDate(Variavel); Onde Variavel uma varivel do tipo DateTime. Exemplo:
var

79

Pascal para Delphi tempo : DateTime; begin DateTimeToFileDate(tempo);

O cdigo acima converte a varivel tempo para o formato DOS.

DeleteFile
Remove um arquivo. Sintaxe: DeleteFile(Constante); Onde Constante uma constante que contm o nome do arquivo. Exemplo:
if FileExists(FileName) then if MsgBox('Voc deseja realmente deletar o arquivo ' + ExtractFileName(FileName) + '?'), []) = IDYes then DeleteFile(FileName);

O cdigo acima apaga um determinado arquivo.

DiskFree
Retorna a quantidade de espao em disco livre. Sintaxe: DiskFree(Variaveis); Onde Variaveis so variveis do tipo String e Integer. Exemplo:
var S: string; AmtFree: integer; Total: integer;

begin

AmtFree := DiskFree(0); Total := DiskSize(0); S := IntToStr(AmtFree div Total) + 'total de espao livre em disco: ' (AmtFree div 1024) + ' Kbytes livres. '; Canvas.TextOut(10, 10, S); end;

O cdigo acima exibe a quantidade de espao em disco.

ExpandFileName
Retorna a string contendo o path e nome do arquivo. Sintaxe: 80

Pascal para Delphi

ExpandFileName(Variavel); Onde Variavel uma varivel do tipo String. Exemplo:


MyFileName := ExpandFileName(MyFileName);

O cdigo acima exibe o caminho completo do arquivo.

ExtractFileName
Retorna somente o nome do arquivo. Sintaxe: ExtractFileName(Constante); Onde Constante uma constante que contm o caminho e nome do arquivo. Exemplo:
FileName := ExtractFileName(FileName);

O cdigo acima exibe somente o nome do arquivo.

ExtractFileExt
Retorna somente a extenso do arquivo.
ExtractFileExt(Constante);

Onde Constante uma constante que contm o caminho e nome do arquivo. Exemplo:
FileName := ExtractFileName(FileName);

O cdigo acima exibe somente a extenso do arquivo.

ExtractFilePath
Retorna o path do arquivo especificado. Sintaxe: ExtractFilePath(Constante); Onde Constante uma constante que contm o caminho e nome do arquivo. Exemplo:
FileName := ExtractFilePath(FileName);

81

Pascal para Delphi

O cdigo acima exibe somente o caminho do arquivo.

FileAge
Retorna a idade do arquivo. Sintaxe: FileAge(Constante); Onde constante uma constante que possui a localizao do arquivo. Exemplo:
FileAge(idade);

O cdigo acima exibe a idade de um arquivo, mas para que isso possa funcionar, voc precisa converter a varivel para TDateTime.

FileCreate
Cria um arquivo com o nome especificado. Sintaxe: FileCreate(Constante); Onde Constante uma constante que especifica o nome do arquivo. Exemplo:
MyFileHandle := FileCreate('ARQUIVO.XXX');

O cdigo acima cria um arquivo com o nome de "ARQUIVO.XXX".

FileClose
Fecha o arquivo especificado. Sintaxe: FileClose(Constante); Onde Constante uma constante que contm a localizao do arquivo. Exemplo:
FileClose(arq);

O cdigo acima fecha um determinado arquivo.

FileExists
82

Pascal para Delphi

Retorna True se o arquivo existe. Sintaxe: FileExists(Constante); Onde constante uma constante que identifica o arquivo. Exemplo:
if FileExists(FileName) then if MsgBox('Do you really want to delete ' + ExtractFileName(FileName) + '?'), []) = IDYes then ShowMessage('Arquivo Encontrado');

O cdigo acima verifica a existncia de um arquivo.

FileGetAttr
Retorna atributos do arquivo. Sintaxe: GetFileAttr(Constante); Onde Constante uma constante de identificao de arquivo. Exemplo:
GetFileAttr(arq);

O cdigo acima retorna os atributos de um determinado arquivo.

FileRead
L de um arquivo especfico. Sintaxe: FileRead(Variaveis); Onde Variaveis so variveis do tipo inteiro. Exemplo:
ActualRead := FileRead(MyFileHandle, Buffer, SizeOf(Buffer));

O cdigo acima l um determinado nmero de bytes de um arquivo.

FileSearch
Procura atravs de diretrios por um arquivo especificado. Sintaxe: 83

Pascal para Delphi

FileSearch(Constante,ListadeDiretorios); Onde Constante uma constante que identifica o arquivo e ListadeDiretorios uma lista de diretrios em que deve ser feita a procura do arquivo. Exemplo:
FoundIt := FileSearch('TESTE04.TXT', MyAppDir+'\';'+WinDir+';'+WinDir+'\SYSTEM');

O cdigo acima procura o arquivo TESTE04.TXT em vrios diretrios.

FileSeek
Muda a posio corrente do arquivo. Sintaxe: FileSeek(Variaveis); Onde Variaveis so variveis do tipo Integer. Exemplo:
if FileSeek(MyFileHandle,0,2) = HFILE_ERROR then HandleFileError else AppendStuff;

O cdigo acima muda a posio corrente do arquivo.

FileSetAttr
Estabelece atributos do arquivo. Sintaxe: FileSetAttr(Constantes); Onde Constantes so constantes de definio do arquivo. Exemplo:
FileSetAttr(arquivo,1);

O cdigo acima estabelece os atributos de um determinado arquivo.

FileSetDate
Estabelece a data e hora do arquivo. Sintaxe: FileSetDate(Parametros); 84

Pascal para Delphi

Onde Parametros so os parmetros da funo. Exemplo:


function FileSetDate(Handle: Integer; Age: Integer): Integer;

O cdigo acima estabelece a data e hora de um determinado arquivo.

FileOpen
Abre um arquivo especificado. Sintaxe: FileOpen(Constante, Variavel); Onde Constante a constante que define o nome do arquivo, e Variavel a varivel que especifica o valor de retorno. Exemplo:
procedure OpenForShare(const FileName: String); var FileHandle : Integer; begin FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone); if FileHandle > 0 then [Arquivo Vlido} else [Erro ao Abrir: FileHandle = erro] end;

O cdigo acima abre um determinado arquivo.

FileWrite
Grava em um arquivo especificado. Sintaxe: FileWrite(Parametros)Integer; Onde Parametros so os parmetros da funo. Exemplo:
function FileWrite(Handle: Integer; const Buffer; Count: Integer): Integer;

O cdigo acima grava em um determinado nmero de bytes em um arquivo.

FindClose
Termina uma sequencia de FindFirst/FindNext. Sintaxe: 85

Pascal para Delphi

FindClose(Variavel); Onde Variavel uma varivel do tipo TSearchRec. Exemplo:


var begin end; SearchRec: TSearchRec; FindClose(SearchRec);

O cdigo acima localliza finaliza uma seqncia FindFirst/FindNext.

FindFirst
Pesquisa no diretrio por um arquivo especfico. Sintaxe: FindFirst(Parametros): Integer; Onde Parametros so os parmetros da funo. Exemplo:
FindFirst('c:\Windows\*.*', faAnyFile, SearchRec); Label1.Caption := SearchRec.Name + ' tem ' + IntToStr(SearchRec.Size) + ' bytes ';

O cdigo acima localiza todos os arquivos do diretrio Windows.

FindNext
Retorna a prxima entrada que combina com o nome e atributos. Sintaxe: FindNext(Variavel): Integer; Onde Variavel uma varivel do tipo TSearchRec. Exemplo:
if (FindNext(SearchRec) = 0) then Label1.Caption := SearchRec.Name + ' tem ' + IntToStr(SearchRec.Size) + ' bytes ';

O cdigo acima procura outro arquivo.

RenameFile
Renomeia um arquivo. Sintaxe: 86

Pascal para Delphi

RenameFile(Constantes); Onde Constantes so as constantes que contm o nome atual do arquivo e no novo nome. Exemplo:
if not RenameFile('OLDNAME.TXT','NEWNAME.TXT') then ErrorMsg('Erro ao renomear arquivo!');

O cdigo acima muda o nome do arquivo OLDNAME.TXT para

Exemplo 21
O programa abaixo apaga um arquivo especificado, se este existir:
unit Unit1; interface .... implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin if FileExists('texto1.txt') then begin ShowMessage('O arquivo '+ ExtractFileName( 'texto1.txt') + ' ser apagado!'); DeleteFile('texto1.txt'); end; end; end.

Outras Rotinas de Manipulao de Arquivos


GetDir
Retorna o diretrio corrente do drive especificado. Sintaxe: GetDir(Variavel); Onde Variavel uma varivel do tipo String; Exemplo:
var begin end; s : string; GetDir(0,s); { 0 = Drive Corrente} MessageDlg('Drive e diretrio corrente: ' + s, mtInformation, [mbOk] , 0);

O cdigo acima exibe o nome do drive e diretrio corrente.

MkDir
Cria um novo subdiretrio no path especificado. 87

Pascal para Delphi

Sintaxe: MkDir(Variavel); Onde Variavel uma varivel do tipo String. Exemplo:


begin {$I-}

MkDir(Edit1.Text); if IOResult <> 0 then MessageDlg('No possvel criar diretrio', mtWarning, [mbOk], 0) else MessageDlg('Novo diretrio criado', mtInformation, [mbOk], 0);

end;

O cdigo acima cria um novo diretrio.

ChDir
Muda o diretrio corrente para o path especificado. Sintaxe: ChDir(Variavel); Onde Variavel uma varivel do tipo String. Exemplo:
begin {$I-}

ChDir(Edit1.Text); if IOResult <> 0 then MessageDlg('Diretrio no encontrado', mtWarning, [mbOk], 0);

end;

O cdigo acima muda o diretrio corrente.

RmDir
Deleta um subdiretrio vazio. Sintaxe: RmDir(Variavel); Onde Variavel uma varivel do tipo String. Exemplo:
begin {$I-}

RmDir(Edit1.Text); if IOResult <> 0 then

88

Pascal para Delphi MessageDlg('No possvel remover diretrio', mtWarning, [mbOk], 0) else MessageDlg('Diretrio removido', mtInformation, [mbOk], 0); end;

O cdigo acima deleta um diretrio vazio.

Exemplo 22
O programa abaixo cria um diretrio chamado MeuDiretorio:
unit Unit1; interface .... implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin MkDir('c:\MeuDiretorio'); if IOResult <> 0 then ShowMessage('No foi possvel criar o diretrio!') else ShowMessage('Diretrio criado com sucesso!'); end; end.

Imprimindo Arquivos
Para imprimir arquivos, utilize o comando AssignPrn. Sintaxe: procedure AssignPrn(var F: Text; Device, Driver, Port: PChar); Este comando atribui varivel F a impressora. Se Device for nil, Driver e Port so ignoradas, e o comando AssignPrn mandar o texto para a impressora default. Aps a atribuio, voc deve utilizar o comando Rewrite. Assim, toda vez que a aplicao enviar dados para F, os dados so enviados para a impressora. Como o comando AssignPrn pertence unit Printers, voc deve acrescentar esta unit clusula uses da seo interface de sua unit.

Exemplo 23
O exemplo abaixo imprime uma frase na impressora default:
unit Unit1; interface uses .........., Printers; var Arq1: TextFile; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin

89

Pascal para Delphi Arq1 := 'c:\texto1.txt'; AssignPrn(Arq1); Rewrite(Arq1); Writeln(Arq1, 'Imprima este texto'); CloseFile(Arq1); end; end.

Objetos
Usamos o termo objeto para representar uma determinada entidade do mundo real. Exemplos de objetos so: 90

Pascal para Delphi

Coisas (um livro, uma estante) Funes (Vendedor, Cliente, etc) Eventos Interaes Lugares

O conceito de objetos baseia-se no princpio de abstrao. Atravs da abstrao, podemos dividir um determinado problema em partes, para estud-las separadamente. Na metodologia orientada, dividiremos o problema em objetos. importante ressaltar que a metodologia estruturada tambm utilizava o princpio da abstrao, mas sua nfase era na procura dos processos que envolviam o problema, e no nos objetos que o compunham. Observe que tivemos o cuidado de colocar o artigo na frente de cada objeto, pois um objeto representa um elemento apenas, uma determinada entidade. No entanto, um objeto pode ser uma entidade composta, como uma estante (composta de livros, prateleiras, titulo, assunto, indice, etc). Em geral a maioria dos objetos so realmente compostos, pois sempre podemos dividi-lo em partes menores at chegarmos a elementos realmente atmicos (indivisveis). Um sistema seria ento um grande objeto composto de outros objetos, formando um mecanismo.

O Sistema de Gerenciamento de Biblioteca


Para entendermos melhor os conceitos ligados a orientao a objetos, vamos utilizar como exemplo um sistema de Gerenciamento de Biblioteca, cujo objetivo administrar as publicaes (livros e revistas) de uma biblioteca fictcia e seus usurios, assim como as movimentaes realizadas pelos usurios (emprstimos e devolues). No Sistema de Gerenciamento de Biblioteca, teramos os seguintes objetos:

publicaes; usurios; movimentaes.

Atributos ou Propriedades
Representam as caractersticas do objeto. Por exemplo, o objeto caneta possui as caractersticas tamanho, cor, tipo de escrita. So seus atributos. Os atributos, ou sejam as caractersticas dos objetos, podem ser fixos ou variveis. O estado de um objeto o valor de determinado atributo em um dado instante. Por exemplo, uma estante em um determinado momento pode estar vazia. Logo aps, colocam-se alguns livros nela, modificando seu estado para uma estante com livros. Um evento corresponde a um estmulo externo, que pode provocar a transio de um estado para outro, ou seja, pode modificar as propriedades de determinado objeto. No Sistema de Gerenciamento de Biblioteca, o objeto publicaes teria como atributos (ou seja, caractersticas) identificador, editora, ttulo, tipo (se livro ou revista), e presena (se est na biblioteca ou no). O objeto usurios teria como atributos identificador, nome, endereo, e usufruto (se est com uma publicao ou no). O objeto movimentaes teria como atributos data, identificador do usurio, identificador da publicao, e tipo (emprstimo ou devoluo). 91

Pascal para Delphi

Note que os atributos usufruto, do objeto usurio, e presena, do objeto publicaes, podem mudar de valor de acordo com um evento. Por exemplo, se o usurio pegar uma publicao emprestada, dando origem a um evento, o atributo usufruto passa para Sim, indicando que o usurio agora possui um livro emprestado, e o atributo presena passa para No, indicando que a publicao no est mais na biblioteca. Ou seja, estes atributos sofrem uma transio, uma mudana de estado devido a um evento..

Servios ou Mtodos
So as funes que operam sobre o objeto. Por exemplo, com o objeto caneta podemos escrever, desenhar, presentear. So as funes oferecidas pelo objeto caneta. Quando um objeto executa um servio (uma funo), dizemos que ele apresenta um determinado comportamento, ou seja, uma reao. O comportamento do objeto ser resultado da ao efetuada sobre ele, e da funo que esta ao chamou. Por exemplo, tanto o rdio quanto a TV possuem um boto para lig-los. Quando apertamos este boto (ou seja, efetuamos uma ao sobre este objeto), o comportamento apresentado por ambos diferente, j que o servio (funo) chamado por esta ao diferente: ligar o rdio significa emitir som; ligar a TV significa emitir som e imagem. Um evento, ou seja, um estmulo externo, tambm pode estimular o objeto a executar determinado servio. No Sistema de Gerenciamento de Biblioteca, todos os objetos poderiam ser cadastrados, ou seja, inseridos, alterados, excludos e consultados:

Classes
Uma classe representa um conjunto de objetos que possuem caractersticas e comportamentos comuns. Como vimos, o mecanismo de classificao um dos mtodos que facilita a compreenso do sistema como um todo. Cada objeto classificado em uma determinada classe, de acordo com suas caractersticas e comportamentos. Chamamos o objeto de instncia de uma determinada classe, o que significa que ele possui o comportamento e as caractersticas definidos pela classe para suas instncias. A instanciao o processo contrrio ao de classificao, e consiste em criar um novo objeto a partir de uma classe. 92

Pascal para Delphi

A nfase da metodologia de orientao a objetos ser dada na definio de classes, e no de objetos, como se poderia pensar pelo nome. No nosso exemplo de Gerenciamento de Biblioteca , aps encontrarmos os objetos, criaramos as classes. Cada publicao da estante seria classificado como um objeto da classe Publicaes, j que possuiria os mesmos atributos e servios. Note que o contedo de cada atributo ir variar para cada objeto (cada publicao tem uma editora diferente), mas todos possuem os mesmos atributos (todas as publicaes possuem uma editora). J um usurio no ir pertencer a classe Publicaes, pois, apesar de oferecer os mesmos servios, no possui os mesmos atributos (no possui editora, por exemplo). Todo objeto pertence a apenas uma classe ao longo de sua existncia, no podendo modificar sua classificao.

Varivies de Instncia
Os atributos de uma classe tambm podem ser objetos. Neste caso, estes atributos so chamados de variveis de instancia. Por exemplo, a classe Publicaes contm os atributos identificador, editora, ttulo, presena e tipo. Se for do interesse do analista, poderamos transformar o atributo editora em uma classe: a classe Editora, com atributos nome e endereo. Ou seja, a classe Publicaes teria como atributos identificador, ttulo, presena, tipo e um objeto da classe editora:

Encapsulamento
Como vimos no captulo anterior, encapsulamos detalhes de sistemas complexos para melhor compreendlos. Na metodologia de orientao a objetos, encapsulamos atributos e servios dentro das classes. O analista oferece ao programador, por exemplo, a classe Publicaes, mostrando quais os atributos dos objetos desta classe, e quais os servios oferecidos por esta. Mas o programador no tem acesso a implementao desses atributos e servios (ou seja, acesso as linhas de cdigo que os controla). Estes dados esto encapsulados, ou seja, escondidos do programador.

Relacionamento entre Classes


Como vimos, as classes so criadas aps a obteno dos objetos. Novas classes podem ser criadas, ao analisarmos o relacionamento existente entre as classes j encontradas.

Generalizao/Especializao
Especializao quando, dada uma determinada classe ou categoria, criamos uma outra, com novos atributos ou servios que a tornam mais restrita. 93

Pascal para Delphi

Generalizao a operao inversa, ou seja, a remoo de uma ou mais caractersticas de determinada classe, de modo a formar uma classe mais abrangente. Por exemplo, podemos criar a classe Livros e a classe Revistas, ao especilizarmos a classe Publicaes. A classe Livros, por exemplo, teria todos os atributos da classe Publicaes mais o atributo autor. J a classe Revista teria todos os atributos da classe Publicaes mais o atributo perodo. Assim, a classe Livros e a classe Revistas seriam especializaes da classe Publicaes:

Em outro exemplo, Estudante de Graduao e Estudante de Ps Graduao podem ser considerados especializaes da classe Estudante. Esta categoria considerada uma generalizao das duas primeiras. Herana o mecanismo pelo qual uma classe obtm as caractersticas de outra classe para expandi-la ou especializa-la de alguma forma, em um relacionamento de generalizao/especializao. Quando definimos uma classe podemos defini-la como sendo uma sub-classe de outra j definida, constituindo assim uma relao de herana entre elas. A classe da qual estamos herdando caractersticas ser ento chamada de superclasse (ou classe base) da nova classe. Em nosso exemplo, a classe Publicaes seria a superclasse (ou classe base) das classes Livros e Revistas. Atravs do mecanismo de herana simples criamos um nova classe baseada apenas em uma nica superclasse. J na herana multipla, criamos uma nova classe baseada em duas ou mais super-classes, acrescentando novos atributos ou servios.

Agregao/Decomposio (Todo / Parte)


Agregar significa juntar, colar, grudar. Neste contexto, dizemos que agregao o ato de agregar duas ou mais classes para formar uma nova classe. Decomposio equivale a diviso. Decompor uma classe significa dividi-la em vrias classes menores e mais simples (refinamentos sucessivos). o processo oposto agregao. Como vimos em nosso exemplo, a classe Publicaes possui o atributo Editora. Como fizemos, poderamos transformar o atributo Editora em uma nova classe. A classe Editora conteria os atributos nome e endereo. A classe Editora "faria parte", ou seja, estaria agregada classe Livro, caracterizando um relacionamento Todo/Parte entre as classes Publicaes e Editora. 94

Pascal para Delphi

Em outro exemplo, podemos dizer que as categorias Nome e Endereo agregadas formam a categoria Estudante. J a decomposio da categoria Estudante resulta nas categorias Nome e Endereo.

Mensagens
Como vimos no captulo anterior, um sistema complexo s funciona atravs da cooperao entre suas partes. Esta cooperao feita atravs do envio de mensagens. Transportando esta imagem para o modelo de orientao a objetos, podemos dizer que um objeto se comunica com outro atravs do envio de mensagens. Para entender melhor o conceito de mensagens, vamos supor que um usurio de nossa biblioteca queira pegar um livro emprestado. O primeiro procedimento da bibliotecria ser verificar se o usurio j est cadastrado na biblioteca. Para essa verificao, o objeto Movimentao enviar uma mensagem para o objeto Usurio: Verificar Usurio. Ao receber esta mensagem, o objeto Usurio dar incio ao servio VerificaUsurio(), devolvendo uma resposta (ou seja, tendo um determinado comportamento): o usurio est cadastrado ou no.

Acoplamento Dinmico
Como vimos, ao receber uma mensagem o objeto ter um determinado tipo de comportamento, de acordo com o servio chamado pela mensagem. Ao receber uma mensagem, o objeto verificar se h na classe a qual ele pertence um servio que defina seu comportamento perante esta mensagem. Caso ele no encontre, verificar nas super-classes da classe (ou seja, nas classes que a originaram) se alguma delas possui um servio que responda aquela mensagem. Este mecanismo de busca de servios chamado de acoplamento dinmico.

95

Pascal para Delphi

O mecanismo de acoplamento dinmico importantssimo para a flexibilidade do modelo de objetos, porque evita que voc tenha que definir o mesmo servio em todas as classes. Basta defin-lo na classe de origem.

96

Pascal para Delphi

Orientao a Objetos em Pascal


Para criarmos um objeto em Pascal utilizamos a palavra reservada object. O Delphi, no entanto, no lugar de object, utiliza a palavra reservada class, porque na realidade criamos uma classe em Delphi, e no apenas um objeto. Apesar de similar ao tipo de dado record (registro), uma classe pode ter, alm de dados, procedures, e funes. Os dados correspondem aos atributos ou propriedades da classe; j as procedures ou funes correspondem aos mtodos ou servios da classe, conforme definio vista no captulo anterior. Criamos a classe na clusula type da seo interface da unit: type nome_classe = class dado1 : tipo_do_dado; dado2 : tipo_do_dado; ..... declarao da funo construtora; declarao das procedures e funes da classe; end;

A funo construtora e as demais funes devem ser implementadas na seo implementation da unit: implementation funo construtora; begin .... end; implementao das outras funes; begin ... end; end. A funo construtora usada para inicializar todas as variveis dentro da classe e fazer qualquer outra operao que precisa ser feita pelo objeto desta classe. O Pascal utiliza o mtodo Init, para a funo construtora. J o Delphi utiliza o mtodo Create:
constructor Create(....);

Note que na implementao dos mtodos da classe devemos usar a seguinte sintaxe:
procedure classe.nome_procedure (parmetros);

Para usarmos a classe criada, precisamos criar uma varivel do tipo da classe criada, ou seja, precisamos criar um objeto daquela classe. Isso feito na seo var da unit: 97

Pascal para Delphi var nome_varivel : nome_classe;

As variveis do tipo da classe so tambm chamadas de instncias da classe. Vamos criar uma varivel para manipularmos os atributos e mtodos da classe TRetangulo, definida anteriormente:
var Ret1 : TRetangulo;

Aps criarmos uma varivel do tipo da classe, precisamos separar um espao na memria para ela. Isto feito atravs da chamada a funo construtora da classe:
variavel_da_classe := classe.Create;

Por exemplo:
Ret1 := TRetangulo.Create;

Podemos, ento, manipular seus atributos e mtodos. Isto feito utilizando-se a seguinte sintaxe:
variavel.atributo;

ou
variavel.metodo;

Como vimos anteriormente, as units so conjuntos de procedimentos e funes que podem ser usadas por diversos programas, aumentando a produtividade do desenvolvimento. Uma classe pode (e deve) ser criada em sua prpria unit, de forma que voc no precise reconstru-la toda vez que for us-la. Basta acrescentar o nome de sua unit clusula uses da unit que a vai usar.

Exemplo 24
Vamos criar uma classe TRetangulo, que conter dois atributos, altura e largura, e dois mtodos, um para atribuir valores para os atributos, e outro que calcula a rea do objeto Retangulo:
unit Unit1; interface type TRetangulo = class altura : integer; largura : integer; constructor Create(alt, larg : integer); procedure AtribuiDados(alt, larg : integer); function CalculaArea : integer; end; implementation constructor TRetangulo.Create(alt, larg : integer); begin altura := alt; largura := larg; end; procedure TRetangulo.AtribuiDados( alt, larg:integer); begin altura := alt;

98

Pascal para Delphi largura := larg; end; function TRetangulo.CalculaArea : integer; begin CalculaArea := altura * largura; end; end.

Criamos, portanto, uma classe TRetangulo que possui dois atributos: largura e altura, uma funo construtora, que inicializa estes atributos, e dois mtodos. O primeiro mtodo AtribuiDados, atribui aos atributos determinado valor. O segundo mtodo, CalculaArea, calcula a rea do retangulo, ao multiplicar os valores de altura e largura. Vamos agora utilizar a classe TRetangulo criada:
unit Unit1; interface type TRetangulo = class altura : integer; largura : integer; constructor Create(alt, larg: integer); procedure AtribuiDados(alt, larg : integer); function CalculaArea : integer; end; var Pequeno,Medio,Grande: TRetangulo; implementation constructor TRetangulo.Create(alt , larg : integer); begin altura := alt; largura := larg; end; procedure TRetangulo.AtribuiDados( alt, larg : integer); begin altura := alt; largura := larg; end; function TRetangulo.CalculaArea : integer; begin CalculaArea := altura * largura; end; procedure TForm1.FormCreate (Sender: TObject); begin Pequeno:=TRetangulo.Create(8,8); Medio:=TRetangulo.Create(10,12); Grande := TRetangulo.Create(15,20); ShowMessage('A rea do retangulo pequeno ' + InttoStr( Pequeno.CalculaArea)); ShowMessage('A rea do retangulo mdio ' + InttoStr( Medio.CalculaArea)); ShowMessage('A rea do retangulo grande ' + InttoStr( Grande.CalculaArea)); end; end.

Ou seja, criamos a classe TRetangulo e, para manipul-la, criamos trs objetos: Pequeno, Medio e Grande, todos do tipo TRetangulo. Chamamos ento o mtodo Create da classe TRetangulo, que inicializa seus atributos com os parmetros passados. Por exemplo, para a instancia Pequeno, inicializamos o retngulo com os valores 8 de altura e 8 de largura. Fazemos o mesmo para as instancias Medio e Grande da classe TRetangulo. 99

Pascal para Delphi

Depois, calculamos a rea do retangulo, atravs da chamada ao mtodo CalculaArea da classe TRetangulo, que multiplica os valores da largura e altura atribuidas no mtodo de inicializao. Por exemplo, para o retangulo pequeno, cuja altura e largura foram inicializadas com o valor de 8, temos uma rea de 64. Este valor mostrado ento na tela, atravs do comando ShowMessage. Repetimos o procedimento anterior para as demais instancias da classe TRetangulo. Como novo exemplo, vamos criar uma unit que utilize a classe de nome TVeiculo, armazenado em uma unit denominada Unidade3. Inicialmente, vamos criar a unit, e nela construir o objeto TVeiculo. Este objeto possui dois atributos, Peso e Pneus, um mtodo construtor, e um mtodo que calcula o peso carregado por cada pneu:
unit Unidade3; interface type TVeiculo = class Pneus : integer; Peso : real; constructor Create(n_pneus: integer; n_peso: real); function AtribuiPneus : integer; function AtribuiPeso : real; function CarregamentoPneus : real; end; implementation constructor TVeiculo.Create( n_pneus : integer; n_peso : real); begin Pneus := n_pneus; Peso := n_peso; end; function TVeiculo.AtribuiPneus : integer; begin AtribuiPneus := Pneus; end; function TVeiculo.AtribuiPeso : real; begin AtribuiPeso := Peso; end; function TVeiculo.CarregamentoPneus : real; begin CarregamentoPneus := Peso/ Pneus; end; end.

No esquea de salvar esta unit criada, atravs do comando File | Save, dando a ela o nome Unidade3.pas. Se voc no salv-la, no poder acrescent-la clusula uses da unit que a usar. Agora, vamos criar a unit que usa a classe TVeiculo criada na unit Unidade3. Note que inclumos a unit Unidade3 na clusula uses:
unit Unit1; interface uses Unidade3; var Veic1 : TVeiculo; implementation {$R *.DFM} procedure TForm1.FormCreate( Sender: TObject); begin Veic1 := TVeiculo.Create(1,50); ShowMessage('O veiculo pesa ' + FloattoStr(Veic1.AtribuiPeso) + ' quilos, e possui ' + FloattoStr(Veic1.Pneus) + 'pneus.');

100

Pascal para Delphi end; end.

101

Você também pode gostar