Vous êtes sur la page 1sur 26

Apostila de Delphi Marcos Ribeiro

A linguagem Object Pascal


A linguagem de programao PASCAL foi criada para ser uma ferramenta educacional, is
to no incio da
dcada de 70 pelo Prof. Niklaus Wirth da Universidade de Zurique. Foi batizada pel
o 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, AL
GOL 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. C
ontudo, 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 apli
cativo 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 Pas
cal (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 prog
rama em Object Pascal.
Exemplos de identificadores so nomes de variveis, constantes, procedures, function
s e componentes. Em
Object Pascal todos os identificadores usados devem ser declarados. Quando voc de
clara 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 li
mite 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 permit
ido.
Um identificador no pode ser uma palavra reservada da linguagem Object Pascal (co
mo begin, if
ou end, por exemplo).
1Apostila de Delphi Marcos Ribeiro
Palavras reservadas
So palavras que tm um sentido predeterminado na linguagem e no podem ser usadas com
o
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 operad
ores aritmticos,
dando sempre como resultado valores numricos.
Operadores Aritmticos
Os operadores aritmticos representam as operaes mais comuns da matemtica. So eles:
Operador Operao Operandos Resultado
+ Adio Inteiro, Real Inteiro, Real
- Subtrao Inteiro, Real Inteiro, Real
* Multiplicao Inteiro, Real Inteiro, Real
/ Diviso Real Inteiro, Real Real
DIV Diviso Inteira Inteiro Inteiro
MOD Resto da Diviso Inteiro Inteiro
Exemplos:
Expresso Resultado
1 + 2 3
5.0 - 1 4.0
2 * 1.5 3.0
5 / 2 2.5
5 DIV 2 2
5 MOD 2 1
Prioridades
2Apostila de Delphi Marcos Ribeiro
Em uma expresso aritmtica, a ordem de avaliao dos operadores obedece a tabela abaixo
:
Prioridade Operadores
1 * / DIV MOD
2 + OBSERVAES:
a) Quando existe em uma expresso operadores com a mesma prioridade, a execuo da esq
uerda 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 matemtic
comuns.
Funo Finalidade Tipo do
argumento
Tipo do
resultado
ABS(X) Valor Absoluto Inteiro, Real o mesmo do argumento
FRAC(X) Parte Fracionria Real Real
TRUNC(X) Parte Inteira Real Inteiro
ROUND(X) Valor Arredondado Real Inteiro
SQR(X) Eleva ao quadrado Inteiro, Real o mesmo do argumento
SQRT(X) Raiz quadrada Inteiro, Real Real
LN(X) Logaritmo Natural Real Real
EXP(X) Exponencial Real Real
Como no existe em Pascal um operador nem uma funo especfica para a operao de Potencia
podemos consegu-la utilizando as funes LN(X) e EXP(X). Para calcular o valor de X
N
suficiente usar:

EXP(LN(X)*N)
Exemplos:
Expresso Resultado
ABS(-2.5) 2.5
ABS(8) 8
FRAC(5.234) 0.234
TRUNC(2.78) 2
ROUND(2.78) 3
SQR(2) 4
SQR(1.5) 2.25
SQRT(4) 2.0
SQRT(2.25) 1.5
EXP(LN(2)*3) 8
3Apostila de Delphi Marcos Ribeiro
Expresses Lgicas
As operaes lgicas podem ser consideradas afirmaes que sero testadas pelo computador,
endo como
resultado, um valor verdadeiro ou falso. So utilizadas com os operadores relacion
ais 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 Resultado
1 = 2 FALSE
'A' = 'a' FALSE
5 > 2 TRUE
3 <= 3 TRUE
TRUE < FALSE FALSE
'JOAO' > 'JOSE' FALSE
2 + 3 <> 5 FALSE
'comp' <> 'COMP' TRUE
'11' < '4' TRUE
Operadores Lgicos
So usados para combinar expresses lgicas.
Operador Operao
not no (negao)
and e (conjuno)
or ou (disjuno)
4Apostila de Delphi Marcos Ribeiro
A tabela verdade (abaixo) apresenta o resultado de cada operador lgico, com os va
lores dados para as
expresses lgicas A e B:
A B A and B A or B not A not B
TRUE TRUE TRUE TRUE FALSE FALSE
TRUE FALSE FALSE TRUE FALSE TRUE
FALSE TRUE FALSE TRUE TRUE FALSE
FALSE FALSE FALSE FALSE TRUE TRUE
Prioridade
Em uma expresso lgica, a ordem de avaliao dos operadores segue a tabela abaixo:
Prioridade Operadores

