Sei sulla pagina 1di 13

FUNDAMENTOS DO OBJECT PASCAL

O Pascal uma linguagem surgida a partir de um projeto experimental do professor Niklaus Wirth, da Escola Politcnica de Zurique (a mesma escola onde Einstein estudou). O nome da linguagem uma homenagem ao filsofo francs Blaise Pascal, que inventou uma mquina de calcular mecnica. A descrio formal do Pascal foi publicada em 1971. O Pascal nasceu dentro do conceito de programao estruturada, muito discutida na Europa durante os anos 60 e hoje difundido pelo mundo e incorporado em todas as linguagens modernas (C, C++, Java, Visual Basic, etc.). A idia principal do Pascal a ordem, administrada atravs de um conceito de dados baseado em tipos, requerendo declaraes explcitas de todas as variveis e controles do programa. Parte da popularidade do Pascal se deve ao compilador Turbo Pascal, da Borland, lanado em 1985. A linguagem usada no Delphi o sucessor do Turbo Pascal, conhecido como Object Pascal.

2.1. INSTRUES CONDICIONAIS


2.1.1. INSTRUES IF Este o tipo mais bsico de instruo condicional e pode ser usada para executar um trecho de programa caso uma condio for satisfeita (if then), ou, mais genericamente, para escolher entre duas instrues (if-then-else). A sintaxe geral da instruo if a seguinte: if condio then [bloco de instrues 1] else [bloco de instrues 2];

Note que no deve haver ponto-e-vrgula aps o primeiro bloco de instrues. Isto ocorre porque a instruo if-then-else deve ser lida como uma linha inteira. Como teste, inicie um novo projeto e acrescente duas CheckBoxes e trs Botes de Comando no formulrio, conforme a Figura 2.1 a seguir. No necessrio mudar os nomes ou legendas dos componentes. Dando um duplo clique no primeiro boto e escreva o seguinte cdigo:

procedure TForm1.Button1Click(Sender: TObject); begin {instruo if simples} if CheckBox1.checked then ShowMessage ('CheckBox1 est selecionada ') end; Este um if simples. Durante a execuo, se voc clicar sobre o boto 1, e se CheckBox1 estiver selecionada, um aviso ser emitido. Mas nada acontece caso CheckBox1 no esteja selecionada. Para contornar este problema, escreva o seguinte cdigo no evento click do boto 2: procedure TForm1.Button2Click(Sender: TObject); begin {instruo if-else} if CheckBox1.checked then ShowMessage ('CheckBox1 est selecionada') else ShowMessage ('CheckBox1 no est selecionada ') end;

Agora um aviso continuar a ser emitido caso CheckBox1 esteja selecionada. Caso contrrio (else), um aviso ser emitido com a mensagem de que CheckBox1 no est selecionada. Voc capaz de imaginar o que aconteceria se as duas caixas estivessem selecionadas? Neste caso, apenas o primeiro bloco ser executado. Como o programa verifica que a primeira condio verdadeira, ento a segunda, dentro da lgica do if-then-else, no tem importncia. Assim, a mensagem recebida seria apenas a de que CheckBox1 est selecionada. Para testar ambas as condies, escreva o cdigo a seguir no boto 3: procedure TForm1.Button3Click(Sender: TObject); begin if CheckBox1.checked and CheckBox2.checked then ShowMessage('Ambas as caixas esto selecionadas') end; Note que usamos o operador booleano and para compor uma condio de duas partes, que s ser verdadeira se ambas as caixas estiverem selecionadas. 2.1.2. INSTRUO CASE Se a quantidade de condies a serem verificadas for muito grande, o uso da instruo if poder acarretar em cdigos muito complexos. Neste caso melhor usar a instruo Case, que seleciona um valor dentro de uma lista de possveis valores ou intervalos de valores. Uma das limitaes da instruo Case do Pascal que estes valores devem ser de tipo ordinal, ou seja, no possvel testar literais ou nmeros reais, por exemplo. Para testar o Case, salve o projeto anterior e inicie um novo, inserindo uma caixa de edio e dois botes, conforme a Figura 2.2 abaixo.

No evento click do boto 1, escreva o seguinte cdigo:

procedure TForm1.Button1Click(Sender: TObject); var Numero: integer; begin Numero := StrToInt(edit1.text); case Numero of 1: Showmessage ('Voc digitou 1'); 2: Showmessage ('Voc digitou 2'); 3: Showmessage ('Voc digitou 3'); 4: Showmessage ('Voc digitou 4'); 5: Showmessage ('Voc digitou 5'); 6: Showmessage ('Voc digitou 6'); 7: Showmessage ('Voc digitou 7'); 8: Showmessage ('Voc digitou 8'); 9: Showmessage ('voc digitou 9'); 10: Showmessage ('voc digitou 10'); else Showmessage ('Voc digitou um nmero maior que 10'); end; end; Note que devemos converter a propriedade text da caixa de edio, que um string, para um valor inteiro, pois no podemos testar text diretamente. Isto feito com a funo StrToInt. Podemos usar o Case tambm para testar intervalos de valores. Por exemplo, escreva o seguinte trecho no evento click do boto 2: procedure TForm1.Button2Click(Sender: TObject); var Numero: integer; begin

Numero := StrToInt(edit1.text); case Numero of 1..10: Showmessage ('Voc digitou um nmero entre 1 e 10'); 11..20: Showmessage ('Voc digitou um nmero entre 11 e 20'); 21..30: Showmessage ('Voc digitou um nmero entre 21 e 30'); 31..40: Showmessage ('Voc digitou um nmero entre 31 e 40'); 41..50: Showmessage ('Voc digitou um nmero entre 41 e 50'); else Showmessage ('Voc digitou um nmero maior do que 50'); end; end;

2.2. INSTRUES DE LAO

2.2.1. LAO FOR A instruo for do Pascal semelhante de outras linguagens, mas no muito flexvel. No possvel estabelecer incrementos diferentes de um, embora seja possvel contar para cima e para baixo. Por exemplo, inicie um novo projeto, adicione dois botes no formulrio, e escreva o seguinte cdigo no evento click do primeiro: procedure TForm1.Button1Click(Sender: TObject); var I: integer; begin for I:=1 to 10 do ShowMessage(IntToStr(I)); end;

Estamos usando a funo IntToStr para converter o nmero inteiro I para um string, pois a funo ShowMessage s exibe strings. Clicando-se sobre o boto 1 em tempo de execuo aparece uma caixa de mensagens que vai exibindo nmeros de 1 a 10. O cdigo abaixo pode ser inserido no segundo boto e exibir nmeros no sentido decrescente, isto , de 10 a 1. procedure TForm1.Button2Click(Sender: TObject); var I: integer; begin for I:= 10 downto 1 do ShowMessage(IntToStr(I)); end; 2.2.2. INSTRUES WHILE E REPEAT A diferena entre os laos while-do e repeat-until que o cdigo da instruo repeat sempre executado ao menos uma vez. Voc pode entender essa diferena escrevendo os cdigos a seguir nos botes do projeto anterior: procedure TForm1.Button1Click(Sender: TObject); var I: integer; begin I:=0; while I < 10 do begin ShowMessage(IntToStr(I)); I:= I+1; end; end; procedure TForm1.Button2Click(Sender: TObject); var I: integer; begin I:=0; repeat ShowMessage(IntToStr(I)); I:=I+1;

until I>10; end; Rode o programa e veja o que acontece. Algumas observaes so importantes. Primeiro, voc mesmo precisa providenciar o incremento da varivel contadora I, e esta varivel no precisa ser inteira. Segundo, a instruo while-do exige que o bloco de instrues a ser controlado fique entre um begin e um end, o que no acontece na instruo repeat-until.

2.3. VARIVEIS
A linguagem Pascal fortemente baseada em tipos de dados. O tipo de uma varivel determina os valores que esta varivel pode ter e as operaes que podem ser executadas com ela. Tambm necessrio que todas as variveis sejam declaradas antes de ser usadas, o que feito por meio da palavra-chave var. Esta declarao pode ser feita em uma unidade, em uma procedure ou para declarar variveis globais, tendo o seguinte aspecto: var Numero: Integer; Fechado: Boolean;

Uma tentativa de realizar uma operao com tipos de dados diferentes resulta em um erro de compilao. Isto aconteceria se tentssemos, por exemplo, somar Numero e Fechado. Constantes podem ser declaradas de forma semelhante, com auxlio da palavrachave const: const Pi = 3.141592; Nome = Alvaro; Note que no usamos, aqui, o sinal de atribuio ":=", e sim o sinal de igualdade convencional. O Object Pascal apresenta vrios tipos de dados construdos internamente, denominados tipos pr-definidos. Tambm possvel construir outros tipos a partir dos pr-definidos. A Tabela 2.1 a seguir apresenta os tipos de dados prdefinidos. Tabela 2.1 - Tipos de dados pr-definidos do Object Pascal
TIPO DE DADO ShorInt SmallInt LongInt Integer VARIAO -128 a 127 -32768 a 32767 -2147483647 a 2147483647 -2147483647 a TAMANHO OBSERVAES 1 byte 2 bytes 4 bytes 4 bytes No Delphi este tipo

