Académique Documents
Professionnel Documents
Culture Documents
Marcos Ribeiro
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
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
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
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
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
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;
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.
14
Apostila de Delphi
Marcos Ribeiro
15
Apostila de Delphi
Marcos Ribeiro
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
...
...
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:
Na formatao, se a varivel for real especificamos o total de posies ocupadas e a quantidade de casas
decimais
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.);
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.
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.
27
Apostila de Delphi
Marcos Ribeiro
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.
28
Apostila de Delphi
Marcos Ribeiro
29
Apostila de Delphi
Marcos Ribeiro
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
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
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
EZeroDivide
Quando se tenta dividir um nmero real (de ponto flutuante) por zero.
EConvertError
EInOutError
EDatabaseError
EDBEngineError
Rotinas teis
Nas sees a seguir, apresentaremos algumas rotinas (functions e procedures) teis na programao em
Object Pascal.
Funo
Copy(S:string;
string
Descrio
Indice,Comp:
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
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