1 NOT
2 AND
3 OR
4 = > < >= <= <>
Como a ordem de precedncia dos operadores lgicos maior que a dos operadores relaci
onais, devem
sempre ser usados parnteses quando se escrever uma expresso lgica complexa. Por exe
mplo:
( A > B ) OR ( B = C )
Declarando variveis
A declarao de uma varivel define o nome e o tipo da varivel. Declaraes de variveis d
m ser
precedidas pela palavra-chave var. As declaraes, junto com a palavra-chave var con
stituem 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 p
ara 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;
5Apostila 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 palavr
a-chave const. As
declaraes das constantes, junto com a palavra-chave const constituem o chamado blo
co const.
Ao contrrio das variveis, as constantes devem ter seus valores definidos logo na d
eclarao. Alm disso,
os tipos das constantes no so definidos explicitamente. Eles so deduzidos pelo Delp
hi, 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, "Veloci
dadeMaxima" 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 smbo
lo de atribuio:

":=".
Comentrios
Um comentrio usado para aumentar a clareza de um programa, embora no seja analisad
o 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.
6Apostila de Delphi Marcos Ribeiro
Formato de Programa Pascal
Pascal uma linguagem altamente estruturada que possui uma rigidez definida, embo
ra sua estrutura de
programa seja flexvel. Cada seo ou parte de um programa em Pascal deve aparecer num
a 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 quebrad
as, 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 disponv
eis 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 tpic
o agora por ser
assunto dos prximos captulos.
Ex:
type
TDiaUtil = (Segunda, Terca, Quarta, Quinta, Sexta);
TFabricante = (Chevrolet, Ford, Volkswagen);
TSexo = (Masculino, Feminino);
7Apostila de Delphi Marcos Ribeiro
Declarao de Procedimentos e Funes
Nesta rea so definidos os procedimentos e funes utilizados pelo programa. Tambm um a
sunto 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
8Apostila de Delphi Marcos Ribeiro
Tipos de Dados
Tipos Simples
O tipo declarado para uma varivel define o conjunto de valores permitidos para aq
uela varivel. H uma
grande quantidade de tipos disponveis em Object Pascal. H vrios tipos muito parecid
os entre si, que so
usados apenas para manter compatibilidade com verses anteriores da linguagem Pasc
al. Abaixo listamos
os tipos mais comumente usados.
Nmericos
Inteiros
So caracterizados como tipos inteiros, os dados numricos positivos ou negativos. E
xcluindo-se destes
qualquer nmero fracionrio.
Ex: 0, -156, 10, 234, -80
Tipos Mnimo Mximo Tamanho
byte
Integer -2.147.483.647 2.147.483.647 4
Cardinal 0 4294967295 4
Shortint -128 127 1

Smallint -32768 32767 2


