Você está na página 1de 35

Apostila de Delphi

Marcos Ribeiro

A linguagem Object Pascal


A linguagem de programao PASCAL foi criada para ser uma ferramenta educacional, isto no incio da
dcada de 70 pelo Prof. Niklaus Wirth da Universidade de Zurique. Foi batizada pelo seu idealizador em
homenagem ao grande matemtico Blaise Pascal, inventor de uma das primeiras mquinas lgicas
conhecidas. Foi baseada em algumas linguagens estruturadas existentes na poca, ALGOL e PLI.
Apesar de seu propsito inicial, o PASCAL comeou a ser utilizado por programadores de outras
linguagens, tornando-se, para surpresa do prprio Niklaus, um produto comercial. Contudo, somente ao final
de 1983 foi que a empresa americana Borland International lanou o TURBO PASCAL.
A linguagem Object Pascal a linguagem por trs de quase todas as partes de um aplicativo no Delphi. Os
arquivos de projeto e as Units, como j vimos, so escritos em Object Pascal. O cdigo usado para criar os
componentes predefinidos do Delphi tambm praticamente todo nessa linguagem.
Nos captulos anteriores usamos vrias vezes pequenas partes da linguagem Object Pascal (dentro do
cdigo para os eventos, por exemplo). Neste captulo veremos como usar recursos mais avanados da
linguagem e como criar programas que no dependam somente da interface com o usurio.

Elementos Bsicos
Entendendo identificadores
Identificadores (Identifiers) so os nomes que identificam os elementos de um programa em Object Pascal.
Exemplos de identificadores so nomes de variveis, constantes, procedures, functions e componentes. Em
Object Pascal todos os identificadores usados devem ser declarados. Quando voc declara um
identificador, voc est definindo um tipo para ele (como inteiro, String, etc.).
Um identificador deve seguir as seguintes regras bsicas:

Um identificador pode ter at 63 caracteres. Qualquer caractere que passe desse limite ignorado
pelo compilador do Delphi.

Identificadores devem comear sempre com letras, ou com o caractere de sublinhado (_). Um identificador no pode comear com um nmero. Os outros caracteres de um identificador (do segundo
em diante) podem ser letras, nmeros ou sublinhados. Nenhum outro caractere permitido.

Um identificador no pode ser uma palavra reservada da linguagem Object Pascal (como begin, if
ou end, por exemplo).

Apostila de Delphi

Marcos Ribeiro

Palavras reservadas
So palavras que tm um sentido predeterminado na linguagem e no podem ser usadas como
identificadores.
ABSOLUTE

END

INLINE

PROCEDURE

TYPE

AND

EXTERNAL

INTERFACE

PROGRAM

UNIT

ARRAY

FILE

INTERRUPT

RECORD

UNTIL

BEGIN

FOR

LABEL

REPEAT

USES

CASE

FORWARD

MOD

SET

VAR

CONST

FUNCTION

NIL

SHL

WHILE

DIV

GOTO

NOT

SHR

WITH

DO

IF

OF

STRING

XOR

DOWNTO

IMPLEMENTATION

OR

THEN

ELSE

IN

PACKED

TO

Expresses Aritmticas
So expresses onde utilizamos os nmeros inteiros ou reais como operandos e os operadores aritmticos,
dando sempre como resultado valores numricos.

Operadores Aritmticos
Os operadores aritmticos representam as operaes mais comuns da matemtica. So eles:
Operador
+
*
/
DIV
MOD

Operao
Adio
Subtrao
Multiplicao
Diviso Real
Diviso Inteira
Resto da Diviso

Operandos
Inteiro, Real
Inteiro, Real
Inteiro, Real
Inteiro, Real
Inteiro
Inteiro

Exemplos:
Expresso
1+2
5.0 - 1
2 * 1.5
5/2
5 DIV 2
5 MOD 2

Resultado
3
4.0
3.0
2.5
2
1

Prioridades
2

Resultado
Inteiro, Real
Inteiro, Real
Inteiro, Real
Real
Inteiro
Inteiro

Apostila de Delphi

Marcos Ribeiro

Em uma expresso aritmtica, a ordem de avaliao dos operadores obedece a tabela abaixo:
Prioridade
1
2

Operadores
* / DIV MOD
+ -

OBSERVAES:

a) Quando existe em uma expresso operadores com a mesma prioridade, a execuo da esquerda para
direita.

b) Caso seja necessrio alterar a ordem de prioridade, deve-se utilizar parnteses. A expresso entre parnteses ter prioridade mxima. Caso haja parnteses aninhados, a ordem de execuo ser do mais
interno para o mais externo.
EXEMPLOS:
2 + 3 / 2 = 2 + 1.5 = 3.5
(2 + 3) / 2 = 5 / 2 = 2.5

Funes e Procedimentos Predefinidos


So subprogramas j prontos disposio dos usurios, para o clculo das funes matemticas mais
comuns.
Funo

Finalidade

ABS(X)
FRAC(X)
TRUNC(X)
ROUND(X)
SQR(X)
SQRT(X)
LN(X)
EXP(X)

Valor Absoluto
Parte Fracionria
Parte Inteira
Valor Arredondado
Eleva ao quadrado
Raiz quadrada
Logaritmo Natural
Exponencial

Tipo do
argumento
Inteiro, Real
Real
Real
Real
Inteiro, Real
Inteiro, Real
Real
Real

Tipo do
resultado
o mesmo do argumento
Real
Inteiro
Inteiro
o mesmo do argumento
Real
Real
Real

Como no existe em Pascal um operador nem uma funo especfica para a operao de Potenciao,
podemos consegu-la utilizando as funes LN(X) e EXP(X). Para calcular o valor de XN suficiente usar:
EXP(LN(X)*N)
Exemplos:
Expresso
ABS(-2.5)
ABS(8)
FRAC(5.234)
TRUNC(2.78)
ROUND(2.78)
SQR(2)
SQR(1.5)
SQRT(4)
SQRT(2.25)
EXP(LN(2)*3)

Resultado
2.5
8
0.234
2
3
4
2.25
2.0
1.5
8

Apostila de Delphi

Marcos Ribeiro

Expresses Lgicas
As operaes lgicas podem ser consideradas afirmaes que sero testadas pelo computador, tendo como
resultado, um valor verdadeiro ou falso. So utilizadas com os operadores relacionais e lgicos.

Operadores Relacionais
So usados na comparao de duas expresses de qualquer tipo, retornando um valor lgico (TRUE ou
FALSE) como resultado da operao.
Operador
=
>
<
>=
<=
<>

Operao
igual
maior
menor
maior ou igual
menor ou igual
diferente

Obs: as operaes lgicas s podem ser efetuadas com relao a valores do mesmo tipo.
Exemplos:
Expresso
1=2
'A' = 'a'
5>2
3 <= 3
TRUE < FALSE
'JOAO' > 'JOSE'
2 + 3 <> 5
'comp' <> 'COMP'
'11' < '4'

Resultado
FALSE
FALSE
TRUE
TRUE
FALSE
FALSE
FALSE
TRUE
TRUE

Operadores Lgicos
So usados para combinar expresses lgicas.
Operador
not
and
or

Operao
no (negao)
e (conjuno)
ou (disjuno)

Apostila de Delphi

Marcos Ribeiro

A tabela verdade (abaixo) apresenta o resultado de cada operador lgico, com os valores dados para as
expresses lgicas A e B:
A
TRUE
TRUE
FALSE
FALSE

B
TRUE
FALSE
TRUE
FALSE

A and B
TRUE
FALSE
FALSE
FALSE

A or B
TRUE
TRUE
TRUE
FALSE

not A
FALSE
FALSE
TRUE
TRUE