2147483647 Byte Word Single Double Extended Currency Comp 0 a 255 0 a 65535 1.5 x10 5.0x103.4x10324 -45

idntico ao LongInt. 1 byte 2 bytes

a 3.4x10

38

4 bytes 8 bytes 10 bytes

7-8 dgitos 15-16 dgitos 19-20 dgitos 19-20 dgitos 19-20 dgitos 11-12 dgitos. Use este tipo apenas para compatibilidade com verses anteriores do Pascal

a 1.7x10

308 4932

4932

a 1.1x10

-922337203675477.5808 a 8 bytes 922337203685477.5807 -263 a 263 8 bytes

Real

2.0x10-39 a 1.7x1038

6 bytes

Boolean AnsiChar WideChar Char ShortString AnsiString String Variant

True ou false Caracteres ANSI Caracteres Unicode Caracteres ANSI At 255 caracteres Virtualmente sem limite Virtualmente sem limite

1 byte

1 byte

No Delphi este tipo idntico ao AnsiChar

Em geral, idntico ao AnsiString Pode conter qualquer tipo de dados

Como o Object Pascal uma linguagem fortemente estruturada, voc no poder realizar operaes entre variveis de tipos diferentes. Ser necessrio, ento, convert-las para o tipo adequado antes de realizar a operao. A Tabela 2.2 a seguir mostra as funes de converso mais utilizadas. Tabela 2.2 - Funes de converso de tipos mais utilizadas
FUNO Chr Round Trunc Int IntToStr StrToInt StrToIntDef Val Str DESCRIO Converte um nmero ordinal em um caractere ANSI Converte um real em um inteiro, arredondando a parte decimal Converte um real em um inteiro, truncando a parte decimal Retorna a parte inteira de um argumento de ponto flutuante Converte um nmero em um string Converte um string em um inteiro, levantando uma exceo (erro) caso o string no represente um inteiro vlido Converte um string em um inteiro, usando um valor padro se o string no estiver correto Converte um string em um nmero (rotina includa para compatibilidade com o Turbo Pascal) Converte um string em um nmero, usando parmetros de formatao (rotina includa para compatibilidade com o Turbo Pascal)

FloatToDecimal Converte um valor de ponto flutuante em um registro (record) incluindo

sua representao decimal (expoente, dgitos, sinal) FloatToStr StrToFolat Converte um valor de ponto flutuante para sua representao string usando formatao padro Converte um string e, um valor de ponto flutuante

Alm dos tipos pr-definidos, o Object Pascal emprega a idia de tipos de dados definidos pelo usurio, que foi introduzida pela primeira vez no Pascal, no estando presente nas linguagens anteriores. Os programadores podem definir seus prprios tipos de dados por meio de construtores de tipos, tais como subintervalos (subranges), matrizes (arrays), registros (records), enumeraes, ponteiros e conjuntos. A seguir, discutiremos brevemente cada um destes tipos.

2.3.1. TIPOS ENUMERADOS


Este tipo permite que voc crie uma lista organizada de itens. Para usar um tipo voc deve antes declar-lo com a palavra reservada type. Por exemplo, um tipo enumerado que descreve os dias da semana pode ser declarado da seguinte maneira: implementation {$R *.DFM} type Semana = (Segunda, Tera, Quarta, Quinta, Sexta, Sbado, Domingo);

Espaos em branco no so permitidos dentro de um elemento. Uma vez declarado um tipo, voc deve declarar uma varivel pertencente a este tipo. No usamos o tipo diretamente, mas sim uma varivel deste tipo. Por exemplo, vamos supor que queiramos construir um programa que fornea o nome da pessoa escalada para um planto semanal. Poderamos declarar uma varivel Plantao da seguinte forma: var Plantao : Semana; Para atribuir valores varivel Plantao escreva simplesmente: Plantao := Segunda; Plantao := Tera; etc.

2.3.2. TIPOS SUBRANGE O tipo subrange (subintervalo) permite que voc defina um intervalo vlido de respostas que um usurio pode inserir em um programa, tal como o nmero de