Longint -2.147.483.647 2.147.483.647 4
Int64 -2^63 2^63-1 8
Byte 0 255 1
Word 0 65535 2
Longword 0 4294967295 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 Mnimo Mximo Tamanho
byte Preciso
Real 5.0 x 10^-324 1.7 x 10^308 8 15-16
Real48 2.9 x 10^-39 1.7 x 10^38 6 11-12
Single 1.5 x 10^-45 3.4 x 10^38 4 7-8
Double 5.0 x 10^-324 1.7 x 10^308 8 15-16
Extended 3.6 x 10^-4951 1.1 x 10^4932 10 19-20
Comp -2^63+1 2^63 -1 8 19-20
Currency 8 19-20
9Apostila de Delphi Marcos Ribeiro
Char
Representa um nico caracter, escrito entre apstrofos (
). A maioria dos computador
es 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 F
ALSE (falso), sendo
que este tipo de dado poder representar apenas um dos dois valores. Ele chamado d
e 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 e
xistem 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 mesm
o tipo. Existem
estruturas de dados que trabalham s com um tipo de elemento, como o vetor, e outr
as que combinam
elementos de dados diferentes, no caso do registro, por exemplo. Uma estrutura d
e dados tambm pode
conter outra estrutura de dados.
As estruturas de dados so subdivididas em dois grupos, estticas e dinmicas. Uma est
rutura de dados
esttica aquela que no pode ter a sua quantidade de elementos de dados alterada dur
ante a execuo
de um programa. As mais comuns so os vetores, as strings e os registros. Uma estr
utura de dados
dinmica frequentemente tem elementos inseridos ou retirados do seu interior. Arqu
ivos 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 (a


rrays 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 decl
arados usando
somente a palavra-chave string. String curtos tm o comprimento limitado em 255 ca
racteres. Para
declarar um String curto, use a palavra-chave string seguida pelo tamanho deseja
do, entre colchetes.
Uma string declarada da seguinte maneira:
NomeDaString: String[TamanhodaString]; onde:
10Apostila 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 va
rivel 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 Usado para
ShortString 255 2 at 256 bytes Compatibilidade com
verses anteriores
AnsiString = String =
String Longa
~2^31 4 bytes at 2GB
Caracteres 8-bit
(ANSI), DBCS ANSI,
MBCS ANSI,etc
WideString ~2^30 4 bytes at 2GB
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 es
t vazia, ou
seja, quando ela contm uma string de tamanho zero - o ponteiro nulo e no usa a str
ing de
armazenamento adicional. Quando a varivel no estiver vazia, ela apontar para um blo
co 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 a
tual da varivel. Esta
memria alocado no heap, mas seu gerenciamento totalmente automtico e no exigindo qu
alquer
cdigo do usurio.

Ex:
Var
Nome: String[10];
Begin
Nome := MARCOS ;
End;
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 me
mria
11
MEMRIA
10 6 M A R C O S
HEAP
Nome
PILHAApostila 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 : String[60];
Endereco: String[50];
Salario : Real;
Idade : Byte;
End;
O tamanho total de uma varivel registro na memria ser o somatrio da quantidade de by
tes que cada
campo (que pode ser de elementos ou de estruturas de dados) ocupa na memria. A va
rivel Funcionario,
por exemplo, ocupar 119 bytes consecutivos na memria.
Para se atribuir valores nos campos referentes aos dados de um funcionrio, devemo
s utilizar as seguintes
notaes:
Funcionario.Nome := Manoel da Silva ;
Funcionario.Endereco := Avenida Maracan, 524 ;
Funcionario.Salario := 1597.00;
Funcionario.Idade := 29;
ou
with Funcionario do
Begin
Nome := Manoel da Silva ;
Endereco := Avenida Maracan, 524 ;

Salario := 1597.00;
Idade := 29;
End;
12Apostila 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 ta
manho 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
ores 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 qualque
r expresso que
tenha como resultado um valor inteiro.
O exemplo a seguir declara um array "quadrados" com 100 inteiros e depois preenc
he 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 cons
t. 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 variv
eis, como se
fossem tipos predefinidos. Veja exemplos de declaraes que usam os tipos definidos
acima:
var
DiaInicial, DiaFinal: TDiaUtil;
Fab : TFabricante;
Sexo: TSexo;
13Apostila 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 exemp
los:
Fab := Ford;
Sexo := Masculino;
DiaDaSemana := Terca;
Note como no so usadas aspas para os valores. Isso acontece porque os valores de u
m tipo enumerado
so armazenados como valores inteiros, na seqncia em que so definidos (comeando a part
ir 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 d
e tipos enumerados.
Tipos de intervalo so teis quando necessrio limitar uma varivel a um intervalo contn
o de valores,
como de 1 a 100, ou de "A" a "Z". Veja a seguir exemplos de definies de tipos de i
ntervalo:
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 es
tar entre 0 e 360.
Quando uma varivel e definida com um tipo de intervalo, o Delphi verifica, durant
e a compilao, as
alteraes nesta varivel e gera erros de compilao quando os limites do intervalo so vio
ados. 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", indica
ndo 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 const
antes para a varivel.
Quando so usadas expresses mais complexas (clculos por exemplo), o Delphi s pode det
ectar o erro
em tempo de execuo. O exemplo a seguir passaria na compilao, mas a linha destacada g
eraria uma
exceo do tipo ERangeError (Temp receberia o valor 400, maior que o mximo permitido
pelo tipo Tgrau:
360).
14Apostila 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
15Apostila 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 mostra
mos 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 varive
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 winches
ter.
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 ar
quivos.
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 curso

r aparece
esperando a digitao dos trs valores que devem ser separada por, pelo menos, um espao
em branco.
16Apostila 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 deseja
dos. A unidade de
sada padro o monitor de vdeo, podendo ser tambm a impressora ou uma memria auxiliar
omo 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 c
ampo 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 quant
idade 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);
17Apostila de Delphi Marcos Ribeiro
No instante da solicitao de dados, podemos usar junto com o READ ou READLN um coma
ndo 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);
18Apostila de Delphi Marcos Ribeiro
Controle de fluxo
Os programas mostrados at aqui no fazem nada alm de definir novos tipos, declarar v
ariveis 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 u
samos blocos
vrias vezes nos exemplos mostrados at aqui . No arquivo de projeto, por exemplo, u
m 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 e
legantes e
poderosas.
If-then-else
O comando mais usado para fazer decises simples o comando if. O comando if verifi
ca uma condio e
executa um comando ou bloco de comandos somente se a condio for verdadeira. O coma
ndo 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 s
eralmente
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 est
iver 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.
19Apostila de Delphi Marcos Ribeiro
Usando else
Um comando if pode tambm apresentar uma segunda parte, delimitada pela palavra-ch
ave else. O
comando da segunda parte (depois de else) executado quando a condio falsa. O exemp
lo 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 progra
ma 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 um
a regra
obrigatria da linguagem Object Pascal: um end antes de um else nunca deve ser seg
uido por ";". Somente
o ltimo end do comando if deve terminar com ponto-e-vrgula.
20Apostila 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 acord
o com o valor da
nota. Acompanhe o fluxo do programa: se a nota for menor que 5, a primeira mensa
gem 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 d
as 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 c
omplexa. 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 ling
uagem Object
Pascal em geral mais clara e mais rpida que uma seqncia de ifs aninhados. Uma estru
tura 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;
21Apostila 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.
22Apostila de Delphi Marcos Ribeiro
Usando loops
Os loops ("laos") so estruturas usadas para repetir vrias vezes sequncias de comando
s. 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 verdadeir
a,
respectivamente.
O loop for