not B
FALSE
TRUE
FALSE
TRUE

Prioridade
Em uma expresso lgica, a ordem de avaliao dos operadores segue a tabela abaixo:
Prioridade
1
2
3
4

Operadores
NOT
AND
OR
= > < >= <= <>

Como a ordem de precedncia dos operadores lgicos maior que a dos operadores relacionais, devem
sempre ser usados parnteses quando se escrever uma expresso lgica complexa. Por exemplo:
( A > B ) OR ( B = C )

Declarando variveis
A declarao de uma varivel define o nome e o tipo da varivel. Declaraes de variveis devem ser
precedidas pela palavra-chave var. As declaraes, junto com a palavra-chave var constituem o chamado
bloco var.
Declaraes devem ser agrupadas no incio do programa, ou no incio de uma procedure ou function (antes
da palavra-chave begin).
O programa (trivial) abaixo mostra um exemplo de declarao de variveis. So declaradas trs variveis
inteiras (X, Y e Soma). Assume-se que h dois componentes Edit no formulrio, onde so digitados os dois
valores a serem somados. As funes StrToInt e IntToStr convertem o tipo de String para o Integer (Inteiro)
e de Integer para String, respectivamente. Um caixa de mensagem exibida no final, com o resultado da
soma.
procedure TForm1.Button1Click(Sender: TObject);
var
X,Y : Integer;
Soma: Integer;
begin
X := StrToInt(Edit1.Text);
Y := StrToInt(Edit2.Text);
Soma := X + Y;
ShowMessage('Soma = ' + IntToStr(Soma));
end;

Apostila de Delphi

Marcos Ribeiro

Declarando constantes
Constantes so usadas em programas para armazenar valores que no podem (ou no devem) ser
alterados em um programa. Declaraes de constantes devem ser precedidas pela palavra-chave const. As
declaraes das constantes, junto com a palavra-chave const constituem o chamado bloco const.
Ao contrrio das variveis, as constantes devem ter seus valores definidos logo na declarao. Alm disso,
os tipos das constantes no so definidos explicitamente. Eles so deduzidos pelo Delphi, de acordo com o
valor definido para cada constante. Veja alguns exemplos:
const
Altura = 100;
Largura = 200;
VelocidadeMaxima = 225.17;
Titulo
= Ecossistemas;
Aqui, as constantes "Altura" e "Largura" so armazenadas com tipo Integer, "VelocidadeMaxima" com tipo
Real (ou Double) e "Titulo" com tipo String.
Note como usado o smbolo "=" para definir os valores para as constantes e no o smbolo de atribuio:
":=".

