Caderno Didtico
Bruno B. Boniati
Sumrio
CAPITULO I - Introduo ao Lazarus................................................................................................................................................................. 01 O que o Lazarus ......................................................................................................................................................................................... 01 Viso geral do Lazarus ............................................................................................................................................................................. 01 Caractersticas do ambiente Lazarus e da linguagem Object Pascal ...................................................................................................... 01 Caractersticas da Programao com Lazarus e Object Pascal .............................................................................................................. 02 Antes de Comear... O Projeto da Interface Grfica .............................................................................................................................. 02 Padronizao ............................................................................................................................................................................................ 02 Esquea a programao modo caractere ou console ......................................................................................................................... 02 Simplicidade ............................................................................................................................................................................................. 02 Nomenclatura ........................................................................................................................................................................................... 02 Como formado uma Aplicao em Lazarus ............................................................................................................................................ 03 Arquivos que Compem uma Aplicao................................................................................................................................................... 03 Arquivos Gerados pela Compilao ......................................................................................................................................................... 03 Cdigo fonte do arquivo Project (.LPR) .................................................................................................................................................... 04 Cdigo fonte do arquivo Unit (.PAS)......................................................................................................................................................... 05 Ambiente de Desenvolvimento Lazarus ..................................................................................................................................................... 07 Janela Principal ........................................................................................................................................................................................ 07 Object Inspector........................................................................................................................................................................................ 08 Form Designer e Program Editor .............................................................................................................................................................. 09 CAPITULO II Programao Orientada a Objetos (Conceitos) ...................................................................................................................... 10 Introduo...................................................................................................................................................................................................... 10 Abstrao de Dados ..................................................................................................................................................................................... 10 Classe ....................................................................................................................................................................................................... 10 Propriedade .............................................................................................................................................................................................. 10 Mtodos .................................................................................................................................................................................................... 10 Instncias.................................................................................................................................................................................................. 10 Objeto ....................................................................................................................................................................................................... 10 Visibilidade................................................................................................................................................................................................ 13 Declarao, Instanciamento, Destruio e Referncia a Objetos ............................................................................................................ 13 Encapsulamento ........................................................................................................................................................................................... 15 Herana .......................................................................................................................................................................................................... 15 Caractersticas / Benefcios ...................................................................................................................................................................... 15 Implementao ......................................................................................................................................................................................... 16 Polimorfismo ................................................................................................................................................................................................. 16 Caractersticas / Benefcios ...................................................................................................................................................................... 16 CAPITULO III - Object Pascal ............................................................................................................................................................................. 17 Bsico da Linguagem ................................................................................................................................................................................... 17 Comentrios ............................................................................................................................................................................................. 17 O Ponto-e-Vrgula e o Ponto .................................................................................................................................................................... 17 Tipos de Dados Padro ................................................................................................................................................................................ 18 Tipos Inteiros ............................................................................................................................................................................................ 18 Tipos Reais ............................................................................................................................................................................................... 18 Tipos Texto ............................................................................................................................................................................................... 18 Tipos Ordinais........................................................................................................................................................................................... 18 Boolean..................................................................................................................................................................................................... 18 TDateTime ................................................................................................................................................................................................ 18 Variant ...................................................................................................................................................................................................... 19 Tipos de Definidos pelo Usurio ................................................................................................................................................................. 19 Strings Limitadas ...................................................................................................................................................................................... 19 Sub-Faixa ................................................................................................................................................................................................. 19 Enumeraes............................................................................................................................................................................................ 19 Ponteiros................................................................................................................................................................................................... 20 Records .................................................................................................................................................................................................... 20 Arrays ....................................................................................................................................................................................................... 20 Sets........................................................................................................................................................................................................... 20 Elementos Fundamentais de Controle........................................................................................................................................................ 21 Operadores ............................................................................................................................................................................................... 21 Comandos de DECISO .......................................................................................................................................................................... 21 Comandos de LOOPING .......................................................................................................................................................................... 22 Procedimentos e Funes ........................................................................................................................................................................ 24 Funes e Comandos Internos (principais) ............................................................................................................................................... 26 Tratamento de Strings .............................................................................................................................................................................. 26 Tratamento de Ordinais ........................................................................................................................................................................... 27 Tratamento de valores TDateTime .......................................................................................................................................................... 27 Converses de Tipos de Dados ............................................................................................................................................................... 28 Strings de Formato ................................................................................................................................................................................... 30 Outras Funes ........................................................................................................................................................................................ 31
CAPITULO IV Classes e Objetos Padres do Lazarus ................................................................................................................................. 32 Propriedades ................................................................................................................................................................................................. 32 Tipos de Propriedade ............................................................................................................................................................................... 32 Propriedades Comuns .............................................................................................................................................................................. 32 Eventos .......................................................................................................................................................................................................... 33 Eventos Comuns ...................................................................................................................................................................................... 33 Mtodos ......................................................................................................................................................................................................... 33 Mtodos Comuns...................................................................................................................................................................................... 33 Biblioteca de Classes ................................................................................................................................................................................... 34 Janelas ..................................................................................................................................................................................................... 34 Componentes Padro ............................................................................................................................................................................... 34 Caixas de Dilogo..................................................................................................................................................................................... 40 Menus ....................................................................................................................................................................................................... 40 Classes No Visuais ................................................................................................................................................................................. 41 Excees........................................................................................................................................................................................................ 45 Blocos Protegidos ..................................................................................................................................................................................... 45 Principais Excees.................................................................................................................................................................................. 46 Blocos de Finalizao ............................................................................................................................................................................... 46 Gerao de Excees .............................................................................................................................................................................. 47 CAPTULO V Banco de Dados......................................................................................................................................................................... 48 Consideraes Iniciais ................................................................................................................................................................................. 48 Configurando a conexo e o acesso aos dados ........................................................................................................................................ 48 SQLdb Componentes de Acesso aos Dados ........................................................................................................................................ 48 DataControls Componentes de Controle aos Dados ............................................................................................................................ 61 CAPTULO VI Relatrios e Comandos de Impresso ................................................................................................................................... 63 LazReport Conceitos Bsicos ................................................................................................................................................................. 63 Utilizao de variveis do relatrio ........................................................................................................................................................... 66 Utilizando scripts....................................................................................................................................................................................... 66 Relatrios baseados em consultas de banco de dados ........................................................................................................................... 67 Visualizao e Impresso ......................................................................................................................................................................... 68 Referncias Bibliogrficas ................................................................................................................................................................................. 69 Sites Especializados (em portugus) ................................................................................................................................................................ 69
Possibilidade de criao de novos componentes na prpria linguagem e incorporao dos mesmos ao IDE. Acesso facilitado a banco de dados. Ambiente de depurao integrado.
Simplicidade
Procure facilidades de uso. Permita liberdade de ao. Permita diferentes maneiras de se alcanar o mesmo resultado. Procure as solues mais intuitivas. Procure adotar os smbolos que o usurio j esteja acostumado.
Nomenclatura
Normalmente os componentes so nomeados utilizando-se uma conveno, onde as primeiras letras, minsculas e sem as vogais, identificam o tipo do componente e o restante identifica a funo deste, assim, btnSair, seria o boto de sair. Se a funo do componente for um nome composto esse nome deve ser escrito com os primeiros nomes abreviados e com letras maisculas e minsculas, como em btnRelVendas, que identifica o boto do relatrio de vendas ou btnRelVenProduto, que identifica o boto do relatrio de vendas por produto.
Pgina 2
.LPR
.EXE
FORM 1
FORM 2
FORM N
.PPU
.PPU
.PPU
FORM 1
FORM 2
FORM N
.LFM .PAS
UNIT 1
.LFM .PAS
UNIT 2
.LFM .PAS
UNIT N
ROTINAS
.PAS
.LPI
.PAS
.LFM
Arquivo grfico do formulrio (Lazarus Form) Arquivo de Recursos do Compilador Arquivo de Recursos (Lazarus Resource)
.RC .LRS
Devido grande quantidade de arquivos de uma aplicao, cada projeto deve ser montado em um diretrio especfico.
Estes arquivos podem ser apagados da mquina do desenvolvedor para economizar espao em disco.
Pgina 3
Pgina 4
Pgina 5
Abaixo veja como fica a unit quando voc abre um projeto novo:
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs; type TForm1 = class(TForm) private { private declarations } public { public declarations } end; var Form1: TForm1; implementation initialization {$I unit1.lrs} end.
Pgina 6
Janela Principal
A janela principal do Lazarus composta pela barra de menus, Speed Bar e paleta de componentes:
Pgina 7
Os Speed Buttons, so atalhos para diversos comandos de menu. Oferecem o recurso das Tool Tips, que so pequenas caixas de texto amarelas, exibidas quando o ponteiro do mouse deixado por sobre um boto durante algum tempo e exibem a ao que ser acionada quando ele for clicado.
Ela mostra todos os controles, tanto visveis como no visveis, que podem ser colocados em um formulrio. O Lazarus utiliza a construo da paleta de componentes em abas, onde cada uma rene componentes de diferentes categorias, agrupados por funcionalidade. Por exemplo, os componentes mostrados na figura anterior so todos componentes padro (aba Standard).
Object Inspector
O object inspector uma janela que aparece esquerda da janela do form designer por padro e pode ser visualizado de qualquer parte do projeto pressionando a tecla F11. Compe-se de quatro abas, sendo as duas mais importantes as abas Properties (Propriedades) e Events (Eventos).
Pgina 8
Propriedades: Refere-se a aspectos e caractersticas de um determinado componente que podem ser alterados tanto em tempo de design como em tempo de execuo. Essencialmente, propriedades so atributos que controlam a aparncia de um componente e a maneira como ele age e reage. Eventos: Eventos so grupos de cdigo que so fornecidos e que determinam a ao a ser tomada em tempo de execuo para uma determinada mensagem ou evento do sistema operacional. Clicando sobre o evento o Lazarus associa um procedimento a ele e abre a janela de edio de cdigo para que seja feita a programao. O object inspector do Lazarus oferece ainda duas outras abas: Favorities que destaca caractersticas (propriedades e eventos) especficas do componente em questo e Restricted que indica possveis restries do componente em diferentes bibliotecas grficas entre plataformas de sistemas operacionais.
Pgina 9
10
Abstrao de Dados
o processo de criar novos tipos de dados, ou seja, a capacidade de abstrairmos algo, porm reconhecendo todas as suas propriedade bsicas.
Classe
Tipo de dados definido pelo usurio (uma especificao para um tipo abstrato), que tem um estado (sua representao) e algumas operaes (seu comportamento). Uma classe possui alguns dados internos e alguns mtodos, na forma de procedimentos ou funes, e normalmente descreve as caractersticas genricas de vrios objetos semelhantes. O programador ir se preocupara no que a classe possui e no naquilo que ela significa.
Propriedade
Define as caractersticas dos objetos de uma classe.
Mtodos
So os servios oferecidos por uma classe, ou seja, so as funes criadas ou utilizadas pelo programador. Os mtodos definem o comportamento dos objetos de uma classe.
Instncias
Elementos de dados individuais so instncias de uma classe. Instanciar uma classe significa criar um objeto.
Objeto
uma instncia de uma classe (da mesma forma que uma varivel numrica nada mais do que uma instncia do tipo inteiro). Objeto uma varivel do tipo de dados definido pela classe. Os objetos so entidades reais, ocupam memria, quando o programa executado. O relacionamento entre objeto e classe o mesmo que o existente entre varivel e tipo.
Pgina 10
11
Exemplo:
unit Datas; interface type TData = Class(TObject) private Dia, Mes, Ano : Integer; public constructor Init (d,m,a : integer); procedure DefVal (d,m,a : integer); function AnoBis : boolean; procedure Incrementa; procedure Decrementa; procedure Adiciona (NumDeDias : integer); procedure Subtrai (NumDeDias : integer); private function DiasNoMes : Integer; end; implementation constructor TData.Init (d,m,a : integer); begin dia := d; Mes := m; ano := a; end; procedure TData.DefVal (d,m,a : integer); begin dia := d; Mes := m; ano := a; end; function TData.AnoBis : boolean; begin if (ano mod 4 <> 0) then AnoBis := false else if (ano mod 100 <> 0) then AnoBis := true else if (ano mod 400 <> 0) then AnoBis := False else AnoBis := True; end; function TData.DiasNoMes : integer; begin case Mes of 1,3,5,7,8,10,12 : DiasNoMes := 31; 4,6,9,11 : DiasNoMes := 30; 2 : if (AnoBis) then DiasNoMes := 29 else DiasNoMes := 28; end; end;
Definio da Classe
. . .
Pgina 11
12
Universidade Federal de Santa Maria procedure TData.Incrementa; begin if (dia < DiasNoMes) then inc(dia) {se no for o ltimo dia do Mes} else if (Mes < 12) then begin inc(Mes); dia := 1; end else {se for o dia de ano novo} begin inc(ano); Mes := 1; dia := 1; end; end; procedure TData.Decrementa; begin if (dia > 1) then Dec(dia) {se no for o primeiro dia do ms} else if (Mes > 1) then {se no for o primeiro dia do ano} begin Dec(Mes); dia := DiasNoMes; end else begin Dec(ano); Mes := 12; dia := DiasNoMes; end; end; procedure TData.Adiciona (NumDeDias : integer); var n : integer; begin for n := 1 to NumDeDias do Incrementa; end; procedure TData.Subtrai (NumDeDias : integer); var n : integer; begin for n := 1 to NumDeDias do Decrementa; end; end.
Utilizao
var x : TData; begin x:=TData.Create; x.Init(10,10,1981) end;
Pgina 12
13
Visibilidade
Define quem tem permisso de acessar e alterar os atributos e mtodos da classe. Em uma mesma classe pode existir atributos e mtodos com visibilidade diferentes. Visibilidade Public Private Protected Published Descrio Os atributos e mtodos podem ser manipulados por qualquer classe. Os atributos e mtodos s podem ser manipulados pela prpria classe. Os atributos e mtodos podem ser manipulados pela prpria classe ou por qualquer subclasse desta e por demais classes declaradas na mesma UNIT. Semelhante a visibilidade public sendo que permite o acesso em tempo de projeto.
Identificador representa uma propriedade ou um mtodo. A referncia a Dados idntica a referncia a cdigo. Mtodo Construtor
constructor <identificador> ( <parmetros formais> );
Aloca memria e inicializa o objeto, baseado nos parmetros passados. Normalmente a primeira ao invocar o construtor da classe base, atravs da instruo:
inherited <construtor> ( <parmetros reais > );
Mtodo Destrutor
destructor <identificador> ( <parmetros formais> );
Destri o objeto, baseado nos parmetros passados, e libera a memria alocada para ele. Normalmente a ltima ao invocar o destrutor da classe base, atravs da instruo:
inherited <destrutor> ( <parmetros reais > );
O Parmetro Self Representa um parmetro invisvel passado a todos os mtodos de uma classe e representa a instncia da classe que esta chamando o mtodo. utilizado para evitar conflitos de nomes de objetos
Pgina 13
14
Mtodos Estticos Os mtodos declarados numa classe so por default estticos. Tem suas referncias determinadas em tempo de compilao Mtodos Virtuais O objetivo dos mtodos virtuais a possibilidade de substitu-los por novos mtodos, contendo os mesmo parmetros, das classes descendentes. Para tornar um mtodo virtual, basta acrescentar no final de sua declarao na classe, a palavra virtual. Um mtodo virtual pode ser substitudo em uma classe descendente atravs de sua redeclarao seguida da diretiva override; Mtodos Dinmicos Mtodos dinmicos so basicamente idnticos a mtodos virtuais sendo declarados com o uso da diretiva dynamic. OBS.: Os mtodos dinmicos favorecem o tamanho do cdigo enquanto os mtodos virtuais favorecem a velocidade. Mtodos Abstratos So mtodos que no fazem nada, servem apenas para definir a estrutura de uma hierarquia. Para tornar um mtodo abstrato, basta acrescentar no final de sua declarao na classe, a palavra abstract. Para um mtodo ser abstrato, necessrio que ele seja tambm virtual. Propriedades Representa um mecanismo para encapsular os campos de uma Classe sobrecarregando as operaes de leitura e escrita. So uma extenso natural s variveis de instncia de uma classe, pois permitem que o desenvolvedor parea esta trabalhando com estas, enquanto na realidade est executando chamadas a mtodos. Para utilizar as propriedades os campos (atributos) devem ser declarados como private, os mtodos como protected, e as propriedades como public.
property Identificador : TIPO [read MtodoDeLeitura] [write MtodoDeEscrita];
Identificador representa a propriedade, TIPO o tipo da propriedade, MtodoDeLeitura o mtodo associado leitura da propriedade, MdodoDeEscrita o mtodo associado escrita da propriedade. Verificao de Tipo Verifica, em tempo de execuo, se o objeto uma instncia da classe ou de alguma subclasse desta. Retorna true ou false.
<objeto> is <classe>
Converso de Tipo Converte, se possvel, uma referncia para o objeto de uma classe base em uma referncia para objeto da subclasse.
(<objeto> as <classe>).<Mtodos ou Propriedade>
Pgina 14
15
Encapsulamento
A encapsulao consiste em ocultarmos ao usurio o funcionamento interno de uma classe. Desta forma todos os detalhes de um objeto, que so insignificantes ao programador no sero aparentes. A principal vantagem da encapsulao permitir que os implementadores de classes mudem a implementao de uma classe sem que precisem alterar algum cdigo gerado. Desta forma podemos alterar os dados de um produto usando a mesma classe j previamente criada para a alterao de outro tipo de cadastro. O principal objetivo tornar o objeto independente de sua implementao interna, para isso a implementao das suas propriedades e mtodos so "escondidas" de forma que o usurio precise apenas conhecer a interface do objeto para poder utiliz-lo. Desta forma o desenvolvedor poder alterar tranquilamente a implementao de um objeto (Classe) sem causar transtornos aos usurios.
Herana
O objetivo bsico deste conceito permitir a criao de uma nova classe a partir de outras existentes sem contudo duplicar cdigo algum. A nova classe, chamada de derivada, se comportar de maneira anloga a classe que lhe deu origem, comportando-se diferentemente apenas naquilo que for alterado em relao classe original. A herana a responsvel direta pela grande reusabilidade usual nos sistemas baseados em OOP. A herana permite que avancemos gradualmente em relao aos objetivos, sem perder consistncias (alvos) anteriormente atingidos. Assim pode-se adaptar o comportamento de um componente sem mudar o prprio componente. O sistema pode ser alterado de forma incremental sem comprometimento do cdigo.
Caractersticas / Benefcios
Permite que uma nova classe seja descrita a partir de outra classe j existente (Reutilizao). A subclasse herda as caractersticas e o comportamento da superclasse. A subclasse pode adicionar novas caractersticas e comportamentos aos herdados da superclasse. A subclasse pode ter um comportamento diferente da superclasse, redefinindo o mtodo herdado. A subclasse uma especializao da superclasse. Toda instncia da subclasse tambm uma instncia da superclasse. Resultado de uma sequncia de heranas uma hierarquia de classes.
Pgina 15
16
Implementao
Segue abaixo um exemplo de herana onde criamos uma subclasse (TNewData), a partir da classe TData, j existente, incluindo o mtodo GetText.
type TNewData = Class(TData) public function GetText : string; end; function TData.GetText : string; var d, m, a : string; begin d := IntToStr(dia); case Mes of 1 : m := 'Janeiro'; 2 : m := 'Fevereiro'; 3 : m := 'Maro'; 4 : m := 'Abril'; 5 : m := 'Maio'; 6 : m := 'Junho'; 7 : m := 'Julho'; 8 : m := 'Agosto'; 9 : m := 'Setembro'; 10: m := 'Outubro'; 11: m := 'Novembro'; 12: m := 'Dezembro'; end; a := IntToStr(ano); GetText := d + ', ' + m + ' de ' + a; end;
Polimorfismo
Este conceito permite que sejam declaradas diferentes classes que por sua vez podem definir mtodos de mesmo nome e comportamentos diferentes. Isto importante na medida em que permite escrever rotinas que operem com qualquer classe que implementa os mtodos necessrios. Desta forma, as classes tornam-se mais independentes uma da outra e assim pode-se criar novas classes no gerando qualquer impacto sobre aquelas anteriormente existentes.
Caractersticas / Benefcios
a capacidade de tratarmos objetos de diferentes tipos de uma mesma maneira desde que eles tenham um ancestral em comum Objetos de classes diferentes podem ter mtodos com mesmo nome e cada objeto responder adequadamente de acordo com seu mtodo. Mtodos da mesma classe podem ter o mesmo nome, desde que possuam quantidade ou tipo de parmetros diferentes. Mtodos da classe derivada podem ter nomes iguais aos da classe base, inclusive com parmetros iguais.
Pgina 16
17
Comentrios:
{ } (* *) // Tudo o que est entre as chaves ignorado; Tudo o que est entre * ignorado; Tudo aps o marcador do comentrio ignorado at o final da linha.
O Ponto-e-Vrgula e o Ponto:
Como regra geral, todas as instrues em um programa Pascal devem ser separadas por um ponto-e-vrgula. Neste caso, note que instruo refere-se tanto a instrues simples como instrues compostas. por esta razo que no existe um ponto-e-vrgula aps um BEGIN e significa tambm que um ponto-e-vrgula antes de qualquer END opcional. Assim, no cdigo a seguir, a instruo de atribuio no possui um ponto-e-vrgula aps ela porque imediatamente seguida por um END, mas o END deve ter um ponto-e-vrgula aps, porque ele o final da instruo composta:
if x = 13 then begin ShowMessage(X vale Treze`); x:=14 // aqui o ponto e vrgula opcional end; //aqui o ponto e vrgula obrigatrio pois termina a instruo composta.
Na maioria dos caso o par BEGIN ... END esto sempre juntos. Entretanto, existem poucos casos onde voc tem um END sem BEGIN. A ocorrncia mais comum a instruo CASE.
Pgina 17
18
Tipos Inteiros
So tipos numricos exatos, sem casas decimais. O tipo integer o tipo inteiro padro.
Tipo ShortInt SmallInt ou Integer Longint Byte Word Cardinal Tam. (bytes) 1 2 4 1 2 4 Valor Mn. -128 -32768 -2147483648 0 0 0 Valor Mx. 127 32767 2147483647 255 65535 2147483647
Tipos Reais
So tipos numricos exatos com casas decimais. O tipo Double o tipo real padro.
Tipo Real Single Double Extended Comp Currency Tam. (bytes) 6 4 8 10 8 8 Valor Mn. -39 10 -45 10 -324 10 -4932 10 18 -10 12 -10 Valor Mx. 38 10 38 10 308 10 4932 10 18 10 12 10 Dgitos Significativos 11-12 7-8 15-16 19-20 19-20 19-20
Tipos Texto
Os tipos texto podem operar com caracteres simples ou grupos de caracteres. O tipo String o tipo texto padro.
Char String ou shortstring Ansistring Um nico caractere ASCII Conjunto de caracteres de tamanho 1 a 256 bytes, sendo que o primeiro byte guarda o comprimento do conjunto. Conjunto de caracteres em limite de tamanho, terminada em nulo (#0)
Tipos Ordinais
Tipos ordinais so tipos que tem uma sequncia incremental, ou seja, pode-se dizer qual o prximo valor ou qual o valor anterior a um determinado valor ordinal. So tipos ordinais o Char, os tipos inteiros, o Boolean e os tipos enumerados.
Boolean
Variveis do tipo Boolean podem receber os valores lgicos True ou False, verdadeiro ou falso. Uma varivel Boolean ocupa 1 byte de memria.
x := true;
TDateTime
O tipo TDateTime guarda data e hora em uma estrutura interna igual ao tipo Double, onde a parte inteira o nmero de dias desde 31/12/1899 e a parte decimal guarda a hora, minuto, segundo e milissegundo. As datas podem ser somadas ou subtradas normalmente.
Pgina 18
19
Variant
Tipo genrico, que pode atribuir e receber valores de qualquer outro tipo. Deve-se evitar a utilizao de variveis do tipo Variant, pois seu uso pode prejudicar a performance do programa, alm de diminuir a legibilidade do cdigo fonte e a integridade do executvel, no trecho de cdigo abaixo se observa como esse tipo de varivel tem um comportamento estranho.
var V1, V2, V3: Variant; begin V1 := True; V2 := 1234.5678; V3 := Date; ShowMessage(V1 + V2 + V3); end;
Strings Limitadas
No caso de se desejar limitar o nmero de caracteres de uma string, podemos criar um tipo de string limitada:
TEstado = string[2]; x := RS;
Se, por exemplo, for tentado atribuir o valor: RGS a uma varivel do tipo TEstado, a mesma receber apenas os dois primeiros caracteres ... RG.
Sub-Faixa
um subconjunto de um tipo ordinal e possui as mesmas propriedades do tipo original:
TMaiusculas = A .. Z; TMes = 1 .. 12; x := C; y := 7;
Enumeraes
Sequncia de identificadores como valores vlidos para o tipo. A cada elemento da lista de identificadores associado internamente um nmero inteiro, iniciando pelo nmero 0.
TDiaSemana = (Dom, Seg, Ter, Qua, Qui, Sex, Sab); x := Ter; // podemos usar o comando CASE para testar atribuies
Pgina 19
20
Ponteiros
Ponteiros armazenam endereos de memria. Todas as classes em Object Pascal so implementadas como ponteiros, mas raramente o programador vai precisar us-los como tal.
TPonteiroInt = ^Integer;
Records
O tipo record uma forma de criar uma nica estrutura com valores de diferentes tipos de dados. Cada um dos dados de um record chamado de campo.
type TData Ano: Mes: Dia: end; = record Integer; TMes; Byte;
var Festa: TData; begin Festa.Ano := 1997; Festa.Mes := Mai; Festa.Dia := 8; end;
Arrays
Arrays fornecem uma forma de criar variveis que contenham mltiplos valores, como em uma lista ou tabela, cujos elementos so do mesmo tipo. Abaixo alguns exemplos de arrays de dimenses variadas.
TTempDia = array [1..24] of Integer; // uma dimenso - vetor TTempMes = array [1..31, 1..24] of Integer; // duas dimenses - matriz TTempAno = array [1..12, 1..31, 1..24] of Integer; // tridimensional
Um array pode ser definido como constante tipada, onde todos os seus elementos devem ser inicializados.
Fatorial: array[1..7] of Integer = (1, 2, 6, 24, 120, 720, 5040);
O tipo dos elementos de um array pode ser qualquer um, voc pode ter uma array de objetos, de conjuntos, de qualquer tipo que quiser, at mesmo um array de arrays.
TTempMes = array [1..31] of TTempDia; TBtnList = array [1..10] of TButton;
Sets So conjuntos de dados de um mesmo tipo, sem ordem, como os conjuntos matemticos. Conjuntos podem conter apenas valores ordinais, o menor que um elemento pode assumir zero e o maior, 255.
TBorderIcons = set of TBorderIcon; BorderIcons := [biSystemMenu, biMinimize]; if MesAtual in [Jul, Jan, Fev] then ShowMessage('Frias'); Caderno Didtico Lazarus IDE Pgina 20
21
3. Relacionais: a tabela a seguir contm os operadores relacionais que retornam dois valores booleanos (true e false): Operador = <> < > <= >= NOT AND OR Operao Igual No Igual Menor que Maior que Menor ou igual Maior ou igual Negao E lgico OU lgico
Comandos de DECISO
IF ... THEN ... ELSE ... (SE ... ENTO ... SENO) O formato bsico da instruo IF ... THEN mostrado abaixo:
if <expresso lgica> then <instruo>;
Esta sintaxe bsica pode ser incrementada pela adio da clusula ELSE:
if <expresso lgica> then <instruo> // no vai ponto-e-vrgula else <instruo>;
Pgina 21
22
Para utilizar instrues compostas, a sintaxe bsica deve ser incrementada pelos comandos de bloco de cdigo:
if <expresso lgica> then begin <instruo 1>; <instruo 2>; <instruo 3>; end // no vai ponto-e-vrgula else begin <instruo 1>; <instruo 2>; <instruo 3>; end;
Obs.: No existe ponto-e-vrgula aps o END que aparece antes do ELSE; CASE ... OF (ESCOLHA ... DE) A instruo IF ... THEN ... ELSE mostrada anteriormente funciona bem para uma pouca quantidade de opes, mas torna-se invivel se voc tiver muitas mais. Nesta situao, a construo CASE mais fcil para se escrever. A sintaxe geral para a instruo CASE :
case <varivel> of <valor 1> : <instruo 1>; <valor 2> : <instruo 2>; <valor n> : <instruo n>; else <instruo>; end;
A instruo CASE toma uma varivel e a compara com os valores possveis. Mltiplos valores podem aparecer sob o mesmo caso, separados por vrgulas. Observe:
case x of 'A' .. 'Z', 'a' .. 'z' : ShowMessage('Letra'); '0' .. '9' : ShowMessage('Nmero'); '+', '-', '*', '/' : ShowMessage('Operador'); else ShowMessage('Caractere Especial'); end;
Comandos de LOOPING
WHILE ... DO (ENQUANTO ... FAA) O Loop while executa instrues at que a condio do loop torne-se falsa. Observe sua sintaxe:
while <expresso lgica> do <instruo>;
Pgina 22
23
Como nas outras estruturas, aqui voc tambm pode ter uma instruo simples ou composta aps o DO, basta para isso utilizar o par BEGIN END. Observe:
i:=10; while i > 0 do begin i:=i-1; ShowMessage(Passando pelo loop + IntToStr(i)); end;
FOR ... DO (DE ... FAA) O Loop FOR difere do while por executar uma quantidade especfica de vezes a ao, determinada pela varivel de controle, sua sintaxe bsica :
For <varivel de controle> := <valor inicial> to <valor final> do <instruo>;
Usando a clusula DOWNTO ao invs de TO, a varivel de controle sofre um decremento de valor. Observe os exemplos:
For i:=10 to 100 do ShowMessage(IntToStr(i)); For i:=100 downto 10 do ShowMessage(IntToStr(i));
REPEAT ... UNTIL (REPITA ... AT QUE) A terceira construo de loop o REPEAT ... UNTIL, ele executa todas as instrues dentro do loop at que a expresso lgica torne-se verdadeira (o contrrio do WHILE). Observe a sintaxe geral:
repeat <instruo 1>; <instruo 2>; <instruo n>; until <expresso lgica>;
Note que essa construo pode conter diversas instrues e no requer o par BEGIN .. END. Observe o exemplo:
j:=0; repeat j:=j+1; ShowMessage(Looping); until j>= 10;
BREAK e CONTINUE (PARE e CONTINUE) So palavras reservadas que podem ser usadas em qualquer um dos laos de repetio. Observe o exemplo:
while true do begin readln(inputFile,i); if strtoint(i) = 5 then break; ShowMessage(i); end; Caderno Didtico Lazarus IDE Pgina 23
24
Neste exemplo, o loop executado eternamente (uma vez eu true sempre true). O loop continuar a ler a entrada de dados de um arquivo e exibir um caixa de mensagem at que seja lido o nmero 5, pois o comando BREAK interrompera o lao. O outro modificador de execuo do loop a instruo CONTINUE. Ela ignorar o restante do loop e voltar a avaliar a condio. Assim, se algo for alterado que altere a condio, voc pode utilizar CONTINUE para pular para o topo do loop e avaliar novamente a condio. Observe:
while i<10 do begin readln(inputFile,i); if strtoint(i) < 5 then continue; ShowMessage(Este nmero ser maior que 5: + i); end;
Neste caso, CONTINUE impedir que qualquer nmero menor que 5 seja impresso. Este comando til para ser usado com entradas invlidas dentro de um loop.
Procedimentos e Funes
Procedimentos e funes so blocos bsicos de programas Object Pascal. Para tornar o programa mais fcil de lidar, melhor quebrar a funcionalidade em blocos ao invs de enormes programas monolticos, onde o cdigo reside no arquivo de programa principal. PROCEDURE Procedures so as sub-rotinas mais comuns em Object Pascal, para criar mdulos deste tipo, observe a sintaxe:
procedure NomeDaProcedure(<parmetro 1> : <tipo 1>; <parmetro n> : <tipo 2>); const <nome da constante> = <valor literal>; var <nome da varivel> : <tipo>; begin <instruo 1> <instruo n> end;
Pgina 24
25
Neste exemplo, uma caixa de mensagem com n asteriscos ser exibida. A quantidade de asteriscos passada como parmetro quando a procedure chamada, sendo assim para exibir 20 asteriscos faz-se a seguinte chamada:
MostraEstrelas(20);
FUNCTION Funes so basicamente o mesmo que procedimentos, porm com uma grande diferena: a funo retorna um valor de algum tipo. Para tanto, ao declarar uma funo, declara-se tambm qual o tipo de valor que ela retorna. A sintaxe bsica de uma funo a seguinte:
function NomeDaFuncao(<param. 1> : <tipo>; <param. n> : <tipo>): <tipo retorno>; const <nome da constante> = <valor literal>; var <nome da varivel> : <tipo>; begin <instruo 1> <instruo n> end;
O valor de retorno de uma funo pode ser especificado de duas formas: fazendo a atribuio diretamente ao nome da funo:
function Cubo(base : integer): integer; begin Cubo:=base*base*base; end;
Ou usando a palavra reservada RESULT dentro da funo para receber o resultado de retorno:
function Quadrado(base : integer): integer; begin Result:=base*base; end;
Quando a funo chamada, o valor de retorno deve ser atribudo a uma varivel de mesmo tipo:
x:=Cubo(2); // x ser igual a 8 y:=Quadrado(3); // y ser igual a 9 Caderno Didtico Lazarus IDE Pgina 25
26
Pgina 26
27
TrimRight(texto) Remove os espaos em branco direita do texto passado como parmetro Ex.: y:=Trim( FRED. WESTPHALEN ); // y:= FRED. WESTPHALEN
Tratamento de Ordinais
Dec(ordinal, quantidade) Decrementa um valor ordinal em uma quantidade determinada de unidades; Ex.: x:=10; Dec(x); // x = 9 Dec(x,6); // x = 4 Inc(ordinal, quantidade) Incrementa um valor ordinal em uma quantidade determinada de unidades; Ex.: x:=10; Inc(x); // x = 11 Inc(x,6); // x = 14 Odd(ordinal) Testa se o ordinal passado como parmetro impar (neste caso retorna true), ou se par (retornando false). Ex.: z:=Odd(10); // z = false z:=Odd(5); // z = true; Pred(ordinal) Retorna o predecessor do ordinal; Ex.: x:=Pred(b); // x = a; Succ(ordinal) Retorna o sucessor do ordinal; Ex.: x:=Succ(b); // x = c; Ord(ordinal) Retorna a ordem do valor ordinal na faixa de valores do tipo a qual ele faz parte; Ex.: x:=Ord(A); // x = 65 (valor de A na tab. ASCII); z:=Odd(5); // x =5 Low(ordinal) Valor mais baixo da faixa de valores do tipo a qual o ordinal faz parte; Ex.: x:=10; // inteiro; x:=Low(x); // x = -2147483648 High(ordinal) Valor mais alto da faixa de valores do tipo a qual o ordinal faz parte; Ex.: x:=10; // inteiro; x:=Low(x); // x = 2147483647
28
... tera-feira
DecodeDate(DateTime, ano, ms, dia) Decodifica um valor TDateTime em trs variveis word ... dia, ms e ano. Ex.: DecodeDate(now,a,m,d); // a = 2001 // m = 03 // d = 12 DecodeTime(DateTime, hora, minutos, segundos, milissegundos) Decodifica um valor TDateTime em quatro variveis word ... hora, minutos, segundos, milissegundos. Ex.: DecodeTime(now,h,m,s,ms); // h = 09 // m = 45 // s = 57 // ms = 23 EncodeDate(ano, ms, dia) Retorna uma data a partir de trs variveis word ... dia, ms e ano. Ex.: x:=EncodeDate(a,m,d); // x = 13/03/2001 EncodeTime(hora, minutos, segundos, milissegundos) Retorna o valor do horrio a partir de quatro variveis word ... hora, minutos, segundos, milissegundos. Ex.: x:=EncodeTime(h,m,s,ms); // x = 09:45:57
As clulas com fundo preto representam converses inexistentes. As converses diretas, como Integer para Byte levam em considerao que o tamanho do dado da origem no maior que o mximo suportado pelo dado de destino.
Chr(var_byte) Converte uma varivel Byte em Char. utilizada para saber o caractere ASCII de um valor. Ex.: x:=Chr(65); // x = A StrToInt(var_string) Converte uma varivel String em Integer. Ex.: x:=StrToInt(10); // x
= 10
Pgina 28
29
Universidade Federal de Santa Maria StrToIntDef(var_string, valor_padro) Converte uma varivel String em Integer e em caso de erro atribui o valor padro (inteiro) Ex.: x:=StrToIntDef(abc,0); // x = 0 x:=StrToIntDef(112,0); // x = 112 IntToHex(var_integer, num_casas) Converte uma varivel Integer em um valor String Hexadecimal Ex.: x:= IntToHex(1100,5) // x = 0044C Round(var_real) Arredonda um nmero real em um Integer. Ex.: x:= Round(50.8) // x = 51 x:= Round(50.5) // x = 50
Trunc(var_real) Trunca um nmero real em um Integer, pega a parte inteira do valor real. Ex.: x:= Trunc(50.8) // x = 50 x:= Trunc(50.5) // x = 50 StrToFloat(var_string) Converte uma varivel String em Real. Ex.: x:=StrToInt(10.12); FloatToStr(var_real) Converte uma varivel Real em String. Ex.: x:=IntToStr(10.12);
// x
= 10,12
// x
= 10,12
DateToStr(data) Converte uma varivel do tipo TDateTime em string de data, de acordo com as configuraes regionais do sistema operacional. Ex.: x:=DateToStr(date); // x = 13/03/2001 StrToDate(var_string) Converte uma varivel do tipo string de data em TDateTime. Ex.: x:=StrToDate(13/03/2001); // x = 13/03/2001 TimeToStr(hora) Converte uma varivel do tipo TDateTime em string de hora. Ex.: x:=TimeToStr(time); // x = 09:45:57 StrToTime(var_string) Converte uma varivel do tipo string de hora em TDateTime. Ex.: x:=StrToTime(09:45:57); // x = 09:45:57 DateTimeToStr(hora) Converte uma varivel do tipo TDateTime em string de data e hora. Ex.: x:=DateTimeToStr(time); // x = 13/03/2001 09:45:57 StrToDateTime(var_string) Converte uma varivel do tipo string de data e hora em TDateTime. Ex.: x:=StrToDateTime(13/03/2001 09:45:57); // x
= 13/03/2001 09:45:57
Val(texto, variavel_destino, var_erro) Converte uma string passada como parmetro em um valor numrico. Caso o contedo da string no seja numrico, a varivel de erro estar armazenando um nmero diferente de zero. Ex.: Val(teste, x, erro); // x = 0 erro = 1 Val(100, x, erro); // x = 100 erro = 0 Str(valor, variavel_destino) Comando que converte um valor numrico em string e armazena o resultado em uma varivel destino. Ex.: Str(950.25:3:2,x); // x = 950.25 Caderno Didtico Lazarus IDE Pgina 29
30
Strings de Formato
Algumas funes permitem criar mscaras de sada a partir de alguns cdigos, alguns exemplos:
Format(texto_p_formatar,[argumentos]) Formata uma string com uma srie de argumentos de vrios tipos: d Nmero Decimal (inteiros); f Nmero Fixado m Formato Dinheiro (money) x Hexadecimal Ex.: Format('O numero %d a parte inteira do nmero %f.', [10,10.5]); Resultado: O numero 10 a parte inteira do nmero 10,50. Format('Este texto %s foi formatado %s usando o caractere #%d.',[#13,#13,13]); Resultado: Este texto foi formatado usando o caractere #13 Format('O preo do livro %s %m.',['Como programar em Pascal',50.7]); Resultado: O preo do livro Como Programar em Pascal R$ 50,70 Format('O numero %d equivale ao valor %x em hexadecimal',[10,10]); Resultado: O nmero 10 eqivale ao valor A em hexadecimal FormatFloat(texto_p_formatar,[argumentos]) Converte um nmero real em string, utilizando uma string de formato com as seguintes especificaes: 0 Dgitos obrigatrios # Dgitos opcionais . Ponto flutuante , Separador de milhar E Notao Cientfica e Nmero Cientfico g Nmero Geral s String (existem outros menos utilizados)
// x = 1.210,25
Observe mais algumas mscaras e seus respectivos resultados Format string 0 0.00 #.## #,##0.00 #,##0.00;(#,##0.00) #,##0.00;;Zero 0.000E+00 #.###E-0 1234 1234 1234 1234,00 1234 1.234,00 1.234,00 1.234,00 1,234E+03 1,234E3 -1234 -1234 -1234 -1234,00 -1234 -1.234,00 (1.234,00) -1.234,00 -1,234E+03 -1,234E3 0.5 0.5 1 0,50 ,5 0,50 0,50 0,50 5,000E-01 5E-1 0 0 0 0,00 0,00 0,00 Zero 0,000E+00 0E0
Pgina 30
31
Outras Funes
As bibliotecas do Lazarus e Free Pascal implementam ainda diversas outras funes veja mais alguns exemplos teis:
Int(var_real) Retorna a parte inteira do argumento real e devolve o valor como real tambm Ex.: x:= Int(50.8) // x = 50,0 x:= Int(50.5) // x = 50,0 Frac(var_real) Retorna a parte fracionria do argumento real e devolve o valor como real tambm Ex.: x:= Frac(14.56) // x = 0,56 Abs(numero) Fornece o valor absoluto do argumento numrico. O resultado pode ser inteiro ou real. Ex.: x:=Abs(-4.21); // x = 4,21 Pi Fornece o valor do , com 14 casas decimais. Ex.: x:=Pi; // x = 3,14159265358979 Sqr(numero) Eleva o valor passado como parmetro ao quadrado e retorna um valor real. Ex.: x:=Sqr(5); // x = 25 Sqrt(numero) Fornece a raiz quadrada do valor passado como parmetro e retorna um valor real. Ex.: x:=Sqrt(9); // x = 3 ExtractFileName(caminho) Extrai o nome do arquivo da string passada como parmetro. Ex.: x:=ExtractFileName(c:\temp\cafw.exe); ExtractFilePath(caminho) Extrai o caminho do arquivo da string passada como parmetro. Ex.: x:=ExtractFilePath(c:\temp\cafw.exe); ExtractFileDrive(caminho) Extrai o drive do caminho da string passada como parmetro. Ex.: x:=ExtractFilePath(c:\temp\cafw.exe); ExtractFileExt(caminho) Extrai a extenso do arquivo da string passada como parmetro. Ex.: x:=ExtractFilePath(c:\temp\cafw.exe); FileExists (caminho) Testa se o arquivo especificado no caminho existe. Ex.: x:=FileExists(c:\command.com);
// x
= cafw.exe
// x
= c:\temp\
// x
= c:\
// x
= .exe
// x
= true
Random Retorna um nmero (pseudo)-randmico. A sequncia de valores randmicos sempre ser a mesma. Randomize utilizado antes do comando Random, para forar o uso do relgio e da sim gerar nmero randmicos em ordem que no se repete. Sleep(tempo) Efetua uma pausa nas operaes. O tempo de durao da pausa determinado pelo parmetro tempo. Os valores informados para a pausa so em milissegundos. Beep Procedimento que emite o som padro do sistema operacional definido no painel de controle. Caderno Didtico Lazarus IDE Pgina 31
32
Tipos de Propriedade
Tipo String Button1.Caption := 'Fechar'; Label1.Caption := Edit1.Text + '/' + Edit2.Text; Tipo Numrico Button2.Height := Button2.Height * 2; Width := Button1.Width + Button2.Width + 12; Tipo Enumerado BorderStyle := bsDialog; Panel1.Color := clWindow; Propriedades Aninhadas de Classe Memo1.Lines.Text := 'E agora, Jos?'; Label1.Font.Color := clBlue; Propriedades Aninhadas de Conjunto BorderIcons := [biSystemMenu, biMaximize]; Label1.Font.Style := [fsBold, fsItalic];
Propriedades Comuns
Propriedade Align Canvas Caption Color ComponentCount Components Enabled Font Height HelpContext Hint Left Name PopupMenu ShowHint TabOrder TabStop Tag Top Visible Width Descrio Determina o alinhamento do componente Superfcie de desenho, do tipo TCanvas, onde pode se desenhar a imagem do componente Legenda do componente (& indica tecla de atalho para alguns componentes) Cor do componente O nmero de componentes possudos Matriz de componentes possudos Define se o componente est ativo, se pode ser usado Fonte utilizada no componente Altura Nmero utilizado para chamar o Help on-line String utilizada em dicas instantneas Posio esquerda Nome do componente Menu de contexto do componente Define se o Hint ser mostrado A ordem de tabulao do componente, usada quando o usurio tecla TAB Indica se o componente ser selecionado quando o usurio teclar TAB Propriedade no utilizada pelo Lazarus, que pode ser usada como propriedade personalizada Posio superior Define se o componente est visvel Largura
Pgina 32
33
Eventos
Os Eventos acontecem em resposta a uma ao do usurio ou do prprio sistema, ao programar um mtodo de evento, deve-se considerar que o cdigo s ser executado quando o evento acontecer. Uma das tarefas mais importantes na programao baseada em eventos determinar quais eventos sero usados e qual a ordem desses eventos, por exemplo, quando o usurio clicar em um boto, qual evento acontecer primeiro, OnEnter, OnMouseDown ou OnClick? Os cdigos dos eventos podem ser compartilhados entre componentes, dessa Forma, voc pode ter um boto na barra de ferramentas que faz a mesma coisa que uma opo de menu. Para isso, basta escolher o evento na lista em vez de clicar duas vezes no Object Inspector. permitido mudar os mtodos de evento atravs de cdigo, uma vez que os eventos tambm so propriedades e podem ser usados como tal. Pode-se atribuir um evento de outro componente ou diretamente o nome do mtodo:
Button1.OnClick := Edit1.OnExit; Button2.OnClick := Edit2Click;
Eventos Comuns
Evento OnChange OnClick OnDblClick OnEnter OnExit OnKeyDown OnKeyPress OnKeyUp Descrio O contedo do componente alterado O componente acionado Duplo-clique no componente O componente recebe o foco O componente perde o foco Tecla pressionada Uma tecla pressionada e solta Tecla solta
Mtodos
Os mtodos realizam aes definidas pelo componente, veja os exemplos abaixo e atente para os parmetros passados. Note que podemos chamar os mtodos de evento como qualquer outro mtodo e que os mtodos de evento pertencem ao Form, no aos componentes.
Edit1.Clear; Form2.Show; Close; ScaleBy(110, 100); Button1.ScrollBy(10, 10); Button1.OnClick(Sender); Button1Click(Self); Form2.Button1Click(Sender);
Mtodos Comuns
Mtodo Create Free Show Hide SetFocus Focused BringToFront SendToBack ScrollBy SetBounds Descrio Cria um novo Objeto de uma Classe Destri um Objeto e libera a memria ocupada por ele Torna o componente visvel Torna o componente invisvel Coloca o foco no componente Determina se o componente tem o foco Coloca o componente na frente dos outros Coloca o componente atrs dos outros Move o componente Muda a posio e o tamanho do componente
Pgina 33
34
Componentes Padro
TButton Boto padro para executar aes.
Propriedade Cancel Default ModalResult Mtodo Click Descrio Dispara o evento OnClick do boto quando a tecla ESC pressionada em qualquer controle Dispara o evento OnClick do boto quando a tecla ENTER pressionada em qualquer controle Associa o boto a opo de fechamento de um Form modal Descrio Ativa o evento OnClick do boto
Pgina 34
35
TMemo Permite entrada de dados texto em mltiplas linhas. Contm propriedades e mtodos do TEdit.
Propriedade Lines WantReturns WantTabs ScrollBar Descrio Propriedade do tipo TStrings que armazena as linhas de texto do componente Define se a tecla ENTER ser tratada como quebra de linha Define se a tecla TAB ser tratada como espao de tabulao Define as barras de rolagem
TMaskEdit Permite entrada de dados texto em uma linha, utilizando uma mscara de edio. Possui todas as propriedades do componente TEdit.
Propriedade EditMask Descrio Mscara de edio
Pgina 35
36
Mscaras Uma mscara composta por trs partes, a primeira parte a mscara propriamente dita, a segunda parte indica se os caracteres literais sero salvos e a terceira parte indica qual o caractere utilizado para representar os espaos a serem digitados no texto. Estes so os caracteres especiais que podem compor a mscara de edio:
Caractere ! > < \ L L A A 9 0 C C # : / Descrio Espaos em branco no sero considerados no texto Todos os caracteres seguintes sero maisculos at que aparea o caractere < Todos os caracteres seguintes sero minsculos at que aparea o caractere > Indica um caractere literal Somente caractere alfabtico Obrigatoriamente um caractere alfabtico Somente caractere alfanumrico Obrigatoriamente caractere alfanumrico Somente caractere numrico Obrigatoriamente caractere numrico Permite um caractere Obrigatoriamente um caractere Permite um caractere numrico ou sinal de mais ou de menos, mas no os requer. Separador de horas, minutos e segundos Separador de dias, meses e anos
Alguns exemplos de mscaras: !90/90/00;1;_ !90:00;1;_ !\(999\)\ 000-0000;1;_ 00000\-999;1;_ Mscara de data. Ex.: 10/10/1981 Mscara de hora. Ex.: 12:00 Mscara de Telefone. Ex.: (055) 332-7100 Cep - Brasil
TStrings Muitos componentes, como o TMemo, possuem propriedades do tipo TStrings, essa classe permite armazenar e manipular uma lista de Strings. Toda propriedade do tipo TStrings permite acesso indexado aos itens da lista.
Propriedade Count Text Mtodo Add Insert Move Delete Clear IndexOf LoadFromFile SaveToFile Descrio Nmero de strings Contedo do memo na Forma de uma nica string Descrio Adiciona uma nova string no final da lista Insere uma nova string numa posio especificada Move uma string de um lugar para outro Apaga uma string Apaga toda a lista Retorna o ndice do item e - 1 caso no encontre Carrega texto de um arquivo Salva texto para um arquivo
Pgina 36
37
TRadioButton Usado em grupo, pode ser utilizado para obter informaes lgicas mutuamente exclusivas, mas recomendado usar o RadioGroup em vez de RadioButtons. TRadioGroup Componente que agrupa e controla RadioButtons automaticamente.
Propriedade Columns Items ItemIndex Descrio Nmero de colunas de RadioButtons Lista de strings com os itens do RadioGroup, cada item da lista representa um RadioButton Item selecionado, iniciando em 0
TScrollBox Container com barras de rolagem automticas. TGroupBox Componente container com um ttulo e borda 3D. TBevel Moldura ou linha com aparncia 3D.
Propriedade Shape Style Descrio Tipo de moldura a ser desenhada Define alto ou baixo relevo para a linha
Pgina 37
38
TPicture Classe usada para guardar cones, bitmaps, fotos e figuras definidas pelo usurio.
Mtodo LoadFromFile SaveToFile Descrio Carrega figura de um arquivo Salva figura para um arquivo
TPageControl Usado para criar controles com mltiplas pginas, que podem ser manipuladas, em tempo de projeto, atravs do menu de contexto. Cada pgina criada um objeto do tipo TTabSheet.
Propriedade ActivePage Evento OnChange OnChanging Mtodo FindNextPage SelectNextPage Descrio Pgina ativa Descrio Aps uma mudana de pgina Permite a validao de uma mudana de pgina Descrio Retorna a prxima pgina Seleciona a prxima pgina
Pgina 38
39
Pgina 39
40
Caixas de Dilogo
Grupo de caixas de dilogo comuns da maioria dos aplicativos.
Mtodo Execute Descrio Mostra a caixa de dilogo e retorna True caso o usurio clique em Ok
Menus
No Lazarus os menus sero desenhados no Menu Editor, que pode ser acessado com um duplo clique sobre o componente de menu. TMainMenu Menu principal de um Form.
Propriedade Items Descrio Itens de menu, essa propriedade guarda todas as alteraes feitas no Menu Designer
TPopUpMenu Menu de contexto de um componente. Cada componente tem uma propriedade PopUpMenu, que indica seu menu de contexto. TMenuItem Item de menu.
Propriedade Checked GroupIndex RadioGroup ShortCut Descrio Indica se o item est marcado ou no ndice do grupo do item, semelhante ao SpeedButton Indica se o item pode ser mutuamente exclusivo com outros itens do mesmo grupo Tecla de atalho do item
Pgina 40
41
Classes No Visuais
TApplication Todo programa tem um objeto global nomeado Application, do tipo TApplication, esse objeto representa a aplicao para o sistema operacional.
Propriedade ExeName MainForm Hint Title HelpFile Evento OnHint OnException OnHelp Mtodo MessageBox Run Terminate Descrio Caminho e nome do arquivo executvel Form principal da aplicao Hint recebido pela aplicao Ttulo da aplicao Caminho e nome do arquivo help Descrio Quando um hint recebido pela aplicao Quando ocorre uma exceo Quando acontece uma solicitao de help Descrio Apresenta um quadro de mensagem Executa a aplicao Finaliza a aplicao normalmente
Quadros de Mensagem O mtodo Application.MessageBox mostra quadros de mensagem com chamadas a funes da API do sistema operacional. Os flags de mensagem mais usados e os valores de retorno desse mtodo so mostrados abaixo (deve-se utilizar na clusula USES a biblioteca LCLType).
Application.MessageBox('Texto','Ttulo',Flags):integer;
Flag MB_OK MB_OKCANCEL MB_ABORTRETRYIGNORE MB_YESNOCANCEL MB_YESNO MB_RETRYCANCEL MB_ICONERROR MB_ICONQUESTION MB_ICONEXCLAMATION MB_ICONINFORMATION Valor de Retorno IDOK IDCANCEL IDABORT IDRETRY IDYES IDIGNORE IDNO Valor 0 1 2 3 4 5 16 32 48 64 1 2 3 4 6 5 7 Item Mostrado Boto de Ok Botes de Ok e Cancelar Botes de Anular, Repetir e Ignorar Botes de Sim, No e Cancelar Botes de Sim e No Botes de Repetir e Cancelar cone de erro cone de pergunta cone com ponto de exclamao cone com letra i, usada para mostrar informaes Boto Escolhido Ok Cancelar Anular Repetir Sim Ignorar No
Esses quadros so usados quando se deseja uma resposta simples do usurio, principalmente numa confirmao ou pergunta para o usurio, observe o cdigo abaixo:
if Application.MessageBox('Deseja MB_YESNO) = IDNO then Close; Salvar?', 'Confirme', MB_ICONQUESTION +
Pgina 41
42
Alm do mtodo MessageBox da classe Application, existem ainda outras funes utilitrias para construo rpida de janelas de aviso. Abaixo esto descritos alguns e suas caractersticas: MessageDlg A funo MessageDlg implementa basicamente a mesma funcionalidade do Mtodo MessageBox, porm permite que sejam colocados mais que trs botes. Compe-se de 4 parmetros: a mensagem que ser mostrada, o tipo de bitmap usado para ilustrar o dilogo, os botes que sero utilizados e o ndice de help que a janela dever chamar caso seja solicitada, em caso de no uso, deve-se colocar zero.
MessageDlg(Mensagem,Tipo,Botoes,Indice_Help):integer;
Tipo mtWarning mtError mtInformation mtConfirmation MtCustom Botes mbYes mbNo mbCancel mbHelp mbAbort mbRetry mbIgnore mbAll Retorno mrNone mrYes mrNo mrCancel mrHelp mrAbort mrRetry mrIgnore mrAll
Descrio Ponto de exclamao amarelo Um sinal de pare vermelho Um i azul Um ponto de interrogao azul Sem bitmap Descrio Sim No Cancelar Ajuda Anular Repetir Ignorar Todos Descrio Nenhum Sim No Cancelar Ajuda Anular Repetir Ignorar Todos
Pgina 42
43
MessageDlgPos semelhante funo MessageDlg, porm permite escolher a posio onde ser mostrado o quadro de mensagem
MessageDlg(Mensagem,Tipo,Botoes,Indice_Help,X,Y):integer;
A diferena que ela implementa dois parmetros: X e Y que representam as coordenadas do canto superior esquerdo do quadro da mensagem (em pixels, referentes tela).
if MessageDlgPos('O arquivo j est em uso. Finalizar?', mtError, [mbYes,mbNo],0,120,150) = mrYes then Table1.Close;
ShowMessage A funo ShowMessage simplesmente mostra um quadro de mensagem contendo apenas a mensagem passada como parmetro e o boto de Ok.
ShowMessage(Mensagem); ShowMessage('Agora so ' + TimeToStr(time));
Pgina 43
44
InputBox A funo InputBox permite ao usurio informar valores, uma funo de entrada de dados. Compe-se de trs parmetros: ttulo, pergunta e valor default. Observe:
InputBox(Ttulo,Pergunta,ValorPadro):string InputBox('Senha','Digite a Senha de Acesso','');
TScreen O Lazarus automaticamente cria a varivel Screen do tipo TScreen, essa varivel guarda caractersticas do vdeo, como mostrado abaixo.
Propriedade ActiveForm FormCount Cursor Forms Fonts PixelsPerInch Height Width Descrio Form com o foco Nmero de Forms no vdeo Cursor do mouse Lista dos Forms disponveis Lista de Fontes de tela disponveis Nmero de pixels por polegada da Fonte usada pelo sistema Altura da tela em pixels Largura da tela em pixels
TList Estrutura de dados polimrfica que pode gerenciar uma lista de objetos de qualquer classe e possui mtodos semelhantes aos de TStrings. TStringList Lista de strings descendente de TStrings usada para manter listas de strings independentes de qualquer componente. TCanvas Um objeto da classe TCanvas uma superfcie de desenho, onde podem ser usados vrios mtodos de plotagem grfica. Todos os controles visveis possuem uma propriedade Canvas, do tipo TCanvas, que geralmente usada nos Forms e no objeto Printer.
Propriedade Brush Pen Font Mtodo TextOut Ellipse Polygon Rectangle Descrio Padro de preenchimento, propriedade do tipo Tbrush Estilo de linha, propriedade do tipo Tpen Fonte usada nas plotagens de texto Descrio Desenha texto na superfcie Desenha uma elipse Desenha um polgono Desenha um retngulo
Pgina 44
45
Excees
O tratamento de excees um mecanismo capaz de dar robustez a uma aplicao, permitindo que os erros sejam manipulados de uma maneira consistente e fazendo com que a aplicao possa se recuperar de erros, se possvel, ou finalizar a execuo quando necessrio, sem perda de dados ou recursos. Para que uma aplicao seja segura, seu cdigo necessita reconhecer uma exceo quando esta ocorrer e responder adequadamente a essa exceo. Se no houver tratamento para uma exceo, ser exibida uma mensagem padro descrevendo o erro e todos os processamentos pendentes no sero executados. Uma exceo deve ser respondida sempre que houver perigo de perda de dados ou de recursos do sistema. Basicamente o conceito de excees de classes definidas pelo Object Pascal para o tratamento de erros. Quando uma exceo criada, todos os procedimentos pendentes so cancelados e, geralmente mostrada uma mensagem de erro para o usurio. As mensagens padro nem sempre so claras, por isso indicado criar seus prprios blocos protegidos.
Blocos Protegidos
Um bloco protegido um grupo de comandos com uma seo de tratamento de excees.
try A := StrToFloat(EdtA.Text); B := StrToFloat(EdtB.Text); ShowMessage(Format('%f / %f = %f', [A, B, A + B])); except ShowMessage('Nmeros invlidos.'); end;
Algumas vezes pode-se precisar especificar quais excees quer tratar, como mostrado abaixo.
try Soma := StrToFloat(EdtSoma.Text); NumAlunos := StrToInt(EdtNum.Text); ShowMessage(Format('Mdia igual a %f.', [Soma / NumAlunos])); except on EConvertError do ShowMessage('Valor invlido para soma ou nmero de alunos.'); on EZeroDivide do ShowMessage('O nmero de alunos tem que ser maior que zero.'); else ShowMessage('Erro na operao, verifique os valores digitados.'); end;
Pgina 45
46
Principais Excees
O Lazarus define muitas excees, para cada erro existe uma exceo correspondente.
Classe Exception EAbort EAccessViolation EConvertError EDivByZero EInOutError EIntOverFlow EInvalidCast EInvalidOp EOutOfMemory EOverflow ERangeError EUnderflow EVariantError EZeroDivide Descrio Exceo genrica, usada apenas como ancestral de todas as outras excees Exceo silenciosa, pode ser gerada pelo procedimento Abort e no mostra nenhuma mensagem Acesso invlido memria, geralmente ocorre com objetos no inicializados Erro de converso de tipos Diviso de inteiro por zero Erro de Entrada ou Sada reportado pelo sistema operacional Resultado de um clculo inteiro excedeu o limite TypeCast invlido com o operador as Operao invlida com nmero de ponto flutuante Memria insuficiente Resultado de um clculo com nmero real excedeu o limite Valor excede o limite do tipo inteiro ao qual foi atribuda Resultado de um clculo com nmero real menor que a faixa vlida Erro em operao com variant Diviso de real por zero
Blocos de Finalizao
Blocos de finalizao so executados sempre, haja ou no uma exceo. Geralmente os blocos de finalizao so usados para liberar recursos.
FrmSobre := TFrmSobre.Create(Application); try FrmSobre.Img.LoadFromFile('Lazarus.png'); FrmSobre.ShowModal; finally FrmSobre.Release; end;
47
Gerao de Excees
Uma exceo pode ser provocada usando a clusula raise.
raise Exception.Create('Erro ao alterar registro.');
Para que uma exceo continue ativa, mesmo depois de tratada, deve-se utilizar a clusula raise dentro do bloco de tratamento da exceo. Geralmente isso feito com excees aninhadas.
try SQLQuery1.Edit; SQLQuery1.FieldByName('contador').asInteger := StrToInt(Edit1.Text); SQLQuery1.Post; except ShowMessage('Erro ao alterar contador.'); raise; end;
Pgina 47
48
SQLConnection
SQLTransaction
DataSource
SQLQuery
TSQLConnection (PQConnection, OracleConnection, MySQL50Connection, IBConnection, ODBCConnection, SQLite3Connection, etc.) Componentes derivados da classe TSQLConnection representam a conexo com o banco de dados. O componente SQLConnection no existe como um componente que pode ser utilizados, deve-se portanto utilizar um componente que oferea as capacidades especficas de conexo com o banco de
Caderno Didtico Lazarus IDE Pgina 48
49
dados que se est utilizando. Em uma aplicao comercial, a eventual troca do fornecedor de banco de dados pode ser facilmente atendida atravs da alterao deste componente. Alguns exemplos de componentes que representam a conexo com um banco de dados so: PQConnection, OracleConnection, MySQL50Connection, IBConnection, ODBCConnection, SQLite3Connection, etc.
Propriedades Connected DatabaseName KeepConnection LoginPrompt UserName Password HostName Port CharSet Transaction Params Mtodos Close CloseDataSets Open Eventos OnLogin Descrio Define se a conexo com o banco de dados est ativa Nome do banco de dados (nome que identifica o banco de dados que se deseja conectar) Define se a conexo com o banco de dados ser mantida, mesmo sem DataSets abertos Define se ser mostrado o quadro de login solicitando a identificao do usurio (login e senha) Identificao do usurio para servidor de banco de dados Senha do usurio Nome ou endereo IP do servidor de banco de dados Nmero da porta de conexo com o servidor de banco de dados Codificao de caracteres utilizada pelo banco de dados Componente do tipo SQLTransaction que identifica uma transao no banco de dados Parmetros adicionais que determinados bancos de dados podem exigir Descrio Encerra a conexo com o banco de dados, todos os DataSets sero fechados Fecha todos os DataSets abertos, mas a conexo no encerrada Abre a conexo com o banco de dados Descrio Evento disparado durante o processo de login do banco de dados.
TSQLTransaction SQLTransaction o componente que controla as transaes no banco de dados. Em um banco de dados as operaes ocorrem no contexto de uma transao. Uma transao finalizada com sucesso atravs de um COMMIT. Um comando de ROLLBACK desfaz as operaes realizadas anteriormente.
Propriedades Active Action DataBase Mtodos StartTransaction Commit CommitRetaining Rollback RollbackRetaining Descrio Indica o estado da transao (ativa ou inativa) Define o tipo de transao padro Indica qual conexo essa transao est vinculada Descrio Inicia a transao (os comandos somente sero persistidos aps um commit ou ento todos sero cancelados atravs de um rollback) Encerra a transao persistindo todas as alteraes Persiste todas as alteraes sem encerrar a transao Desfaz as alteraes e encerra a transao Desfaz as alteraes mas no encerra a transao
TDataModule Um DataModule como se fosse um Form invisvel, onde sero inseridos os componentes de acesso a dados, como o SQLConnection, SQLTransaction, SQLQuery e DataSource. Uma vez que os DataModules so classes eles permitem a fcil implementao de modelos de objetos, permitindo herana, criao de mtodos, dentre outros aspectos. Para inserir um DataModule em um projeto, escolha New... no menu File e escolha a opo Data Module (dentro da opo Module). Os Data Modules no gastam recursos do sistema, servem apenas para agrupar os componentes de acesso a dados e potencializar a organizao do programador.
Pgina 49
50
Exemplo de DataModule
TSQLQuery O componente SQLQuery a principal via de acesso para interao com o banco de dados. atravs dele que utilizamos instrues em linguagem SQL para representar acessos a tabelas e/ou consultas personalizadas no banco de dados. um componente ancestral de uma classe denominada de TDataSet, que contm um conjunto de propriedades e mtodos para representar o estado e as operaes sobre um conjunto de dados.
Propriedades Active AutoCalcFields BOF Database DataSource DeleteSQL Descrio Define se a consulta est aberta ou fechada Indica se os campos calculados devem sofrer atualizao automtica Informa se o cursor est no incio do conjunto de dados Componente TSQLConnection que fornece a conexo para a consulta Define o DataSource para se obter os valores das variveis na consulta. Instruo SQL alternativa para execuo de excluses (delete). Exemplo de utilizao: delete from clientes where codigo = :old_codigo and nome is not null; O prefixo :old_ utilizado para referenciar o valor que est sendo excludo. Informa se o cursor est no final do conjunto de dados Nmero de campos da consulta Lista com a definio dos campos da consulta Lista de objetos do tipo TField, que representam os campos da consulta String com uma condio de filtragem Define se a consulta est filtrada Lista com a definio dos ndices Nome dos campos de ndice, usados para ordenar os registros da consulta Nome do ndice atual, vazia quando o ndice for a chave primria Instruo SQL alternativa para execuo de incluses (insert). Exemplo de utilizao: insert into clientes (codigo, nome) values (:codigo, :nome); Os nomes dos campos na clusula values devem ser exatamente iguais aos nomes dos campos na tabela destino. Campos usados no relacionamento com a tabela mestre Define se o registro atual foi modificado Define se a consulta somente leitura Nmero do registro atual Nmero de registros Instruo SQL normalmente utilizada para acessar o contedo de uma tabela (select * from tabela) ou para fazer consultas personalizadas. Estado do conjunto de dados (edio, insero, inativo, etc). Componente que controla as transaes realizadas por essa consulta Instruo SQL alternativa para execuo de atualizaes (update). Exemplo de utilizao: update clientes set nome = :nome where codigo = :old_codigo and nome is not null; O prefixo :old_ utilizado para referenciar o valor anterior (antes da atualizao).
EOF FieldCount FieldDefs Fields Filter Filtered IndexDefs IndexFieldNames IndexName InsertSQL
Pgina 50
51
Mtodo Append AppendRecord ApplyUpdates Cancel Close Delete DisableControls Edit EnableControls ExecSQL FieldByName First Insert InsertRecord IsEmpty Last Locate Lookup MoveBy Next Open Post Prepare Prior Refresh Evento AfterCancel AfterClose AfterDelete AfterEdit AfterInsert AfterOpen AfterPost AfterScroll BeforeCancel BeforeClose BeforeDelete BeforeEdit BeforeInsert BeforeOpen BeforePost BeforeScroll OnCalcFields OnDeleteError OnEditError OnFilterRecord OnNewRecord OnPostError
Descrio Entra em modo de insero e, ao gravar, o registro ser colocado no fim do conjunto Insere um registro no final do arquivo atravs de cdigo O mtodo ApplyUpdates faz com que as alteraes feitas na cache do conjunto de dados (alteraes apenas em memria) sejam enviadas para o banco de dados. Cancela as alteraes feitas no registro atual Fecha a tabela Exclui o registro corrente Desabilita a atualizao dos controles visuais Permite a alterao dos campos do registro atual Habilita os controles visuais Executa uma instruo, exceto SELECT Acessa um campo, do tipo TField, pelo nome Move para o primeiro registro Entra em modo de insero de um novo registro na posio atual Adiciona um novo registro, j com os dados, na posio atual Define se a tabela est vazia Move para o ltimo registro Procura um registro, usando ou no ndices, de acordo com a disponibilidade Procura um registro e retorna valores dos campos deste Move um nmero especfico de registros Move para o prximo registro Abre a tabela Grava as alteraes no registro atual Prepara uma instruo SQL para ser aberta ou executada Move para o primeiro registro Atualiza a tabela com os dados j gravados Descrio Aps do mtodo Cancel Aps o fechamento da consulta Aps do mtodo Delete Aps do mtodo Edit Aps do mtodo Insert Aps do mtodo Open Aps do mtodo Post Aps mudar de registro Antes do mtodo Cancel Antes do fechamento da consulta Antes do mtodo Delete Antes do mtodo Edit Antes do mtodo Insert Antes do mtodo Open Antes do mtodo Post Antes de mudar o registro Evento usado para calcular os valores dos campos calculados Quando ocorre um erro ao chamar o mtodo Delete Quando ocorre um erro ao chamar o mtodo Edit Evento usado com filtragem varivel Quando a consulta entra em modo de insero (obs.: no deixa Modified igual a True) Quando ocorre um erro ao chamar o mtodo Post
Pgina 51
52
Construindo uma consulta em tempo de projeto Para construir uma consulta SQL em tempo de projeto, utiliza-se a propriedade SQL do componente TSQLQuery. Ao clicar no boto de reticncias, o Lazarus abre a janela do Editing SQL, e nele a consulta digitada normalmente, utilizando os comandos SQL padro do banco de dados a ser utilizado:
Caso a conexo (SQLConnection) ao qual a SQLQuery est conectada estiver ativa possvel testar a consulta e exibir o resultado na aba Results Passagem de Parmetros Geralmente em uma instruo SQL genrica necessrio especificar alguns parmetros, por exemplo: selecionar todos os clientes de uma determinada cidade. Para isto, o nome do parmetro deve ser includo na expresso, precedido pelo smbolo de : (dois pontos).
No primeiro caso o SQL escrito em tempo de execuo passando o valor 1 para o critrio a.id_cidade = como condio filtrante da consulta. J no segundo caso, a maneira como o parmetro :ID_CIDADE foi escrito, permite alter-lo em tempo de execuo:
SQLQuery1.Close; SQLQuery1.Params[0].AsInteger := StrToInt(Edit1.Text); // ou Params.ParamByName('ID_CIDADE').asInteger := StrToInt(Edit1.Text); SQLQuery1.Open;
Pgina 52
53
Construindo uma consulta em tempo de execuo Para construir uma consulta SQL em tempo de execuo a propriedade SQL do componente SQLQuery deve ser manipulado. O mtod ADD parmite adicionar os comandos, um a um:
SQLQuery1.Close; SQLQuery1.SQL.Clear; SQLQuery1.SQL.ADD('select a.id_cliente, a.nome, a.endereco, b.nome as cidade'); SQLQuery1.SQL.ADD('from CLIENTE a, CIDADE b'); SQLQuery1.SQL.ADD('where a.id_cidade = b.id_cidade and a.id_cidade = 1'); SQLQuery1.Open;
Esta consulta faz a mesma coisa que aquela criada em tempo de projeto, porm permite alterar ou criar novas consultas em tempo de execuo, via cdigo. Da mesma forma, para alterar valores de parmetros em tempo de execuo utiliza-se a propriedade Params do componente SQLQuery.
SQLQuery1.Close; SQLQuery1.SQL.Clear; SQLQuery1.SQL.ADD('select * from cidade where id_cidade = :ID_CIDADE'); SQLQuery1. Params.ParamByName('ID_CIDADE').asInteger := StrToInt(Edit1.Text); SQLQuery1.Open;
Executando um Comando SQL Para executar um comando SQL (insert, update, create table ...), necessrio utilizar o mtodo execSQL, diferente do comando select, onde apenas utiliza-se o mtodo open, do componente SQLQuery.
SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add(create table senhas_telefone (sn_rgfunc char(6) not null,); SQLQuery1.SQL.Add(sn_nome varchar(40) not null, sn_ramal char(3),); SQLQuery1.SQL.Add(sn_senha char(5) not null);); SQLQuery1.execSQL;
Neste exemplo uma tabela criada pelo comando CREATE TABLE e no exemplo seguinte so inseridos alguns registros na tabela recm criada, utilizando-se de dados de campos de formulrio (Edits)
SQLQuery1.Close; SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add('insert into senhas_telefone values ( ''' + Edit1.Text + ''', ''' + Edit2.Text + ''', ''' + Edit3.Text + ''', ''' + Edit4.Text + ''')' ); SQLQuery1.execSQL;
Filtros A propriedade Filter, permite filtrar os registros em cache de uma consulta usando uma expresso lgica (abaixo alguns exemplos). Para tornar um filtro ativo, a propriedade Filtered deve ser igual a True.
Data = '20/04/1998' (Data = '20/04/1998') AND (Vendedor = 'Guilherme Augusto da Fonseca') (Nome > 'A') AND (Nome < 'B')
Pgina 53
54
Ao filtrar uma consulta, a propriedade RecordCount do componente SQLQuery mostra o nmero total de registros da consulta, ignorando se a consulta est com o filtro ativado ou no. Alterando Registros Para alterar registros atravs de cdigo, a consulta deve ser colocada em modo de edio e s ento o valor dos campos desejados devem ser alterados e posteriormente gravados (lembrando que as alteraes so feitas nos dados em cache e precisam ser efetivadas no banco de dados atravs do mtodo ApplyUpdates e do encerramento da transao).
SQLQuery1.Edit; SQLQuery2.FieldByName('ID').asInteger := 1; SQLQuery2.FieldByName('DESCRICAO').asString := 'Teste'; SQLQuery2.Post;
Inserindo Registros Para inserir registros em cdigo utiliza-se o mtodo Insert e posteriormente a atribuio de valores aos campos utilizando o mtodo FieldByName. Da mesma forma que a alterao a operao de insero apenas coloca o DataSet da consulta em modo de incluso e realiza alteraes na cache do SQLQuery. Para efetivar as incluses na base de dados o mtodo ApplyUpdates precisa ser executado assim como a transao precisa ser finalizada.
SQLQuery1.Insert; SQLQuery2.FieldByName('ID').asInteger := 10; SQLQuery2.Post;
Localizando Registros O mtodo Locate o mais indicado para fazer pesquisas na cache de dados da consulta, no exemplo abaixo feita uma pesquisa exata.
if not SQLQuery3.Locate('ID_CIDADE', Edit1.Text, []) then ShowMessage('Cidade no encontrada.');
Tambm podem ser feitas pesquisas parciais e/ou sem sensitividade de caso usando o terceiro parmetro, que um conjunto de opes.
SQLQuery3.Locate('NOME', Edit1.Text, [loPartialKey, loCaseInsensitive]);
As pesquisas em mais de um campo tambm so permitidas, neste caso, os nomes dos campos devem ser separados por ponto e vrgula e a funo VarArrayOf (unit variants) deve ser usada para criar um array com os valores que se deseja procurar.
if not SQLQuery3.Locate('Vendedor;Data', VarArrayOf([EdtVendedor.Text, EdtData.Text]), [loCaseInsensitive]) then ShowMessage('O vendedor no realizou nenhuma venda nessa data');
Indexao A indexao usada para ordenar os registros da tabela, para isso deve-se escolher os campos pelos quais se deseja ordenar na propriedade IndexFieldNames, inclusive em cdigo, como mostrado abaixo, todos os campos devem ser indexados e separados por ponto e vrgula.
SQLQuery3.IndexFieldNames := 'ID_CIDADE'; SQLQuery3.IndexFieldNames := 'ID_CIDADE;NOME';
Pgina 54
55
Verificando Alteraes Existem situaes onde necessrio verificar se houveram alteraes na cache de uma consulta, por exemplo, no evento OnClose de um Form de manuteno, pode-se usar a propriedade Modified, como mostrado no exemplo abaixo.
if SQLQuery1.Modified then if Application.MessageBox('Gravar alteraes?', 'Dados Alterados', MB_ICONQUESTION + MB_YESNO) = IDYES then begin SQLQuery1.ApplyUpdates; SQLTransaction1.CommitRetaining; end else SQLQuery1.Cancel;
Percorrendo uma Consulta O cdigo semelhante a este mostrada abaixo pode ser utilizado para percorrer uma consulta do incio ao fim.
SQLQuery1.DisableControls; Total := 0; SQLQuery1.First; while not SQLQuery1.EOF do begin Total := Total + SQLQuery1.FieldByName('IGC_CONTINUO').asFloat; SQLQuery1.Next; end; SQLQuery1.EnableControls;
Mestre/Detalhe Nos relacionamentos de 1 para N, uma tabela pode estar ligada a outra em uma relao Mestre/Detalhe, nesse tipo de relao os registros da tabela de ordem N so filtrados pelo campo de relacionamento com a tabela de ordem 1. Por exemplo, se o relacionamento de Clientes com Cidades for mestre/detalhe, s sero acessados em Clientes, os registros cujo campo Id_Cidade seja igual ao Id_Cidade da tabela de Cidades. Para fazer esse tipo de relacionamento utilizamos a propriedade DataSource do componente SQLQuery que representa os dados da tabela detalhe (o valor da propriedade DataSource ser o componente DataSource que representa a tabela Mestre). Na consulta da tabela detalhe os campos dependentes da tabela mestre devem ser especificados na clusula where com parmetros cujos nomes devem ser exatamente os mesmos contidos na clusula SLQ da SQLQuery da tabela mestre (precedidos do sinal de :). Abaixo uma relao mestre/detalhe que mostra todos os clientes de uma cidade. Na aplicao existem dois componentes SQLQuery, conforme consultas exibidas abaixo:
Pgina 55
56
Marcando Dados Os mtodos para marcar so: GetBookmark - Pega a posio do registro e coloca em uma varivel do tipo TBookmark; GotoBookmark - Leva o apontador para uma varivel do tipo TBookmark; FreeBookmark - Desaloca uma varivel do tipo TBookmark;
procedure DoSomething; var Marca: TBookmark; begin Marca := SQLQuery1.GetBookmark; {Marca a posio} SQLQuery1.DisableControls; {Desabilita o controle de dados} try Table1.First; while not Table1.EOF do begin {Faz alguma coisa} Table1.Next; end; finally SQLQuery1.GotoBookmark(Marca); SQLQuery1.EnableControls; SQLQuery1.FreeBookmark(Marca); {Desaloca a varivel} end; end;
Fields Editor Para criar objetos para os campos de uma consulta clica-se duas vezes no componente TSQLQuery. Na janela seguinte (Edit Fields) clica-se com o boto direito do mouse e escolhe-se Add Fields, na janela Add Fields, escolhe-se os campos que se deseja utilizar e confirma-se no boto Ok. No Fields Editor pode-se remover os campos criados, alterar sua ordem de apresentao e usar suas propriedades e eventos no Object Inspector. Para cada campo criado um objeto de um tipo descendente de TField, como TStringField, TIntegerField, TFloatField. As principais propriedades dos objetos TField esto listadas na tabela abaixo. Se nenhum objeto TField for criado para uma determinada consulta, todos os campos da consulta estaro disponveis, mas caso algum seja criado, somente os campos que estiverem criados estaro disponveis.
Caderno Didtico Lazarus IDE Pgina 56
57
TField A classe TField usada como ancestral para todos as classes dos campos. Geralmente so utilizados objetos de classes descendentes de TField, mas em todos eles pode-se encontrar os itens mostrados abaixo.
Propriedades Alignment AsBoolean AsCurrency AsDateTime AsFloat AsInteger AsString AsVariant Calculated CanModify ConstraintErrorMessage CustomConstraint DataSet DataSize DataType DefaultExpression DisplayLabel DisplayText DisplayWidth FieldKind FieldName FieldNo Index IsIndexField IsNull KeyFields Lookup LookupCache LookupDataSet LookupKeyFields LookupResultField ReadOnly Required Size Text Value Visible Eventos OnChange OnSetText OnGetText OnValidate Mtodo Assign FocusControl Clear Descrio Alinhamento do texto do campo nos controles visuais Valor do campo convertido para Boolean Valor do campo convertido para Currency Valor do campo convertido para DataTime Valor do campo convertido para Double Valor do campo convertido para Integer Valor do campo convertido para string Valor do campo convertido para Variant Indica se o campo calculado em tempo de execuo Indica se um campo pode ser modificado Mensagem de erro se a condio de CustomConstraint no for satisfeita Condio de validao do campo DataSet onde est o campo Tamanho do campo, em Bytes Propriedade do tipo TFieldType, que indica o tipo do campo Expresso com valor Default do campo para novos registros Ttulo a ser exibido para o campo Texto exibido nos controles visuais associados ao campo Nmero de caracteres que deve ser usado para mostrar o campo no controles visuais Propriedade do tipo TFieldKind que indica o tipo do campo, como Calculado ou Lookup Nome do campo na tabela Posio fsica do campo na tabela Posio do campo nos controles visuais Indica se um campo vlido para ser usado como ndice Indica se o campo est vazio Campo chave da tabela no relacionamento com LookupDataSet, usado em campos Lookup Indica se um campo Lookup Define se ser usado cache para campos Lookup DataSet onde est definido o valor do campo Lookup Campo chave do relacionamento em LookupDataSet Valor do campo, que ser mostrado nos controles visuais Define se um campo somente para leitura Define se o campo obrigatrio Tamanho fsico do campo Texto de edio do campo Acesso direto ao valor do campo Define se um campo visvel Descrio Chamado quando o valor do campo mudado Chamado pelos controles visuais para atribuir o texto digitado pelo usurio ao campo Chamado para formatar o texto de exibio do campo Validao do valor atribudo ao campo, caso o valor no seja vlido, gere uma exceo Descrio Atribui um valor de um campo a outro, inclusive nulo Seta o foco para o controle visual ligado ao campo nos Forms Limpa o contedo do campo
Pgina 57
58
Abaixo esto listadas as classes que so manipuladas no tratamento dos campos de uma consulta, so classes descendentes de TField.
TStringField TSmallintField TFloatField TCurrencyField TBooleanField TDateField TBlobField TIntegerField TWordField TAutoIncField TBCDField TDateTimeField TTimeField TBytesField TVarBytesField TGraphicField TMemoField
Em algumas dessas classes podero ser encontradas outras propriedades e mtodos que no esto presentes em TField.
Propriedades MaxValue MinValue DisplayFormat EditFormat Currency DisplayValues Mtodos LoadFromFile SaveToFile Descrio Valor mximo para o campo Valor mnimo para campo Formato de apresentao do campo, como ,0.00 % ou ,0.## Km Formato de edio do campo Define se um campo monetrio Usado com campos Boolean, define o texto para True e False, como Sim;No Descrio Carrega o contedo do campo de um arquivo Salva o contedo do campo para um arquivo
Para acessar os campo de uma tabela, existem vrias abordagens, como mostrado abaixo.. Usando o objeto TField ligado ao campo.
sqlQryDescri.Value := sqlQryVend.Value + ' em ' + sqlQryDta.asString;
Converso de Tipos A converso de tipo de um campo pode ser feita atravs as propriedades tipo As..., como AsString.
SQLQuery1.AsString := EdtData.Text; SQLQuery1.AsInteger := 10; SQLQuery1.AsFloat := StrToFloat(EdtValor.Text);
Validao Para validar os valores de um campo, utiliza-se a propriedade CustomConstraint. Para garantir que a quantidade de um item seja maior que zero, por exemplo, utiliza-se em CustomConstraint Quantidade>0, e em CustomConstraint coloca-se a mensagem para o usurio caso a condio seja falsa. Outra forma, mais flexvel, usando o evento OnValidate, com um cdigo como abaixo, onde gerada uma exceo para cancelar a atribuio do valor ao campo.
Caderno Didtico Lazarus IDE Pgina 58
59
Universidade Federal de Santa Maria if CampoQuantidade.Value <= 0 then raise Exception.Create('Quantidade deve ser maior que zero.');
Formatao Personalizada Para fazer uma formatao personalizada do campo, pode usar os eventos OnGetText e OnSetText. Por exemplo, se existir um campo Estado Civil, e se desejar que quando o valor do campo for C seja mostrado Casado e S: Solteiro, no evento OnGetText utiliza-se um cdigo como o abaixo.
if sqlQryEstado.Value = 'C' then Text := 'Casado' else if sqlQryEstado.Value = 'S' then Text := 'Solteiro';
Como controle visual para o usurio escolher o valor do campo, voc poderia usar o DBComboBox, com Solteiro e Casado na propriedade Items, e no evento OnGetText do campo o cdigo mostrado abaixo.
if Text = 'Casado' then sqlQryEstado.Value := 'C' else if Text := 'Solteiro' then sqlQryEstado.Value = 'S';
Campos Calculados Para criar campos calculados, clica-se com o boto direito do mouse no Fields Editor e escolhe-se New Field, no quadro NewField, digita-se o nome do campo, o nome do objeto ser automaticamente informado, o tipo do campo, seu tamanho e escolhe-se Calculated em Field type. Para colocar um valor nesse campo utiliza-se o evento OnCalcFields do componente TSQLQuery, em nenhuma outra parte os valores desses campos podem ser alterados. O cdigo do evento OnCalcFields deve ser enxuto, pois este chamado vrias vezes durante a edio de um registro e um procedimento pesado pode comprometer a performance do sistema.
procedure TDtmAluno.SQLQueryCalcFields(DataSet: TDataSet); begin if SQLQryFaltas.Value > SQLQryMaxFaltas.Value then SQLQrySituacao.Value := 'Evadido' else if SQLQryNota.Value >= 7 then SQLQrySituacao.Value := 'Aprovado' else SQLQrySituacao.Value := 'Retido' end;
Campos Lookup Para criar um relacionamento, s vezes necessrio criar um campo de descrio, por exemplo, na tabela de clientes guardamos o identificador da cidade, mas gostaramos de exibir o nome da cidade, esses campos so chamados de campos Lookup. Para criar um campo Lookup, siga os passos abaixo, tomando como exemplo o caso da relao entre cidade e cliente.
Pgina 59
60
Abra o Fields Editor do SQLQuery onde o campo ser adicionado, no caso a consulta de Clientes. Clique com o direito e escolha New No quadro New Field, em Field type, escolha Lookup. Em Key Fields escolha o campo da tabela que faz parte do relacionamento (neste caso ID_CIDADE) DataSet a consulta (SQLQuery) onde est a descrio que se deseja buscar (consulta Cidades) Em Lookup Keys, escolha o campo de DataSet que faz parte do relacionamento (ID_CIDADE da consulta Cidades) Finalmente, escolha em Result Fields o campo de DataSet que vai ser mostrado para o usurio (o nome da cidade)
Essas opes correspondem a algumas propriedades do objeto TField gerado, que podem ser alteradas no Object Inspector, KeyFields, LookupDataSet, LookupKeyFields, LookupDataSet e LookupResultField. Quando esses campo so exibidos em um DBGrid, por padro criado um boto de lookup que mostrar os valores da outra tabela uma lista. Para colocar esses campos em um Form, devemos usar o DBLookupComboBox, apenas com as propriedades padro, DataSource e DataField. TDataSource Componente usado para fazer a ligao entre um DataSet (SQLQuery) e os componentes visuais, encontrado na guia Data Access.
Propriedade AutoEdit DataSet Evento OnDataChange OnStateChange OnUpdateData Descrio Define se a consulta entrar em modo de edio assim que o usurio digitar novos valores nos controles DataSet (consulta) ao qual o TDataSource faz referncia Descrio Ocorre quando o DataSet alterado, ao mudar de registro ou mudar os valores dos campos Ocorre quando o estado do DataSet alterado Ocorre antes de uma atualizao
Obtendo o Estado de uma Consulta Manipulando o evento StateChange da DataSource podemos obter o estado de uma consulta em qualquer momento, atualizando-o quando houver alteraes.
procedure TForm1.DataSource1.StateChange(Sender:TObject); var S:String; begin case SQLQuery1.State of dsInactive: S := 'Inactive'; //o data set est fechado dsBrowse: S := 'Browse'; //estado de espera (visualizao/navegao) dsEdit: S := 'Edit'; //o data set est sendo editado dsInsert: S := 'Insert'; //o data set est recebendo um novo registro end; Label1.Caption := S; end; Caderno Didtico Lazarus IDE Pgina 60
61
TDBNavigator O DBNavigator permite que o usurio realize operaes padro de controle de dados. Cada um dos botes do DBNavigator chama um mtodo do componente SQLQuery ao qual est ligado.
First Next Insert Edit Cancel
Prior
Last
Delete
Post
Refresh
TDBGrid Mostra os registros de uma consulta na forma de uma grade ou tabela (cada coluna um campo e cada linha um registro).
Propriedades Columns Options SelectedField SelectedIndex SelectedRows TitleFont FixedColor Eventos OnCellClick OnColEnter OnColExit OnColumnMoved OnEditButtonClick OnTitleClick Descrio Lista do tipo TGridColumns, com as colunas da Grid, cada item da lista do tipo TColumn Set com as opes da Grid, como ConfirmDelete, MultiSelect, ColumnResize Campo da coluna selecionada ndice da coluna selecionada Lista do tipo TBookmarkList, com os registros selecionados em uma Grid com MultiSelect Fonte do ttulo das colunas Cor Fixa, usada nas colunas e indicadores Descrio Ao clicar em uma clula da Grid Quando uma clula de alguma coluna da Grid recebe o foco Quando uma clula de alguma coluna da Grid perde o foco Quando o usurio mover uma coluna Ao clicar no boto de edio de uma clula, mostrado pela propriedade ButtonStyle da coluna Ao clicar no ttulo das colunas
TColumn Representa uma coluna do DBGrid, um item da lista TGridColumns (propriedade Columns).
Propriedades ButtonStyle FieldName PickList Title Descrio Boto mostrado ao editar as clulas da coluna Nome do campo ligado coluna Tstrings com os itens da lista DropDown usada nas clulas da coluna Propriedade do tipo TColumnTitle com as opes do ttulo da coluna
Pgina 61
62
TDBText, TDBEdit, TDBMemo, TDBListBox, TDBComboBox, TDBImage, TDBCalendar Controles genricos ligados a um campo de uma tabela.
Propriedades DataField Descrio Campo ao qual o controle est ligado
TDBCheckBox Usado em campos que podem receber apenas dois valores, como campos lgicos.
Propriedades ValueChecked ValueUnchecked Descrio Valor a ser armazenado quando est selecionado Valor a ser armazenado quando no est selecionado
Pgina 62
63
Um relatrio recm-criado basicamente uma folha em branco onde sero inseridas faixas de contedo e campos de dados. Uma faixa de contedo (Band) define uma rea no relatrio que seguir um determinado comportamento padro, por exemplo, ser impressa no incio de cada pgina, ou ento, ser impressa ao final do relatrio. Para inserir uma faixa de contedo utilizamos a barra de componentes a esquerda, escolhendo o segundo boto:
Pgina 63
64
Cada Band (faixa de contedo) possui um comportamento especfico, logo, no importa o local onde a mesma adicionada na pgina ela ir obedecer prioritariamente seu comportamento. Antes de adicionar uma faixa de contedo necessrio indicar o seu tipo de comportamento, uma janela ser exibida para que a escolha seja feita:
Tipo de faixa Report title Report summary Page header Page footer Master header Master data Master footer Detail header Detail data Detail footer Subdetail header Subdetail data Subdetail footer Overlay Column Header Group Header Group Footer Cross Header Cross Data Cross Footer Caderno Didtico Lazarus IDE
Utilizao/Comportamento Impresso no incio do relatrio (apenas na primeira pgina) Impresso no final do relatrio (apenas na ltima pgina e no necessariamente na parte inferior da mesma) Impresso no incio de cada pgina Impresso ao final de cada pgina Impresso no incio do primeiro nvel de dados Dados do primeiro nvel (repetidos para cada registro mestre) Impresso ao final do primeiro nvel de dados Impresso no incio do segundo nvel de dados Dados do segundo nvel (repetidos para cada registro detalhe) Impresso ao final do segundo nvel de dados Impresso no incio do terceiro nvel de dados Dados do terceiro nvel (repetidos para cada registro sub-detalhe) Impresso ao final do terceiro nvel de dados Impresso em cada pgina usando uma camada inferior da pgina (utilizado para marcas d'gua) Ttulo das colunas, utilizado geralmente em relatrios em formato de tabela onde necessrio indicar o ttulo de cada coluna (impresso no incio de cada pgina, aps o cabealho da pgina) Banda agrupadora (agrupa registros ordenados por determinado campo). Impressa sempre que o valor do campo que condio para o grupo alterado. Impresso aps os dados agrupados, antes do valor do campo que condio para o grupo ser alterado. Esse grupo de bandas foi projetado para criar relatrios de tabulao cruzada, que tm uma quantidade varivel de colunas na pgina.
Pgina 64
65
Sobre as Bands so adicionados objetos retngulo. Um objeto retngulo normalmente um texto organizado com expresses fixas, variveis e campos de uma consulta. A figura abaixo demonstra como inserir um objeto retngulo:
A janela a seguir exibida logo que o objeto retngulo includo sobre a faixa de contedo:
Podem compor o contedo de um objeto retngulo dados estticos como a palavra Instituio na figura acima, campos de uma consulta como o campo NOME da consulta sqlqryUF_IGC alm de variveis pr-definidas:
Tipo de faixa Utilizao/Comportamento Nmero da pgina Data atual Hora atual Nmero da linha (considerando o conjunto de dados que est sendo percorrido) Numero da linha geral Nmero da coluna Numero da linha atual Total de pginas Pgina 65
66
Utilizao de variveis do relatrio Alm de usar textos fixos, campos de uma consulta ou variveis pr-definidas tambm possvel definir outras variveis que podem ser controladas atravs de cdigo. Para fazer isso, na tela de Designer do relatrio escolhe-se o menu File/Variables list .... A seguir, na janela que surge clica-se sobre o boto Variables e na janela Variables List digita-se inicialmente um nome de categoria para as variveis seguido dos nomes de variveis, sendo que cada nome deve obrigatoriamente iniciar por um espao em branco. Depois de concludo, na janela de escolha das variveis as mesmas aparecero agrupadas por categoria.
Para informar os dados de uma varivel utiliza-se o evento OnGetValue do componente TfrReport. Este evento recebe dois parmetros: ParName (que se refere ao nome da varivel que se quer obter o valor) e ParValue (que se refere ao valor que dever ser atribudo a varivel). O cdigo atribui a varivel VarNome o contedo do campo EditNome de um formulrio de dados:
procedure TForm1.frReport1GetValue(const ParName: String; var ParValue: Variant); begin if ParName = 'VarNome' then ParValue:= EdtNome.Text; end;
Diferentemente dos scripts, os dados de variveis definidas pelo usurio somente podem ser testados/visualizados em tempo de execuo. Utilizando Scripts Um objeto retngulo pode ter suas propriedades modificadas por meio da utilizao de scripts. Para utilizar um script a opo Script da janela Text Editor deve estar selecionada. Um script LazReport baseado um Pascal e possui as seguintes capacidades: Operadores (>, <, =, >=, <=, <>); Atribuio (por meio do operador de atribuio (:=); Desvios condicionais (por meio de estruturas if ... then ... else) Laos de repetio (while ... do e repeat ... until) Delimitadores de blocos (begin e end); Utilizao de variveis temporrias no tipadas;
Caderno Didtico Lazarus IDE Pgina 66
67
A cada vez que um objeto retngulo impresso, o script associado a ele executado. A janela abaixo demonstra um script LazReport que testa se o valor do campo IGC_Faixa for maior ou igual a 4 e neste caso troca a cor da fonte para Verde (clGreen) e em no sendo troca para vermelho).
Relatrios baseados em consultas de banco de dados Relatrios que acessam bancos de dados precisam de alguns cuidados especiais. O primeiro deles a utilizao de um componente TfrDBDataSet (guia LazReport). O componente TfrDBDataSet nada mais do que uma extenso da consulta (TSQLQuery), utilizado por motivos de compatibilidade com outras bibliotecas de relatrios. Cada consulta que ser utilizada no relatrio ir precisar de um TfrDBDataSet com a propriedade DataSource configurada. Na tela de construo do relatrio existem algumas faixas de contedo (Bands) com comportamentos especficos para utilizao de dados de consultas: Master data, Detail data e Subdetail data. Essas faixas so impressas uma vez para cada registro das consultas aos quais esto ligadas. A ligao entre a faixa de contedo (Band) e a consulta feita por meio da componente TfrDBDataSet. Ao adicionar uma faixa de contedo baseada em banco de dados ser necessrio indicar qual componente TfrDBDataSet ir controlar o comportamento da faixa: Um tipo especial de DataSource pode ser utilizado quando no temos um especfico, neste caso na tela de escolha Band data source deve-se indicar assim como a quantidade de linhas que devero ser criadas para essa faixa no relatrio.
Pgina 67
68
Visualizao e Impresso Conforme detalhado anteriormente, um relatrio feito em LazReport salvo separadamente da aplicao como um arquivo (lrf) que precisa necessariamente ser distribudo junto com o arquivo executvel. Para fazer a impresso de um relatrio precisamos inicialmente carregar o arquivo que contm o relatrio:
frReport1.LoadFromFile('relatorio1.lrf');
Pgina 68
69
Referncias Bibliogrficas
CANT, M. Dominando o Delphi 2005: A Bblia. Prentice Hall, 2006. CANT, M. Dominando o Delphi 5: A Bblia. Makron Books, 2000. CANT, M. Essential Pascal. 4 Edio. Paperback, 2008. EVARISTO, J. Programando com Pascal. 2 Edio. Ed. Book Express, 2004. MANZANO, J. A.; YAMATUMI, W. Y. Free Pascal - Programao de Computadores. Ed. rica, 2007. SOUZA, V. A. Programando com o Lazarus. Cerne Tecnologia e Treinamento Ltda, 2010.
Pgina 69