O loop for o mais rpido e mais compacto dos trs tipos de loops. Esse loop usa um c
ontador, 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 mlti
plos 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 loo
p while repete um
comando, ou um bloco de comandos, at que a condio especificada se torne falsa. O nme
ro 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 s
tring) 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,
rama sai
do loop e executa o comando imediatamente depois. Se a condio testada for verdadei
ra, o loop
23Apostila 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 inteiramen
te na primeira vez.
Outra caracterstica importante do loop while, que a condio usada no loop deve se to
rnar falsa em
algum momento. Caso contrrio, o loop executado para sempre. O programa entra em u
m "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 progra
ma ficar preso
para sempre dentro do while.
Esse um erro cometido com freqncia, principalmente em loops while com condies mais c
omplexas.
Tenha cuidado, portanto, de alterar pelo menos uma das variveis envolvidas na con
dio, dentro do while.
O loop repeat
O loop repeat uma verso "invertida" do loop while. Nele, a condio verificada soment
e 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 estrutu
ra 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 el
egante:
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','');
24Apostila 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 usad
a no loop while
o oposto da condio do loop repeat. Alm disso, h uma repetio das linhas de cdigo que
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 conveninc
ia, 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] of Integer;
i: Integer;
...
for i:= 1 to 1000 do
if A[i] <> B[i] then break;
if i = 1000 then
ShowMessage('Todos os elementos so iguais')
else
ShowMessage('O elemento com ndice ' + IntToStr(i) + '
diferente');
...
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 c
hecados. Se todos
os elementos forem iguais, o valor da varivel i no final do loop ser 1000 e a prim
eira 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.
25Apostila de Delphi Marcos Ribeiro
Procedures e functions
A linguagem pascal permite que possamos declarar trechos de cdigo fora do program
a principal e
associados a um identificador que podem ser executadas sempre que invocados. Cha
maremos estes
trechos de cdigo por mdulos ou rotinas.
Uma das tcnicas mais utilizadas e tida como vantajosa na confeco de programas grand
es 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 c
hamados de
subprogramas.
Os principais motivos para se usar rotinas so:
1. Evitar codificao: trocar certos trechos de programas que se repetem por chamada
s 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 princi
pal ou por uma outra
procedure, ou at por ela mesma.
Uma procedure tem praticamente a mesma estrutura de um programa, ou seja, ela co
ntm um cabealho,
rea de declaraes e o corpo da procedure. Na rea de declaraes, podemos ter as seguinte
subreas:
Const - Type - Var - Procedures - Functions
Devemos salientar que tudo que for declarado dentro das subreas s ser reconhecido d
entro 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;
26Apostila 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 identifica
dor de uma funo assume o valor de retorno da funo. Uma funo deve sempre retornar um valor e em Turb
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 ne
ssa ordem).
Todos estes so opcionais, pois a procedure ou functions pode no precisar de nenhum
a 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: atribuind
o um valor para o nome da
function, ou alterando a varivel especial Result. As duas funes a seguir so exatamen
te equivalentes:
27Apostila 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 parme
tros de uma
rotina so opcionais. So comuns rotinas (principalmente procedures) sem nenhum parme
tro.
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 depoi
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 pas
ada 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 pa
lavra-chave var antes
do nome do parmetro, no cabealho da rotina.Veja um exemplo que usa os dois tipos d
e 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 va
lor. 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 cd
igo, em qualquer
lugar da Unit em que foi definida.
Para chamar uma procedure ou function, basta especificar o seu nome e valores pa
ra seus parmetros (se
houver). O seguinte trecho de cdigo mostra como chamar a procedure Descontar (def
inida 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);
...
28Apostila de Delphi Marcos Ribeiro
Onde criar procedures e functions
H regras para o posicionamento das procedures no cdigo: as procedures devem ser co
locadas somente
depois da parte implementation da Unit (veja a seguir), depois das declaraes das v
ariveis 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.
29Apostila de Delphi Marcos Ribeiro
Entendendo o cdigo das Units
As Units contm praticamente todo o cdigo de um aplicativo no Delphi. As Units gera
lmente 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 identificado
r 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 referen
ciem 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 c
lusula so geralmente
adicionadas pelo prprio Delphi, para fazer referncia a Units do sistema (predefini
das). rara a
necessidade de adicionar manualmente nomes de Units a essa clusula uses. Para se
referenciar a outras
30Apostila 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 des
it.
Nenhuma outra Unit pode ter acesso s variveis e constantes declaradas aqui.
A parte implementation contm a segunda clusula uses. As Units listadas nessa clusul
a 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 declar
ar 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 ante
s de qualquer outro cdigo
na Unit.
Parte finalization
A parte finalization tambm opcional. O cdigo nessa parte executado logo antes do tr
mino do