Comentrios
Um comentrio usado para aumentar a clareza de um programa, embora no seja analisado pelo
computador.
Comentrio Simples para uma nica linha: //
Comentrio de Mltiplas linhas: { }
Ex:
{
************** PROGRAMA REAJUSTA SALRIO *****************
Finalidade.......: Calc. o reajuste de um salrio em 20%
Verso...........: 1.0.1
ltima Alterao.: 12/02/2008
***********************************************************
}
Program REAJUSTE_SALARIO;
{
Uses
Crt;
Const
IND = 0.20; //indice do reajuste}
Var
SAL_ATUAL, //salario atual
SAL_NOVO, //novo salario
AUMENTO: Real; //valor do aumento
Begin
{leitura do salario atual}
write('Digite o salario atual: ');
readln(SAL_ATUAL);
{calculo do reajuste}
AUMENTO := SAL_ATUAL * IND;
SAL_NOVO := SAL_ATUAL + AUMENTO;
{exibicao do resultado}
writeln('Novo Salario = ',SAL_NOVO:10:2);
End.

Apostila de Delphi

Marcos Ribeiro

Formato de Programa Pascal


Pascal uma linguagem altamente estruturada que possui uma rigidez definida, embora sua estrutura de
programa seja flexvel. Cada seo ou parte de um programa em Pascal deve aparecer numa seqncia
apropriada e ser sistematicamente correta, seno ocorrer um erro.
Por outro lado, no Pascal no h regras especficas para o uso de espao, linhas quebradas, requisies e
assim os comandos podem ser escritos no formato livre em quase todos os estilos em que o programador
deseja utilizar.
Um programa escrito em Pascal tem o seguinte formato:
PROGRAM <identificador>;
<bloco>.
O <bloco>, por sua vez, est dividido em seis reas, onde somente a ltima obrigatria e devem obedecer
a seqncia abaixo. So elas:

rea de declarao de uso de unidades


rea de declarao de tipos

rea de declarao de constantes


rea de declarao de variveis
rea de declarao de procedimentos e funes
rea de comandos
Declarao de uso de unidades
Um programa Object Pascal pode fazer uso de algumas unidades padro que esto disponveis no Sistema,
tais como: SysUtils, Windows, DOS, PRINTER, GRAPH, etc.
A rea de declarao de uso de unidades possui o seguinte formato:
USES

<unidade> , ... , <unidade> ;

EXEMPLO:
USES SysUtils;
Declarao de Tipos
Serve para definirmos novos tipos e estruturas de dados. No detalharemos esse tpico agora por ser
assunto dos prximos captulos.
Ex:

type
TDiaUtil
= (Segunda, Terca, Quarta, Quinta, Sexta);
TFabricante = (Chevrolet, Ford, Volkswagen);
TSexo
= (Masculino, Feminino);

Apostila de Delphi

Marcos Ribeiro

Declarao de Procedimentos e Funes


Nesta rea so definidos os procedimentos e funes utilizados pelo programa. Tambm um assunto que
ser detalhado mais adiante.
Ex:

function Dobro1(Numero: Integer): Integer;


begin
Dobro := Numero*2;
end;
function Dobro2(Numero: Integer): Integer;
begin
Result := Numero*2;
end;

rea de Comandos
nesta rea onde inserido o algoritmo do programa. Os comandos so separados entre si pelo
delimitador ponto-e-vrgula. A forma geral :
Begin
<comando> ;
... ;
<comando>
End

Apostila de Delphi

Marcos Ribeiro

Tipos de Dados
Tipos Simples
O tipo declarado para uma varivel define o conjunto de valores permitidos para aquela varivel. H uma
grande quantidade de tipos disponveis em Object Pascal. H vrios tipos muito parecidos entre si, que so
usados apenas para manter compatibilidade com verses anteriores da linguagem Pascal. Abaixo listamos
os tipos mais comumente usados.

Nmericos
Inteiros
So caracterizados como tipos inteiros, os dados numricos positivos ou negativos. Excluindo-se destes
qualquer nmero fracionrio.
Ex: 0, -156, 10, 234, -80
Tipos
Integer
Cardinal
Shortint
Smallint
Longint
Int64
Byte
Word
Longword

Mnimo

Mximo

-2.147.483.647
0
-128
-32768
-2.147.483.647
-2^63
0
0
0

2.147.483.647
4294967295
127
32767
2.147.483.647
2^63-1
255
65535
4294967295

Tamanho
byte
4
4
1
2
4
8
1
2
4

Reais
So caracterizados como tipos reais, os dados numricos positivos, negativos e nmeros fracionrios.
Ex: 35.00, 0, -56, 1.2, -45.659
Tipos
Real
Real48
Single
Double
Extended
Comp
Currency

Mnimo

Mximo

5.0 x 10^-324
2.9 x 10^-39
1.5 x 10^-45
5.0 x 10^-324
3.6 x 10^-4951
-2^63+1

1.7 x 10^308
1.7 x 10^38
3.4 x 10^38
1.7 x 10^308
1.1 x 10^4932
2^63 -1

Tamanho
byte
8
6
4
8
10
8
8

Preciso
15-16
11-12
7-8
15-16
19-20
19-20
19-20

Apostila de Delphi

Marcos Ribeiro

Char
Representa um nico caracter, escrito entre apstrofos ( ). A maioria dos computadores utilizam a tabela
de cdigos ASCII para representar todos os caracteres disponveis.
Ex:
'A', 'B', 'a', '1', '@', ' '

Boolean
So caracterizados como tipos boleanos, os dados com valores TRUE (verdadeiro) e FALSE (falso), sendo
que este tipo de dado poder representar apenas um dos dois valores. Ele chamado de boleano, devido
contribuio do filsofo e matemtico ingls George Boole na rea da lgica matemtica.

Tipos Estruturados
medida que evolumos nos tipos de programas que projetamos surge a necessidade de armazenar certos
tipos de informaes que os tipos simples de dados, sozinhos, no so capazes de guardar, devido
pequena quantidade de informao que uma varivel desse tipo armazena. para isso que existem os tipos
de dados compostos, ou estruturados, ou, simplesmente, as estruturas de dados.
Estruturas de dados so construes de uma linguagem de programao que agregam um ou mais
elementos de dados para formar um tipo de dado que armazena uma quantidade maior de informaes.
Os elementos de dados que uma estrutura de dados armazena podem ou no ser do mesmo tipo. Existem
estruturas de dados que trabalham s com um tipo de elemento, como o vetor, e outras que combinam
elementos de dados diferentes, no caso do registro, por exemplo. Uma estrutura de dados tambm pode
conter outra estrutura de dados.
As estruturas de dados so subdivididas em dois grupos, estticas e dinmicas. Uma estrutura de dados
esttica aquela que no pode ter a sua quantidade de elementos de dados alterada durante a execuo
de um programa. As mais comuns so os vetores, as strings e os registros. Uma estrutura de dados
dinmica frequentemente tem elementos inseridos ou retirados do seu interior. Arquivos e listas, filas, pilhas
e rvares so as estruturas de dados dinmicas mais comuns.

Strings
Strings em Object Pascal so armazenados internamente como arrays de caracteres (arrays do tipo Char).
H dois tipos de Strings em Object Pascal: Strings longos e Strings curtos.
Ex:
'BONITO', 'Informtica', '123
Strings longos tm o comprimento praticamente ilimitado (2 GigaBytes). Eles so declarados usando
somente a palavra-chave string. String curtos tm o comprimento limitado em 255 caracteres. Para
declarar um String curto, use a palavra-chave string seguida pelo tamanho desejado, entre colchetes.
Uma string declarada da seguinte maneira:
NomeDaString: String[TamanhodaString];

onde:

10

Apostila de Delphi

Marcos Ribeiro

NomeDaString: contm o identificador a ser utilizado no programa;


String: a palavra reservada da linguagem, utilizada para declarar variveis desse tipo;
TamanhodaString: fornece a quantidade de caracteres mxima a ser alocada para a varivel declarada.
Veja a seguir exemplos de declaraes dos dois tipos de Strings:
var
Nome: String[10];{um String curto com no mximo 10 caracteres}
Texto: String;
{um String longo}
Como uma String um array de caracteres, pode-se acessar cada caractere do String individualmente,
usando ndices. Por exemplo, Nome[5] retorna o quinto caractere do String "Nome" (os caracteres so
indexados a partir de 1).
Tipo

Tamanho Mximo
em caracter

Memria Requerida

ShortString

255

2 at 256 bytes

AnsiString = String =
String Longa

~2^31

4 bytes at 2GB

WideString

~2^30

4 bytes at 2GB

Usado para
Compatibilidade com
verses anteriores
Caracteres
8-bit
(ANSI), DBCS ANSI,
MBCS ANSI,etc
Caracteres Unicode,
servidores
multiusrios e aplicaes
multi-linguagens

AnsiString, tambm chamada string longa, representa uma alocao dinmica de uma string que o tamanho
mximo limitado apenas pela quantidade de memria disponvel.
Uma varivel string um ponteiro ocupando quatro bytes de memria. Quando a varivel est vazia, ou
seja, quando ela contm uma string de tamanho zero - o ponteiro nulo e no usa a string de
armazenamento adicional. Quando a varivel no estiver vazia, ela apontar para um bloco de memria
dinamicamente alocado que contm os valores da string. Os oito primeiros bytes da localizao da string
contm 4 bytes para indicar o tamanho da string e 4 bytes para indicar o tamanho atual da varivel. Esta
memria alocado no heap, mas seu gerenciamento totalmente automtico e no exigindo qualquer
cdigo do usurio.
Ex:

Nome

Var
Nome: String[10];
Begin
Nome := MARCOS;
End;

PILHA

10 6

M A R C O S
HEAP
MEMRIA

Como as variveis strings longas so ponteiros, duas ou mais delas podem referenciar o mesmo valor, sem
consumir memria adicional. O compilador explora isto para conservar os recursos e executar tarefas de
forma mais rpida. Se o contador de referncia de uma string chegar a zero, a sua memria

11

Apostila de Delphi

Marcos Ribeiro

automaticamente liberada do heap.

Registros
Muitas vezes precisa-se criar algum tipo de varivel que armazene informaes de tipos de dados diferentes
numa nica estrutura, e o vetor no supre essas necessidades. para isso que existe a estrutura de dados
esttica registro.
Um registro composto por elementos de dados ou por outras estruturas que no sejam necessariamente
do mesmo tipo. Cada elemento de um registro conhecido como campo.
Para se declarar uma varivel do tipo registro em Pascal, usa-se a sintaxe:
Var
NomeDoRegistro: Record
Campo1: TipoDeDado;
Campo2: TipoDeDado;
CampoN: TipoDeDado;
End;
Ex:
Var
Funcionario: Record
Nome
:
Endereco:
Salario :
Idade
:
End;

String[60];
String[50];
Real;
Byte;

O tamanho total de uma varivel registro na memria ser o somatrio da quantidade de bytes que cada
campo (que pode ser de elementos ou de estruturas de dados) ocupa na memria. A varivel Funcionario,
por exemplo, ocupar 119 bytes consecutivos na memria.
Para se atribuir valores nos campos referentes aos dados de um funcionrio, devemos utilizar as seguintes
notaes:
Funcionario.Nome
Funcionario.Endereco
Funcionario.Salario
Funcionario.Idade

:=
:=
:=
:=

Manoel da Silva;
Avenida Maracan, 524;
1597.00;
29;

ou
with Funcionario do
Begin
Nome
:= Manoel da Silva;
Endereco := Avenida Maracan, 524;
Salario := 1597.00;
Idade
:= 29;
End;

12

Apostila de Delphi

Marcos Ribeiro

Vetores Arrays
O vetor uma estrutura de dados esttica e ordenada, com elementos do mesmo tipo. No pode
armazenar numa posio um valor booleano e noutra um caractere, e nem aumentar de tamanho no
momento da execuo de um programa. A definio de um vetor em Pascal feita da seguinte maneira:
NomeDoVetor: array[ndiceMnimo..ndiceMximo] of TipoDeDado;
Ex:
var
Nomes
: array[1..100] of String;
Salarios: array[1..50] of Real;
Meses
: array[1..12] of integer
Vetor
: array[-10..10] of array[1..5] of real;
Aqui, a varivel "Nomes" uma seqncia de 100 Strings e "Salarios" uma seqncia de 50 valores do
tipo Real.
Os elementos de um array so indexados: para acessar um valor de um array, digite o nome do array,
seguido do ndice entre colchetes. Por exemplo: Nomes[32]. O ndice pode ser qualquer expresso que
tenha como resultado um valor inteiro.
O exemplo a seguir declara um array "quadrados" com 100 inteiros e depois preenche esse array com os
quadrados dos nmeros de -50 a 250:
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Quadrados: array[1..100] of Integer;
begin
for I := -50 to 250 do
Quadrados[I] := I*I;
end;

Tipos de Dados definidos pelo usurio


Tipos enumerados
A declarao de um tipo enumerado lista diretamente todos os valores que uma varivel pode conter. Voc
define novos tipos usando a palavra-chave type, que deve ser colocada antes das definies dos tipos (tal
como var e const). O bloco type deve ser posicionado antes dos blocos var e const. Veja alguns
exemplos:
type
TDiaUtil
= (Segunda, Terca, Quarta, Quinta, Sexta);
TFabricante = (Chevrolet, Ford, Volkswagen);
TSexo
= (Masculino, Feminino);
Depois de definir os novos tipos, voc pode us-los normalmente nas declaraes das variveis, como se
fossem tipos predefinidos. Veja exemplos de declaraes que usam os tipos definidos acima:
var
DiaInicial, DiaFinal: TDiaUtil;
Fab : TFabricante;
Sexo: TSexo;

13

Apostila de Delphi

Marcos Ribeiro

Nesse caso, por exemplo, a varivel Fab s pode ter trs valores diferentes. Qualquer valor diferente de "Chevrolet", "Ford", ou
"Volkswagen" no permitido.

Voc atribui valores a uma varivel de tipo enumerado normalmente. Veja alguns exemplos:
Fab
:= Ford;
Sexo
:= Masculino;
DiaDaSemana := Terca;
Note como no so usadas aspas para os valores. Isso acontece porque os valores de um tipo enumerado
so armazenados como valores inteiros, na seqncia em que so definidos (comeando a partir de zero).
Para o tipo TFabricante, por exemplo, temos Ford = 0, Chevrolet = 1 e Volkswagen = 2. O uso de tipos
enumerados em vez de inteiros pode tornar um programa muito mais legvel.

Tipos de intervalo (Subrange)


Os tipos de intervalo so seqncias de valores dos tipos Boolean, Char, Integer, ou de tipos enumerados.
Tipos de intervalo so teis quando necessrio limitar uma varivel a um intervalo contnuo de valores,
como de 1 a 100, ou de "A" a "Z". Veja a seguir exemplos de definies de tipos de intervalo:
type
TGraus
= 0..360;
THoraValida = 0..23;
TMaiuscula = A..Z;
var
Hora : THoraValida;
Angulo: TGraus;
No exemplo, a varivel "hora" s pode estar entre 0 e 23 e a varivel "angulo" deve estar entre 0 e 360.
Quando uma varivel e definida com um tipo de intervalo, o Delphi verifica, durante a compilao, as
alteraes nesta varivel e gera erros de compilao quando os limites do intervalo so violados. O seguinte
exemplo gera um erro de compilao, na linha destacada.
procedure TFormTesteRange.Button1Click(Sender: TObject);
type
TGrau = 0..360;
var
Temp: TGrau;
begin
for Temp := 0 to 720 do {Erro de compilao!}
begin
... {cdigo omitido}
end;
end;
A mensagem de erro gerada "Constant expression violates subrange bounds", indicando que os limites do
intervalo foram violados (a varivel Temp passaria do limite, 360, no loop for).
No caso anterior, o Delphi pde detectar o erro, porque foram usados valores constantes para a varivel.
Quando so usadas expresses mais complexas (clculos por exemplo), o Delphi s pode detectar o erro
em tempo de execuo. O exemplo a seguir passaria na compilao, mas a linha destacada geraria uma
exceo do tipo ERangeError (Temp receberia o valor 400, maior que o mximo permitido pelo tipo Tgrau:
360).

14

Apostila de Delphi

Marcos Ribeiro

procedure TFormTesteRange.Button2Click(Sender: TObject);


type
TGrau = 0..360;
var
Temp: TGrau;
begin
Temp := 200;
Temp := Temp*2; {Erro de execuo!}
ShowMessage(IntToStr(Temp));
end;
NOTA: O comportamento padro do Delphi no verificar erros de intervalo em tempo de execuo (como
o erro do exemplo anterior). Para que o Delphi realmente verifique se as variveis esto dentro dos limites,
escolha o comando Project | Options, mude para a pgina Compiler e ative a opo Range Checking

15

Apostila de Delphi

Marcos Ribeiro

Comandos Bsicos da Linguagem Pascal


Usando o comando de atribuio
O comando de atribuio um dos mais usados em muitas linguagem de programao. O comando de
atribuio usado para a alterar valores de variveis e propriedades no Delphi. J mostramos vrios
exemplos que usam atribuio. Aqui est mais um:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Color
:= clRed;
Edit1.Text
:= 'Novo texto';
Memo1.ReadOnly := True;
end;
O comando de atribuio, como se v formado por duas partes, a parte esquerda um nome de uma
varivel ou de uma propriedade; a parte direita o novo valor que ser atribudo varivel ou propriedade.
Esse valor pode ser outra varivel ou propriedade, uma constante, ou outra expresso. Os tipos dos dois
lados devem ser os mesmos, ou pelo menos compatveis; caso contrrio, o Delphi gera erros na
compilao.
Entrada
Um comando de entrada serve para que o programa solicite dados no momento em que o mesmo est
sendo executado. Esses dados fornecidos sero armazenados em variveis na memria. Em geral a
unidade de entrada o teclado, podendo tambm ser uma memria auxiliar como o winchester.
Considerando a unidade de entrada padro, o teclado, o comando seria:
READ (<identificador-1>,...<identificador-n>)
ou

READLN (<identificador-1>,...,<identificador-n>)

Com READ o cursor permanece na mesma linha aps a execuo do comando; com o READLN o cursor
muda para a prxima linha.
Observao:

No Turbo Pascal, o comando READ s deve ser utilizado para a leitura de arquivos.
Portanto, para a leitura de variveis, devemos sempre utilizar o comando READLN.

EXEMPLOS:
1) Se o programa deve solicitar as trs notas de um aluno, teramos:
readln (NOTA1,NOTA2,NOTA3); ...
No momento da execuo do comando acima, o programa mostra a tela do usurio e o cursor aparece
esperando a digitao dos trs valores que devem ser separada por, pelo menos, um espao em branco.