horas trabalhadas em um ms, a faixa de idade dos membros de um clube, etc. Um subintervalo pode conter os seguintes tipos: boolean, char, integer e tipos enumerados. A declarao de um tipo subintervalo similar quela de um tipo enumerado: type Salario_faixa1 = 500 .. 1000;

Note que usamos dois pontos para separar os limites do suintervalo, e no vrgulas. Isto permite que o compilador identifique o tipo como um subintervalo e no um tipo enumerado. A seguir, devemos declarar uma varivel como pertencente ao tipo declarado anteriormente: var Salario_Ana : Salario_faixa1;

Quando um programa usando subintervalos executado, e se um valor atribudo a um tipo subintervalo estiver fora do intervalo, o programa gerar um erro de tempo de execuo. Veremos mais tarde como capturar este erro de modo a avisar ao usurio que ele deve entrar novamente com os dados, sem que o programa seja abortado. Para que o teste de intervalo seja executado, voc deve antes incluir a diretiva de compilao {$R+} no programa, da seguinte forma: procedure Tform1.ButtonClick (Sender : Tobject); {$R+} type Salario_faixa1 = 500 .. 1000; var Salario_Ana : Salario_faixa1;

2.3.3. TIPOS ARRAY Arrays so matrizes, isto , colees ordenadas de elementos de um mesmo tipo de dados, que faz uso de um ndice para dar acesso aos itens da coleo. Como array j um tipo, basta declarar uma varivel como array, da seguinte forma: var Dia_da_semana: array [1..7] of string; Dia_do_ms: array [1..31] of integer;

Note que separamos os valores mnimo e mximo de um array por dois pontos. Os arrays declarados acima so unidimensionais, isto , seus elementos podem ser dispostos formando uma nica linha. Para atribuir valores a um array proceda da seguinte forma: begin Dia_da_semana Dia_da_semana Dia_da_semana Dia_da_semana Dia_da_semana Dia_da_semana Dia_da_semana end; [1] [2] [3] [4] [5] [6] [7] := := := := := := := Domingo; Segunda-feira; Tera-feira; Quarta-feira; Quinta-feira; Sexta-feira; Sbado;

Para armazenar valores de um array em outra varivel, podemos escrever: var Dia : string; begin Dia := Dia_da_semana [1]; end;

e assim por diante. A declarao de arrays multidimensionais semelhante de arrays unidimensionais. Por exemplo, para declarar um array a ser usado como uma tabela 30x30, escrevemos: var Bi_array: array [1..30,1..30] of currency;

Note que os elementos de um array podem pertencer a qualquer tipo de dados pr-definido ou definido pelo usurio. Os elementos de um array podem ser at mesmo outro array, mas por enquanto ficamos por aqui. 2.3.4. TIPOS RECORD (REGISTRO) O tipo de dados Record provavelmente o mais verstil disposio, pois pode conter tipos de dados heterogneos. Por exemplo, a folha de pagamento de uma empresa conter dados do tipo string (nome, endereo, etc), dados do tipo currency (salrio), dados do tipo TDateTime (data de contratao) e assim por

diante. No poderamos usar um array, pois este tipo s pode conter dados de um mesmo tipo. O tipo Record resolve o problema e, mais uma vez, devemos declarar o tipo de dados antes de us-lo: type Folha_Pgto = Record Nome: String; Data_Cont : TDateTime; Salario: currency; end; var Folha_Abril: Folha_Pgto; begin Folha_Abril.Nome := Ana Paula Magalhes; Folha_Abril.Data_Cont := 10/02/1998; Folha_Abril.Salrio := 2200; end; Note que voc deve usar um ponto para separar o nome do Record do nome do campo a que voc est se referindo. O Object Pascal, e vrias linguagens modernas fornecem uma maneira mais fcil de executar esta operao, usando a instruo With: begin With Folha_Abril do begin Nome := Ana Paula Magalhes; Data_Cont := 10/02/1998; Salrio := 2200; end; end; Aqui, o primeiro "end" da instruo With. A documentao do Object Pascal sugere que voc use With quando for possvel, pois isto diminui o tempo de execuo. Os tipos Record tambm podem conter arrays e so bastante usados quando se requer bancos de dados simples. Veremos que o Delphi permite a implementao de estruturas de dados bastante complexas, usando bancos de dados Dbase, Paradox, Access, etc. Contudo, vez por outra no necessria toda esta

sofisticao e conveniente optar pelos tipos Record. Alm disso, nesses casos simples no ser necessrio instalar os drivers de bancos de dados.

Potrebbero piacerti anche