aplicativo. Essa parte geralmente usada para realizar "operaes de limpeza", como r
ecuperar memria e
outros recursos, ao final da execuo do aplicativo.
31Apostila de Delphi Marcos Ribeiro
Trabalhando com Excees
As excees so um mecanismo poderoso para lidar com erros nos seus programas. O uso d
e excees
permite uma separao entre o cdigo normal de um programa e o cdigo usado para lidar c
om erros que
podem surgir.
Quando ocorre um erro em um programa, o Delphi levanta uma exceo. Se uma exceo que f
oi levantada
no for tratada, o programa interrompido e mostrada uma caixa de dilogo com uma des
crio da
exceo. Uma exceo no-tratada pode causar danos aos seus dados, deixar o programa em um
a
situao instvel, ou at levar o programa a "travar".
Para evitar que isso acontea, voc deve tratar as excees, protegendo blocos de cdigo q
ue 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 bl
oco 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 "limpe
a", 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, gerad
quando
feita uma diviso por zero (o divisor aqui o valor contido no componente Edit1). A
ssume-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;
32Apostila 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 b
loco.
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 pr
incipais
rotinas de manipulao de strings oferecidas pelo Delphi. (As rotinas cujos nomes co
meam com "Ansi" so
capazes de lidar com caracteres acentuados e, portanto, so muito teis para strings
em portugus).
Funo Descrio
Copy(S:string; Indice,Comp: Integer):
string
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 substri
ng 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 exp
resses, e nas
chamadas de procedures e functions. Se o tipo usado no for compatvel com o tipo es
perado, gerado um
erro de compilao. Funes de converso de tipo devem ser usadas para converter valores p
ara os tipos
adequados.
33Apostila de Delphi Marcos Ribeiro
As principais funes de converso de tipo so listadas na tabela a seguir. Se uma conve
rso 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
34Apostila 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; Joa
na Botini. Rio de
Janeiro: Ed. Senac Nacional, 1999.
Manzano, Jos Augusto N. G., Algoritmos: lgica para desenvolvimento de programao, 2 E
dio,
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

Vous aimerez peut-être aussi