16

Apostila de Delphi

Marcos Ribeiro

3.5 ser armazenado na varivel NOTA1, o 7.0 em NOTA2 e o 8.2 em NOTA3.


2) Se o programa deve solicitar o nome e o salrio de um funcionrio teramos:
readln (NOME);
readln (SALRIO);
...
Sada
Um comando de sada serve para que o programa mostre ao usurio os resultados desejados. A unidade de
sada padro o monitor de vdeo, podendo ser tambm a impressora ou uma memria auxiliar como o
disco.
Considerando a unidade de sada padro, o monitor de vdeo, o comando seria:
WRITE (<expresso-1>,...,<expresso-n>)
ou

...

...

WRITELN (<expresso-1>,...,<expresso-n>)

Com WRITE o cursor permanece na mesma linha aps a execuo do comando; com WRITELN o cursor
muda para a prxima linha.
EXEMPLO:

A:=1; B:=2;
writeln ('Soma de ',A,' e ',B,' = ',A+B);

No caso de variveis do tipo REAL os valores so mostrados na notao exponencial, num campo de 16
posies, a menos que uma formatao seja especificada.
EXEMPLO:

MEDIA := (8.0 + 2.0) / 2


writeln (MEDIA); {sada 5.0000000000E+00}
writeln (MEDIA:5:2); {sada 5.00}

Na formatao, se a varivel for real especificamos o total de posies ocupadas e a quantidade de casas
decimais

. Se inteira, s o total de posies.

