Escolar Documentos
Profissional Documentos
Cultura Documentos
Sumrio
Introduo Pascal base para o delphi Object pascal Orientao para eventos Programas e units Viso geral Estrutura simplificada de um programa Units Estrutura da unit Programas e units no delphi Exemplo 1 Exemplo 2 Adicionando comentrios ao programa Exemplo 3 Tipos de dado, variveis e operadores Tipos de dados Variveis Exemplo 4 Exemplo 5 Convertendo dados Constantes Palavras reservadas Operadores e expresses Exemplo 6 Procedures e funes Introduo a procedures e funes Criando procedures Criando funes Posicionando a procedure ou funo na unit Exemplo 7 Chamando a procedure ou funo Exemplo 8 Passagem de parmetros por valor ou referncia Exemplo 9 Comandos condicionais Viso geral If...then Exemplo 10 Case...of Exemplo 11 Comandos de repetio Viso geral While...do Exemplo 12 For...do 1 03 03 03 03 04 04 04 05 05 05 07 10 11 11 12 12 12 13 14 14 16 16 17 18 19 19 19 21 23 23 25 25 27 27 30 30 30 31 34 35 38 38 38 38 40
Exemplo 13 Repeat...until Exemplo 14 Manipulando strings Viso geral Funes de manipulao de strings Procedure de manipulao de strings Rotinas aritimticas Viso geral Principais rotinas Exemplo 15 Outros tipos de dados Viso geral Arrays Exemplo 16 Exemplo 17 Strings Registros Exemplo 18 Tipo enumerado Tipo set Tipo intervalo Comandos de entrada e sada de arquivos Tipos de arquivos Trabalhando com arquivos texto Comandos de manipulao de arquivos texto Exemplo 19 Trabalhando com arquivos binrios Comandos de manipulao de arquivos binrios Exemplo 20 Manipulando arquivos no tipados Rotinas de gerenciamento de arquivos Exemplo 21 Outras rotinas de manipula co de arquivos Exemplo 22 Imprimindo arquivos Exemplo 23 Conceitos bsicos de orientao a objetos Objetos Atributos ou propriedades Servios ou mtodos Classes Relacionamento entre classes Menssagens Cdigo orientado a objetos em pascal Orientao a objetos em pascal Exemplo 24
O Object Pascal
Apesar de se basear na linguagem Pascal padro, o Delphi implementa alguns comandos novos, notadamente na parte de criao de classes e objetos. Estes novos comandos sero vistos neste livro, e o alertaremos quanto ao seu uso em outros compiladores Pascal. Por causa destes comandos adicionais, o Pascal do Delphi conhecido como Object Pascal. O segundo ponto que devemos ressaltar que, por ser um ambiente de programao que roda sobre o Windows, um programa em Delphi dificilmente usa os comandos de entrada e sada de dados em tela da linguagem Pascal, como Readln e Writeln, prprios para o ambiente DOS. A entrada e a sada de dados em tela esto ligadas aos componentes do Delphi inseridos no formulrio da aplicao, e s propriedades destes. Os comandos do Pascal s so usados quando desenvolvemos uma aplicao em Delphi para rodar em ambiente DOS, portanto sero vistos apenas superficialmente.
Viso Geral
Apesar de bem mais poderoso que qualquer outro compilador Pascal, como o Turbo Pascal, o ambiente de programao Delphi um pouco mais complexo do que os demais compiladores. Ou seja, no oferecido ao programador simplesmente uma tela em branco onde o cdigo em Pascal inserido. Ao contrrio, mesmo que nosso aplicativo Delphi no realize nenhuma operao, diversas linhas de cdigo so inseridas automaticamente pelo Delphi. Inserir seu prprio cdigo dentro do Delphi no uma tarefa simples. Por isso iniciamos este livro explicando de forma detalhada como o Delphi trabalha com programas e units. A partir deste captulo, poderemos dar nfase completa ao Pascal.
Iniciamos com o cabealho, que contm a palavra reservada program, seguida do nome que daremos ao programa, e um ponto e vrgula:
program nome_do_programa;
Por exemplo, se o nome que daremos para o programa for PrimeiroPrograma, faramos:
program PrimeiroPrograma;
Aps o cabealho do programa segue a seo uses. Nesta seo declaramos o nome das units usadas por nosso programa. Uma unit um conjunto de procedimentos e funes que realizam determinada operao, e sero vistas com mais detalhes na prxima seo. Se seu programa usa a unit PrimeiraUnit, por exemplo, teramos ento:
program PrimeiroPrograma; uses PrimeiraUnit;
Aps a seo uses, temos o corpo do programa, limitado pelas palavras reservadas begin e end:
begin
Entre estas palavras colocamos a estrutura de nosso programa. Note que aps a palavra end colocamos um ponto final, que mostrar ao compilador que o programa terminou.
Units
Quando um programa muito extenso, podemos divid-lo em units. Uma unit um conjunto de procedures e funes que realizam determinada tarefa. Seu programa pode ser ento dividido em diversas units, cada uma com determinado objetivo. As units criadas podem ser usadas no s pelo seu programa, mas por qualquer outro que voc venha a desenvolver. Como voc imagina, isto torna seu trabalho bem mais produtivo. Basta voc criar um conjunto de units padres para clculos, acesso a dados, etc, e depois us-las em seus diversos programas, sem ter que reescrev-las.
Este arquivo acessado atravs da opo Project | View Source. Note que na seo uses deste arquivo j est includa a Unit1, oferecida automaticamente pelo Delphi: 5
Veja a unit criada automaticamente pelo Delphi, acessada atravs de um clique sobre a aba correspondente a Unit:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} end.
Esta unit possui um cabealho, que a identifica como Unit1. Na seo interface, usa trs clusulas: uses, type e var. A clusula uses define as units que esta Unit1 usar. So units padro do Delphi, que oferecem, por exemplo, funes de converso, quadros de mensagem, etc. Voc no deve apag-las. 6
J as clusulas type e var criam dados e variveis ligados ao formulrio, operao que veremos com mais detalhes posteriormente. Voc tambm no deve mexer nestas clusulas. Finalmente temos a seo implementation (sem nada implementado), uma diretiva de pr-processamento (que tambm no deve ser apagada) e a palavra reservada end, seguida de um ponto final que finaliza a unit. A estrutura da unit vista acima criada automaticamente pelo Delphi, e a estrutura mnima que uma unit deve ter para criar um aplicativo no Delphi. Ou seja, no Delphi voc no cria cdigo em um arquivo do tipo program, apenas nas units. O arquivo do tipo program serve apenas para inicializar a aplicao, e determinar que units fazem parte desta.
Exemplo 1
Vamos criar um programa que mostra em uma caixa de mensagem a frase 'Bem Vindo'. Para isso, vamos ter que associar o cdigo que mostra a frase a um evento. Para facilitar, vamos associar o cdigo ao evento de criao do formulrio, que ocorre logo que o programa executado, e o formulrio mostrado na tela. Siga ento os seguintes passos: 1) Entre no Delphi. 2) Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate:
4) Clique sobre a linha em branco entre as palavras begin e end e escreva ento: 7
ShowMessage uma rotina do Delphi que mostra uma caixa de dilogo na tela, com uma mensagem definida pelo programador. Note que aps a linha de comando colocamos um ponto e vrgula. Isto feito para indicar ao compilador que a linha de comando terminou. Note tambm que o texto da mensagem est entre aspas simples. 5) Aperte a tecla F9, para executar o exemplo. Aparece o seguinte quadro de mensagem:
6) Clique no boto OK, para fechar o quadro de mensagem. 7) Feche o formulrio, para voltar ao ambiente do Delphi. 8) Se quiser salvar seu programa, selecione no menu File a opo Save Project As:
9) D um nome para a unit, e clique no boto Salvar. D um nome para o projeto, e clique no boto Salvar. Note que a unit possui muito mais cdigo do que a linha inserida por voc:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate (Sender: TObject); begin ShowMessage('Bem Vindo'); end; end.
Como vimos, as demais linhas so necessrias para o funcionamento do programa, e so inseridas automaticamente pelo Delphi, portanto, no se preocupe com elas.
Exemplo 2
9
Vamos criar agora um progama que escreva seu nome e sobrenome na tela. Podemos usar o mesmo comando ShowMessage visto anteriormente: 1) Entre no Delphi. 2) Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate.
3) Clique sobre a linha em branco entre as palavras begin e end e escreva ento:
ShowMessage('Adelize Oliveira');
10
Exemplo 3
O cdigo abaixo ilustra o uso de comentrios no cdigo:
procedure TForm1.FormCreate(Sender: TObject); begin { Mostraremos uma mensagem} ShowMessage('Adelize Oliveira'); (* A mensagem foi mostrada *); end;
11
Tipos de Dados
Um tipo de dado define uma regio de valores que uma varivel capaz de armazenar, e tambm define um conjunto de operaes que as variveis daquele tipo so capazes de realizar. O Pascal oferece os seguintes tipos de dados:: Integer: inteiro. Ocupa somente 2 bytes de memria, e seu valor pode variar de -32.768 at 32.767. Shortint: inteiro curto. Ocupa somente 1 byte de memria, e seu valor pode variar de -128 at 127. Longint: inteiro longo. Ocupa 4 bytes de memria, e seu valor varia de - 2.147.483.648 at 2.147.483.647. Word: inteiro sem sinal. Ocupa 2 bytes da memria e seu valor varia de 0 at 65.535. Byte: inteiro sem sinal. Ocupa apenas 1 byte da memria e seu valor varia de 0 at 255. Real: nmero decimal. Ocupa 6 bytes da memria, e seu valor varia de 2.9E-39 at 1.7E+38, com 11 a 12 dgitos significativos. Single: nmero decimal. Ocupa 4 bytes da memria, e seu valor varia de 1.5E-45 at 3.4E+38, com 7 a 8 dgitos significativos. Double: nmero decimal . Ocupa 8 bytes da memria, e seu valor varia de 5.0E-324 at 1.7E+308, com 15 a 16 dgitos significativos. Extended: nmero decimal. Ocupa 10 bytes da memria, e seu valor varia de 3.4E-4932 at 1.1E+4932, com 19 a 20 dgitos significativos. Comp: um tipo real que ocupa 8 bytes da memria e que s armazena inteiros. Seu valor varia de -2E+63 +1 at 2E+63 -1 com 19 a 20 dgitos significativos. Char: assume caracteres do teclado como valores. Boolean: assume apenas True (verdadeiro) e False (falso) como valores. String: formado por um conjunto de elementos do tipo Char. O Delphi oferece tambm um outro tipo de dado, TDateTime, para manipular dados no formato de data e hora.
Variveis
Variveis so identificadores que mudam de valores de acordo com o programa.
Declarando Variveis
Voc precisa dar a uma varivel tanto um nome quanto um tipo. 12
os nomes de variveis podem ter tamanho ilimitado, mas o compilador s l os primeiros 63 caracteres; voc pode utilizar letras e nmeros, e o caracter de sublinhado _; os nomes das variveis precisam comear com uma letra ou com o caracter de sublinhado _; cada varivel deve ter um nome nico, diferente das palavras reservadas do Pascal (veja lista a seguir); no h diferena entre maisculas e minsculas; no so permitidos espaos em branco no nome da varivel.
Uma vez que voc tenha determinado o nome da varivel, dever declarar seu tipo na seo var da unit:
unit Unit1; interface var nome: string; num: integer; x,y: real; implementation end.
Como vimos acima, a declarao feita definido-se um nome para a varivel, seguido de um sinal de dois pontos (:) e do tipo da varivel, terminando finalmente com um ponto e vrgula (;).
As variveis declaradas na seo var podem ser utilizadas por todas as sub-rotinas e funes descritas no programa, ou seja, so globais. Como veremos, voc poder criar variveis locais, ou seja, variveis que s podero ser utilizadas na procedure ou funo onde so declaradas:
procedure Calculo; var A : integer; begin A := 4; end;
Exemplo 4
Vamos criar um programa que calcule o quadrado de uma determinado valor x, armazenando o resultado na varivel quadrado. Para isso: 1. Entre no Delphi. 2. Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate. 3. Clique sobre a linha em branco entre as palavras begin e end e escreva ento:
procedure TForm1.FormCreate(Sender: TObject);
13
Usamos a funo de converso InttoStr para converter um valor inteiro para string. As funes de converso sero vistas com mais detalhes posteriormente. 4. Role a unit at a clusula var da seo implementation, e insira a declarao das variveis:
var Form1: TForm1; x, quadrado : integer;
5. Aperte a tecla F9, para executar o exemplo. 6. Volte para o ambiente do Delphi.
Exemplo 5
O programa a seguir soma os valores de X e Y, armazenando o total na varivel Conta, todas do tipo integer. Aps a soma, mostrado na tela o resultado, usando-se o comando ShowMessage: 1. Entre no Delphi 2. Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate. 3. Clique sobre a linha em branco entre as palavras begin e end e escreva ento:
procedure TForm1.FormCreate(Sender: TObject); begin X := 12; Y := 13; Conta := X + Y; ShowMessage('O valor de Conta '+ InttoStr(Conta)); end;
4. Role a unit at a clusula var da seo implementation, e insira a declarao das variveis:
var ..... Conta : integer; X,Y : integer;
5. Aperte a tecla F9, para executar o exemplo. 6. Volte para o ambiente do Delphi.
Convertendo Dados
O Pascal oferece diversos comandos para a converso de um tipo de dados em outro. Veja alguns:
Str
Converte um valor integer ou real para uma string, armazenando o resultado em uma varivel. 14
Sintaxe: Str(x, var s) onde x um nmero integer ou real, e var s a varivel do tipo string onde ser armazenada a converso.
Val
Converte uma string para um valor real. Sintaxe: Val (s: string, var v, var code) onde s a string a ser transformada, var v a varivel onde armazenado o resultado da converso, e var code a varivel onde armazenado o ndice do caracter que tornou impossvel a converso, caso ela seja impossvel.
IntToStr
Converte um nmero do tipo integer para uma string contendo uma representao decimal daquele nmero. Sintaxe: IntToStr(Valor: Longint) onde Valor o nmero a ser convertido. A funo retorna uma string, contendo a representao decimal daquele nmero.
FloatToStr
Converte um nmero do tipo real, single, double ou extended em uma string. Sintaxe: FloatToStr(valor: extended) onde valor o nmero a ser convertido. A funo retorna uma string, contendo a representao decimal daquele nmero.
StrToInt
Converte uma string representando um nmero integer em um nmero. Sintaxe: StrToInt(s: string) onde s a string a ser convertida. A funo retorna um valor Longint. Se a string no representa um nmero vlido, StrToInt retorna uma exceo.
StrToFloat
15
Converte uma string representando um nmero real, single, double ou extended em um nmero. Sintaxe: StrToFloat(s: string) onde s a string a ser convertida. A funo retorna um valor extended. Se a string no representa um nmero vlido, StrToFloat retorna uma exceo.
Constantes
So identificadores que no alteram seu valor durante a execuo do programa. Podem ser dos mesmos tipos descritos para variveis, e as regras descritas para criao dos nomes das variveis devem ser seguidas para a criao de constantes. As constantes so declaradas na clusula const:
unit Unit1; interface ..... const num = 350; nome = 'Pascal'; implementation ... end.
Como vimos acima, a declarao de constantes feita descrevendo seu nome, seguido de um sinal de igual (=), seu valor e um ponto e vrgula (;). Note que:
voc usa o operador = para atribuir valores constantes; para trabalhar com constantes do tipo string, voc dever colocar seu contedo entre aspas simples. as demais constantes sero classificadas de acordo com o que foi digitado. Por exemplo, um nmero 650000 muito grande para ser do tipo integer, logo s pode ser do tipo longint.
Palavras Reservadas
As palavras abaixo so reservadas pelo Pascal, no podendo ser usadas para nomes de variveis ou constantes: and case div except function inherited label object program set to uses as class do exports goto inline library of property shl try var asm const downto file if initialization mod or raise shr type while array constructor else finally implementation interface nil packed record string unit with begin destructor end for in is not procedure repeat then until xor 16
Operadores e Expresses
Uma expresso pode ser uma simples constante ou varivel, ou a combinao de variaveis e constantes usando operadores. Os operadores podem ser: aritmticos, relacionais, lgicos, e de string. Operadores Aritmticos + * / ^ div mod Funo Soma Diferena Multiplicao Diviso Exponenciao Diviso Mdulo
Funo e ou no ou exclusivo
Operadores de Strings +
Exemplo 6
Vamos criar um programa, que tire a raiz quadrada de um nmero, multiplique-a por 3, converta o valor em string e coloque o resultado na tela. Para isso, siga os seguintes passos: 1) Entre no Delphi. 2) Clique sobre o formulrio apresentado, e, no Object Inspector, v para a ficha Events, e d um duplo clique no evento onCreate. 17
3) Clique sobre a linha em branco entre as palavras begin e end e escreva ento:
procedure TForm1.FormCreate(Sender: TObject); begin quadrado := square(x); mult := quadrado * 3; str(mult, result); ShowMessage('O valor '+ InttoStr(result)); end;
4) Role a unit at a clusula var da seo implementation, e insira a declarao das variveis:
var ..... x, quadrado, mult : real; result : string;
5) Aperte a tecla F9, para executar o exemplo. 6) Volte para o ambiente do Delphi.
18
Voc pode criar suas prprias procedures e funes, para organizar o cdigo da aplicao de forma a facilitar sua leitura e manuteno, ou mesmo para reaproveitar procedures e funes em outras aplicaes. A diferena principal entre procedures e funes que funes retornam valores aps serem processadas, ao passo que procedures nada retornam.
Criando Procedures
Uma procedure composta de duas partes:
As procedures podem ter parmetros, ou seja, dados que so passados para a procedure quando esta chamada. Os parmetros, ou argumentos, so listados entre parnteses. Cada parmetro possui um identificador e um tipo, e so separados entre si por um ponto e vrgula (;):
procedure ValidaEntrada(num: integer; nome: string);
No exemplo acima, a procedure possui dois parmetros: num e nome. Ou seja, quando chamarmos a procedure ValidaEntrada em nosso programa, teremos que fornecer para ela um nmero inteiro e uma string.
19
Pascal para Delphi var resultado : string; dado : integer; begin end; ....
Neste caso, as variveis declaradas sero locais, ou seja, s podero ser utilizadas dentro da procedure. Se quiser que suas varveis sejam globais, deve declar-las na seo interface, clusula var da unit:
unit Unit1; interface var resultado : string;
O mesmo raciocnio vale para as constantes. Voc pode declar-las na seo const da procedure, e ento sero locais:
procedure ValidaEntrada(num: integer; nome: string); const pi = 3,14; begin end; ....
Se quiser que suas constantes sejam globais, deve declar-las na seo interface,clusula const da unit, e no da procedure.
Criando Funes
Uma funo composta de duas partes:
Como vimos anteriormente, a diferena entre uma procedure e uma funo que a funo retorna algum valor, aps ser executada.
As funes podem ter parmetros, ou seja, dados que so passados para a funo quando esta chamada. Os parmetros, ou argumentos, so listados entre parnteses. Cada parmetro possui um identificador e um tipo, e so separados entre si por um ponto e vrgula (;):
function ValidaEntrada(num: integer; nome: string) : boolean;
No exemplo acima, a funo possui dois parmetros: num e nome. Ou seja, quando chamarmos a funoValidaEntrada em nosso programa, teremos que fornecer para ela um nmero inteiro e uma string.
begin end;
Neste caso, as variveis declaradas sero locais, ou seja, s podero ser utilizadas dentro da fun Se quiser que suas varveis sejam globais, deve declar-las na seo interface, clusula var da unit:
unit Unit1; interface var resultado : string;
O mesmo raciocnio vale para as constantes. Voc pode declar-las na seo const da funo, e ento sero locais: 21
Pascal para Delphi function ValidaEntrada(num: integer; nome: string): boolean; const pi = 3,14; begin end; ....
Se quiser que suas constantes sejam globais, deve declar-las na seo interface,clusula const da unit, e no da funo.
Se estiver construindo uma funo, o valor de retorno desta pode ser atribuido uma varivel com o nome da funo:
function CalculaSoma(num1, num2: integer): longint; begin end; CalculaSoma := num1 + num2;
O Delphi tambm aceita que voc atribua o retorno da funo varivel Result:
functionalculaSoma(num1, num2: integer): longint; begin end; Result := num1 + num2;
22
Pascal para Delphi procedure ValidaEntrada(num:integer; nome: string); implementation .... end.
Exemplo 7
A procedure abaixo calcula a diferena de duas variveis:
procedure CalculaDiferenca; var num1, num2 : integer; dif : integer; num1 := 10; num2 := 2; dif := num1 - num2;
begin
end;
Criamos a procedure acima iniciando-a com a palavra reservada procedure. CalculaDiferenca o nome da procedure. Iniciamos ento uma seo var, onde declaramos trs variveis locais procedure, todas do tipo integer: num1, num2 e dif. Aps a seo var, colocamos o corpo da procedure, entre as palavras reservadas begin e end. Atribumos valores para num1 e num2, e calculamos a diferena entre eles, atribuindo o resultado para a varivel dif. Se voc quiser utilizar o valor da varivel dif em outro local, deveria criar uma funo, ao invs de uma procedure:
Function CalculaDiferenca : integer; var begin num1 := 10; num1, num2 : integer;
23
Nesse caso, o retorno da funo dado atravs de uma varivel CalculaDiferenca, que possui o mesmo nome da funo. Note que especificamos no cabealho da funo que seu retorno um dado do tipo integer. Se os valores de num1 e num2 forem fornecidos por outra procedure, voc pode coloc-los como parmetros:
procedure CalculaDiferenca(num1,num2 : integer); var dif : integer; begin end; dif := num1 - num2;
Veja como ficaria posicionada a procedure CalculaDiferenca dentro da unit Unit1. Para efeito de ilustrao, vamos supor que a varivel dif uma varivel global:
unit Unit1; interface ...... var dif : integer; procedure CalculaDiferenca; implementation {$R *.DFM} procedure CalculaDiferenca; var num1, num2 : integer; begin num1 := 10; num2 := 2; dif := num1 - num2;
end; end.
<>
24
Exemplo 8
A unit abaixo possui duas procedures, MostraResultado e CalculaDiferenca. A procedure CalculaDiferenca calcula a diferenca entre dois valores, e a procedure MostraResultado mostra na tela esta diferena. Quando o formulrio criado (ou seja, quando o evento onCreate ocorre), chamamos a funo MostraResultado:
unit Unit1; interface var dif : integer; resultado : string; procedure CalculaDiferenca; procedure MostraResultado; implementation {$R *.DFM} procedure CalculaDiferenca; var num1, num2 : integer; begin num1 := 10; num2 := 2; dif := num1 - num2; str(dif, resultado); end; procedure MostraResultado; begin CalculaDiferenca; ShowMessage('A diferena : '+ resultado); end; procedure TForm1.FormCreate(Sender: TObject); begin MostraResultado; end; end.
Como vimos, a procedure MostraResultado chama a procedure CalculaDiferenca. O valor armazenado na varivel dif, global, ento mostrado na tela. Preste ateno em dois pontos:
Se a varivel dif ou a varivel resultado fossem declaradas na seo var da procedure CalculaDiferenca, no poderamos nos referir a elas na procedure MostraResultado. Como a procedure MostraResultado chama a procedure CalculaDiferenca, esta ltima deve ser declarada primeiro. Isto porque, se voc declarasse a procedure MostraResultado primeiro, o compilador acusaria um erro, dizendo que h uma procedure sendo usada (CalculaDiferenca) sem ser declarada.
Veja como ficaria a unit anterior se passssemos os valores de num1 e num2 como parmetros, na chamada da procedure CalculaDiferenca::
unit Unit1; interface
25
Pascal para Delphi var dif : integer; resultado : string; procedure CalculaDiferenca(num1, num2 : integer); procedure MostraResultado; implementation {$R *.DFM} procedure CalculaDiferenca(num1, num2 : integer); begin end; dif := num1 - num2; str(dif, resultado);
procedure MostraResultado; begin CalculaDiferenca(10,2); ShowMessage('A diferena : '+ resultado); end; procedure TForm1.FormCreate(Sender: TObject); begin MostraResultado; end; end.
Se a procedure CalculaDiferenca fosse uma funo, poderamos utilizar seu retorno, e nosso programa ficaria assim:
unit Unit1; interface var resultado : string; function CalculaDiferenca(num1,num2 : integer) : integer; procedure MostraResultado; implementation {$R *.DFM} function CalculaDiferenca(num1, num2 : integer) : integer; begin CalculaDiferenca := num1 - num2; end; procedure MostraResultado; begin resultado :=InttoStr(CalculaDiferenca ( 10,2)); ShowMessage('A diferena : '+ resultado); end; procedure TForm1.FormCreate(Sender: TObject); begin MostraResultado; end;
26
Desta forma, podemos no s passar como parmetro o valor original da varivel, como tambm modificar este valor dentro da procedure que a utiliza como parmetro. Uma referencia da varivel passada para a procedure.
Exemplo 9
O programa abaixo usa a passagem de parmetro por valor:
unit Unit1; inteface var Index : integer; procedure VerificaParametro(num : integer); implementation {$R *.DFM} procedure VerificaParametro(num : integer); begin num := 12; end; procedure TForm1.FormCreate(Sender: TObject); begin Index := 1; ShowMessage('O valor inicial de Index '+ IntToStr(Index)); VerificaParametro(Index); ShowMessage('Aps a procedure, o valor de Index ' + IntToStr(Index)); end; end.
Ou seja, quando chamamos a rotina VerificaParametro, passamos como parmetro a varivel Index, com valor inicial de 1. Como a passagem por valor, a varivel Index continua com valor 1 quando a procedure 27
acaba, mesmo que dentro da procedure VerificaParametro mudemos o valor de num (que representa a varivel Index) para 12. O resultado o programa acima o seguinte:
O valor inicial de Index 1 Aps a procedure, o valor de Index 1
Veja como ficaria o programa anterior se usssemos a passagem de parmetro por referencia:
unit Unit1; inteface var Index : integer; procedure VerificaParametro(varnum : integer); implementation {$R *.DFM} procedure VerificaParametro(varnum : integer); begin num := 12; end; procedure TForm1.FormCreate(Sender: TObject); begin Index := 1; ShowMessage('O valor inicial de Index '+IntToStr(Index)); VerificaParametro(Index); ShowMessage('Aps a procedure, o valor de Index ' + IntToStr(Index)); end; end.
Ou seja, quando chamamos a rotina VerificaParametro, passamos como parmetro a varivel Index, com valor inicial de 1. Como a passagem por referncia, a varivel Index muda de valor dentro da procedure, j que mudamos o valor de num (que representa a varivel Index) para 12. O resultado o programa acima o seguinte:
O valor inicial de Index 1 Aps a procedure, o valor de Index 12
28
Viso Geral
Com um comando condicional, voc poder forar o programa a executar um bloco de operaes de acordo com uma condio. O Pascal possui dois grupos de comandos condicionais:
If...then Case...of
If ... then
Este comando condicional utilizado quando precisamos avaliar uma determinada condio. Se esta for verdadeira, executaremos determinado comando. Sintaxe:
if expresso then comando;
Outra sintaxe para o comando If...then inclui o uso do comando else: Sintaxe: 29
Ou seja, se expresso for verdadeira, executaremos a linha de comando1. Se for falsa, executaremos os comandos posteriores ao else, ou seja, a linha de comando 2. Note que a linha imediatamente anterior a palavra else no termina com um ponto e vrgula! Quando o bloco de comandos a ser executado dentro de um if...then for muito extenso, voc deve inseri-los dentro de uma estrutura begin...end:
if expresso then begin bloco de comandos1; end else begin bloco de comandos2; end;
Comandos Aninhados
Voc pode aninhar um comando if...then dentro de um outro comando if...then:
if expresso then begin comando1; if expresso2 then comando 2; end else comando3;
O Comando Exit
Atravs do comando Exit voc pode sair de um bloco de comandos limitado por begin...end, evitando que as demais linhas aps o comando Exit sejam avaliadas:
if expresso then Exit;
O Comando GoTo
Este comando desvia o cdigo para um determinado rtulo: Sintaxe:
GoTo <rtulo>
30
Pascal para Delphi implementation procedure MinhaProcedure; label 210; begin end; end. ....
Exemplo 10
O programa abaixo mostrar uma frase na tela se a varivel x for maior que a varivel y:
unit Unit1; interface var x, y : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 15; y := 12; if (x > y) then ShowMessage('X maior do que Y'); end; end.
O programa abaixo mostrar uma frase na tela se a varivel x for maior que a varivel y, e outra se x for menor do que y:
unit Unit1; interface var x, y : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 15; y := 12; if (x > y) then ShowMessage('X maior do que Y') else ShowMessage('Y maior do que X'); end; end.
O programa abaixo mostrar uma frase na tela se a soma da varivel x for maior que 25, e outra se no for: 31
Pascal para Delphi unit Unit1; interface var x, y, soma : integer; resultado : string; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 15; y := 12; if (x + y > 25) then begin soma := x + y; str(soma, resultado); ShowMessage('A soma igual a '+resultado); end else ShowMessage('A soma menor que 25'); end; end.
O programa abaixo calcula a rea de um quadrado. Se a rea estiver entre 25 e 60 metros quadrados, a rea suficiente, e o programa mostra uma mensagem na tela. Seno, o programa verifica qual a metragem, e se for menor do que 10 metros quadrados, mostra uma mensagem avisando que a sala muito pequena:
unit Unit1; interface var x, area : integer; resultado : string;
implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 6; area := x * x; if (area > 25) and (area < 60)then begin str(area, resultado); ShowMessage('A rea suficiente!'); ShowMessage ('A rea de '+ resultado); end else begin if (area < 10) then ShowMessage('A rea muito pequena!') else ShowMessage('Ainda h possibilidades!'); end; end; end.
O programa abaixo verifica o valor de uma varivel, mostrando-a na tela somente se seu valor for diferente de 1: 32
unit Unit1; interface var x : integer; procedure VerificaValor; implementation {$R *.DFM} procedure VerificaValor; begin x := 1; if (x = 1) then exit else begin x := x + 3; end; ShowMessage('O valor de x foi acrescido de 3 unidades'); end; procedure TForm1.FormCreate(Sender: TObject); begin VerificaValor; end; end. Ou seja, quando x for igual a 1, a mensagem no mostrada, pois o comando Exit interrompe a execuo do bloco inserido entre o begin e o end da procedure. O programa abaixo desvia o programa para o rtulo 1, se o valor da varivel X for maior do que 10:
unit Unit1; interface var x : integer; implementation {$R *.DFM} produre TForm1.FormCreate(Sender: TObject); label 1; begin x := 20; if x > 10 then goto 1; ShowMessage('O programa no foi para o label'); 1: ShowMessage('O programa veio para c'); end;
33
Ou seja, se o valor de x for maior do que 10, o programa pula para a linha com o rtulo 1, definido na seo label do programa.
Case ... of
Este comando condicional permite a execuo de comandos de acordo com o resultado de uma expresso do tipo ordinal. Sintaxe:
case expresso of sequencias de constantes 1: comando 1; sequencias de constantes 2: comando 2; end;
As constantes da sequencia so separadas por vrgula. Voc pode definir um intervalo de constantes, usando dois pontos (..) entre elas:
case tecla of 'A'..'Z', 'a'..'z': ShowMessage('Letra');
Neste caso, se o valor de expresso no for igual as constantes 1 ou iguais as constantes 2, o bloco de comando 3 ser executado. Note que ao contrrio do comando if...then...else, a linha anterior a palavra else termina com um ponto e vrgula. Quando o bloco de comandos a ser executado dentro de um case...of for muito extenso, voc deve inser-los dentro de uma estrutura begin...end:
case expresso of constantes 1: begin comandos 1; end; constantes 2: begin comandos 2; end; begin end; comandos 3;
else
34
Exemplo 11
A unit abaixo faz determinado clculo de acordo com o valor de x:
unit Unit1; interface var x, y : integer;
implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 2; case x 1 2 3 end; end; end. of : y := x + x; : y := x * x; : y := x div x;
ShowMessage(InttoStr(y));
implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin tecla := 'a'; case tecla of 'A'..'Z', 'a'..'z':ShowMessage('Letra'); '0'..'9':ShowMessage('Nmero'); '+', '-', '*', '/':ShowMessage('Operador'); end; end; end.
A unit abaixo faz determinado clculo de acordo com o valor de x. Se este no foi igual a 1, 2 ou 3, os valores so subtrados: 35
Pascal para Delphi unit Unit1; interface var x, y : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 2; case x 1 2 3 else y end; end; end. of : y := x + x; : y := x * x; : y := x div x; := x - x;
ShowMessage(IntToStr(y));
O programa abaixo calcula o valor do salrio de um funcionrio, de acordo com seu cdigo de funo:
unit Unit1; interface var codo : integer; salario, desconto : real; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Cod := 2; desconto := 0; case Cod of 1 : begin salario := 1000; desconto := salario * 0.2; salario := salario-desconto; end; 2: begin salario := 2000; desconto := salario * 0.2; salario := salario-desconto;
end; 3:
36
Pascal para Delphi begin salario := 3000; desconto := salario *0.2; salario := salario-desconto;
end; else
end; end.
Viso Geral
Os comandos de repetio repetem blocos de comando de acordo com determinada condio. Por exemplo, se voc precisa repetir uma soma enquanto o total no atende determinada condio, use comandos interativos. Entre os comandos de repetio oferecidos pelo Pascal temos:
While ... do
Este comando repete um bloco de comando enquanto determinada condio for verdadeira. Sintaxe:
while expresso do comando1;
Quando o bloco de comandos a ser executado dentro de um while...do for muito extenso, voc deve inserilos dentro de uma estrutura begin...end:
while expresso do begin comando 1; comando 2; comando n; end;
Interrompendo o Loop
Para interromper a repetio de um bloco de comandos dentro de uma estrutura while...do, use o comando Break: 37
Exemplo 12
O programa abaixo multiplica os valores de dois nmeros at que o total atinja o valor de 1000:
unit Unit1; interface var x, total : integer
implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin total := 5; x := 2; while (total < 1000) do total := total * x; ShowMessage(IntToStr(total)); end; end.
implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Contador := 4; while Contador < 20 do begin ShowMessage('O valor de Contador '+ IntToStr(Contador)); Contador := Contador + 2; end; end; end.
Veja como ficaria o programa anterior se usssemos um comando break para interromper a contagem se o valor da varivel Contador atingisse 10: 38
Pascal para Delphi unit Unit1; interface var Contador : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Contador := 4; while Contador < 20 do begin ShowMessage('O valor de Contador '+ IntToStr(Contador)); Contador := Contador + 2; if (Contador = 10) then break; end;
end; end.
For ... do
Com essa estrutura, voc poder repetir um bloco de comandos um nmero determinado de vzes. Sintaxe:
for variavel := expresso1 to expresso2 do comando;
Ao invs da palavra to, voc pode usar a palavra downto. Com downto, voc parar no passo anterior a expresso2:
for variavel := expresso1 downto expresso2 do comando;
Quando o bloco de comandos a ser executado dentro de um for...do for muito extenso, voc deve inseri-los dentro de uma estrutura begin...end:
for variavel := expresso to expresso do begin comando 1; comando 2; end;
Interrompendo o Loop
Para interromper a repetio de um bloco de comandos dentro de uma estrutura for...do, use o comando Break: 39
Pascal para Delphi for variavel := expresso to expresso do begin comando1; break; end;
Exemplo 13
O programa abaixo mostra uma lista de nmeros de 1 a 10:
unit Unit1; interface var Num : integer;
implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for num:= 1 to 10 do ShowMessage(InttoStr(num)); end; end.
O programa abaixo recalcula a rea de um quadrado, ao ampliarmos a sua rea at 10 metros quadrados:
unit Unit1; interface var area, x : integer; resultado : string;
implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for x:=1 to 10 do begin area := x * x; str(area, resultado); ShowMessage('A rea do quadrado igual a ' + resultado); end;
end; end.
40
Veja como ficaria o programa anterior se usssemos um comando break para interromper a contagem se o valor da rea atingisse 25:
unit Unit1; interface var area, x : integer; resultado : string;
implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for x:= 1 to 10 do begin area := x * x; if (area = 25) then break; str(area, resultado); ShowMessage('A rea do quadrado igual a ' + resultado); end;
end; end.
Quando o bloco de comandos a ser executado dentro de um repeat...until for muito extenso, voc deve inseri-los dentro de uma estrutura begin...end:
repeat begin comando 1; comando 2; comando n;
Interrompendo o Loop
Para interromper a repetio de um bloco de comandos dentro de uma estrutura repeat...until, use o comando Break: 41
Exemplo 14
O programa abaixo multiplica os valores de dois nmeros at que o total atinja o valor de 1000:
unit Unit1; interface var x, total : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin total := 5; x := 2; repeat total := total * x; until (total < 1000); ShowMessage(IntToStr(total)); end; end.
implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Contador := 4; repeat begin ShowMessage(IntToStr(contador)); Contador := Contador + 2; end; until Contador > 20;
end; end.
42
Veja como ficaria o programa anterior se usssemos um comando break para interromper a contagem se o valor da varivel Contador atingisse 10:
unit Unit1; interface var Contador : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Contador := 4; repeat begin ShowMessage(IntToStr(contador)); Contador := Contador + 2; if (Contador = 10) then break; end; until Contador > 20; end; end.
43
Viso Geral
O Pascal oferece inmeras funes e procedures pr-construdas para manipulao de strings. Com elas voc poder, por exemplo, extrair parte de uma string, verificar seu comprimento, convert-la para nmero, etc.
Copy
Esta funo permite que voc isole um substring do meio de uma string. Sintaxe: Copy (expr,incio,num) : string; onde expr uma expresso do tipo string, incio a localizao do primeiro caracter a extrair, e num o nmero de caracteres a serem extrados. Esta funo retorna uma string. Exemplo:
Copy ('palavra',2,3)
retorna ala.
Length
Esta funo determina a largura do string. 44
Sintaxe: Length(s: string) : integer; onde s uma varivel do tipo string. A funo retorna um valor integer. Exemplo:
s := 'palavra'; Length (s);
retorna 7.
Pos
Esta funo permite que se procure um determinado substring em um string, mesmo sem saber se este substring ser encontrado. Sintaxe: Pos (s: string, d: string) : integer; onde s a substring a ser encontrada dentro da string d. A funo pos retorna um valor integer, referente ao ndice da primeira letr da substring. Se a substring no for encontrada, retorna-se 0. Exemplo:
palavra := 'felicidade' numero := Pos ('idade', palavra);
retorna 6.
UpperCase
Esta funo substitui todas as letras minsculas de uma string por letras maisculas. Sintaxe: UpperCase (s: string) : string; onde s a string que ter as letras convertidas. Esta funo retorna uma string igual a s, s que com todas as letras maisculas. Exemplo:
s := 'palavra'; UpperCase(s);
retorna PALAVRA.
LowerCase
Esta funo substitui todas as letras maisculas de uma string por letras minsculas. 45
Sintaxe: LowerCase (s: string) : string; onde s a string que ter as letras convertidas. Esta funo retorna uma string igual a s, s que com todas as letras maisculas transformadas em minsculas. Exemplo:
s := 'Palavra'; LowerCase(s);
retorna palavra.
IntToStr
Converte um nmero do tipo integer para uma string contendo uma representao decimal quele nmero. Sintaxe: IntToStr(Valor: Longint) : string; onde Valor o nmero a ser convertido. A funo retorna uma string, contendo a representao decimal daquele nmero. Exemplo:
s : string; num := 10; s := IntToStr(num);
retorna '10'.
FloatToStr
Converte um nmero do tipo real, single, double ou extended em uma string. Sintaxe: FloatToStr(valor: extended) : string; onde valor o nmero a ser convertido. A funo retorna uma string, contendo a representao decimal daquele nmero.
StrToInt
Converte uma string representando um nmero integer em um nmero. Sintaxe: StrToInt(s: string) : longint; onde s a string a ser convertida. A funo retorna um valor Longint. Se a string no representa um nmero vlido, StrToInt retorna uma exceo. 46
Exemplo:
num: integer; s := '10'; num := StrToInt (s);
retorna 10.
StrToFloat
Converte uma string representando um nmero real, single, double ou extended em um nmero. Sintaxe: StrToFloat(s: string) : extended; onde s a string a ser convertida. A funo retorna um valor extended. Se a string no representa um nmero vlido, StrToFloat retorna uma exceo
Insert
Esta procedure insere uma substring em uma string. Sintaxe: Insert(origem, palavra, indice); Onde origem a string a ser inserida, palavra a string em cujo interior inseriremos outra string, e ndice a partir de qual letra ser iniciada a insero. Exemplo:
s := 'Florianpolis'; Insert('Eu amo ',s,1)
47
Str
Esta sub-rotina converte um valor integer ou real para uma string, armazenando o resultado em uma varivel. Sintaxe: Str(x, var s); onde x um nmero integer ou real, e var s a varivel do tipo string onde ser armazenada a converso. Exemplo:
s: string; x := 10; str(x,s);
Val
Esta sub-rotina retira o valor numrico de um string. Sintaxe: Val (s: string, var v, var code); onde s a string a ser transformada, var v a varivel onde armazenado o resultado da converso, e var code a varivel onde arm o ndice do caracter que tornou impossvel a converso. Exemplo:
v,code: integer; s := '10'; val(s,v,code);
Viso Geral
O Pascal oferece uma srie de rotinas aritmticas para serem usadas em clculos matemticos. 48
Com elas voc pode, por exemplo, extrair a raiz quadrada de um elemento, seu valor absoluto, seu logartmo natural, etc.
ArcTan
Retorna a tangente do argumento. Sintaxe: ArcTan(Variavel); Onde Variavel a varivel de onde ser retirado o valor da tangente. Exemplo:
var begin num : extended; num := arctan(Pi);
Cos
Retorna o cosseno do argumento. Sintaxe: Cos(Variavel); Onde Variavel a varivel de onde ser retirado o valor do coseno. Exemplo: 49
Exp
Retorna o exponencial do argumento. Sintaxe: Exp(Valor); Onde Valor o valor a ser calculado o exponencial. Exemplo:
var begin x : real; x := exp(1.0);
Frac
Retorna a parte fracionria do argumento. Sintaxe: Frac(Valor); Onde Valor o valor de onde deve ser retirada a parte fracionria. Exemplo:
var begin fracao : real; fracao := Frac(12.32);
Int
Retorna a parte inteira do argumento. Sintaxe: Int(Valor); Onde Valor o valor de onde deve ser obtida a parte inteira do argumento. 50
Exemplo:
var begin inteiro : real; inteiro := Int(19.82);
Ln
Retorna o logartmo natural do argumento. Sintaxe: Ln(Variavel); Onde Variavel a varivel que contm o valor a ser calculado. Exemplo:
var begin loga : real; loga := Ln(1.82);
Pi
Retorna o valor de Pi. Sintaxe: Variavel := Pi; Onde Variavel uma varivel onde ficar armazenado o valor de PI. Exemplo:
var begin valorpi : real; valorpi := Pi;
Sin
Retorna o seno do argumento. Sintaxe: Sin(Variavel); 51
Onde Variavel uma varivel que contm o valor a ser calculado. Exemplo:
var begin seno : real; seno := Sin(45.27);
Sqr
Retorna o quadrado do argumento. Sintaxe: Sqr(Valor); Onde Valor o valor que deve ser elevado ao quadrado. Exemplo:
var begin quadrado: real; quadrado:= Sqr(11);
Sqrt
Retorna a raiz quadrada do argumento. Sintaxe: Sqrt(Valor); Onde Valor o valor que deve ser calculada a raz quadrada. Exemplo:
var begin raiz : real; raiz := Sqrt(144);
Exemplo 15
O programa abaixo realiza alguns clculos em cima do valor de uma varivel: 52
Pascal para Delphi unit Unit1; interface var x, y, z, w : real; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin x := 16; y := abs(x); ShowMessage(FloattoStr(y)); z := sqrt(x); ShowMessage(FloattoStr(z)); w := ln(x); ShowMessage(FloattoStr(w)); end; end.
Viso Geral
Alm dos dados prprios do Pascal, o usurio pode criar novos tipos de dados:
Arrays
53
Um array (ou vetor) uma coleo ordenada de um tipo de dado, com cada elemento da coleo especificado por sua posio numrica dentro da coleo. Um array criado na seo var do programa, e usa a seguinte sintaxe:
var num : array [1..10] of integer;
A varivel num se refere a uma lista de 10 variveis do tipo integer, cada uma com um nmero de indice de 1 a 10. Nos referimos a cada item do array atravs do seu ndice entre colchetes [ ]. Por exemplo:
num[5] := 250;
Exemplo 16
A unit abaixo escreve na tela uma lista dos anos dos carros armazenados em um array:
unit Unit1; interface var Index : integer; Automoveis : array[1..12] of integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for Index := 1 to 12 do begin Automoveis[Index] := Index + 1980; ShowMessage('O automvel de nmero ' + InttoStr(Index) + ' tem o valor ' + InttoStr(Automoveis[ Index])); end; ShowMessage('Fim do Programa!'); end; end.
Inicialmente, a varivel Index ser igual a 1. Atribuiremos ao primeiro item do array, Automoveis[1], o valor de 1980+1, ou seja, 1981. Escreveremos ento na tela a frase O automvel de nmero 1 tem o valor de 1981. Repetiremos a estrutura for, sendo que agora a varivel Index tem o valor de 2 (a estrutura for se autoincrementa de uma unidade). Atribuiremos ao segundo item do array, Automoveis[2], o valor de 1980+2, ou seja, 1982. Escreveremos ento na tela a frase O automvel de nmero 1 tem o valor de 1982. E assim sucessivamente.
Exemplo 17
Vamos criar um programa que liste a seguinte tabela na tela: Ano 1980 1981 1982 54
unit Unit1; interface var Automoveis : array[0..1,1980..1982] of integer; Ano, Motor : integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin for Ano := 1980 to 1982 do begin for Motor := 0 to 1 do begin Automoveis[Motor,Ano] := Ano - 80 + Motor; ShowMessage('O valor do carro com motor ' + InttoStr(motor) + ' do ano '+ InttoStr(ano) + ' de ' + InttoStr( Automoveis[Motor, Ano])); end; end; end; end.
Inicialmente, atribumos varivel Ano o valor 1980, dentro da primeira estrutura for. Na segunda estrutura for, atribumos varivel Motor o valor 0. Atribuimos ao item Automoveis[0,1980] do vetor Automoveis o valor 1900, correspondente a conta 1980 - 80 + 0. Escrevemos ento na tela a frase O carro com motor 0 do ano 1980 possui valor de 1900. Acrescentamos 1 varivel Motor, e voltamos segunda estrutura for. Atribuimos ao item Automoveis[1,1980] do vetor Automoveis o valor 1901, correspondente a conta 1980 - 80 + 1. Escrevemos ento na tela a frase O carro com motor 1 do ano 1980 possui valor de 1901. Acabamos ento a segunda estrutura for, e voltamos para a primeira, sendo que agora a varivel Ano est acrescentada de uma unidade, valendo ento 1981. E voltamos ao raciocnio do pargrafo anterior.
Strings
Strings so arrays do tipo char. Quando voc declara uma varivel do tipo string, pode determinar o nmero de caracteres que esta contm:
var nome : string[30];
Na realidade os arrays de caracter so 1 byte maiores do que o tamanho especificado na string, porque a primeira posio da string um byte que contm o tamanho da string.
Registros
55
Registros (records) so colees de dados aos quais sua aplicao pode ser referir como um todo. Por exemplo, voc poderia criar um registro de nome Empregado, que contivesse os dados deste: ltimo nome, primeiro nome, ano do emprego. Cada um destes dados tambm conhecido como campo do registro. Os registros no so declarados na seo var do programa, e sim na seo type, usando a seguinte sintaxe:
type Nome_Registro = record Dado1 : tipo_dado; Dado2 : tipo_dado; ..... end;
Aps criar o tipo de dado registro, voc deve criar uma varivel do tipo do registro criado. Isto feito na seo var do programa, usando-se a sintaxe tradicional:
var nome_variavel : nome_registro
Voc pode acessar cada campo ou se referir ao registro como um todo, usando a seguinte sintaxe:
variavel_tipo_registro.campo
Exemplo 18
Vamos criar um registro de nome Empregado, que contenha os dados deste: ltimo nome, primeiro nome, ano do emprego.
type Empregado = Record UltimoNome :string[20]; PrimeiroNome : string[15]; AnoEmprego : string[4]; end;
Todos os dados so do tipo string, j que contero texto. Estamos estabelecendo tambm o nmero total de caracteres que cada string poder conter. Aps criarmos o registro Empregado, vamos criar uma varivel chamada Empreg1, do tipo Empregado:
type Empregado = Record UltimoNome :string[20]; PrimeiroNome : string[15]; AnoEmprego : string[4]; end;
var
Empreg1 : Empregado;
56
Pascal para Delphi Empregado = Record UltimoNome :string[20]; PrimeiroNome : string[15]; AnoEmprego : string[4]; end; var Empreg1 : Empregado; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Empreg1.UltimoNome := 'Prado'; Empreg1.PrimeiroNome := 'Alyssa'; Empreg1.AnoEmprego := '1996'; ShowMessage(Empreg1.UltimoNome); ShowMessage(Empreg1. PrimeiroNome); ShowMessage(Empreg1.AnoEmprego); end; end.
Tipo Enumerado
Um dado do tipo enumerado (enumerated type) representa uma lista de valores. Na declarao do tipo de dado, so listados os valores possveis. Por exemplo:
type TDias = (Segunda, Tera,Quarta);
Na lista, cada item corresponde a um valor inteiro, comeando por 0. Um item na lista de um tipo enumerado na verdade um identificador. Logo, voc no pode criar uma varivel com este nome. No exemplo acima, no poderia criar uma varivel com o nome Segunda.
Tipo Set
Um conjunto (set) uma coleo de elementos de um tipo que precisa ser byte, boolean, char, enumerado ou intervalo. Por exemplo:
type TVogais = set of char;
end;
57
Tipo Intervalo
Uma estrutura de dados do tipo intervalo (subrange type) contm uma regio de valores do tipo integer, boolean, char ou enumerado. So teis quando voc quer limitar o valor que uma varivel deve ter. Para criar um intervalo, especifique o valor mnimo e o valor mximo, com dois pontos (..) entre eles. Por exemplo:
type TLetraValida = `A' .. ` F' ;
Para que a verificao de regio seja feita, voc deve utilizar a diretiva {$R+} no cdigo da aplicao.
Tipos de Arquivos
Para tornar seu programa mais til, voc precisar de um meio para armazenar de forma permanente os dados, e recuper-los posteriormente. Isto feito atravs de arquivos. O Pascal suporta tanto arquivos texto quanto arquivos binrios.
Arquivos Texto
Nos arquivos texto, os dados so representados como caracteres do conjunto ASCII. Cada linha encerrada por um retorno de carro. Com este formato, as linhas podem variar de comprimento.
Arquivos Binrios
Os arquivos binrios armazenam os dados em uma representao binria compactada. Existem arquivos binrios tipificados e no-tipificados. Arquivos tipificados so arquivos binrios que s armazenam dados de um nico tipo. Arquivos no-tipificados so arquivos binrios que armazenam os dados em sequencia de bytes sem tipo.
Os arquivos texto, apesar de facilmente manipulveis, apresentam duas limitaes: Nem todos os caracteres podem ser armazenados em um arquivo texto (somente aqueles que podem ser exibidos na tela ou impressora, incluindo os caracteres de retorno de carro, de avano de linha e tabulao); No podem ser acessados aleatoriamente, ou seja, a leitura dos dados deve ser sempre feita a partir do incio do arquivo.
A atribuio do nome do arquivo varivel feita atravs do comando Assign ou AssignFile (especfico do Delphi):
AssignFile(varivel, 'nome_do_arquivo_extenso');
Aps atribuir o arquivo a uma varivel, voc pode utilizar as rotinas de manipulao de arquivo para abrir, ler e gravar no arquivo.
Append
Abre um arquivo existente para a entrada dee novos dados no final do arquivo. Sintaxe: Append(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin arq: TextFile; if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); AssignFile(f); Append(f); Writeln(f, 'Texto a ser inserido no arquivo.'); Flush(f); CloseFile(f); end;
end;
59
O cdigo acima abre um arquivo texto e insere nele uma nova string.
CloseFile
Fecha um arquivo. Sintaxe: CloseFile(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var F: TextFile; S: string; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); Reset(F); Readln(F, S); Edit1.Text := S; CloseFile(F); end;
end;
EOF
Retorna o status de fim de arquivo. Sintaxe: Eof(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin arq : TextFile; nome : String; AssignFile(arq); Reset(arq); While not eof(arq) do begin Read(nome); end; CloseFile(arq);
end.
EOLN
Retorna o status de fim de linha de um arquivo texto Sintaxe: Eoln(Variavel); Onde Variavel uma varivel do tipo Text. Exemplo:
Writeln(Eoln);
Erase
Apaga um arquivo externo. Sintaxe: Erase(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin F: Textfile; OpenDialog1.Title := 'Delete File'; if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); try Reset(F); if MessageDlg('Deletar ' + OpenDialog1.FileName + '?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin CloseFile(F); Erase(F); end; except on EInOutError do MessageDlg('Erro de I/O.', mtError, [mbOk], 0); end; end;
end;
FileSize
Retorna o tamanho corrente de um arquivo. Sintaxe: 61
end;
Flush
Esvazia o buffer de um arquivo texto aberto para output. Sintaxe: Flush(Variavel); Onde Variavel uma varivel do tipo TextFile; Exemplo:
var begin f: TextFile; if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Append(f); Writeln(f, 'Texto'); Flush(f); CloseFile(f); end;
end;
IOResult
62
Retorna o status da tima operao I/O realizada. Sintaxe: IOResult : Integer; Exemplo:
var begin F: file of Byte; if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then MessageDlg('Tamanho do arquivo em bytes: ' + IntToStr(FileSize(F)), mtInformation, [mbOk], 0); else MessageDlg('Erro ao acessar arquivo ', mtWarning, [mbOk], 0); end; end;
Read
L um elemento de dado de um arquivo. Sintaxe: Read(Variavel); Onde Variavel a varivel que ir conter os dados. Exemplo:
var nome : String; idade : Integer: begin end; read(nome); read(idade);
Readln
L uma linha de dados de um arquivo. Sintaxe: Readln(Variavel); 63
begin
Rename
Renomeia um arquivo externo. Sintaxe: Rename(Variavel); Onde Variavel uma varivel do tipo Pchar. Exemplo:
var begin f : file; OpenDialog1.Title := 'Escolha o arquivo... '; if OpenDialog1.Execute then begin SaveDialog1.Title := 'Renomear para...'; if SaveDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Canvas.TextOut(5, 10, 'Renomeando ' + OpenDialog1.FileName + ' para ' + SaveDialog1.FileName); Rename(f, SaveDialog1.FileName); end; end; end;
Reset
Abre um arquivo existente. 64
end; begin
end;
O cdigo acima abre um arquivo existente, caso ele no exista exibida uma mensagem.
Rewrite
Cria e abre um novo arquivo. Sintaxe: Rewrite(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin F: TextFile; AssignFile(F, 'ARQUIVO.XXX'); Rewrite(F); Writeln(F, 'Texto'); CloseFile(F);
end;
SeekEof
Retorna o status de fim de arquivo de um arquivo. Sintaxe: 65
end;
SeekEoln
Retorna o status de fim de linha de um arquivo. Sintaxe: SeekEoln(Variavel); Onde Variavel uma varivel do tipo Booleano. Exemplo:
var f : System.TextFile; i, j, Y : Integer; begin AssignFile(f,'TESTE02.TXT'); Rewrite(f); Writeln(f,'1 2 3 4 '); Writeln(f,'5 6 7 8 '); Reset(f); Y := 5; while not SeekEof(f) do begin if SeekEoln(f) then Readln; Read(f,j); Canvas.TextOut(5, Y, IntToStr(j)); Y := Y + Canvas.TextHeight(IntToStr(j)) + 5; end;
end;
66
SetTextBuf
Atribui um buffer de I/O para um arquivo texto. Sintaxe: SetTextBuf(Variaveis); Onde Variaveis so variveis do tipo TextFile, Char, e vetor. Exemplo:
var F, FTwo: System.TextFile; Ch: Char; Buf: array[1..4096] of Char; {buffer de 4K} if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); System.SetTextBuf(F, Buf); Reset(F); AssignFile(FTwo, 'WOOF.DOG'); Rewrite(FTwo); while not Eof(f) do begin Read(F, Ch); Write(FTwo, Ch); end; System.CloseFile(F); System.CloseFile(FTwo); end; end;
begin
Write
Grava um ou mais elementos de dados para o arquivo. Sintaxe: Write(arq'Texto'); Onde arq o arquivo onde queremos escrever o "Texto". Exemplo:
var begin arq : TextFile; AssignFile(arq); Reset(arq); Write(arq,'Texto Qualquer'); CloseFile(arq);
Writeln
Grava uma linha de dados de um arquivo. Sintaxe: Writeln(arq'Texto'); Onde arq o arquivo onde queremos escrever o "Texto". Exemplo:
var begin arq : TextFile; AssignFile(arq); Reset(arq); Writeln(arq,'Texto Qualquer 01'); Writeln(arq,'Texto Qualquer 02'); CloseFile(arq);
Exemplo 19
A unit abaixo atribui o arquivo doc1.txt varivel MeuTexto:
unit Unit1; interface var MeuTexto : TextFile; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin AssingFile(MeuTexto,'doc1.txt'); end; end.
O exemplo abaixo abre um arquivo texto (texto1.txt, que tem que existir) e copia seus dados para um segundo arquivo (texto2.txt, que criado, caso no exista):
unit Unit1; interface var F1, F2: TextFile; Ch: Char; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin AssignFile(F1, 'texto1.txt'); Reset(F1); AssignFile(F2, 'texto2.txt'); Rewrite(F2); while not Eof(F1) do begin Read(F1, Ch); Write(F2, Ch);
68
end.
69
Aps estas tarefas, voc pode utilizar as rotinas de manipulao de arquivo para abrir, ler e gravar no arquivo.
AssignFile
Atribui o nome de um arquivo externo a uma varivel de arquivo. Sintaxe: AssignFile(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var F: TextFile; S: string; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); Reset(F); Readln(F, S); CloseFile(F); end;
end;
CloseFile
Fecha um arquivo aberto. Sintaxe: CloseFile(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin arq : TextFile; If OpenDialog.Execute Then begin AssignFile(arq, OpenDialog1.FileName); Reset(arq); CloseFile(arq); end; end;
70
O cdigo acima simplesmente abre e fecha um arquivo texto sem ao menos modific-lo.
EOF
Retorna o status de fim de arquivo. Sintaxe: Eof(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var arq : TextFile; nome : String; begin AssignFile(arq); Reset(arq); While not eof(arq) do begin Read(nome); end; CloseFile(arq);
end.
Erase
Apaga um arquivo externo. Sintaxe: Erase(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin F: Textfile; OpenDialog1.Title := 'Delete File'; if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); try Reset(F); if MessageDlg('Deletar ' + OpenDialog1.FileName + '?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin CloseFile(F); Erase(F); end; except on EInOutError do
71
Pascal para Delphi MessageDlg('Erro de I/O.', mtError, [mbOk], 0); end; end; end;
FilePos
Retorna a posio corrente de um arquivo. Sintaxe: FilePos(Variavel); Onde Variavel uma varivel do tipo Longint. Exemplo:
var f: file of Byte; size : Longint; S: string; y: integer; begin if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Reset(f); size := FileSize(f); S := 'Tamanho do arquivo em bytes: ' + IntToStr(size); y := 10; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; S := 'Localizando restante do arquivo...'; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; Seek(f,size div 2); S := 'A posio ' + IntToStr(FilePos(f)); Canvas.TextOut(5, y, S); CloseFile(f); end;
end;
FileSize
Retorna o tamanho corrente de um arquivo. Sintaxe: FileSize(Variavel); Onde Variavel uma varivel do tipo Integer. Exemplo: 72
Pascal para Delphi var f: file of Byte; size : Longint; S: string; y: integer; begin AssignFile(f); Reset(f); size := FileSize(f); S := 'Tamanho dos arquivos em bytes: ' + IntToStr(size); y := 10; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; S := 'Verificando o restante do arquivo...'; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; Seek(f,size div 2); S := 'Posio ' + IntToStr(FilePos(f)); Canvas.TextOut(5, y, S); CloseFile(f);
end;
IOResult
Retorna o status da tima operao I/O realizada. Sintaxe: IOResult : Integer; Exemplo:
var begin F: file of Byte; if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then MessageDlg('Tamanho do arquivo em bytes: ' + IntToStr(FileSize(F)), mtInformation, [mbOk], 0); else MessageDlg('Erro ao acessar arquivo ', mtWarning, [mbOk], 0); end;
end;
Read
L um elemento de dado de um arquivo. Sintaxe: Read(Variavel); 73
Rename
Renomeia um arquivo externo. Sintaxe: Rename(Variavel); Onde Variavel uma varivel do tipo Pchar. Exemplo:
var begin f : file; OpenDialog1.Title := 'Escolha o arquivo... '; if OpenDialog1.Execute then begin SaveDialog1.Title := 'Renomear para...'; if SaveDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Canvas.TextOut(5, 10, 'Renomeando ' + OpenDialog1.FileName + ' to ' + SaveDialog1.FileName); Rename(f, SaveDialog1.FileName); end; end;
end;
Reset
Abre um arquivo existente. Sintaxe: Reset(Variavel); Onde Variavel uma varivel do tipo File; Exemplo: 74
Pascal para Delphi var begin F: file; {$I-} AssignFile(F, FileName); FileMode := 0; Reset(F); CloseFile(F); {$I+} FileExists := (IOResult = 0) and (FileName <> ''); if FileExists(ParamStr(1)) then Canvas.TextOut(10, 10, 'Arquivo Encontrado') else Canvas.TextOut(10, 10, 'Arquivo no Encontrado');
end; begin
end;
O cdigo acima abre um arquivo existente, caso ele no exista exibida uma mensagem.
Rewrite
Cria e abre um novo arquivo. Sintaxe: Rewrite(Variavel); Onde Variavel uma varivel do tipo TextFile. Exemplo:
var begin F: TextFile; AssignFile(F, 'ARQUIVO.XXX'); Rewrite(F); Writeln(F, 'Texto'); CloseFile(F);
end;
Seek
Move a posio corrente do arquivo at um "componente" especificado. Sintaxe: Seek(Variavel); Onde Variavel uma varivel do tipo Longint;
var f: file of Byte; size : Longint; S: string; y: integer;
75
Pascal para Delphi begin AssignFile(f); Reset(f); size := FileSize(f); S := 'Tamanho dos arquivos em bytes: ' + IntToStr(size); y := 10; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; S := 'Verificando o restante do arquivo...'; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; Seek(f,size div 2); S := 'Posio ' + IntToStr(FilePos(f)); Canvas.TextOut(5, y, S); CloseFile(f); end;
Truncate
Trunca o arquivo na posio corrente. Sintaxe: Truncate(Variavel); Onde Variavel uma varivel de arquivo exceto TextFile. Exemplo:
var f: file of Integer; i,j: Integer; begin AssignFile(f,'TESTE03.INT'); Rewrite(f); for i := 1 to 6 do Write(f,i); Writeln('Arquivo antes de ser truncado:'); Reset(f); while not Eof(f) do begin Read(f,i); Writeln(i); end; Reset(f); for i := 1 to 3 do Read(f,j); Truncate(f); Writeln; Writeln('Arquivo depois de ser truncado:'); Reset(f); while not Eof(f) do begin Read(f,i); Writeln(i); end; CloseFile(f); Erase(f);
end;
76
Write
Grava um ou mais elementos de dados para o arquivo. Sintaxe: Write(arq'Texto'); Onde arq o arquivo onde queremos escrever o "Texto". Exemplo:
var begin arq : TextFile; AssignFile(arq); Reset(arq); Write(arq,'Texto Qualquer'); CloseFile(arq);
Exemplo 20
Veja abaixo a declarao de uma varivel do tipo arquivo, e sua atribuio:
var begin end; MeuArq : FILE OF integer; AssingFile(MeuArq, `doc1.txt');
O programa abaixo abre um arquivo, verifica seu tamanho, e vai at a metade deste:
unit Unit1; interface var f: file of Byte; tamanho : Longint; S: String; y: integer; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin AssignFile(f, 'texto1.txt'); Reset(f); tamanho := FileSize(f); ShowMessage('Tamanho do Arquivo em Bytes ' + IntToStr(tamanho)); Seek(f,tamanho div 2); ShowMessage('A posio agora ' + IntToStr(FilePos(f))); CloseFile(f); end; end.
BlockRead
L um ou mais blocos de dados de um arquivo. Sintaxe: BlockRead(Variaveis); Onde Variaveis so variveis do tipo Integer, file e char. Exemplo:
var FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..2048] of Char; {buffer de 2K}
begin
if OpenDialog1.Execute then begin AssignFile(FromF, OpenDialog1.FileName); Reset(FromF, 1); if SaveDialog1.Execute then begin AssignFile(ToF, SaveDialog1.FileName); Rewrite(ToF, 1); Canvas.TextOut(10, 10, 'Copiando ' + IntToStr(FileSize(FromF))+ ' bytes...'); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); CloseFile(FromF); CloseFile(ToF); end; end; end;
BlockWrite
Escreve um ou mais bloco de dados em um arquivo Sintaxe: BlockRead(Variaveis); Onde Variaveis so variveis do tipo Integer, file e char. Exemplo:
var FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..4096] of Char; {buffer de 4K}
begin
78
Pascal para Delphi if OpenDialog1.Execute then begin AssignFile(FromF, OpenDialog1.FileName); Reset(FromF, 1); if SaveDialog1.Execute then begin AssignFile(ToF, SaveDialog1.FileName); Rewrite(ToF, 1); Canvas.TextOut(10, 10, 'Copiando ' + IntToStr(FileSize(FromF))+ ' bytes...'); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); CloseFile(FromF); CloseFile(ToF); end; end; end;
ChangeFileExt
Muda a extenso do arquivo. Sintaxe: ChangeFileExt(Variavel); Onde Variavel uma varivel do tipo String. Exemplo:
INIFileName := ChangeFileExt(ParamStr(0), '.INI');
DateTimeToFileDate
Converte a data do formato Delphi para o formato DOS. Sintaxe: DateTimeToFileDate(Variavel); Onde Variavel uma varivel do tipo DateTime. Exemplo:
var
79
DeleteFile
Remove um arquivo. Sintaxe: DeleteFile(Constante); Onde Constante uma constante que contm o nome do arquivo. Exemplo:
if FileExists(FileName) then if MsgBox('Voc deseja realmente deletar o arquivo ' + ExtractFileName(FileName) + '?'), []) = IDYes then DeleteFile(FileName);
DiskFree
Retorna a quantidade de espao em disco livre. Sintaxe: DiskFree(Variaveis); Onde Variaveis so variveis do tipo String e Integer. Exemplo:
var S: string; AmtFree: integer; Total: integer;
begin
AmtFree := DiskFree(0); Total := DiskSize(0); S := IntToStr(AmtFree div Total) + 'total de espao livre em disco: ' (AmtFree div 1024) + ' Kbytes livres. '; Canvas.TextOut(10, 10, S); end;
ExpandFileName
Retorna a string contendo o path e nome do arquivo. Sintaxe: 80
ExtractFileName
Retorna somente o nome do arquivo. Sintaxe: ExtractFileName(Constante); Onde Constante uma constante que contm o caminho e nome do arquivo. Exemplo:
FileName := ExtractFileName(FileName);
ExtractFileExt
Retorna somente a extenso do arquivo.
ExtractFileExt(Constante);
Onde Constante uma constante que contm o caminho e nome do arquivo. Exemplo:
FileName := ExtractFileName(FileName);
ExtractFilePath
Retorna o path do arquivo especificado. Sintaxe: ExtractFilePath(Constante); Onde Constante uma constante que contm o caminho e nome do arquivo. Exemplo:
FileName := ExtractFilePath(FileName);
81
FileAge
Retorna a idade do arquivo. Sintaxe: FileAge(Constante); Onde constante uma constante que possui a localizao do arquivo. Exemplo:
FileAge(idade);
O cdigo acima exibe a idade de um arquivo, mas para que isso possa funcionar, voc precisa converter a varivel para TDateTime.
FileCreate
Cria um arquivo com o nome especificado. Sintaxe: FileCreate(Constante); Onde Constante uma constante que especifica o nome do arquivo. Exemplo:
MyFileHandle := FileCreate('ARQUIVO.XXX');
FileClose
Fecha o arquivo especificado. Sintaxe: FileClose(Constante); Onde Constante uma constante que contm a localizao do arquivo. Exemplo:
FileClose(arq);
FileExists
82
Retorna True se o arquivo existe. Sintaxe: FileExists(Constante); Onde constante uma constante que identifica o arquivo. Exemplo:
if FileExists(FileName) then if MsgBox('Do you really want to delete ' + ExtractFileName(FileName) + '?'), []) = IDYes then ShowMessage('Arquivo Encontrado');
FileGetAttr
Retorna atributos do arquivo. Sintaxe: GetFileAttr(Constante); Onde Constante uma constante de identificao de arquivo. Exemplo:
GetFileAttr(arq);
FileRead
L de um arquivo especfico. Sintaxe: FileRead(Variaveis); Onde Variaveis so variveis do tipo inteiro. Exemplo:
ActualRead := FileRead(MyFileHandle, Buffer, SizeOf(Buffer));
FileSearch
Procura atravs de diretrios por um arquivo especificado. Sintaxe: 83
FileSearch(Constante,ListadeDiretorios); Onde Constante uma constante que identifica o arquivo e ListadeDiretorios uma lista de diretrios em que deve ser feita a procura do arquivo. Exemplo:
FoundIt := FileSearch('TESTE04.TXT', MyAppDir+'\';'+WinDir+';'+WinDir+'\SYSTEM');
FileSeek
Muda a posio corrente do arquivo. Sintaxe: FileSeek(Variaveis); Onde Variaveis so variveis do tipo Integer. Exemplo:
if FileSeek(MyFileHandle,0,2) = HFILE_ERROR then HandleFileError else AppendStuff;
FileSetAttr
Estabelece atributos do arquivo. Sintaxe: FileSetAttr(Constantes); Onde Constantes so constantes de definio do arquivo. Exemplo:
FileSetAttr(arquivo,1);
FileSetDate
Estabelece a data e hora do arquivo. Sintaxe: FileSetDate(Parametros); 84
FileOpen
Abre um arquivo especificado. Sintaxe: FileOpen(Constante, Variavel); Onde Constante a constante que define o nome do arquivo, e Variavel a varivel que especifica o valor de retorno. Exemplo:
procedure OpenForShare(const FileName: String); var FileHandle : Integer; begin FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone); if FileHandle > 0 then [Arquivo Vlido} else [Erro ao Abrir: FileHandle = erro] end;
FileWrite
Grava em um arquivo especificado. Sintaxe: FileWrite(Parametros)Integer; Onde Parametros so os parmetros da funo. Exemplo:
function FileWrite(Handle: Integer; const Buffer; Count: Integer): Integer;
FindClose
Termina uma sequencia de FindFirst/FindNext. Sintaxe: 85
FindFirst
Pesquisa no diretrio por um arquivo especfico. Sintaxe: FindFirst(Parametros): Integer; Onde Parametros so os parmetros da funo. Exemplo:
FindFirst('c:\Windows\*.*', faAnyFile, SearchRec); Label1.Caption := SearchRec.Name + ' tem ' + IntToStr(SearchRec.Size) + ' bytes ';
FindNext
Retorna a prxima entrada que combina com o nome e atributos. Sintaxe: FindNext(Variavel): Integer; Onde Variavel uma varivel do tipo TSearchRec. Exemplo:
if (FindNext(SearchRec) = 0) then Label1.Caption := SearchRec.Name + ' tem ' + IntToStr(SearchRec.Size) + ' bytes ';
RenameFile
Renomeia um arquivo. Sintaxe: 86
RenameFile(Constantes); Onde Constantes so as constantes que contm o nome atual do arquivo e no novo nome. Exemplo:
if not RenameFile('OLDNAME.TXT','NEWNAME.TXT') then ErrorMsg('Erro ao renomear arquivo!');
Exemplo 21
O programa abaixo apaga um arquivo especificado, se este existir:
unit Unit1; interface .... implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin if FileExists('texto1.txt') then begin ShowMessage('O arquivo '+ ExtractFileName( 'texto1.txt') + ' ser apagado!'); DeleteFile('texto1.txt'); end; end; end.
MkDir
Cria um novo subdiretrio no path especificado. 87
MkDir(Edit1.Text); if IOResult <> 0 then MessageDlg('No possvel criar diretrio', mtWarning, [mbOk], 0) else MessageDlg('Novo diretrio criado', mtInformation, [mbOk], 0);
end;
ChDir
Muda o diretrio corrente para o path especificado. Sintaxe: ChDir(Variavel); Onde Variavel uma varivel do tipo String. Exemplo:
begin {$I-}
end;
RmDir
Deleta um subdiretrio vazio. Sintaxe: RmDir(Variavel); Onde Variavel uma varivel do tipo String. Exemplo:
begin {$I-}
88
Pascal para Delphi MessageDlg('No possvel remover diretrio', mtWarning, [mbOk], 0) else MessageDlg('Diretrio removido', mtInformation, [mbOk], 0); end;
Exemplo 22
O programa abaixo cria um diretrio chamado MeuDiretorio:
unit Unit1; interface .... implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin MkDir('c:\MeuDiretorio'); if IOResult <> 0 then ShowMessage('No foi possvel criar o diretrio!') else ShowMessage('Diretrio criado com sucesso!'); end; end.
Imprimindo Arquivos
Para imprimir arquivos, utilize o comando AssignPrn. Sintaxe: procedure AssignPrn(var F: Text; Device, Driver, Port: PChar); Este comando atribui varivel F a impressora. Se Device for nil, Driver e Port so ignoradas, e o comando AssignPrn mandar o texto para a impressora default. Aps a atribuio, voc deve utilizar o comando Rewrite. Assim, toda vez que a aplicao enviar dados para F, os dados so enviados para a impressora. Como o comando AssignPrn pertence unit Printers, voc deve acrescentar esta unit clusula uses da seo interface de sua unit.
Exemplo 23
O exemplo abaixo imprime uma frase na impressora default:
unit Unit1; interface uses .........., Printers; var Arq1: TextFile; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin
89
Pascal para Delphi Arq1 := 'c:\texto1.txt'; AssignPrn(Arq1); Rewrite(Arq1); Writeln(Arq1, 'Imprima este texto'); CloseFile(Arq1); end; end.
Objetos
Usamos o termo objeto para representar uma determinada entidade do mundo real. Exemplos de objetos so: 90
Coisas (um livro, uma estante) Funes (Vendedor, Cliente, etc) Eventos Interaes Lugares
O conceito de objetos baseia-se no princpio de abstrao. Atravs da abstrao, podemos dividir um determinado problema em partes, para estud-las separadamente. Na metodologia orientada, dividiremos o problema em objetos. importante ressaltar que a metodologia estruturada tambm utilizava o princpio da abstrao, mas sua nfase era na procura dos processos que envolviam o problema, e no nos objetos que o compunham. Observe que tivemos o cuidado de colocar o artigo na frente de cada objeto, pois um objeto representa um elemento apenas, uma determinada entidade. No entanto, um objeto pode ser uma entidade composta, como uma estante (composta de livros, prateleiras, titulo, assunto, indice, etc). Em geral a maioria dos objetos so realmente compostos, pois sempre podemos dividi-lo em partes menores at chegarmos a elementos realmente atmicos (indivisveis). Um sistema seria ento um grande objeto composto de outros objetos, formando um mecanismo.
Atributos ou Propriedades
Representam as caractersticas do objeto. Por exemplo, o objeto caneta possui as caractersticas tamanho, cor, tipo de escrita. So seus atributos. Os atributos, ou sejam as caractersticas dos objetos, podem ser fixos ou variveis. O estado de um objeto o valor de determinado atributo em um dado instante. Por exemplo, uma estante em um determinado momento pode estar vazia. Logo aps, colocam-se alguns livros nela, modificando seu estado para uma estante com livros. Um evento corresponde a um estmulo externo, que pode provocar a transio de um estado para outro, ou seja, pode modificar as propriedades de determinado objeto. No Sistema de Gerenciamento de Biblioteca, o objeto publicaes teria como atributos (ou seja, caractersticas) identificador, editora, ttulo, tipo (se livro ou revista), e presena (se est na biblioteca ou no). O objeto usurios teria como atributos identificador, nome, endereo, e usufruto (se est com uma publicao ou no). O objeto movimentaes teria como atributos data, identificador do usurio, identificador da publicao, e tipo (emprstimo ou devoluo). 91
Note que os atributos usufruto, do objeto usurio, e presena, do objeto publicaes, podem mudar de valor de acordo com um evento. Por exemplo, se o usurio pegar uma publicao emprestada, dando origem a um evento, o atributo usufruto passa para Sim, indicando que o usurio agora possui um livro emprestado, e o atributo presena passa para No, indicando que a publicao no est mais na biblioteca. Ou seja, estes atributos sofrem uma transio, uma mudana de estado devido a um evento..
Servios ou Mtodos
So as funes que operam sobre o objeto. Por exemplo, com o objeto caneta podemos escrever, desenhar, presentear. So as funes oferecidas pelo objeto caneta. Quando um objeto executa um servio (uma funo), dizemos que ele apresenta um determinado comportamento, ou seja, uma reao. O comportamento do objeto ser resultado da ao efetuada sobre ele, e da funo que esta ao chamou. Por exemplo, tanto o rdio quanto a TV possuem um boto para lig-los. Quando apertamos este boto (ou seja, efetuamos uma ao sobre este objeto), o comportamento apresentado por ambos diferente, j que o servio (funo) chamado por esta ao diferente: ligar o rdio significa emitir som; ligar a TV significa emitir som e imagem. Um evento, ou seja, um estmulo externo, tambm pode estimular o objeto a executar determinado servio. No Sistema de Gerenciamento de Biblioteca, todos os objetos poderiam ser cadastrados, ou seja, inseridos, alterados, excludos e consultados:
Classes
Uma classe representa um conjunto de objetos que possuem caractersticas e comportamentos comuns. Como vimos, o mecanismo de classificao um dos mtodos que facilita a compreenso do sistema como um todo. Cada objeto classificado em uma determinada classe, de acordo com suas caractersticas e comportamentos. Chamamos o objeto de instncia de uma determinada classe, o que significa que ele possui o comportamento e as caractersticas definidos pela classe para suas instncias. A instanciao o processo contrrio ao de classificao, e consiste em criar um novo objeto a partir de uma classe. 92
A nfase da metodologia de orientao a objetos ser dada na definio de classes, e no de objetos, como se poderia pensar pelo nome. No nosso exemplo de Gerenciamento de Biblioteca , aps encontrarmos os objetos, criaramos as classes. Cada publicao da estante seria classificado como um objeto da classe Publicaes, j que possuiria os mesmos atributos e servios. Note que o contedo de cada atributo ir variar para cada objeto (cada publicao tem uma editora diferente), mas todos possuem os mesmos atributos (todas as publicaes possuem uma editora). J um usurio no ir pertencer a classe Publicaes, pois, apesar de oferecer os mesmos servios, no possui os mesmos atributos (no possui editora, por exemplo). Todo objeto pertence a apenas uma classe ao longo de sua existncia, no podendo modificar sua classificao.
Varivies de Instncia
Os atributos de uma classe tambm podem ser objetos. Neste caso, estes atributos so chamados de variveis de instancia. Por exemplo, a classe Publicaes contm os atributos identificador, editora, ttulo, presena e tipo. Se for do interesse do analista, poderamos transformar o atributo editora em uma classe: a classe Editora, com atributos nome e endereo. Ou seja, a classe Publicaes teria como atributos identificador, ttulo, presena, tipo e um objeto da classe editora:
Encapsulamento
Como vimos no captulo anterior, encapsulamos detalhes de sistemas complexos para melhor compreendlos. Na metodologia de orientao a objetos, encapsulamos atributos e servios dentro das classes. O analista oferece ao programador, por exemplo, a classe Publicaes, mostrando quais os atributos dos objetos desta classe, e quais os servios oferecidos por esta. Mas o programador no tem acesso a implementao desses atributos e servios (ou seja, acesso as linhas de cdigo que os controla). Estes dados esto encapsulados, ou seja, escondidos do programador.
Generalizao/Especializao
Especializao quando, dada uma determinada classe ou categoria, criamos uma outra, com novos atributos ou servios que a tornam mais restrita. 93
Generalizao a operao inversa, ou seja, a remoo de uma ou mais caractersticas de determinada classe, de modo a formar uma classe mais abrangente. Por exemplo, podemos criar a classe Livros e a classe Revistas, ao especilizarmos a classe Publicaes. A classe Livros, por exemplo, teria todos os atributos da classe Publicaes mais o atributo autor. J a classe Revista teria todos os atributos da classe Publicaes mais o atributo perodo. Assim, a classe Livros e a classe Revistas seriam especializaes da classe Publicaes:
Em outro exemplo, Estudante de Graduao e Estudante de Ps Graduao podem ser considerados especializaes da classe Estudante. Esta categoria considerada uma generalizao das duas primeiras. Herana o mecanismo pelo qual uma classe obtm as caractersticas de outra classe para expandi-la ou especializa-la de alguma forma, em um relacionamento de generalizao/especializao. Quando definimos uma classe podemos defini-la como sendo uma sub-classe de outra j definida, constituindo assim uma relao de herana entre elas. A classe da qual estamos herdando caractersticas ser ento chamada de superclasse (ou classe base) da nova classe. Em nosso exemplo, a classe Publicaes seria a superclasse (ou classe base) das classes Livros e Revistas. Atravs do mecanismo de herana simples criamos um nova classe baseada apenas em uma nica superclasse. J na herana multipla, criamos uma nova classe baseada em duas ou mais super-classes, acrescentando novos atributos ou servios.
Em outro exemplo, podemos dizer que as categorias Nome e Endereo agregadas formam a categoria Estudante. J a decomposio da categoria Estudante resulta nas categorias Nome e Endereo.
Mensagens
Como vimos no captulo anterior, um sistema complexo s funciona atravs da cooperao entre suas partes. Esta cooperao feita atravs do envio de mensagens. Transportando esta imagem para o modelo de orientao a objetos, podemos dizer que um objeto se comunica com outro atravs do envio de mensagens. Para entender melhor o conceito de mensagens, vamos supor que um usurio de nossa biblioteca queira pegar um livro emprestado. O primeiro procedimento da bibliotecria ser verificar se o usurio j est cadastrado na biblioteca. Para essa verificao, o objeto Movimentao enviar uma mensagem para o objeto Usurio: Verificar Usurio. Ao receber esta mensagem, o objeto Usurio dar incio ao servio VerificaUsurio(), devolvendo uma resposta (ou seja, tendo um determinado comportamento): o usurio est cadastrado ou no.
Acoplamento Dinmico
Como vimos, ao receber uma mensagem o objeto ter um determinado tipo de comportamento, de acordo com o servio chamado pela mensagem. Ao receber uma mensagem, o objeto verificar se h na classe a qual ele pertence um servio que defina seu comportamento perante esta mensagem. Caso ele no encontre, verificar nas super-classes da classe (ou seja, nas classes que a originaram) se alguma delas possui um servio que responda aquela mensagem. Este mecanismo de busca de servios chamado de acoplamento dinmico.
95
O mecanismo de acoplamento dinmico importantssimo para a flexibilidade do modelo de objetos, porque evita que voc tenha que definir o mesmo servio em todas as classes. Basta defin-lo na classe de origem.
96
A funo construtora e as demais funes devem ser implementadas na seo implementation da unit: implementation funo construtora; begin .... end; implementao das outras funes; begin ... end; end. A funo construtora usada para inicializar todas as variveis dentro da classe e fazer qualquer outra operao que precisa ser feita pelo objeto desta classe. O Pascal utiliza o mtodo Init, para a funo construtora. J o Delphi utiliza o mtodo Create:
constructor Create(....);
Note que na implementao dos mtodos da classe devemos usar a seguinte sintaxe:
procedure classe.nome_procedure (parmetros);
Para usarmos a classe criada, precisamos criar uma varivel do tipo da classe criada, ou seja, precisamos criar um objeto daquela classe. Isso feito na seo var da unit: 97
As variveis do tipo da classe so tambm chamadas de instncias da classe. Vamos criar uma varivel para manipularmos os atributos e mtodos da classe TRetangulo, definida anteriormente:
var Ret1 : TRetangulo;
Aps criarmos uma varivel do tipo da classe, precisamos separar um espao na memria para ela. Isto feito atravs da chamada a funo construtora da classe:
variavel_da_classe := classe.Create;
Por exemplo:
Ret1 := TRetangulo.Create;
Podemos, ento, manipular seus atributos e mtodos. Isto feito utilizando-se a seguinte sintaxe:
variavel.atributo;
ou
variavel.metodo;
Como vimos anteriormente, as units so conjuntos de procedimentos e funes que podem ser usadas por diversos programas, aumentando a produtividade do desenvolvimento. Uma classe pode (e deve) ser criada em sua prpria unit, de forma que voc no precise reconstru-la toda vez que for us-la. Basta acrescentar o nome de sua unit clusula uses da unit que a vai usar.
Exemplo 24
Vamos criar uma classe TRetangulo, que conter dois atributos, altura e largura, e dois mtodos, um para atribuir valores para os atributos, e outro que calcula a rea do objeto Retangulo:
unit Unit1; interface type TRetangulo = class altura : integer; largura : integer; constructor Create(alt, larg : integer); procedure AtribuiDados(alt, larg : integer); function CalculaArea : integer; end; implementation constructor TRetangulo.Create(alt, larg : integer); begin altura := alt; largura := larg; end; procedure TRetangulo.AtribuiDados( alt, larg:integer); begin altura := alt;
98
Pascal para Delphi largura := larg; end; function TRetangulo.CalculaArea : integer; begin CalculaArea := altura * largura; end; end.
Criamos, portanto, uma classe TRetangulo que possui dois atributos: largura e altura, uma funo construtora, que inicializa estes atributos, e dois mtodos. O primeiro mtodo AtribuiDados, atribui aos atributos determinado valor. O segundo mtodo, CalculaArea, calcula a rea do retangulo, ao multiplicar os valores de altura e largura. Vamos agora utilizar a classe TRetangulo criada:
unit Unit1; interface type TRetangulo = class altura : integer; largura : integer; constructor Create(alt, larg: integer); procedure AtribuiDados(alt, larg : integer); function CalculaArea : integer; end; var Pequeno,Medio,Grande: TRetangulo; implementation constructor TRetangulo.Create(alt , larg : integer); begin altura := alt; largura := larg; end; procedure TRetangulo.AtribuiDados( alt, larg : integer); begin altura := alt; largura := larg; end; function TRetangulo.CalculaArea : integer; begin CalculaArea := altura * largura; end; procedure TForm1.FormCreate (Sender: TObject); begin Pequeno:=TRetangulo.Create(8,8); Medio:=TRetangulo.Create(10,12); Grande := TRetangulo.Create(15,20); ShowMessage('A rea do retangulo pequeno ' + InttoStr( Pequeno.CalculaArea)); ShowMessage('A rea do retangulo mdio ' + InttoStr( Medio.CalculaArea)); ShowMessage('A rea do retangulo grande ' + InttoStr( Grande.CalculaArea)); end; end.
Ou seja, criamos a classe TRetangulo e, para manipul-la, criamos trs objetos: Pequeno, Medio e Grande, todos do tipo TRetangulo. Chamamos ento o mtodo Create da classe TRetangulo, que inicializa seus atributos com os parmetros passados. Por exemplo, para a instancia Pequeno, inicializamos o retngulo com os valores 8 de altura e 8 de largura. Fazemos o mesmo para as instancias Medio e Grande da classe TRetangulo. 99
Depois, calculamos a rea do retangulo, atravs da chamada ao mtodo CalculaArea da classe TRetangulo, que multiplica os valores da largura e altura atribuidas no mtodo de inicializao. Por exemplo, para o retangulo pequeno, cuja altura e largura foram inicializadas com o valor de 8, temos uma rea de 64. Este valor mostrado ento na tela, atravs do comando ShowMessage. Repetimos o procedimento anterior para as demais instancias da classe TRetangulo. Como novo exemplo, vamos criar uma unit que utilize a classe de nome TVeiculo, armazenado em uma unit denominada Unidade3. Inicialmente, vamos criar a unit, e nela construir o objeto TVeiculo. Este objeto possui dois atributos, Peso e Pneus, um mtodo construtor, e um mtodo que calcula o peso carregado por cada pneu:
unit Unidade3; interface type TVeiculo = class Pneus : integer; Peso : real; constructor Create(n_pneus: integer; n_peso: real); function AtribuiPneus : integer; function AtribuiPeso : real; function CarregamentoPneus : real; end; implementation constructor TVeiculo.Create( n_pneus : integer; n_peso : real); begin Pneus := n_pneus; Peso := n_peso; end; function TVeiculo.AtribuiPneus : integer; begin AtribuiPneus := Pneus; end; function TVeiculo.AtribuiPeso : real; begin AtribuiPeso := Peso; end; function TVeiculo.CarregamentoPneus : real; begin CarregamentoPneus := Peso/ Pneus; end; end.
No esquea de salvar esta unit criada, atravs do comando File | Save, dando a ela o nome Unidade3.pas. Se voc no salv-la, no poder acrescent-la clusula uses da unit que a usar. Agora, vamos criar a unit que usa a classe TVeiculo criada na unit Unidade3. Note que inclumos a unit Unidade3 na clusula uses:
unit Unit1; interface uses Unidade3; var Veic1 : TVeiculo; implementation {$R *.DFM} procedure TForm1.FormCreate( Sender: TObject); begin Veic1 := TVeiculo.Create(1,50); ShowMessage('O veiculo pesa ' + FloattoStr(Veic1.AtribuiPeso) + ' quilos, e possui ' + FloattoStr(Veic1.Pneus) + 'pneus.');
100
101