Se desejarmos que a sada seja atravs da impressora e no do monitor de vdeo, devemos especificar no
comeo da lista da sada o parmetro LST e a unidade PRINTER com o USES.
EXEMPLO:

Uses PRINTER;
:::
writeln (LST, 'Media = ', MEDIA:5:2);

17

Apostila de Delphi

Marcos Ribeiro

No instante da solicitao de dados, podemos usar junto com o READ ou READLN um comando de sada
com a finalidade de emitir mensagens que orientem o usurio na digitao dos dados.
EXEMPLOS:

writeln('Digite o Nome:');
readln(NOME);
writeln('Digite as 3 Notas:');
readln(NOTA1,NOTA2,NOTA3);
writeln('Digite o salrio do funcionrio:');
readln(SALARIO);

18

Apostila de Delphi

Marcos Ribeiro

Controle de fluxo
Os programas mostrados at aqui no fazem nada alm de definir novos tipos, declarar variveis e alterlas. Para que programas realmente "faam alguma coisa", eles devem ser capazes de tomar decises de
acordo com as entradas do usurio, ou repetir comandos, at que uma certa condio seja satisfeita. So
essas operaes que constituem o controle de fluxo de um programa.

Usando blocos
Um bloco um conjunto de comandos delimitado pelas palavras chave begin e end. J usamos blocos
vrias vezes nos exemplos mostrados at aqui . No arquivo de projeto, por exemplo, um bloco contm o
cdigo principal do projeto (onde, entre outras coisas, so criados os formulrios do aplicativo). Todo
programa em Object Pascal deve ter pelo menos um bloco: o bloco principal.
Quando voc precisa executar ou no um conjunto de comandos dependendo de uma condio, voc deve
usar blocos para delimitar esses conjuntos. Outro uso importante de blocos para a repetio de um
conjunto de comandos vrias vezes, como nos loops for, while e repeat, que veremos a seguir.
Blocos podem ser aninhados, isto pode haver blocos dentro de blocos. Isso til em estruturas
complexas, como ifs dentro de ifs, ou loops dentro de loops.
A estruturao em blocos da linguagem Object Pascal uma de suas caractersticas mais elegantes e
poderosas.

If-then-else

O comando mais usado para fazer decises simples o comando if. O comando if verifica uma condio e
executa um comando ou bloco de comandos somente se a condio for verdadeira. O comando if sempre
usado com a palavra-chave then. H vrias maneiras de usar o comando if. Veja a mais simples a seguir:
if condio then
comando;
Aqui a condio qualquer expresso que tenha valor booleano (True ou False). Condies so geralmente
comparaes, como a > b, x = 1, total <= 1000, etc. Pode-se tambm usar o valor de uma propriedade
como condio. O exemplo abaixo, ativa um boto (chamado "Button2") somente se ele estiver desativado
(com Enabled=False). Caso contrrio, nada acontece.
if Button2.Enabled = False then
Button2.Enabled = True;
H tambm vrias funes predefinidas que retornam valores booleanos e que tambm podem ser usadas
como condies.

19

Apostila de Delphi

Marcos Ribeiro

Usando else
Um comando if pode tambm apresentar uma segunda parte, delimitada pela palavra-chave else. O
comando da segunda parte (depois de else) executado quando a condio falsa. O exemplo a seguir
mostra uma mensagem diferente dependendo do valor da varivel "x":
if x > limite then
ShowMessage(Limite ultrapassado!);
else
ShowMessage(Sem problemas.);

Usando blocos com o comando if


A verso simples do comando if usada nos exemplos acima tem uso muito limitado. Na maioria das vezes,
necessrio executar mais de um comando se uma certa condio for verdadeira. Para isso voc deve usar
blocos de comandos. Veja um exemplo completo:
procedure TForm1.Button1Click(Sender: TObject);
var
Dividendo, Divisor, Resultado: Real;
begin
Dividendo := StrToFloat(Edit1.Text);
Divisor := StrToFloat(Edit2.Text);
if Divisor = 0 then
begin
Color := clRed;
ShowMessage('Divisor invlido');
end
else
begin
Color := clSilver;
Resultado := Dividendo/Divisor;
ShowMessage('Resultado = ' + FloatToStr(Resultado));
end;
end;
Note os dois blocos de comandos: um para o if-then e outro para o else. O programa calcula a diviso de
dois valores do tipo Real (lidos a partir de dois componente Edit). Se o divisor for zero, o primeiro bloco do if
executado: o formulrio muda para vermelho e uma mensagem exibida. Se o divisor no for zero, o
segundo bloco (depois do else) executado, mudando a cor do formulrio para cinza.
As funes StrToFloat e FloatToStr convertem de Strings para nmeros reais e de nmeros reais para
Strings, respectivamente.
Note como o end depois do primeiro bloco no seguido de ponto-e-vrgula (;). Essa uma regra
obrigatria da linguagem Object Pascal: um end antes de um else nunca deve ser seguido por ";". Somente
o ltimo end do comando if deve terminar com ponto-e-vrgula.

20

Apostila de Delphi

Marcos Ribeiro

Aninhando comandos if
Muitas vezes, um programa deve decidir entre mais de duas opes. Para isso, pode-se usar comandos if
aninhados (um if dentro de outro). Veja um exemplo:
procedure TForm1.Button1Click(Sender: TObject);
var
Nota: Real;
begin
Nota := StrToFloat(Edit1.Text);
if nota < 5.0 then
ShowMessage('Reprovado por mdia')
else
if (Nota >= 5.0) and (Nota < 7.0) then
ShowMessage('Aprovado na final')
else
if Nota > 8.5 then
ShowMessage('Aprovado com excelncia')
else
ShowMessage('Aprovado simplesmente')
end;
O exemplo l uma nota digitada pelo usurio e mostra uma mensagem que varia de acordo com o valor da
nota. Acompanhe o fluxo do programa: se a nota for menor que 5, a primeira mensagem exibida; caso
contrrio (qualquer valor maior ou igual a 5), o programa checa a segunda condio: se a nota estiver entre
5 e 7, a segunda mensagem exibida. Se no, o programa verifica se a nota maior que 8.5 e, se for,
mostra a terceira mensagem. A mensagem depois do ltimo else s exibida se nenhuma das condies
anteriores for verdadeira (isso acontece se a nota estiver entre 7 e 8.5).
NOTA: no programa acima foi usada a palavra chave and para criar uma condio mais complexa. H mais
duas palavras-chaves semelhantes: or e not. Pode-se usar qualquer combinao de not, and e or para
criar novas condies. Lembre-se, entretanto de usar parnteses para agrupar as condies. Os parnteses
usados no programa anterior, por exemplo, so todos obrigatrios.

A estrutura case
Quando necessrio decidir entre muitas opes em um programa, a estrutura case da linguagem Object
Pascal em geral mais clara e mais rpida que uma seqncia de ifs aninhados. Uma estrutura case s
pode ser usada com valores ordinais (inteiros, caracteres, tipos de intervalo e tipos enumerados). Na
estrutura case uma varivel comparada com vrios valores (ou grupos de valores) e o comando (ou bloco
de comandos) correspondente executado.
Veja a seguir um exemplo simples, que mostra mensagens diferentes, de acordo com o nmero entrado em
um Edit.
procedure TForm1.Button1Click(Sender: TObject);
var
Numero: Integer;
begin
Numero := StrToInt(Edit1.Text);
case Numero of
1, 2, 3, 5, 7 :
begin
ShowMessage('Nmero primo menor que 10');
Color := clBlue;

21

Apostila de Delphi

Marcos Ribeiro

end;
4, 6, 8
: ShowMessage('Nmero par menor que dez');
9
: ShowMessage('Nmero mpar menor que dez');
10..1000 : ShowMessage('Nmero entre 10 e 1000');
else
ShowMessage('Outro nmero');
end; // final do case
end; // final da procedure
Uma estrutura case deve ser terminada com end e pode ter uma parte opcional else. Os comandos depois
do else s so executados se a varivel no for igual a nenhum dos valores especificados (se no houver a
parte else, a estrutura case pulada inteiramente). No exemplo acima, a mensagem "Outro nmero" s
mostrada se o valor da varivel "numero" for maior que 1000 ou menor que 1.

22

Apostila de Delphi

Marcos Ribeiro

Usando loops
Os loops ("laos") so estruturas usadas para repetir vrias vezes sequncias de comandos. H trs tipos
de loops em Object Pascal. O loop for usado para realizar um nmero fixo de repeties. Os loops while
e repeat repetem um bloco de comandos at que uma condio se torne falsa ou verdadeira,
respectivamente.

O loop for
O loop for o mais rpido e mais compacto dos trs tipos de loops. Esse loop usa um contador, uma
varivel inteira que aumentada (incrementada) automaticamente cada vez que o loop executado. O
nmero de repeties do loop for fixo. Ele depende somente do valor inicial e do valor final do contador,
que so definidos no incio do loop. Veja um exemplo:
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Numero: Integer;
begin
Numero := StrToInt(Edit1.Text);
for I := 1 to 50 do
ListBox1.Items.Add(IntToStr(Numero*I));
end;
Este programa mostra os primeiros 50 mltiplos do nmero digitado em um Edit. Os mltiplos so
adicionados a um ListBox. O loop for usado aqui contm um nico comando. Por isso no necessrio
usar begin e end.

O loop while
O loop while um loop mais verstil que o for, embora um pouco mais complexo. O loop while repete um
comando, ou um bloco de comandos, at que a condio especificada se torne falsa. O nmero de
repeties no preestabelecido como no loop for.
No exemplo a seguir, o valor digitado em um Edit lido, convertido e colocado em uma varivel "x". Em
seguida, subtrado 10 do valor de "x" e adicionado o resultado (convertido em um string) a um ListBox,
repetindo o processo at que "x" seja menor ou igual a 0.
procedure TForm1.Button1Click(Sender: TObject);
var
x: Integer;
begin
x := StrToInt(Edit1.Text); {Ler valor inicial para x}
ListBox1.Items.Clear; {Limpar a lista de valores}
while x > 0 do
begin
x := x - 10;
ListBox1.Items.Add(IntToStr(x));
end;
end;
No loop while, a condio testada no incio de cada repetio. Quando a condio falsa, o programa sai
do loop e executa o comando imediatamente depois. Se a condio testada for verdadeira, o loop

23

Apostila de Delphi

Marcos Ribeiro

executado novamente.
Note que possvel que os comandos de um loop while no sejam executados nenhuma vez. Isso
acontece quando a condio falsa j na entrada do loop. No programa acima, por exemplo, um valor
inicial negativo para a varivel "x" faria com que o while fosse pulado inteiramente na primeira vez.
Outra caracterstica importante do loop while, que a condio usada no loop deve se tornar falsa em
algum momento. Caso contrrio, o loop executado para sempre. O programa entra em um "loop infinito".
Veja uma exemplo de um loop infinito com while:
x:= 1;
while x > 0 do
x := x + 1;
Aqui, a condio x > 0 nunca se tornar falsa (x ser sempre maior que zero), e o programa ficar preso
para sempre dentro do while.
Esse um erro cometido com freqncia, principalmente em loops while com condies mais complexas.
Tenha cuidado, portanto, de alterar pelo menos uma das variveis envolvidas na condio, dentro do while.

O loop repeat
O loop repeat uma verso "invertida" do loop while. Nele, a condio verificada somente no final do
loop. Isso faz com que o loop seja sempre executado, pelo menos uma vez. A condio do loop repeat
aparece no final, ao lado da palavra-chave until ("at"). Alm disso, devido estrutura simples do loop
repeat, os comandos do loop no precisam ser delimitados por begin e end. Veja um exemplo:
procedure TForm1.Button1Click(Sender: TObject);
var
Entrada: String;
Valor: Integer;
begin
repeat
Entrada:= (InputBox('', 'Entre com um nmero de 1 a
100',''));
Valor:= StrToInt(entrada);
until (Valor >= 1) and (Valor <= 100);
ShowMessage('Entrada aceita.');
end;
O cdigo mostra uma InputBox vrias vezes, at que a entrada seja vlida (entre 1 e 100). Note que a
InputBox exibida pelo menos uma vez, pois usado um loop repeat.
Se while tivesse sido usado em vez de repeat, o cdigo seria mais longo e menos elegante:
procedure TForm1.Button1Click(Sender: TObject);
var
Valor: Integer;
Entrada: string;
begin
Entrada:=InputBox('','Entre com um nmero de 1 a 100','');
Valor := StrToInt(entrada);
while (Valor < 1) or (Valor > 100) do
begin
Entrada := InputBox('','Entre com um nmero de 1 a
100','');

24

Apostila de Delphi

Marcos Ribeiro

Valor := StrToInt(Entrada);
end;
ShowMessage('Entrada aceita.');
end;
Este cdigo tem exatamente o mesmo efeito que o anterior. Mas note que a condio usada no loop while
o oposto da condio do loop repeat. Alm disso, h uma repetio das linhas de cdigo que lem a
entrada. Isso necessrio porque a varivel "valor" testada no incio do loop e precisa ser inicializada
primeiro.
Na verdade, qualquer programa que use repeat pode ser convertido em um programa usando while,
fazendo-se mudanas semelhantes s mostradas aqui. O loop repeat apenas uma convenincia, que
pode algumas vezes tornar o cdigo mais simples.

O comando break
O comando break usado para sair imediatamente de um loop (while, for ou repeat). Veja um exemplo
simples:
var
A,B: array[1..1000]
i: Integer;
...
for i:= 1 to 1000 do
if A[i] <> B[i] then
if i = 1000 then
ShowMessage('Todos
else
ShowMessage('O
diferente');

of Integer;

break;
os elementos so iguais')
elemento

com

ndice

'

IntToStr(i)

'

...
O exemplo compara os elementos de dois arrays A e B, de 1000 elementos cada um (o clculo para os
valores dos arrays no mostrado). Quando encontrada a primeira diferena nos arrays, o comando
break interrompe o loop for imediatamente e os outros elementos dos arrays no so checados. Se todos
os elementos forem iguais, o valor da varivel i no final do loop ser 1000 e a primeira mensagem
mostrada. Se o loop for quebrado antes de terminar, com o comando break, o valor de i ser menor que
1000 e a segunda mensagem ser mostrada.

25

Apostila de Delphi

Marcos Ribeiro

Procedures e functions
A linguagem pascal permite que possamos declarar trechos de cdigo fora do programa principal e
associados a um identificador que podem ser executadas sempre que invocados. Chamaremos estes
trechos de cdigo por mdulos ou rotinas.
Uma das tcnicas mais utilizadas e tida como vantajosa na confeco de programas grandes a modularizao. Consiste em dividir o programa em diversos mdulos ou subprogramas, de certa forma
independentes uns dos outros. Existe um mdulo que o principal, a partir do qual so chamados os outros
mdulos, esse mdulo recebe o nome de programa principal, enquanto que os outros so chamados de
subprogramas.
Os principais motivos para se usar rotinas so:
1. Evitar codificao: trocar certos trechos de programas que se repetem por chamadas de apenas uma
rotina que ser codificada apenas uma vez.
2. Modularizar o programa, dividindo-o em mdulos (rotinas) logicamente coerentes, cada uma com funo
bem definida. Isto facilita a organizao do programa, bem como o entendimento dele.
No sistema Turbo Pascal, existem dois tipos de subprogramas, a saber:
- Procedures (procedimentos)
- Functions (funes)

Procedures
A procedure como se fosse um programa. Ela tem a estrutura praticamente igual a de um programa, como
veremos mais adiante. A procedure deve ser ativada(chamada) pelo programa principal ou por uma outra
procedure, ou at por ela mesma.
Uma procedure tem praticamente a mesma estrutura de um programa, ou seja, ela contm um cabealho,
rea de declaraes e o corpo da procedure. Na rea de declaraes, podemos ter as seguintes subreas:
Const - Type - Var - Procedures - Functions
Devemos salientar que tudo que for declarado dentro das subreas s ser reconhecido dentro da procedure. Mais para frente, voltaremos a falar sobre isso.

Sintaxe das procedures


A sintaxe para uma procedure a seguinte:
procedure NomeDaProcedure(param1, param2, ...:Tipo1; param1,...:tipo2;
...);
type
{definies de tipos}
var
{declaraes de variveis }
const
{definies de constantes}
begin
{ corpo }
end;

26

Apostila de Delphi

Marcos Ribeiro

Ex:
Program Exemplo_1; (* cabealho do programa *)
Procedure linha; (* cabealho da procedure linha *)
Begin (* corpo da procedure linha *)
for i:=1 to 80 do
write('-');
End;
End;
Var
i : integer; (* subrea Var da procedure linha *)
Begin (* corpo do programa principal *)
linha; (* ativao da procedure linha *)
writeln('teste');
linha; (* ativao da procedure linha,novamente *)
End.

Funes
As funes so muito parecidas com as procedures. A principal diferena que o identificador de uma funo assume o valor de retorno da funo. Uma funo deve sempre retornar um valor e em Turbo Pascal,
este valor retornado no nome da funo.
Para functions, a sintaxe praticamente idntica. A nica diferena que o tipo do valor retornado deve ser
especificado no final da primeira linha.
function nome da function (param1, param2, ...:tipo1; param1,...:tipo2; ...): tipo de retorno;
type
{definies de tipos}
var
{declaraes de variveis }
const
{definies de constantes}
begin
{corpo}
end;
A primeira linha, chamada de cabealho, deve sempre terminar com ";". Os parmetros, se existirem,
devem ter seus tipos especificados e devem ser separados por vrgulas. Parmetros do mesmo tipo podem
ser agrupados; esses grupos devem ser separados por ";".
Depois do cabealho, vm os blocos de declarao type, var e const (no necessariamente nessa ordem).
Todos estes so opcionais, pois a procedure ou functions pode no precisar de nenhuma varivel alm das
especificadas nos seus parmetros. Em seguida, vem o bloco principal (ou corpo) da procedure, delimitado
por begin e end. neste bloco que fica o cdigo executvel da procedure.

Definindo o valor de retorno de uma function


O valor retornado por uma function pode ser definido de duas maneiras: atribuindo um valor para o nome da
function, ou alterando a varivel especial Result. As duas funes a seguir so exatamente equivalentes:

27

Apostila de Delphi

Marcos Ribeiro

function Dobro1(Numero: Integer): Integer;


begin
Dobro := Numero*2;
end;
function Dobro2(Numero: Integer): Integer;
begin
Result := Numero*2;
end;

Entendendo parmetros
Os parmetros so variveis passadas para as procedures e functions (rotinas). Os parmetros de uma
rotina so opcionais. So comuns rotinas (principalmente procedures) sem nenhum parmetro.
Quando so usados parmetros, estes podem ser passados por valor ou por referncia. A forma como os
parmetros so passados definida no cabealho da rotina.
Quando uma varivel passada por valor, a rotina recebe apenas um cpia da varivel. A varivel passada
se comporta como uma varivel local. Alteraes realizadas na varivel no tm efeito depois da rotina
terminar (ou retornar). A passagem por valor o tipo padro de passagem de parmetros na linguagem
Object Pascal.
Quando uma varivel passada por referncia, a rotina recebe uma referncia varivel passada ou, em
outras palavras, a prpria varivel. Com esse tipo de passagem de parmetros, a rotina pode alterar
diretamente a varivel passada. Para especificar a passagem por referncia, use a palavra-chave var antes
do nome do parmetro, no cabealho da rotina.Veja um exemplo que usa os dois tipos de passagem de
parmetros:
procedure Descontar(Taxa: Real; var Preco: Currency);
begin
Preco := Preco - Preco*(Taxa/100);
end;
Esta procedure recebe dois parmetros: Taxa e Preco. O parmetro Taxa passado por valor. O valor de
Taxa pode ser alterado dentro da procedure, mas as alteraes no tero efeito depois de a procedure
retornar.
O parmetro Preco passado por referncia (usando-se a palavra var antes do parmetro). Preco
alterado dentro da procedure e essa alterao permanente.

Chamando procedures e functions


Depois de definir uma procedure ou function, voc pode cham-la diretamente no seu cdigo, em qualquer
lugar da Unit em que foi definida.
Para chamar uma procedure ou function, basta especificar o seu nome e valores para seus parmetros (se
houver). O seguinte trecho de cdigo mostra como chamar a procedure Descontar (definida acima) para
realizar um desconto de 10% sobre um preo p. (O valor de p no final ser 450.0).
...
p := 500.0;
Descontar(10, p);
...

28

Apostila de Delphi

Marcos Ribeiro

Onde criar procedures e functions


H regras para o posicionamento das procedures no cdigo: as procedures devem ser colocadas somente
depois da parte implementation da Unit (veja a seguir), depois das declaraes das variveis globais.
O exemplo a seguir usa a procedure Descontar e uma variao da function Dobrar, dos exemplos
anteriores. Os valores de cem preos, armazenados no array Precos, so alterados no evento OnClick do
componente Button1. (O programa, apesar de completo, foi mantido deliberadamente simples, para ilustrar
melhor os conceitos envolvidos).
{Cdigo inicial da Unit}
...
implementation
var
Precos: array[1..100] of Currency;
procedure Descontar(Taxa: Double; var Preco: Currency);
begin
Valor := Preco - Preco*(taxa/100);
end;
function Dobrar(Preco: Currency): Currency
begin
Result := Preco*2;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
// Descontar em 25% os primeiros 20 produtos...
for i := 1 to 20 do
Descontar(25, Precos[i]);
//...descontar em 50% os prximos 30...
for i := 21 to 50 do
Descontar(50, Precos[i]);
//...e dobrar o preo dos 50 produtos restantes
for i := 51 to 100 do
Precos[i]:= Dobrar(Precos[i]);
end;
end.

29

Apostila de Delphi

Marcos Ribeiro

Entendendo o cdigo das Units


As Units contm praticamente todo o cdigo de um aplicativo no Delphi. As Units geralmente so
associadas a formulrios, mas podem ser criadas de forma totalmente independente. Nesta seo veremos
detalhes sobre cada parte de uma Unit.

A estrutura bsica de uma Unit


Todas as Units tm a mesma estrutura bsica:
program
unit <nome da unit>
interface
uses <lista de Units>
type
var
procedure
function
implementation
uses <lista de Units>
{cdigo para os procedures e functions}
initialization {opcional}
{cdigo para inicializao}
finalization {opcional}
{codigo para finalizao}
end.
A primeira linha da Unit identifica o nome da Unit (que deve ser um identificador vlido na linguagem Object
Pascal). Veja a seguir descries sobre cada uma das partes.

Parte Interface
A parte interface comea com a palavra interface e termina imediatamente antes da palavra-chave
implementation. Esta parte contm a definio de todos os tipos, constantes, variveis, procedures e
funnctions que devem ser "visveis" (ou acessveis) para outras Units que se referenciem a esta. Somente o
que estiver definido na parte interface pode ser acessado por outras Units.
A primeira clusula uses fica dentro da parte interface. As Units listadas nessa clusula so geralmente
adicionadas pelo prprio Delphi, para fazer referncia a Units do sistema (predefinidas). rara a
necessidade de adicionar manualmente nomes de Units a essa clusula uses. Para se referenciar a outras

30

Apostila de Delphi

Marcos Ribeiro

Units, altera-se a clasula uses na parte implementation.

Parte Implementation
A parte implementation contm todo o cdigo das procedures e functions da Unit. Esta parte pode conter
tambm declaraes de variveis e constantes, mas estas s sero "visveis" pelo cdigo desta Unit.
Nenhuma outra Unit pode ter acesso s variveis e constantes declaradas aqui.
A parte implementation contm a segunda clusula uses. As Units listadas nessa clusula so geralmente
adicionadas pelo programador, manualmente, ou usando o comando File | Use unit.

Parte Initialization
A parte initialization opcional. Voc pode usar a parte initialization para declarar e inicializar variveis,
por exemplo. O cdigo nesta parte executado antes de qualquer outro cdigo na Unit. Se um aplicativo
tiver vrias Units, a parte initialization (se houver) de cada Unit executada antes de qualquer outro cdigo
na Unit.

Parte finalization
A parte finalization tambm opcional. O cdigo nessa parte executado logo antes do trmino do
aplicativo. Essa parte geralmente usada para realizar "operaes de limpeza", como recuperar memria e
outros recursos, ao final da execuo do aplicativo.

31

Apostila de Delphi

Marcos Ribeiro

Trabalhando com Excees


As excees so um mecanismo poderoso para lidar com erros nos seus programas. O uso de excees
permite uma separao entre o cdigo normal de um programa e o cdigo usado para lidar com erros que
podem surgir.
Quando ocorre um erro em um programa, o Delphi levanta uma exceo. Se uma exceo que foi levantada
no for tratada, o programa interrompido e mostrada uma caixa de dilogo com uma descrio da
exceo. Uma exceo no-tratada pode causar danos aos seus dados, deixar o programa em uma
situao instvel, ou at levar o programa a "travar".
Para evitar que isso acontea, voc deve tratar as excees, protegendo blocos de cdigo que contenham
comandos que possam causar erros. Para proteger um bloco de cdigo cerque-o com as palavras-chave try
e end. Dentro de um bloco protegido, pode-se usar as comandos except ou finally, para tratar as
excees. H dois de tipos blocos protegidos:
try
{comandos que podem levantar excees }
except
{comandos executados quando uma exceo levantada}
end;
try
{comandos que podem levantar excees }
finally
{comandos sempre executados, havendo excees ou no}
end;
O primeiro tipo de bloco protegido chamado de bloco try-except. O segundo, de bloco try-finally.
No bloco try-except, os "comandos protegidos" ficam entre as palavras-chave try e except. Quando uma
exceo ocorre em um desses comandos, o programa pula imediatamente para o primeiro comando depois
de except.
No caso do bloco try-finally, os comandos depois de finally so executados sempre (mesmo quando
excees no so levantadas). Pode-se usar esses comandos para realizar operaes de "limpeza", como
destruir componentes que no so mais necessrios, por exemplo.
H vrios tipos de excees. Veja a seguir um exemplo que trata a exceo EDivByZero, gerada quando
feita uma diviso por zero (o divisor aqui o valor contido no componente Edit1). Assume-se que os valores
dos arrays resultado e valores foram declarados e inicializados antes.
procedure TForm1.Button1Click(Sender: TObject);
var
Divisor: Real;
begin
Divisor:= StrToFloat(Edit1.Text);
for i:= 1 to 50 do
try
Resultado[i] := Valores[i]/Divisor;
except
on EDivByZero do Resultado[i] := 0;
end;
end;

32

Apostila de Delphi

Marcos Ribeiro

Note o uso da palavra-chave on dentro do bloco except. On usada para especificar o tipo de exceo a
ser tratado. Um bloco except pode lidar com vrios tipos de exceo, definindo-se um bloco.
on [tipo de exceo] do [comandos]para cada tipo.
Na tabela abaixo, listamos alguns tipos comuns de excees:
Tipo de exceo

Quando ocorre

EDivByZero

Quando se tenta dividir um inteiro por zero.

EZeroDivide

Quando se tenta dividir um nmero real (de ponto flutuante) por zero.

EConvertError

Quando feita uma converso ilegal de tipos.

EInOutError

Quando h um erro de entrada ou sada.

EDatabaseError

Quando ocorre um erro geral de banco de dados.

EDBEngineError

Quando h um erro no BDE (Borland Database Engine).

Rotinas teis

Nas sees a seguir, apresentaremos algumas rotinas (functions e procedures) teis na programao em
Object Pascal.

Rotinas para manipulao de strings


A manipulao de strings uma tarefa muito comum em programao. A seguir, listamos as principais
rotinas de manipulao de strings oferecidas pelo Delphi. (As rotinas cujos nomes comeam com "Ansi" so
capazes de lidar com caracteres acentuados e, portanto, so muito teis para strings em portugus).

Funo
Copy(S:string;
string

Descrio
Indice,Comp:

Integer): A funo Copy retorna um string contendo Comp


caracteres, comeando com S[Indice].

Delete(var S: string; Indice, Comp: Integer) A procedure Delete remove o substring com Comp
caracteres do string S, comeando com S[Index].
O string resultante retornado na varivel S.
Length(S: string): Integer

A funo Length retorna o nmero de caracteres


no string S.

Trim(S: string): string

A funo Trim remove espaos esquerda e


direita do string S.

Funes de converso de tipo


A linguagem Object Pascal especialmente exigente com relao aos tipos usados em expresses, e nas
chamadas de procedures e functions. Se o tipo usado no for compatvel com o tipo esperado, gerado um
erro de compilao. Funes de converso de tipo devem ser usadas para converter valores para os tipos
adequados.

33

Apostila de Delphi

Marcos Ribeiro

As principais funes de converso de tipo so listadas na tabela a seguir. Se uma converso for ilegal,
essas funes levantam a exceo EconvertError.
Funo

Tipo de origem

Tipo de destino

StrToCurr

String

Currency

StrToDate

String

TDate

StrToDateTime

String

TDateTime

StrToFloat

String

Real

StrToInt

String

Integer

StrToTime

String

TTime

IntToStr

Integer

String

CurrToStr

Currency

String

DateToStr

TDate

String

TimeToStr

TTime

String

34

Apostila de Delphi

Marcos Ribeiro

Bibliografia
Boratti, Isaias Camilo. Programao Orientada a Objetos usando Delphi, 3 Edio, Visual Books, 2004.
Cantu, Marco. Dominando o Delphi 6: a Bblia, So Paulo, Editora Makron Books, 2003.
SENAC. DN. Estruturas de Dados./Ricardo de Souza Oliveira; Gilda Ach Taveira; Joana Botini. Rio de
Janeiro: Ed. Senac Nacional, 1999.
Manzano, Jos Augusto N. G., Algoritmos: lgica para desenvolvimento de programao, 2 Edio,
rica, 1996.
Barnes, J. David; Kolling Michael. Programao Orientada a Objetos com Java, Pearson, 2004
Facunte, Emerson. Delphi 7 Internet e Banco de Dados, Brasport,2003.
Melo, Ana Cristina. Desenvolvendo Aplicaes com UML, 1 Edio, Brasport, 2002.
Todd, Bill; Kellen, Vince. Delphi 2 Guia do Desenvolvedor, Makron Books, 1997.

35