Apostila Delphi - 2005
Apostila Delphi - 2005
Apostila Delphi - 2005
APOSTILA : DELPHI
UFPR
ANO 2005
LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III PAG.1
7 7 7
7 7 8 8 8 9 9 10 10 11 11 12
12 13
13 13 13 13 14 15
4. A
17
17 17 17 18 18
Object Pascal Algumas Observaes Sobre Comandos Comentrios 4.1 Composio de Programas Escritos em OBJECT PASCAL. 4.2 SMBOLOS ESPECIAIS USADOS NA LINGUAGEM.
19
19
PAG.2
5. UTILIZANDO COMPONENTES
5.1 PGINA STANDARD 5.2 PGINA ADICIONAL 5.3 PGINA WIN32 5.4 PGINA DIALOG
50
50 50 51 51
PAG.3
70
70 70 71 71 71 71 72 72 72 73
73
73 76 77 77
8. MENU POP-PUP
8.1 Exemplo de Projeto usando Popup Menu
77
77
80
80 81
81
81 83
84
84 84 85
87
87 87
PAG.4
106
106 106 106 107 107 108 108 109 111 111 112 119 120 123 124 126 127 128 130
132
132 133 135 136
PAG.5
136
136 136 137 137 137 137 138
16. ANEXO: CLASSES E COMPONENTES 17. ANEXO : FUNES DE DATA/HORA, STRINGS,FORMATAO E CONVERSO DE TIPOS 17. ANEXO : TECLAS DE ATALHO PARA TRABALHAR MAIS RPIDO DURANTE O DESENHO E A CODIFICAO BIBLIOGRAFIA
141
149
151 152
PAG.6
Apresentao
Esta apostila destinada as pessoas que desejam obter conhecimentos bsicos da linguagem de programao orientada a eventos e a objetos DELPHI. Os assuntos so abordados de forma sinttica, procurando a medida do possvel apresent-los com clareza e simplicidade. Todas as criticas e sugestes sero bem recebidas no intudo de aprimorar este trabalho.
1. INTRODUO
A linguagem PASCAL ( nome dado em homenagem ao matemtico BLAISE PASCAL) foi criada em 1968 por Niklaus Wirth, do Institut fur Informatik de Zurich, tem como principais caractersticas: Ser uma linguagem adequada ao ensino de programao, isto , estruturada, bem organizada e compreensvel. Permitir uma implementao confivel e eficiente em grandes computadores ou em pequenos computadores. Simplicidade, incluindo os avanos da cincia de computao atingidos na poca. Baseada no ALGOL 60, de modo a criar bons hbitos de programao.
Em 1.983 a software house americana Borland International lanou o Turbo Pascal para microcomputadores. O turbo Pascal consegue em um ambiente, colocar um editor de textos, bastante parecido com o Wordstar e um compilador de um passo bastante veloz, com a desvantagem de que apenas um erro localizado pr vez, e tambm oferece facilidades para a depurao de programas e programao orientada o objetos. O Delphi uma linguagem de programao orientada a eventos e a objetos (OBJECT PASCAL), criada pela BORLAND, voltada para o ambiente Windows 95/98, NT, com capacidade para gerar aplicaes em arquitetura Cliente/Servidor ou Local. O Delphi baseia-se na programao visual onde o programador utiliza-se de diversos cones para recriar todos os objetos presentes na tela do Windows, tais como: Botes de Presso, Pop-Ups, Caixas de Listagem, Botes de Rdio, etc; o que facilita a utilizao dos programas para os usurios dos programas at mesmo para os iniciantes. Alm de todas facilidades que esta linguagem apresenta, vale dizer, que ela herda muitos recursos e estruturas prprias do Turbo Pascal, o que torna o Delphi uma linguagem extremamente prtica e clara. Todas as regras para a estruturao do cdigo dos programas foram recriadas semelhana do Turbo Pascal, tornando os programas muito organizados e fceis de ler e entender. Podemos arriscar a dizer que ao mesmo tempo em que o Delphi marca o retorno da Borland ao segmento das linguagens de programao , representando de certa forma a retomada e evoluo do excelente Turbo Pascal. O Delphi uma linguagem de programao que permite compilao e linkedio de suas aplicaes, gerando um arquivo executvel (EXE) real, dispensando o uso de RunTime.
Atravs da barra de menu o usurio ter acesso a todos os recursos do Delphi. Os menus seguem at certo ponto a padronizao do Windows. Com isto queremos dizer que, dentro do menu File (Arquivo), voc encontrar opes para Abrir, Salvar e Fechar arquivos, etc; portanto de forma semelhante aos demais programas voltados para Windows. Alm disso, caso voc queira acessar aos menus do Delphi atravs do teclado, dever pressionar a tecla ALT seguido de F . Caso Voc precise de qualquer ajuda adicional, clique no menu Help/Help Topics.
A Speedbar contm cones que foram considerados como de uso comum, justamente para que os programadores Delphi no precisem acessar constantemente barra de menus. Em caso de dvida sobre a funo de qualquer cone na tela do Delphi, basta mover o mouse sobre o cone que surgir um texto descritivo. Todo item da Speedbar possui uma tecla de atalho correspondente, portanto, se voce j tiver o costume de utilizar de teclas de atalho poder dispensar o uso do mouse.
Est a principal barra de ferramentas do Delphi. Atravs dela voc tem acesso a todos os recursos que permitiro construir visualmente a sua aplicao. Na pgina Standard, por exemplo, voc tem acesso a objetos como: caixas de textos, combos, botes de rdio, caixas de verificao, campos de textos, e muito mais. Para utilizar qualquer um destes objetos basta selecionlo com o mouse e arrast-lo para o formulrio de sua aplicao.
2.3 O FORMULRIO
O Formulrio o ponto central de qualquer aplicao Delphi e constitui a rea de programao e a tela da aplicao em desenvolvimento. O formulrio equivalente s janelas dos programas Windows. A partir de um formulrio voc constri a janela da sua aplicao. Nesta janela voc deve posicionar os componentes ou objetos desejados (Combos, Caixas de listagem, etc) e escrever os cdigos associados aos eventos selecionados dos componentes. Tudo o que colocado e realizado para o formulrio, fica gravado num arquivo (.DFM) anexado ao projeto da aplicao. Embora este arquivo esteja em formato binrio, possvel abr-lo no Delphi e ler o seu contedo.
Centraliza Alinhamento horizontal horizontalmente na janela Alinha para o canto esquerdo Alinha para cima
Espaos iguais na horizontal Alinha para o canto direito Alinha para baixo
PAG.8
A janela Code Editor propriamente o lugar onde o cdigo do programa, ser escrito. O cdigo dos eventos, definidos no formulrio atravs dos mais variados componentes, ser necessrio para fazer com que o Delphi responda as aes do usurio. Em outras palavras quando o usurio clicar sobre um boto do formulrio, os comandos executados sero escritos no Code Editor. O cdigo escrito em Pascal, ou seja o programa, ser gravado num arquivo com extenso (.PAS) que ser designado UNIT. Estes arquivos so armazenados no padro ASCII podendo ser acessados atravs de qualquer editor de textos no Windows. bom saber que nem tudo o que estiver escrito na UNIT ser por iniciativa prpria do usurio. O Delphi nos auxilia escrevendo sozinho a maior parte do cdigo e insere nos lugares certos aqueles comandos que o programador deseja acrescentar.
PAG.9
O Object TreeView uma forma alternativa para visualizao e seleo dos componentes de um Form. Os Componentes so apresentados numa rvore de acordo com o agrupamento lgico entre eles. O Object Treeview, o Form Designer e o Object Inspector trabalham de forma sincronizada, de modo que quando um componente selecionado em uma dessas janelas, a mesma seleo exibida nas outras duas.
Uma vez que muito comum termos vrios Fomulrios e Units numa nica aplicao e compartilharmos cdigos, o Delphi organiza todos num nico arquivos, extenso (.DPR) chamado PROJETO. Mais tarde o projeto ser transformado no arquivo executvel responsvel pelo funcionamento de toda a sua aplicao. Um projeto formado pela interface visual (formulrio) juntamente com o cdigo (Unit) que ativa a interface. Cada projeto pode ter vrios formulrios permitindo a construo de aplicaes com vrias janelas.
PAG.10
O ambiente de desenvolvimento do Delphi permite que sejam feitas algumas configuraes relativas a cada projeto. Dentre estas opes podemos destacar a criao automtica dos formulrios do projeto, definio do ttulo e do cone da aplicao, os mtodos de compilao e linkedio, etc. Normalmente as opes padro so as mais recomendveis para a maioria das aplicaes. Para visualizar a caixa de dilogo de configuraes clique em Project/Options. Logo abaixo, veja as descries sintetizadas sobre as funes das principais opes de configurao. Guia Form: permite que sejam definidos os formulrios que sero autocriados durante o incio da execuo da aplicao. A autocriao do formulrio permite que o mesmo seja reconstrudo e exibido na tela. J que cada formulrio autocriado consome recursos do equipamento, comumente apenas o primeiro formulrio (Principal) definido como autocriado. Guia Application: possibilita a definio do ttulo e do cone da aplicao quando na forma de um arquivo executvel no Windows. Guia Compiler: permite o ajuste de diretivas de compilao e depurao de erros, bem como ajustes na maneira como sero detectados erros em tempo de execuo. Guia Linker: permite a configurao do uso da memria e a definio dos arquivos de sada contendo o mapeamento da memria. Guia Diretories/Condicional: permite a definio do diretrio de sada para o executvel da aplicao e do diretrio de procura para os arquivo fontes. Guia Version Info: quando a Version Info includa, se o usurio clicar com o boto direito do mouse no cone do programa e selecionar a opo Properties (Propriedades) as informaes fornecidas sero mostradas. Guia Packages: especifica Design-time packages utilizados para instalar componentes na interface do ambiente de desenvolvimento do Delphi e para criar propriedades especiais para personalizar componentes.
PAG.11
PAG.12
3. INTRODUO PROGRAMAO
Neste captulo voc ter uma viso geral do funcionamento da programao no Delphi, desde a etapa de elaborao/codificao do projeto, at a compilao e execuo.
Arquivo de Form Unit Compilada Arquivo de Recursos Arquivo de Opes do Projeto Arquivos de Backup
.DFM .DCU .RES .DOF (DPR) ~DP (PAS) ~PA (DFM) ~DF .DLL .EXE
PAG.13
CINCIA DA COMPUTAO - DELPHI Tabela com sugestes para padronizao de nome de objetos usuais
Objeto Formulrio Caixa de Texto Label Boto de Comando Caixa de Verificao Frame Boto de Opo Caixa de Lista Combo Box Menu Timer Prefixo Form Edit Label Button CheckBox GroupBox RadioGroup ListBox ComboBox Menu Timer Exemplo FormCliente EditNome LabelMensagem ButtonExecutar CheckBox GravaSempre GroupBoxDados RadioGroupEstadoCivil ListBoxCidade ComboBoxBancos MenuAbrir TimerHora
Nomes de Variveis A dica colocar nomes de arquivo que signifiquem algo. Modularizao Modularize seu projeto e procure no misturar funcionalidades diferentes na mesma unit. Diretrios Utilizar um diretrio para cada projeto Delphi.
Agora devemos escrever o cdigo que ser executado quando o boto for pressionado. Para isto, selecione a guia Events no Object Inspector e dar um clique duplo sobre o evento OnClick ou clique duplo sobre o boto fechar (apesar de rpido este mtodo mais limitado). Digite o cdigo na figura seguinte. Ele ser o responsvel por fechar o formulrio e finalizar o funcionamento do nosso primeiro projeto quando este estiver sendo executado.
PAG.14
O Objetivo deste programa fazer com que o usurio digite o seu primeiro nome e sobrenome nas caixas de edio prprias e clique no boto Mostrar Nome para mostrar o Nome Completo na caixa Nome Completo. Logo a seguir o usurio poder mudar a cor do nome completo atravs dos botes Azul, Vermelho e Verde. Alocar no formulrio os componentes ou objetos via palheta de componentes Standard: 6 Botes de Presso 3 caixas de textos 3 labels Ajustar as Propriedades Name, Caption e Text dos objetos atravs da Janela Object Inspector e guia Properties. Tipo de Componente Boto de Presso Name CmdFechar CmdApagar CmdMostrar CmdAzul CmdVermelho CmdVerde TxtPNome TxtSobreNome TxtNome LblPNome LblSobreNOme LblNome FrmSegundoProjeto Caption / Text &Fechar Apagar Nome Mostrar Nome Azul Vermelho Verde
Caixa de Texto
Label
Formulrio
Digite o primeiro nome Digite o sobre nome Nome Completo Segundo Projeto
Em seguida salve o projeto clicando no menu File/Save All ou Save Project As. Ateno, primeiro o Delphi solicita um nome para a Unit (sugesto: SegundoProjeto) e, depois o nome para o projeto (sugesto: Projeto2). Aps a construo do formulrio, queremos alert-lo para um procedimento da maior importncia no desenvolvimento de qualquer aplicao. Quando voc insere qualquer componente no formulrio, ele recebe um nome interno que utilizado como referncia durante a programao. Acontece que os nomes do Delphi inicialmente sugere no so ideais para uma aplicao com vrios componentes. Da necessrio que voc clique em cada um dos objetos e no Object Inspector, d nomes padronizados e sugestivos aos componentes atravs da propriedade Name. Depois de criada a interface visual e ajustadas as propriedades, vamos adicionar o cdigo necessrio para a execuo do projeto. Para os botes Mostra Nome e Apaga Nome, no evento OnClick:
PAG.15
Ao clicar no boto CmdApagar, o contedo das caixas de edio TxtPNome, TxtSobreNome e TxtNome (Mtodo Clear) sero eliminados liberando espao para uma nova digitao, a cor do texto da caixa TxtNome (Propriedade Color) ser restaurada para preto e o foco ser dirigido para a caixa TxtPNome (Mtodo SetFocus). Ao clicar no boto CmdMostrar, a caixa TxtNome receber como contedo, o contedo das caixas TxtPNome e TxtSobreNome. A referncia ao contedo das caixas feita atravs do uso de uma propriedade chamada Text, encontrada no Object Inspector. Para os botes Azul, Vermelho e Verde, no evento OnClick:
Ao clicar em qualquer um destes trs botes, a cor do nome completo mostrado na caixa Nome Completo ser imediatamente alterada. Este efeito obtido porque atravs das propriedades Font e Color atribuimos uma cor de fonte diferente ao contedo (Text) no TxtNome. Por fim, clique numa rea vazia do formulrio, v pgina Events no Object Inspector e d um clique duplo no evento OnCreate. Queremos que no momento em que o projeto for executado e o formulrio for criado (transformado internamente numa janela Windows), surja uma caixa de dilogo com uma mensagem para o usurio. A caixa de dilogo surgir antes da janela do formulrio. Para isto, digite o cdigo abaixo e execute o projeto:
PAG.16
Com estes dois projetos voc j deve ter percebido que a programao Delphi bastante diferente da programao procedural na qual se baseiam linguagens como o Clipper e o antigo Turbo Pascal. Nelas os cdigos de programao so escritos de cima para baixo e percebe-se claramente o nicio e o fim do programa. A nova filosofia de programao Delphi muda bastante o estilo tradicional ao permitir que a programao deixe de ser de cima para baixo e se concentre apenas nos pontos fundamentais. Voc j observou que nos exemplos descritos anteriormente a maior parte do cdigo foi escrita pelo Delphi, bastando apenas complet-la.
Object Pascal
Nunca demais enfatizar que a chave da programao Delphi consiste em reconhecer que ele geralmente processa um cdigo apenas em resposta a eventos. Pense num programa como um conjunto de elementos independentes que acordam apenas em resposta a eventos que forma ensinados a reconhecer. Tambm vale a pena dizer, que mesmo que voc conhea uma linguagem de programao convencional, no tente obrigar seus programas Delphi a se adaptarem s estruturas dela. Caso imponha hbitos antigos de programao enfrentar problemas. No pense num programa Delphi executando seus comandos de cima para baixo.
Comentrios
muito comum que seja solicitado ao programador pequenas alteraes no cdigo dos programas. Tais alteraes so muito mais simples de serem feitas quando o programador dispes de meios para lembrar-se de certos comandos. Portanto, os comentrios so sempre teis no cdigo fonte como forma de auxiliar o programador na leitura e na compreenso da finalidade dos comandos no programa.
PAG.17
pelo
PAG.18
Exemplo: FUNCTION TESTE ( X:INTEGER ) : INTEGER; := - Atribuio de valores. Exemplo : TOTAL := 0; ; - Delimitador de comandos, termina declaraes, definies e cabealhos. = - Usado como operador relacional, associa tambm tipos ou Exemplos: CONST INDICE = 1.3452; TYPE VET = ARRAY [ 1..50 ] OF INTEGER; [] - Usado na identificao de um elemento em uma matriz e na definio de conjuntos. constantes aos seus identificadores.
Exemplo: IF TECLA IN [ A .. Z ] THEN WRITE (DIGITOU UMA LETRA MAIUSCULA ); ^ - Define um identificador como ponteiro (POINTER), ou indica um caractere de controle. Exemplo: var key : char; begin readln(Key); CASE Key of ^G : writeln('DIGITOU CTRL-G '); ^D,^A : writeln('DIGITOU CTRL-D OU CTRL-A '); End; readln; end. (* *) {} - Usado para envolver comentrios dentro do programa.
PAG.19
O nome da varivel deve ser nico em cada bloco do programa e deve conter at 255 caracteres, podendo ser composto pr letras, nmeros e sublinhado _ , porm serve sempre iniciar com uma letra e no pode ser uma palavra reservada pelo Object Pascal. aconselhvel que defina o nome da varivel de forma que esta ns lembre a funo que ela ter no contexto do programa. Alm disso, o nome de uma varivel no deve conter smbolos especiais (p.e. &%#@!), , nem ser igual ao nome de uma palavra reservada do Object Pascal. O formato de declarao de variveis deve ter a seguinte sintaxe:
VAR
nome_da_varivel [, nome_da_varivel ...] : tipo; Exemplo: Var Nome, SobreNome : String; Idade : Integer; N_Pessoas : Byte; Veja abaixo as palavras reservadas do Object Pascal: And Case Div Except Function Inherited Label Object Program Set To Uses As Class Do Exports Goto Inline Libray Of Property Shl Try Var Asm Const Downto File If Initialization Mod Or Raise Shr Type While Array Constructor Else Finally Implementation Interface Nil Packed Record String Unit With Begin Destructor End For In Is Not Procedure Repeat Then Until xor
Tipos
Finalidade
Variveis booleanas que contm True ou False. Valores True ou False. Ocupa 1 byte. Utilizados para trabalhar com nmeros inteiros dispensando o ponto decimal; as operaes com inteiros so muito rpidas. Abrange inteiros entre 128 e 127. Ocupa 1 byte. Abrange inteiros entre o a 255. Ocupa 1 byte. Abrange inteiros entre 32768 a 32767. Ocupa 2 bytes. Abrange inteiros entre 0 a 65535. Ocupa 2 bytes. Abrange inteiros entre -2147483648 a 2147483647. Ocupa 4 bytes. Abrange inteiros entre 0 a 2147483647. Ocupa 4 bytes. Abrange inteiros entre -2147483648 a 2147483647. Ocupa 4 bytes. Destinadas operaes que podem utilizar tanto nmeros inteiros quanto nmeros com casas decimais. Abrange reais entre 2.9x10-39 a 1.7x1038 com 11 a 12 dgitos significativos e ocupa 6 bytes. Abrange reais entre 1.5x10-45 a 3.4x1038 com 7 a 8 dgitos significativos e ocupa 4 bytes. Abrange reais entre 5.0x10-324 a 1.7x10308 com 15 a 16 dgitos significativos e ocupa 8 bytes. Abrange reais entre 3.4x10-4932 a 1.1x104932 com 19 a 20 dgitos significativos e ocupa 10 bytes. Abrange reais entre 9.2x1018 a 9.2x1018 com 19 a 20 dgitos significativos e ocupa 8 bytes. O tipo Comp , na verdade, um grande inteiro e no um real. A razo de estar incluido nesta tabela que ele implementado no mesmo estilo dos tipos de ponto flutuante. Na verdade, trata-se de um inteiro de 64 bits. Tem uma preciso de 4 casas decimais, e armazenado como um inteiro de 64 bits. Usado para manusear valores monetrios. Variveis prprias para armazenar textos ou qualquer outros valores que no devero ser utilizados em operaes matemticas. Armazena apenas caracteres ASCII. Ocupa 1 byte. Comporta 255 caracteres da tabela ASCII.
PAG.20
Data/Hora Variant
Exemplo: VAR INDICE RESP VALOR PALAVRA S_N DIA, MES, ANO QUANTIDADE BYTE; CHAR; REAL; STRING[20]; : BOOLEAN; : WORD; : INTEGER; : : : :
PAG.21
PAG.22
PAG.23
a referncia as
PAG.24
4.4 Constantes
Constantes so valores especiais que geralmente so definidos no nicio do programa e, se destinam a armazenar informaes ou valores que no se alteram ao longo da execuo do programa. Veja abaixo um exemplo de declarao de constantes no Delphi. Const PI = 3.1416; Linguagem : String = Delphi; dia : array [0..6] of String[9] = ('Domingo' , 'Segunda' , 'Tera' , 'Quarta' , 'Quinta' , 'Sexta',
'Sbado');
As declaraes de constantes no alocam recursos do sistema. De fato, isto somente ocorre quando elas forem utilizadas na aplicao. Contudo, a constante Linguagem ter um tratamento diferente, uma vez que ela uma constante tipada, ou seja, seu tipo (string) j foi previamente definido.
4.5 Operadores
So sinais responsveis pela modificao no fluxo do programa ou no contedo de variveis. Eles so extremamente teis e amplamente utilizados. A ttulo de exemplificao vale mencionar o operador de atribuio := que necessrio para determinar o contedo das variveis ( por Exemplo: A := 1; ).
MOD
AND
OR
XOR
4.5.4 CONJUNTOS
IN : VERDADEIRO SE O OPERANDO PERTENCER AO CONJUNTO. Exemplo : IF LETRA IN [A .. E , a .. e] THEN
PAG.25
4.5.5 STRINGS
+ : PERMITE A CONCATENAO ENTRE STRINGS. Exemplo : ESCOLA := FACE + - + FUMEC ;
Exemplo: program Project1; uses Forms, sysutils; {$R *.RES} var DT : string; begin Readln(DT); Writeln(Formatdatetime('DDDDDD',strtodatetime(DT))); Writeln(formatfloat('###,##0',date - strtodatetime(DT))); readln; end.
PAG.26
Sintaxe: <varivel> := <Expresso | Varivel | Constantel>; 4.6.2 Comandos de Deciso 4.6.2.1 Comando IF ... Then ... Else
O comando IF um dos comandos mais importantes e bsicos da programao Object Pascal. Ele utilizado para determinar o fluxo do programa a partir de determinada condio. Caso a situao pela qual o programa estiver passando confirme uma dada condio, o programa executar os comandos abaixo da clusula Then; caso contrrio, executar as instrues abaixo da clusula Else. A clusula Else, em funa das necessidades do programa pode ser omitida. Neste caso, se a situao da execuo do programa no satisfazer a condio estabelecida no IF, prosseguir no seu funcionamento normal. ALTERNATIVA SIMPLES IF <ExpL> THEN <comando simples>;
ALTERNATIVA SIMPLES IF <ExpL> THEN BEGIN <comando-1>; <comando-2>; <comando-3>; ... END; ALTERNATIVA COMPOSTA IF <ExpL> THEN <comando> ELSE <comando> ; ALTERNATIVA COMPOSTA IF <ExpL> THEN BEGIN <comandos>; END ELSE BEGIN <comandos>; ... END;
PAG.27
FOR <v> := <i> TO <f> DO < comando >; FOR <v> := <i> TO <f > DO BEGIN < comandos >; END; FOR <v> := <i> DOWNTO <f> DO BEGIN < comandos >; END; Exemplo: Var I : Byte; Begin
// PASSO = 1
// PASSO = -1
PAG.28
4.6.4.1 GOTO
A instruo GOTO permite que voc salte de onde est no programa para uma linha rotulada especfica. Exemplo:
PAG.29
uses ... ;
label ... ; const ... ; type ... ; var ... ;
{ Especificao Uses }
{ Labels } { Constantes } { Tipos } { Variveis }
Sintaxe Procedures: Procedure identificao; Declaraes; Begin Comandos; End; Procedure identificao ( parmetros ); Declaraes; Begin Comandos; End; Exemplos: { Esta Procedure possui parmetros } Procedure Mensagem1 (Var Msg : String);
PAG.30
Chamada da Procedure no programa: Mensagem1 (Esta mensagem aparecer no vdeo e o parmetro da procedure); Mensagem2; Sintaxe Functions: Function identificao : Tipo; Declaraes; Begin Comandos; End; Function identificao ( parmetros ) : Tipo; Declaraes; Begin Comandos; End; Exemplos: Function SomaNumeros (Var N1, N2 : Integer) : Integer; Begin { esta a rea de cdigo da funo } SomaNumeros := N1 + N2; End; Chamada da Function no programa: X := SomaNumeros (2,3); { os parmetros da function tm que ser nmeros inteiros }
Parmetros de Referncia
Nos exemplos acima muito importante observar que tanto os procedimentos quanto as funes podem receber parmetros ou no. Os parmetros so informaes passadas que so necessrias para o funcionamento de uma subrotina e podem ser passados por valor ou referncia quando expressos atravs da palavra-chave Var. Exemplo: Function PROD(X : real; var Y : real) : real; begin PROD := X * Y; X := 1; Y := 1; end;
{--* PROGRAMA PRINCIPAL *--} begin A := 2; B := 10; writeln (PROD (A,B)); end.
A linguagem Pascal coloca disponvel aos usurios um conjunto de funes e procedimentos distribudos em UNITS (as units so rotinas compiladas separadamente do programa principal), com a finalidade de facilitar e agilizar a programao.
PAG.31
Retorna o caratere correspondente ao cdigo ASCII fornecido. Unit System function Chr(x : Byte) : Char; Exemplo:
Uses ....., Printers; Var P : TextFile; Begin AssignPrn(P); Rewrite(P); { Envia um form feed para a impressora } Writeln(P, chr(12) , Testando a Impressora); CloseFile(P); End;
4.8.1.2 CONCAT Concatenar os strings especificados. Unit System function Concat(s1, s2 [, s3, ..., sn] : string) : string;
{ 'ABCDEF' }
4.8.1.3 COPY Retorna um substring de um string , isto , retorna uma parte se S, desde inicio e com o tamanho especificado. Unit System function Copy(s : string; inicio, tamanho : Integer) : string; Exemplo: var s, s1 : string; begin s := 'ABCDEF'; s1 := Copy(s, 2, 3) { 'BCD' } end; 4.8.1.4 DELETE Elimina parte do string S; comea em inicio com o tamanho especificado.
PAG.32
4.8.1.5 INSERT Insere um string origem em s apartir da posico inicio. Unit System procedure Insert(origem : string; var s : string; inicio: Integer); Exemplo: var s: string; begin s := 'Honest Lincoln'; Insert('Abe ', s, 8); WriteLn(s); { 'Honest Abe Lincoln' } end. 4.8.1.6 LENGTH Retorna o nmero de caracteres do string. Unit System function Length(s : string) : Integer; Exemplo: var S : string; begin read(S); write(length(S)); end. 4.8.1.7 POS Retorna a posio do inicio do string s1 dentro do string s2. (retorna 0 se no encontrar) Unit System function Pos(s1,s2 : string) : Byte; Exemplo: var s: string; begin s := ' 123.50'; { Converte espaos para zeros } while Pos(' ', s) > 0 do s[Pos(' ', s)] := '0'; end.
PAG.33
Transforma um nmero em representao string; x pode ser inteiro ou real; S passa a conter representao string de x com a largura e casas decimais especificadas. Unit System procedure Str(x [ : tamanho [ : decimais ]]; var s : string);
(* ' 1492' *)
4.8.1.10 VAL Converte string S em numero n. A posio de qualquer erro no string S reportada no parmetro cdigo. Se cdigo = 0, a converso foi feita com sucesso. Unit System procedure Val(s : string; var n; var codigo : Integer); Exemplo: Program conver; var X : string; Y,Z : integer; begin X:='9876'; Val(X,Y,Z); writeln(Y); writeln(Z); readln; end.
PAG.34
4.8.1.11 TRIM TRIMLEFT - TRIMRIGHT Trim - Retira espaos a esquerda e direita da string TrimLeft - Retira espaos a esquerda da string TrimRight - Retira espaos a direita da string Unit SysUtils function Trim(const S: string): string; function TrimLeft(const S: string): string; function TrimRight(const S: string): string; Exemplo: If Trim(EditNome.Text) = then Begin ShowMessage(Falta Informar o Nome); EditText.SetFocus; Exit; End;
4.8.1.12 ORD Retorna o cdigo ASCII do caractere da vativel x. Unit System function Ord(x:char) : Longint;
Exemplo: program MINUSCULA; var I:integer; (* MINUSC retorna um string com caracteres Minusculos*) function MINUSC(C : STRING) : STRING; var I : integer; begin for I := 1 to length(C) do if (ord(C[I]) >= 65) and (ord(C[I]) <= 90) then C[I] := chr(ord(C[I])+32); MINUSC := C; end; begin writeln(MINUSC('ABCDEFGHIJKLMNOPQRSTUVWXYZ')); writeln(MINUSC('FACE FUMEC.')); readln; end.
PAG.35
{ 2.3 } { 157 }
4.8.2.2 EXP Retorna o valor de e(e=2.7182818285E+00) elevado a potncia x. Unit System function Exp(x : real) : real; Exemplo: begin WriteLn('e = ',Exp(1.0)); end. 4.8.2.3 LN Retorna o logaritmo natural de x (base e=2.7182818285E+00). Unit System function Ln(x : real) : real; Exemplo: program exponencial; var I : integer; { funo para calcular um exponencial } function pot (X,Y : real) : real; begin pot:=exp(Y*ln(X)); end; { Programa Principal } begin for I:=1 to 10 do begin writeln (I:2 , '**' , 3 ,' = ',pot(I,3):0:2); end; readln; {X**Y}
PAG.36
4.2.8.4 FRAC Retorna a parte fracionaria de x. Unit System function Frac(x : real) : real; Exemplo: var S : string; begin str(Frac(123.456):7:3,S); { 0.456 } Writeln(S); str(Frac(-123.456):7:3,S); { -0.456 } Writeln(S); readln; end.
PAG.37
function Int(x : real) : real; Exemplo: var r: real; begin r := Int(123.456); { 123.0 } r := Int(-123.456); { -123.0 } end. 4.8.2.6 ROUND Retorna o valor de x arredondado para um inteiro. Unit System function Round(x : real) : Longint; Exemplo: begin WriteLn(1.4, ' arredonda para ', Round(1.4)); WriteLn(1.5, ' arredonda para ', Round(1.5)); WriteLn(-1.4, ' arredonda para ', Round(-1.4)); WriteLn(-1.5, ' arredonda para ', Round(-1.5)); Readln; end.
4.8.2.7 TRUNC Retorna a parte inteira de x descartando a parte decimal. Unit System function Trunc(x : real) : Longint; Exemplo: begin WriteLn(1.4, ' truncar para ', Trunc(1.4)); WriteLn(1.5, ' truncar para ', Trunc(1.5)); WriteLn(-1.4, ' truncar para ', Trunc(-1.4)); WriteLn(-1.5, ' truncar para ', Trunc(-1.5)); Readln; end.
PAG.38
4.8.2.8 SQR Retorna o quadrado de x. Unit System function Sqr(x) : (Mesmo tipo do parmetro) Exemplo: writeln (O quadrado de x = , SRQ(X));
4.8.2.9 SQRT Retorna a raiz quadrada de x function Sqrt(x : real): real; Exemplo: begin WriteLn('5 ao quadrado = ', Sqr(5)); WriteLn('A raiz quadrada de 2 = ', Sqrt(2.0)); end.
4.8.2.10 ODD Retorna true se o valor de X e um nmero impar. Unit System function ODD(X:longint):boolean;
PAG.39
4.8.3 MANIPULAO DE TIPOS ESCALARES 4.8.3.1 PRED Funo encarregada de reconhecer o elemento, que antecede X no conjunto considerado. O resultado e do mesmo tipo do parmetro X. Unit System function PRED(x) : <mesmo tipo do parmetro> ; Exemplo: var x : char; begin x:=C; write(PRED(x)); { B } end. 4.8.3.2 SUCC Funo encarregada de reconhecer o elemento, que sucede X no conjunto considerado. O resultado e do mesmo tipo do parmetro X. Unit System function SUCC(x) : <mesmo tipo do parmetro> ;
Exemplo: var x : char; begin x:=C; write(SUCC(x)); { D } end. 4.8.4 Controle de memria 4.8.4.1 SIZEOF Retorna o nmero de bytes ocupados pelo argumento. Unit System function SizeOf(var) : Integer; Exemplo: var s : string[35]; begin write(sizeof(S)); Readln; end. 4.8.5 INTERAGINDO COM O SISTEMA OPERACIONAL 4.8.5.1 CHDIR ChDir muda the diretrio corrente. Unit { 36 }
PAG.40
A procedure ChDir modifica o diretrio corrente para o caminho especificado em S. Exemplo: begin {$I-} { mudar para o diretrio especificado em Edit1 } ChDir(Edit1.Text); if IOResult <> 0 then ShowMessage('Diretrio no foi encontrado'); end; 4.8..5.2 GETDIR Retorna o path do diretrio ativo do drive especificado (acionador default=0,A=1,B=2,...). Retorna -1 se o drive no estiver presente. Unit System procedure GetDir(D: Byte; var S: string); Usar GetDir para determinas o diretrio correnteno drive especificado no parmetro D. D pode receber os valores abaixo: Value 0 1 2 3 Exemplo: var s : string; begin GetDir(0,s); { 0 = Current drive } writeln('Drive e diretrio corrente: ' + s); readln; end. Drive Default A B C
PAG.41
4.8.5.4 RMDIR Remove o diretrio especificado em path que esteja vazio. Procedure RMDIR (path:string); Exemplo: Rmdir (\ tp\fontes\tmp);
PAG.42
PAG.43
PAG.44
PAG.45
PAG.46
unit RotGer; interface Uses Sysutils; Function Replicar(X : String; Q : Byte): string; implementation Function Replicar(X : String; Q : Byte): string; { Funo para retornar uma string Replicar, com Q ocorrncias da String X } Var Resp : String; I : Byte; begin Resp := ''; for I := 1 to Q do Resp := Resp + X; Replicar := Resp; end; end.
Procedimentos para incluir a UNIT RotGer no desenvolvimento de um aplicativo Inciar o desenvolvimento Menu Delphi - opo New Application Incluir a Unit RotGer no projeto Menu Delphi - opo Add Project... Incluir o nome da Unit RotGer na clasula Uses da Unit do Formulrio da aplicao. Chamar a funo Replicar na rea de cdigo da aplicao. Desenho do aplicativo para chamar a Unit RotGer
PAG.47
Cdigo do aplicativo para chamar a funo Replicar da Unit RotGer da Unit do formulrio interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ,RotGer, StdCtrls; type ... end; var Form1: TForm1; implementation procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(Replicar(Edit1.Text,StrToInt(Edit2.Text))); end; end.
Construir uma DLL com o nome RotGer contendo inicialmente uma Funo para retornar uma string Replicar, com Q ocorrncias da String X. Function Replicar(X : PChar; Q : Byte): PChar; Selecionar no Delphi a opo File/New...DLL
PAG.48
Library RotGer; Uses Sysutils; Function Replicar(X : PChar; Q : Byte): PChar; StdCall; Export; { Funo para retornar uma string Replicar, com Q ocorrncias da String X } Var Resp , X1: String; I : Byte; Begin X1 = StrPas(X); Resp := ''; for I := 1 to Q do Resp := Resp + X1; Replicar := Pchar(Resp); end; Exports Replicar Name Replicar; end.
Cdigo do aplicativo para chamar a DLL RotGer unit UChamaRotGerDLL; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type ... end; var Form1: TForm1; implementation {$R *.DFM} Function Replicar(X : PChar; Q : Byte): PChar; StdCall; External 'RotGer.DLL'; procedure TForm1.Button1Click(Sender: TObject); begin
PAG.49
5. Utilizando Componentes
Objetivo
Aps uma introduo ao uso do ambiente geral da linguagem Object Pascal, estamos printos para entrar numa parte muito importante do Delphi, o uso dos componentes. A programao visual usando componentes a caracterstica fundamental deste ambiente de desenvolvimento. Nosso objetivo ser portanto, o de mostrar como utilizar algumas de suas caractersticas. Iniciaremos fazendo uma breve descrio de cada componente, para que mais adiante voc possa estar mais familiarizado com eles.
10 11 12 13 14
Nmero do cone 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Nome ou Rtulo Main Menu Popup Menu Label Edit Memo Button CheckBox Radio Buttons ListBox ComboBox ScroolBar GroupBox RadioGroup Panel
Finalidade Projeta Barras de Menu no estilo dos programas Windows. Projeta Menus de Atalho (Smente acessveis atravs do boto direito do mouse). Permite identificar outros componentes ou mostrar mensagens fixas no formulrio. Disponibiliza uma espao no formulrio, para entrada de dados. Disponibiliza uma ampla rea para digitao de textos. Define botes de presso. Utilizado para entrada de dados com apenas duas possibilidades. Permite a seleo de opes mutuamente exclusivas. Projeta Caixas de Listagem. Projete uma caixa de listagem com opes suspensas. Geralmente associada a outro componente, permite selecionar, analgicamente, um valor numa faixa de escolhas. Agrupa Botes de Rdio para que se comportem como uma unidade. Associa automticamente GroupBox e Rdio Buttons. Utilizado para projetar Barras de Ferramentas e Barras de Status.
10
11 12
13
Nmero do cone 1 2 3 4 5 6 7 8 9 10 11 12 13
Nome ou Rtulo BITBTN SpeedButton MaskEdit StringGrid DrawGrid Image Shape Bevel ScrollBox ChekListBox Splitter StaticText Chart
Finalidade Projeta um boto de comando com grfico. Define cones para uma barra de ferramentas. Formata a digitao e a exibio de dados. til para criar uma tabela que mostre o contedo de strings. Arranja vrias imagens num formato tabular. Projeta um objeto para mostrar imagens de diversos formatos. Projete figuras geomtricas. Projeta quadros chanfrados. Projeta um container redimensionvel. Mostra uma lista com rolagem similar caixa de listagem com um checkbox frente de cada item. Adiciona um divisor de tela no formulrio redimensionvel em tempo de execuo. Controle no editvel, til para fornecer feedback sobre o estado atual de uma aplicao. Permite a criao de grficos variados em tempo real.
PAG.50
10
11 12
13
14
15
16
Nmero do cone 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Nome ou Rtulo TabControl PageControl ImageList RichText TrackBar ProgressBar UpDown HotKey Animate DateTimePicker TreeView ListView HeaderControl StatusBar ToolBar CoolBar
Finalidade Projeta um container com vrias pginas com abas no topo. Cria caixas de dilogo com abas (como no Object Inspector) Projeta caixa de listagem para imagens de mesmo tamanho. Disponibiliza um campo Memo no formato RichText. Define uma barra com uma faixa de valores ajustveis. Projeta uma barra de progresso preenchida da esquerda para direita Projeta cones para incrementar ou decrementar valores. Associa um componente, uma tecla de atalho. Trs cones animados padronizados pelas operaes de manipulao de arquivos. Disponibiliza um calendrio para seleo de datas. Projeta uma caixa de listagem com as opes em forma de tpicos. Projeta uma caixa de listagem com as opes colunadas. Fornece uma rea de texto redimensionvel. Define uma rea de barra de status. Gera barra de ferramentas com controle automtico de tamanho e posio dos cones. Gera barra de ferramentas redimensionvel e mvel.
10
Nmero do cone 1 2 3 4 5 6 7 8 9 10
Nome ou Rtulo OpenDialog SaveDialog OpenPictureDialog SavePictureDialog FontDialog ColorDialog PrintDialog PrinterSetupDialog FindDialog ReplaceDialog
Finalidade Exibe caixa de abertura de arquivos. Exibe caixa de salvamento de arquivos. Exibe caixa de abertura de figuras. Exibe caixa de salvamento para arquivos de figuras. Exibae caixa de formatao de fontes. Exibe caixa de formatao de cores. Exibe caixa de controle de impresso. Exibe caixa de configurao de impresso. Exibe caixa de dialgo para localizao de textos. Exibe caixa de dialgo para localizao e substituio de textos.
8 Finalidade Ativa umcdigo aps um intervalo de tempo definido. Projeta uma rea para desenhos e grficos. Disponibiliza recursos para reproduo multimdia. Estabelece um cliente OLE. Estabelece um cliente DDE. Especifica o que ser enviado do cliente para o servidor numa ligao DDE. Instala um servidor DDE. Especifica o que ser enviado do servidor ao cliente.
Nmero do cone 1 2 3 4 5 6 7 8
Nome ou Rtulo Timer PaintBox MediaPlayer OLEContainer DDEClientCOnv DDEClientItem DDEServerConv DDEServerItem
PAG.51
Nmero do cone 8 9 10 11 12 13 14 15
Nome ou Rtulo FTP HTML HTTP NNTP POP SMTP TCP UDP
Finalidade Facilita o acesso para servios de protocolo de transferncia de arquivos na Internet. Transferindo arquivos entre mquinas remota e local. Implementa um visualizador de HTML. Permite obter documentos HTTP se nenhuma visualizao ou nenhum processamento de imagem for necessrio. Permite o acesso ao Networking News Transfer Protocol. Possibilitanto novos recursos para leitura e gravao. Baixa correspondncia de UNIX ou de outros servidores que suportem o protocolo POP3. Permite o acesso STMP servidores de correspondncias. Implementa protocolo para controle de transmisso para aplicaes C/S, provendo acesso rpido a servios de rede TCP. Prov acesso rpido ao protocolo User Datagram para servios em rede.
PAG.52
Exemplo de Procedure de Evento: procedure TForm1.FormActivate(Sender: TObject); begin ShowMessage('Teste'); end; Mtodos Conjunto de comandos (funes ou procedures ) declaradas dentro do objeto que executam tarefas do objeto, cabendo ao programador selecionar as de interesse do aplicativo. Exemplo de Mtodos: Form1.Hide ; // Ocultar Form1 Form2.Close ; // Fechar Form2 5.7.2.1 Formulrio O Formulrio o objeto principal da interface visual pois comporta-se com um container dos demais objetos visuais.
Barra de Ttulo - Formulrio Serve para identificar o formulrio e tambm acomodar botes de controle do formulrio. Menu de Controle do Formulrio Menu que aparece quando clica com o mouse no cone do Formulrio e com os itens Restaurar, Mover, Tamanho, Minimizar, Maximizar e Fechar. Propriedades usuais para o Formulrio BorderIcons
PAG.53
PAG.54
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if Application.MessageBox ('Confirma a sada do aplicativo?', 'Sada do Aplicativo', Mb_YesNo + Mb_DefButton2) = IDYes then Canclose := True else CanClose := False; end; Dicas Para Formulrios. Como Criar Forms Em Tempo de Execuo Para voc economizar memria, deve-se criar os forms de sua aplicao somente no momento da execuo. Na criao do Form voc define se ele MODAL ou NO MODAL. Para Isso observe os seguintes cdigos: Form2 => MODAL procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2); {Carrega form na memria} Form2.ShowModal; {Mostra form em modo exclusivo} Form2.Free; {Libera Memria} end; Form2 => NO MODAL procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2); {Carrega form na memria} Form2.Show; {Mostra form em modo no exclusivo} end; //No evento OnClose do Form2 coloque o seguinte cdigo. procedure TForm2.FormClose (Sender: Tobject; var Action : TCloseAction); begin Action:= caFree; {Libera Memria} end; Descobrindo se um form no modal j est criado Quando um form ou outro objeto no existe, ou seja, ainda no foi criado, a varivel usada para instanciar o objeto est "nil". If form2 = nil then {form2 no criado ainda ou j foi fechado} // Lembre-se de fazer o form2, no seu evento close, receber nil. form2 := nil; // Assim ele estar fechado e no existir mais. procedure TForm1.Button1Click(Sender: TObject); begin if Form2 <> nil then exit; Application.CreateForm(TForm2, Form2); Form2.Show; {Mostra form em modo no exclusivo} end; //No evento OnClose do Form2 coloque o seguinte cdigo. procedure TForm2.FormClose (Sender: Tobject; var Action : TCloseAction); begin Action:= caFree; {Libera Memria} Form2 := nil; end;
PAG.55
PAG.56
Propriedades usuais para o Memo As propriedades do Edit so vlidas para o Memo. Lines Contm linhas individuais dentro da caixa de texto de mltiplas linhas. ScrollBars Determina a presena da barra de Scroll no controle: (ssNone, ssHorizontal, ssVertical, ssBoth). Memo1.Lines.Clear Comando para limpar todas as linhas da caixa de texto. Ex: Memo1.Lines.Clear; Memo1.Lines.Append(const S: string) Comando para inserir uma linha no final no final da caixa de texto. Ex: Linhas := Memo1.Lines.Append('FUMEC'); Memo1.Lines.Add(const S: string): Integer Comando para inserir uma linha no final retornando o index da linha colocada. Ex: Linhas := Memo1.Lines.Add('FUMEC'); Memo1.Lines.LoadFromFile(const FileName:string) Carrega a caixa de texto com as linhas gravadas no arquivo texto especificado. Ex: Memo1.Lines.LoadFromFile(Exemplo.Pas); Memo1.Lines.SaveToFile(const FileName: string) Gravar o contedo da caixa de texto no arquivo texto especificado. Memo1.Lines.Text Retorna uma String com todo o contedo da caixa de texto. Memo1.Lines.Strings[Index: Integer] Retorna uma String c/ dados da linha da posio Index. Exerccio Elaborar um aplicativo para Abrir e visualizar o contedo de Arquivo Texto via componente Memo. Funes: Abertura, leitura, visualizao e fechamento de arquivo texto. Formatao: Possibilidade de alterar a Fonte , Estilo, Tamanho, Efeitos e Cor do Texto).
PAG.57
FocusControl Determina o controle associado com o label para recepo de foco via tecla de atalho. Hint Contm o texto que pode aparecer quando o usurio move o mouse sobre o controle. ShowHint : ( True ou False) Determina se o controle pode mostrar o Help Hint quando o mouse move sobre o controle. Mtodos usuais para o Label OnClick Ocorre quando o usurio clica no controle. OnMouseMove Ocorre quando o usurio move o mouse sobre o controle Exerccio Elaborar um aplicativo para testar as propriedades Hint, ShowHint, FocusControl, Cursor e eventos OnClick e OnMoveMouse do controle Label.
PAG.58
Exerccio Elaborar um aplicativo para testar a propriedade ModalResult para o Componente Button e Formulrio Modal.
Cdigo - Evento OnClick procedure TForm1.Button1Click(Sender: TObject); begin Form2.ShowModal; // Abrir Form2 Modal if form2.ModalResult = mrYes // Qual boto Fechou Form2 ? then ShowMessage('Fechou formulrio com Sim') else ShowMessage('Fechou formulrio com No'); end; 5.7.2.6 Boto de Comando c/ imagem - BitBtn
PAG.59
5.7.2.7 Boto de Opo RadioButton Usado dentro de um grupo de botes de opo para mostrar uma mltipla escolha, na qual o usurio s pode selecionar uma opo de cada vez.
Propriedades usuais p/ o RadioButton Checked : (True ou False) Determina se a opo representada pelo boto de rdio foi selecionada. Caption Especifica um texto string para identificar o boto de rdio para o usurio.
5.7.2.8 Frame GroupBox Usado para relacionar controles no formulrio, comportando com um container de controles. Propriedades usuais p/ o GroupBox Enabled : (True ou False) Desabilitar o GroupBox e todos os controles internos. Visible : (True ou False) Ocultar o GroupBox e todos os controles internos. Caption Especifica um texto string para identificar o GroupBox.
5.7.2.9 Caixa de Verificao CheckBox Usado para criar uma caixa que o usurio pode facilmente indicar se algum tem verdadeiro ou falso, ou para mostrar mltiplas opes quando o usurio pode escolher mais de uma ao mesmo tempo.
PAG.60
Items Contm tens individuais (Strings) que aparecem dentro da Lista. MultiSelect : (True ou False) Determina se o usurio pode selecionar um ou mais de um tem ao mesmo tempo. Selected[Index: Integer]: Boolean; Indica quando um determinado tem foi selecionado. Sorted : (True ou False) Especifica se os tems de uma lista so ordenados alfabeticamente. Mtodos usuais para o ListBox ListBox1.Items.Clear Comando para limpar todos os tens da lista. Ex: ListBox1.Items.Clear; ListBox1.Items.Append(const S: string) Comando para inserir um tem no final no final da lista. Ex: ListBox1.Items.Append('FUMEC'); ListBox1.Items.Add(const S: string): Integer Comando para inserir um tem no final da lista retornando o index do tem colocado. ListBox1.Items.IndexOf(const S: string): Integer Retorna a posio da 1a. Ocorrncia do Item na lista. Caso o tem no exista ser retornado -1. ListBox1.Items.LoadFromFile(const FileName:string) Carrega a lista com os tens gravadas no arquivo texto especificado. Ex: ListBox1.Items.LoadFromFile(Itens.txt); ListBox1.Items.SaveToFile(const FileName: string) Gravar o contedo da lista no arquivo texto especificado. ListBox1.Items.Strings[Index: Integer] Retorna uma String c/ dados do tem da posio Index. ListBox1.Items.Delete(Index: Integer) Exclui o tem da posio Index na lista. Exerccio Elaborar um aplicativo para verificar quais os tens de uma lista o usurio selecionou. O usurio poder indicar se deseja selecionar um ou vrios tens na lista.
PAG.61
Cdigo - Evento OnClick RadioButton procedure TForm1.RadioButton1Click(Sender: TObject); begin ListBox1.MultiSelect := True; end; procedure TForm1.RadioButton2Click(Sender: TObject); begin ListBox1.MultiSelect := False; end; Cdigo - Evento OnClick Button procedure TForm1.Button1Click(Sender: TObject); var I : integer; Resp : String; begin if Listbox1.MultiSelect // Lista com Mltiplas Selees then begin if ListBox1.SelCount = 0 then exit; Resp := 'Os tens abaixo foram selecionados:' + chr(13)+chr(10); for i := 0 to listbox1.items.Count - 1 do begin if listbox1.Selected[I] then Resp := Resp + ListBox1.Items.Strings[I] + chr(13)+chr(10); end; Showmessage(Resp); end else if ListBox1.itemindex >= 0 then // Lista com Seleo simples Showmessage('Opo Selecionada pelo Usurio: ' + trim(ListBox1.Items.Strings[ListBox1.ItemIndex])); end; Exerccio Elaborar um aplicativo para incluir e excluir tens em um ListBox a partir de um string de um Edit, excluir tambm tens selecionados na ListBox, gravar a lista ou carregar a lista a partir do arquivo texto Itens.txt.
PAG.62
Propriedades usuais para o CheckListBox Items Contm tens individuais (Strings) que aparecem dentro da Lista. Checked[Index: Integer]: Boolean; Indica quando um determinado tem foi marcado. Selected[Index: Integer]: Boolean; Indica quando um determinado tem foi selecionado. Sorted : (True ou False) Especifica se os tems de uma lista so ordenados alfabeticamente. Mtodos usuais para o CheckListBox
PAG.63
Cdigo - Evento OnClick do Boto procedure TForm1.BitBtn1Click(Sender: TObject); Var I : Integer; begin Memo1.Lines.clear; For I := 0 to CheckListBox1.Items.Count - 1 do if CheckListBox1.Checked[I] then Memo1.Lines.append(CheckListBox1.items.strings[I]); end; Cdigo - Evento OnDlbClick do CheckListBox procedure TForm1.CheckListBox1DblClick(Sender: TObject); begin if CheckListBox1.Checked[CheckListBox1.ItemIndex] then CheckListBox1.Checked[CheckListBox1.ItemIndex] := false else CheckListBox1.Checked[CheckListBox1.ItemIndex] := true; end; 5.7.2.12 Caixa de Texto + Lista ComboBox Uma combinao de caixa de lista de itens ( List Box) e caixa de texto (Edit). O usurio pode escolher um item dentro da lista ou digitar um valor na caixa de texto.
PAG.64
Propriedades usuais para o ComboBox Items Contm tens individuais (Strings) que aparecem dentro da Lista. Style Determina a forma e o funcionamento do ComboBox. Sorted : (True ou False) Especifica se os tems de uma lista so ordenados alfabeticamente. Mtodos usuais para o ComboBox Mesmos mtodos do CheckListBox.
Exerccio Elaborar um aplicativo para incluir no ComboBox (Style csDropDownList) uma tabela de Histricos a partir do arquivo Historicos.txt e mostrar qual o histrico que o usurio selecionou.
Cdigo - Evento OnClick do Boto procedure TForm1.BitBtn1Click(Sender: TObject); begin if ComboBox1.ItemIndex = -1 then exit; ShowMessage('Opo Selecionada: ' + ComboBox1.Items.Strings[ComboBox1.Items.IndexOf(ComboBox1.Text)]); // ComboBox1.Text ); Melhor Alternativa end; Cdigo - Evento OnActivate do Form procedure TForm1.FormActivate(Sender: TObject);
PAG.65
! (E xclam ao ) > (M aior q ue) < (M enor Q ue) < > (M eno r e M aio r Q ue) \ (B arra Invertid a) L (L etra L M aiscula) l (L etra l M inscula) A (L etra A M aiscula) a (L etra a M inscula) C (L etra C M aiscula) c (L etra c M inscula) 0 (Z ero ) 9 (N o ve) #
D escrio C aracteres em b ranco no so arm azenad o s T o d o s o s caracteres estaro em m aisculo s at q ue ap area o caractere < . T o d o s o s caracteres estaro em m insculos at que aparea o caractere > . T o do s os caracteres estaro arm azenad o s co m o fo ram d igitad o s p elo usurio . O s caracteres ap s a b arra so tratad o s co m o literais. F az co m q ue ap enas os caracteres alfab ticos sejam aceitos na p osio o nde se enco ntra o L , m as o s caracteres n o p o d em ser o m itid o s p elo usurio . F az co m q ue ap enas os caracteres alfab ticos sejam aceitos na p osio o nde se enco ntra o l, m as os caracteres po d em ser o m itid os p elo usurio . F az co m q ue ap enas o s caracteres alfanum rico s sejam aceito s na p o sio o nd e se enco ntra o A , m as o s caracteres n o p od em ser om itid o s pelo usurio. Q uaisq uer caracteres p o dem ser aceitos na p osio o nde se encontra a letra C , m as o s caracteres n o p o d em ser o m itid o s p elo usurio . F az co m q ue ap enas o s caracteres alfanum rico s sejam aceito s na p o sio o nd e se enco ntra o A , m as o s caracteres n o p od em ser om itid o s pelo usurio. Q uaisq uer caracteres p o dem ser aceitos na p osio o nde se enco ntra a letra C , m as o s caracteres p o d em ser o m itid os p elo usurio . F az co m q ue ap enas os caracteres num ricos sejam aceitos na p osio o nd e se enco ntra o Z ero , m as o s caracteres n o p od em ser om itid o s p elo usurio. F az co m q ue ap enas os caracteres num ricos sejam aceitos na p osio o nd e se enco ntra o N o ve, m as o s caracteres p o dem ser o m itido s pelo usurio . F az co m q ue ap enas os caracteres num ricos e sinais de ad io (+ ) o u sub trao (-) sejam aceito s na po sio ond e se enco ntra o # , m as os caracteres po d em ser o m itido s pelo usurio . U sad o p ara sep ara H o ras, M inutos e S egund o s. U sad o p ara sep ara D ias, M eses e A no s. U sad o p ara inserir esp ao s na caixa d e ed io
AutoSelect: Para True todo o texto ser selecionado automticamente quando o controle MaskEdit receber o foco.
PAG.66
Exerccio Elaborar um aplicativo para receber o Nome , Data de Admisso e o Salrio do Empregado usando o componente MaskEdit para formatar e ajudar a validao. Nome : Campo Obrigatrio , tamanho mximo de 25 , converter para maisculo via mscara. Data de Admisso: Campo Obrigatrio e com data Vlida no formato dd/mm/aaaa e menor que a data corrente. Salrio : Campo Obrigatrio com o tamanho mximo de 7 dgitos e 2 decimais.
PAG.67
Cdigo procedure TForm1.ButtonOKClick(Sender: TObject); begin // Verificar o Nome if trim(MaskEditNome.Text) = '' then begin ShowMessage('Falta Nome do Funcionrio'); MaskEditNome.SetFocus; Exit; end; // Verificar a Data if trim(MaskEditAdmissao.Text) = '/ /' then begin ShowMessage('Falta informar a data de admisso'); MaskEditAdmissao.SetFocus; Exit; end; // Verificar a Data if length(trim(MaskEditAdmissao.Text)) < 10 then begin ShowMessage('Informar a Data no formato dd/mm/aaaa'); MaskEditAdmissao.SetFocus; Exit; end; // Verificar a Data Try StrToDate(MaskEditAdmissao.Text); Except on EconvertError do begin ShowMessage('Data de Admisso Invlida'); MaskEditAdmissao.SetFocus; Exit; end; end; // Verificar a Data if StrToDate(MaskEditAdmissao.Text) > date then begin ShowMessage('Data de Admisso Maior que a Data Corrente'); MaskEditAdmissao.SetFocus; Exit; end; // Verificar o Salrio if (trim(MaskEditSalario.Text) = '') or (StrToFloat(MaskEditSalario.Text) = 0 ) then begin ShowMessage('Falta o Salrio do Funcionrio'); MaskEditSalario.SetFocus; Exit; end; // Mostrar os Dados ShowMessage('Nome: ' + MaskEditNome.Text + chr(13) + chr(10) + 'Admisso : ' + FormatDateTime('dd/mm/yyyy',strtodate(MaskEditAdmissao.Text)) + chr(13) + chr(10) + 'Salrio : ' + FormatFloat('R$ ##,###.#0',StrToFloat(MaskEditSalario.Text)/100));
PAG.68
PAG.69
6.1.1 MESSAGEDLG
Exibe uma mensagem personalizada, numa caixa de dilogo com um ou mais botes de presso ( por exemplo , botes Ok e Cancelar ou, ainda, Sim e No) e, com um cone ilustrativo. Sintaxe: MESSAGEDLG (Mensagem, cone Ilustrativo, Tipos de Botes, HelpCtx); Onde: cone Ilustrativo: Valor MtInformation MtError MtWarning MtConfirmation MtCustom Tipos de Botes: Valor MbYes MbNo MbOK MbCancel MbHelp MbAbort MbRetry MbAll Significado Um boto com um tick verde e a palavra Yes na superfcie. Um boto com um smbolo de proibido e a palavra No na superfcie. Um boto com um tick verde e a palavra OK na superfcie. Um boto com um X vermelho e a palavra Cancel na superfcie. Um boto com um ? vermelho e a palavra Help na superfcie. Um boto com um tick vermelho a palavra Abort na superfcie. Um boto com um homem verde e a palavra Retry na superfcie. Um boto com dois ticks verdes e a palavra All na superfcie. Significado I Azul representativo de uma mensagem informativa. Sinal vermelho de parada, indicando uma operao ilegal sendo executada. ! Amarela representativa de uma operao de risco que exige ateno. ? Verde Iniciativa da necessidade de uma deciso do usurio. No possui nenhum cone ilustrativo.
Valor Retornado para os Botes: Valor MrYes MrNo MrOK MrCancel MrHelp MrAbort MrRetry MrAll Significado Selecionou o boto Yes. Selecionou o boto No. Selecionou o boto OK. Selecionou o boto Cancel. Selecionou o boto Help. Selecionou o boto Abort. Selecionou o boto Retry. Selecionou o boto All.
HelpCtx: Parmetro que define qual a tela de ajuda apropriada para a caixa, se esta a possuir. O zero indica que esta caixa no tem uma tela de ajuda associada. Exemplos: MessageDlg (Bem Vindo ao Object Pascal!, MtInformation, [MbOK], 0); MessageDlg (Confirma Atualizao ?, MtConfirmation, [MbYes, MbNo], 0);
PAG.70
6.1.2 MESSAGEDLGPOS
Similar a MessageDlg. A nica diferena que sua posio deve ser definida pelo usurio, no ficando obrigatrio a caixa de mensagem no centro da tela. Sintaxe: MESSAGEDLGPOS (Mensagem, cone Ilustrativo, Tipos de Botes, HelpCtx, PosX, PosY);
6.1.3 SHOWMESSAGE
Exibe uma caixa de mensagem simples com o boto OK. Sintaxe: SHOWMESSAGE (Mensagem); Exemplo: ShowMessage (Programas Delphi so mais produtivos!);
6.1.4 SHOWMESSAGEPOS
Exibe uma caixa de mensagem simples com o boto OK especificando a posio da caixa na tela.. Sintaxe: SHOWMESSAGEPOS (Mensagem, PosX, PosY); Exemplo: ShowMessagePos (Delphi um produto da Borland, 150, 300);
6.1.5 MESSAGEBOX
Como vimos, algumas caixas de mensagens permite utilizao de vrios botes de presso, cuja finalidade permitir a interao com o usurio. No obstante, a legenda de tais botes escrita em ingls, o que pode gerar algumas incovenincias para o desenvolvedor. Uma maneira de contornar o problema utilizar este comando. Alm disso, ele permite que voc defina o ttulo e o texto da caixa. Sintaxe: Application.MessageBox (Mensagem, Ttulo, Tipo de Botes); Exemplo: IF Application.MessageBox ('Finalizar o Aplicativo?', 'Sada do Aplicativo',Mb_YesNoCancel) = IdYes then Form1.Close;
PAG.71
6.2.1 INPUBOX
Exibe uma caixa na qual voc define o ttulo, um texto explicativo e um valor padro digitado, cabendo ao usurio fornecer ou no uma string. Se o usurio pressionar o boto Cancel o valor digitado no ser atribudo a varivel. Sintaxe: InputBox ( Ttulo, Texto Explicativo, Valor Padro); Exemplo : Escola := InputBox (Informaes de Entrada, Identificao da Escola:, Face-Fumec);
6.2.2 INPUQUERY
Exibe uma caixa na qual voc define o ttulo, um texto explicativo, uma varivel para receber o valor digitado. A funo retorna True se o usurio pressionou o boto OK. Sintaxe: InputQuery ( Ttulo, Texto Explicativo, Varivel para Recepo de Dados); Exemplo: procedure TForm1.FormActivate(Sender: TObject); Var Escola : String; begin Escola := 'Face-Fumec'; if Inputquery ('Informaes de Entrada', 'Identificao da Escola:', Escola) then ShowMessage ('Pressionou OK' + Digitou: + Escola); end;
PAG.72
10
Nmero do cone 1 2 3 4 5 6 7 8 9 10
Nome ou Rtulo OpenDialog SaveDialog OpenPictureDialog SavePictureDialog FontDialog ColorDialog PrintDialog PrinterSetupDialog FindDialog ReplaceDialog
Finalidade Exibe caixa de abertura de arquivos. Exibe caixa de salvamento de arquivos. Exibe caixa de abertura de figuras. Exibe caixa de salvamento para arquivos de figuras. Exibe caixa de formatao de fontes. Exibe caixa de formatao de cores. Exibe caixa de controle de impresso. Exibe caixa de configurao de impresso. Exibe caixa de dialgo para localizao de textos. Exibe caixa de dialgo para localizao e substituio de textos.
O primeiro item do menu ainda no foi definido. A partir do momento em que o definirmos o Menu Designer ir destacar um prximo item. Para definirmos o item Arquivo, basta digitarmos esta palavra na propriedade Caption do menu; o Delphi se encarregar de inseri-l corretamente. Caso voc digite &Arquivo, o item ter com tecla de atalho a letra sublinhada, ajuste tambm a propriedade Name do menu com um nome padronizado como MnuArquivo .
PAG.73
Neste instante, temos definidos vrios menus que sero teis no aplicativo que estamos desenvolvendo. Definiremos agora as opes de cada um. Para isto, clique no menu Arquivo do formulrio e, clique no item em branco logo abaixo. Agora digite as opes deste menu da maneira como elas se apresentam na figura seguinte:
Importante: Para obter o efeito da linha separadora das opes Arquivo e Sair, no item abaixo de Novo, digite (-) hfen.
Uma vez construdo o menu principal do aplicativo, construiremos sua tela e escreveremos seu cdigo. Comeando pela tela do formulrio, na pgina Standard, selecione o componente Memo e clique no formulrio (veja a figura abaixo).
PAG.74
At agora, embora tenhamos o menu aplicativo pronto, suas opes no executam absolutamente nada. Para resolvermos este problema necessrio que ao serem clicadas, portanto ao ativarem o evento OnClick, executem um cdigo correspondente. Para escrever o cdigo de cada opo, basta selecionar a opo desejada a partir do prprio formulrio. O Delphi o remeter, no Code Editor, precisamente ao evento OnCLick do boto selecionado. Escreveremos inicialmente o cdigo das opes Arquivo/Novo e Arquivo/Sair. Veja a seguir:
Nosso prximo passo ser escrever o cdigo para as opes do Menu Editar. Comearemos com as trs ltimas opes para depois tratarmos da primeira opo. Veja o cdigo abaixo:
PAG.75
Por fim, a opo Editar Fonte. Seu objetivo ser o de permitir a mudana do estilo de letra do texto escrito no campo Memo. Para realizar isto, precisamos, primeiro, que voc insira no formulrio o componente FontDialog da pgina Dialog. E logo depois escreva o cdigo abaixo no evento OnClick da opo Editar Fonte.
PAG.76
8. Menu Pop-Pup
um Menu que aparece quando o usurio aperta o boto direito do mouse na aplicao
PAG.77
Para construirmos o Menu Popup, precisaremos, primeiro, de um novo projeto (clique no menu File/New aplication) e, depois, no componente PopupMenu na pgina Standard. D um clique neste componente e em seguida no interior do formulrio. Clique duplo sobre o cone do PopupMenu no seu formulrio, isto ativar o PopupMenu Designer, observe-o na figura abaixo:
PAG.78
Executando o Exemplo:
A Janela de Cdigo para acionar o PopupMenu e executar o cdigo associado as opes do PopMenu.
PAG.79
Propriedades
Eventos
9.2 Propriedades
As propriedades so atributos dos objetos/componentes com os quais podemos interagir. Sua importncia vital para a programao Delphi uma vez que, o estado de cada propriedade pode e, as vezes, precisa ser regulado atravs de comandos apropriados. O bom uso das propriedades determina em boa parte, o bom uso do Delphi. Cada objeto ou componente tem propriedades especificas para as suas finalidades. Suas configuraes podem ser feitas mediante o Object Inspector ou mediante linhas de cdigo. Por exemplo, para mudar a legenda de um boto de presso. J as configuraes alteradas atravs de linhas de comando so da maior importncia durante o tempo de execuo do projeto. Muitas vezes tais mudanas podem ser necessrias. Um exemplo seria mudar a fonte de um texto em funo de ajustes promovidos pelo usurio atravs de uma caixa de dilogo adequada. Caso voc deseje aprofundar-se na programao Delphi, um primeiro e importantssimo passo seria o de observar com ateno as propriedades exibidas no Object Inspector enquanto clica em cada objeto alocado na janela do formulrio em uso e tentar compreender a importncia de cada propriedade. Para manipular o estado de uma propriedade no Object Inspector, basta dar um clique na lacuna ou edit frente e observar se ela trs sub-opes. Caso seja mostrado um combo, isto significar que a propriedade permite certo nmero de possibilidades de ajustes. Caso seja mostrado apenas um edit, voc dever digitar alguma coisa (p.e. a propriedade Caption que define a legenda de um boto de presso). Caso observe um sinal (+) frente do nome da propeiedade, isto significar que o acesso s sub-opes se d atravs de um clique duplo sobre o nome da propriedade. Para manipular o estado de uma propriedade atravs de linhas de comando , voc dever trabalhar um pouco com programao orientada objetos. Por exemplo, para definir um boto de presso em estado desativado ser necessrio o cdigo: Boto1.Enabled := False; Traduzindo numa regra geral: NomeDoObjeto.NomeDaPropriedade := NovoValor ou Estado;
PAG.81
3. 4.
Para criar cada uma das trs janelas( verde, amarela e azul); clique em File/New Form e, na propriedade Color do formulrio, selecione a cor correspondente janela criada. No evento OnCLick dos botes de presso, escreva o cdigo abaixo e , a seguir, execute a aplicao.
PAG.82
3. 4. 5.
Defina na propriedade FormStyle deste formulrio, a opo fsMDIForm. Isto indica que este formulrio ser considerado o principal. Clique em File/New Form e dedina sua propriedade FormStyle para fsMDIChild. Isto indica que este novo formulrio ser um sub-formulrio (filho) do principal. No evento OnClick da opo Nova, no menu Janela, escreveremos o cdigo (veja listagem abaixo) responsvel pela criao e utilizao de diversos sub-formulrios, a partir da execuo desta aplicao MDI.
PAG.83
7. Por fim, para garantir o bom funcionamento completo desta aplicao, devemos introduzir o cdigo abaixo no evento OnClose do Form2. Este cdigo garantir que as janelas ou sub-formulrios criados semelhana do Form2, desaloquem recursos que utilizam do sistema, no momento em que forem fechadas.
Finalmente, agora poderemos executar a aplicao e colher seus resultados. Contudo, cabe uma observao final: lembre-se dos comandos utilizados no evento OnClick da opo Nova, pois podero ser teis para desenvolver aplicaes que, embora utilizem vrios sub-formulrios, os criem e exibam em momentos diferentes e atravs de outros comandos acionados pelo usurio.
PAG.84
Agora devemos escrever o cdigo correspondente a cada um dos botes de presso de modo que, possam enviar ou resgatar informaes pela rea de Transferncia. Veja o cdigo a seguir:
Observao: a respeito do cdigo acima, vale dizer que utilizamos a propriedade Enabled dos botes, como forma de controlarmos o acesso do usurio. Da maneira como fizemos, aproximamos o funcionamento destes trs botes do padro estabelecido pelo programa Windows. Assim, se o usurio j tiver utilizado os botes copiar ou recortar, estes ficaro desabilitados, ao passo que o boto colar estar habilitado e, vice-versa.
PAG.85
5.
6.
PAG.86
Veja algumas funes e procedures que voc precisa conhecer para trabalhar com arquivos de texto, e depois construa um programa que armazena e l dados em um arquivo de texto. Sintaxe AssignFile(NomeInterno, NomeExterno) Rewrite(NomeInterno) Reset(NomeInterno) Readln(NomeInterno,NomeLinha) Writeln(NomeInterno,NomeLinha) CloseFile(NomeInterno) EOF(NomeInterno) Tipo Proc Proc Proc Proc Proc Proc Func Descrio Associar o Nome interno do arquivo ao Nome Externo. Cria e abre um novo arquivo. O arquivo existente com o mesmo nome ser sobrescrito. Abre um arquivo existente. O arquivo de texto aberto no modo read-only. L a linha de texto corrente de um arquivo de texto aberto. Cada linha termina com a combinao CR/LF. Escreve uam linha de texto no arquivo aberto, com uma combinao CR/LF no final. Termina de atualizar o arquivo corrente e fecha o arquivo. Permite identificar o final do arquivo, retornando um valor booleano.
Componente
Memo Name Lines Align ScrollBar Name Filter Name Filter Filter Filter Name Filter Filter Name Filter Name Filter Filter Filter Name Filter Filter DefaultExt
Propriedade
Valor
MemEditor Vazio alClient ssVertical DlgAbrir Arquivos de Textos *.txt Todos Arquivos *.* DlgSalvar Arquivos de Textos *.txt Todos Arquivos *.* Txt
OpenDialog
SaveDialog
PAG.87
PAG.88
PAG.89
PAG.90
Manipulao de Arquivos
Alguns comandos podem ser uteis para manipular o arquivo .INI :
GetDir
Retorna o diretrio corrente do drive especificado. D pode assumir os seguintes valores: 0 - Default 1-A 2-B 3-C Sintaxe: GetDir(D: Byte; var S: String);
FileExists
A funo FileExist retorna True se o arquivo especificado existe. Sintaxe: FileExists(const FileName: string): Boolean;
DeleteFile
A funo DeleteFile apaga o arquivo especificado do disco. Se o arquivo no poder ser apagado ou no existir retorna falso. Sintaxe: DeleteFile(const FileName: string): Boolean;
PAG.91
ArqClientes uma varivel de arquivo de tipo TRClientes. As variveis de arquivo so usadas com muitas procedures e funes de I/O de arquivos. RClientes uma varivel do tipo TRClientes. Como seu novo tipo, TRClientes, um registro, RClientes se torna um buffer com a estrutura do tipo TRClientes. Isso permite que voc leia ou escreva os dados facilmente no buffer, com uma linha de cdigo, enquanto mantm certa ordem. Cada registro salvo no disco ter o mesmo tamanho, independente dos dados nele introduzidos. Isso tambm conhecido como registro de comprimento fixo e o que est pro trs dos arquivos com tipo. Antes de ir mais longe com o seu programa, d uma olhada nas funes e procedures que usar para trabalhar com arquivos com tipo. Sintaxe AssignFile(NomeInterno, NomeExterno) FileExists(NomeExterno) Rewrite(NomeInterno) Reset(NomeInterno) Read(NomeInterno,NomeLinha) Write(NomeInterno,NomeLinha) Seek(NomeInterno,Posio) FilePos(NomeInterno) FileSize(NomeInterno) EOF(NomeInterno) CloseFile(NomeInterno) Tipo Proc Func Proc Proc Proc Proc Proc Func Func Func Proc Descrio Associar o Nome interno do arquivo ao Nome Externo. Retorna True se o arquivo especificado existir, caso contrrio retorna False. Cria e abre um novo arquivo. O arquivo existente com o mesmo nome ser sobrescrito. Abre um arquivo existente. Ler registros do arquivo. Escrever registros do arquivo. Usada para mover o ponteiro do arquivo para o registro ou posio especificada dentro do arquivo aberto. Recupera a posio corrente do ponteiro do arquivo. Recupera o tamanho de um arquivo aberto em bytes. Retorna zero caso no exista nenhum registro. Permite identificar o final do arquivo, retornando um valor booleano. Termina de atualizar o arquivo corrente e fecha o arquivo.
Ajuste as propriedades dos Componentes de acordo a tabela abaixo: Componente Form1 Propriedade Name Caption Position BorderIcons.biMaximize BorderStyle Name Caption Enabled Valor FrmClientes Cadastro de Clientes PoScreenCenter False BsSingle FraDados Nenhuma Opo Selecionada False
GroupBox1
PAG.92
Edit2
Edit3
ComboBox1
MaskEdit1
GroupBox2 Button1
Button2
Button3
Button4
Button5
BitBtn1
GroupBox3
Button6
Button7
BitBtn2
ListView1
PAG.93
Listagem do Programa Fonte: unit UFrmClientes; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, Buttons, ComCtrls; type TFrmClientes = class(TForm)
PAG.94
Type TRClientes = record Excluido : boolean; Nome : string[40]; Endereco : string[40]; Cidade : string[20]; UF : string[2]; Cep : string[8]; End; { Funes e Procedures do Usurio } Procedure LiberaDados; Procedure LiberaOpcoes; Procedure TelaRegistro; Procedure CarregaListView; var FrmClientes: TFrmClientes; ArqClientes : File of TRClientes; RClientes : TRClientes; Posicao : LongInt; PastaArquivo : String; CargaLista : Byte; implementation {$R *.DFM}
PAG.95
PAG.96
PAG.97
ShowMessage(FraDados.Caption +' - Arquivo Atualizado'); { Limpar o Formulrio } if FraDados.Caption = 'INCLUSO' then CmdLimpar.Click else CmdCancelar.Click; end; procedure TFrmClientes.CmdIncluirClick(Sender: TObject); begin FraDados.Caption := 'INCLUSO'; LiberaDados; TxtNome.Setfocus; end; procedure TFrmClientes.CmdCancelarClick(Sender: TObject); begin { O Componente ListView est Visivel } If LVwConsulta.Visible then Begin FrmClientes.Caption := 'Cadastro de Clientes'; LVwConsulta.Visible := false; FraDados.Visible := True; LiberaOpcoes; CmdIncluir.Setfocus; Exit End; { Cancelar as Atualizaes } CmdLimpar.Click;
PAG.98
PAG.99
procedure TFrmClientes.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; CloseFile(ArqClientes); end; procedure TFrmClientes.CmdLArquivoClick(Sender: TObject); Var ArqNovo : File of TRClientes; PastaArquivo1 : String; I, P : LongInt; begin If Application.MessageBox('Confirma a limpeza do Cadastro de Clientes?','Cadastro de Clientes', Mb_YesNo) = IdNo then Exit; { Abertura do Arquivo Novo para sada } GetDir(0,PastaArquivo1); {Retorna a Pasta do Drive Default} PastaArquivo1 := PastaArquivo1 + '\Clientes.tmp'; AssignFile(ArqNovo, PastaArquivo1); Rewrite(ArqNovo); P := 0; for I := 0 to FileSize(ArqClientes) - 1 do begin Seek(ArqClientes,I); Read(ArqClientes,RClientes); If Rclientes.Excluido then Continue; {Ignora registros excluidos} Seek(ArqNovo,P); Write(ArqNovo,RClientes); P := P + 1; end; CloseFile(ArqClientes); {Fechar Arquivo Velho} CloseFile(ArqNovo); {Fechar Arquivo Novo} Erase(ArqClientes); {Eliminar Arquivo Velho} Rename(ArqNovo,PastaArquivo); {Renomear Arquivo Novo} Reset(ArqClientes); {Reabrir Arquivo Novo} ShowMessage('Limpeza de Arquivo Concluida'); end;
{ Adaptao para Verso 3 } procedure TFrmClientes.LVwConsultaChanging(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean); begin If FraDados.Caption = 'CONSULTA' then exit; IF CargaLista = 1 then exit; { Acessa os campos do item ListView e move para Frame de Dados de Atualizao} TxtNome.Text := Item.Caption; TxtEndereco.Text := Item.SubItems.Strings[0]; TxtCidade.Text := Item.SubItems.Strings[1]; CmbUF.Text := Item.SubItems.Strings[2]; MskCep.Text := Copy(Item.SubItems.Strings[3],1,2) + Copy(Item.SubItems.Strings[3],4,3) + Copy(Item.SubItems.Strings[3],8,3); Posicao := StrToInt(Item.SubItems.Strings[4]); FrmClientes.Caption := 'Cadastro de Clientes'; LVwConsulta.Visible := false; FraDados.Visible := True; LiberaDados; end; end.
PAG.100
Reset(NomeInterno,TamanhoRegistro) BlockRead(NomeInterno,NomeBuffer,TamanhoDoB loco,BytesLidos) BlockWrite(NomeInterno,NomeBuffer,TamanhoDo Bloco,BytesGravados) Seek(NomeInterno,Posio) FilePos(NomeInterno) FileSize(NomeInterno) EOF(NomeInterno) CloseFile(NomeInterno)
O Programa Fonte : unit UTroca; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
PAG.101
implementation {$R *.DFM} procedure TForm1.CmdAbrirClick(Sender: TObject); begin If DlgAbrir.Execute then begin PastaArquivo := DlgAbrir.FileName; TxtArquivo.Text := DlgAbrir.FileName; end; end; procedure TForm1.CmdProcessarClick(Sender: TObject); var X : Integer; begin AssignFile(Arquivo,PastaArquivo); Reset(Arquivo,1); While not Eof(Arquivo) do Begin Posicao := FilePos(Arquivo); BlockRead(Arquivo,Buffer,Sizeof(Buffer),BytesLidos); For X := 1 to BytesLidos do begin If Buffer[X] = 32 then Buffer[X] := 44; end; Seek(Arquivo,Posicao); BlockWrite(Arquivo,Buffer,BytesLidos); end; CloseFile(Arquivo); ShowMessage('Processamento Concluido'); end; procedure TForm1.CmdSairClick(Sender: TObject); begin Application.Terminate; end; end.
12.3 Impresso
Esta seo ensina como voc imprime sem usar as ferramentas acessrias, como QuickReport. O QuickReport ser abordado em outro captulo. Aqui voc aprender dois modos de imprimir diretamente dos programas Delphi, o que pode evitar sobrecarga, se
PAG.102
Suponha, por exemplo, que voc queira imprimir um texto usando o objeto impressora. O cdigo poderia ser: Printer.BeginDoc; Printer.Canvas.TextOut(200,100, Testando a Impressora); Printer.EndDoc;
Esse cdigo faz o texto Testando a Impressora ser impresso a partir do (200) pixel a direita e do (100) para baixo da pgina (Canvas).
PAG.103
O Programa Fonte: unit UImpressora; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Printers; type TForm1 = class(TForm) DlgAbrir: TOpenDialog; LblMsg1: TLabel; CmdAbrir: TButton; CmdImprimir: TButton; DlgImpressora: TPrintDialog; DlgFonte: TFontDialog; LblMsg2: TLabel; CmdFonte: TButton; procedure CmdAbrirClick(Sender: TObject); procedure CmdFonteClick(Sender: TObject); procedure CmdImprimirClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Arquivo : String; implementation {$R *.DFM} procedure TForm1.CmdAbrirClick(Sender: TObject); begin if DlgAbrir.Execute then begin Arquivo := DlgAbrir.FileName; LblMsg1.Caption := 'Pronto para imprimir: ' + Arquivo; end; end; procedure TForm1.CmdFonteClick(Sender: TObject); begin Dlgfonte.Execute; end; procedure TForm1.CmdImprimirClick(Sender: TObject); Var Arq : TextFile; Linha, NumeroPagina : String; CTLinhas, TamanhoLinha, LinhasPorPagina, TamanhoFonte, TamanhoPagina, NumeroCopia, TotalCopias, PosY, PosX : Integer; begin
PAG.104
PAG.105
Dbase
Paradox
Outros
SQL Links
ODBC
Interbase
Informix
Outros
Driver ODBC
Outros Drivers
O uso do BDE, por no permitir o acesso direto aos dados, traz apenas um pequeno inconveniente: ao instalar o aplicativo Delphi nos computadores clientes, voc ter de instalar tambm o BDE ( o programa de instalo do BDE distribuido gratuitamente pela Borland) para que os aplicativos de banco de dados funcionem corretamente. O Delphi possui componentes prprios para aplicaes de banco de dados. Eles concentram-se nas pginas DataAccess e DataControl. Os componentes contidos na primeira pgina reservam-se para operaes de interao e manipulao de dados. J os componentes da Segunda pgina so destinados ao uso visual atravs de formulrios. Veja a seguir uma rpida descrio de cada componente.
8 Finalidade
Nmero do cone
Nome ou Rtulo
PAG.106
2 1 2 3 4 5 6 7e8 9 10 11 12 13 14 15
10
11
12
13
14
15
DBGrid DBNavigator DBText DBEdit DBMemo DBImage DBListBox e DBComboBox DBCheckBox DBRadioGroup DBLookUpListBox DBLookUpComboBox DBRichEdit DBCtrlGrid DBChart
Permite a visualizao, atualizao ou excluso de todos os dados de uma tabela. Possibilita a interao do usurio com os dados de uma tabela atravs de botes de navegao e de manipulao de registros. Similar ao componente Label, exibe o contedo de campos num controle no editvel. Exibe o contedo do campo permitindo edies. Exibe e permite alteraes em extensos campos de textos. Exibe figuras armazenadas em registros de uma tabela. Permite a seleo de um nico valor de um conjunto de valores especificados. Constri uma caixa de verificao associada a um campo boleano. Fornece um conjunto de opes de seleo exclusiva a partir de dados de uma tabela. Permite a seleo numa caixa de listagem, de um nico valor de um conjunto de valores especificados provenientes de uma tabela. Permite a seleo combo ou pop-up, de um nico valor de um conjunto de valores especificados provenientes de uma tabela. Permite edio de um campo memo do tipo Rich Text. Permite a utilizao de vrios componentes relacionados a dados numa nica grade multi-registro. Cria um grfico em tempo de execuo a partir de dados armazenados em tabela.
BDE
Durante nossa abordagem sobre o desenvolvimento de aplicaes de banco de dados, nos concentraremos em dois componentes fundamentais expostos acima: Table e Query. Faremos uso do termo DataSet para designarmos genericamente, os dados correspondentes a cada um deles quando relacionados a um banco de dados. Assim, ao utilizarmos o componente Table, o DataSet equivale a todos os registros do banco de dados associado. Por outro lado, ao utilizarmos o componente Query, o DataSet ser o conjunto dos registros selecionados atravs de comando SQL.
PAG.107
Table -Propriedades e Metodos Atualizao da Tabela LTP-III - LINGUAGENS E TCNICAS DE PROGRAMAO III PAG.108
PAG.109
Atravs do Object Inspector, atribua s propriedades DataBaseName, TableName e Active (esta propriedade deve ser modificada por ltimo) do componente Table e; propriedade DataSet do componente DataSource, os valores indicados na figura seguinte.
PAG.110
PAG.111
Porque usar SQL? Facilidade de uso para recuperar e atualizar dados no Banco de Dados. Padro de mercado. Rapidez no desenvolvimento e manuteno dos Aplicativos.
Onde usar o SQL? Os comandos SQL so usados em componentes SQL localizado na guia Data Access da Palheta de Componentes do Delphi.
Organizao da SQL DDL - Linguagem de Definio de Dados Composta de comandos para criar e modificar a estrutura das tabelas e ndices que vo compor o Banco de Dados: CREATE - Criar tabelas e ndices DROP - Remover tabelas e ndices ALTER - Alterar a estrutura de uma tabela
DML - Linguagem de Manipulao de Dados Composta de comandos para atualizar e recuperar os dados das tabelas do Banco de Dados: SELECT - Recuperar dados no Banco de Dados INSERT - Incluir Dados no Banco de Dados UPDATE - Alterar Dados no Banco de Dados DELETE - Excluir Dados no Banco de Dados
SQL - Comando SELECT Descrio: Recupera uma linha ou parte da linha de uma tabela. Recupera multiplas linhas ou parte das linhas de uma tabela. Recupera linhas relacionadas ou parte das linhas a partir de duas ou mais tabelas.
SQL Sintaxe Comando SELECT SELECT [DISTINCT] * | <Lista de Campos> FROM <Lista de Tabelas> WHERE <Condio de Seleo> GROUP BY <Lista de Campos> HAVING <Condio de Seleo do Grupo> ORDER BY <Lista de Campos de ordenao> Operadores Aritmticos: +,-,*,/ Ex.: (Salario * 1.15) AS SalarioAtual Relacionais: > , < , = , <> , >= , <= Ex.: WHERE Codigo >= 120 Lgicos: AND , OR , NOT Ex.: WHERE (Depto = Informtica) AND (Salario > 1200) Outros operadores para expresses lgicas Faixa - BETWEEN val1 [NOT] BETWEEN val2 AND val3 Ex.: SALARIO BETWEEN 800 AND 1200
PAG.112
Funes
CONCATENAO, LOWER , UPPER , TRIM , SUBSTRING Estatstica: AVG , COUNT , MAX , MIN , SUM Data: EXTRACT Converso de Tipos de Dados CAST STRING - Funo - Concatenao Objetivo: Concatenar dois ou mais Strings. Sintaxe: string1 || string2 || string3 Exemplos: Select Nome || , || Admissao as Empregado from Pessoal STRING - Funo LOWER Objetivo: Converte todos ao caracteres para minsculo. Sintaxe: LOWER(coluna_referncia ) Exemplos: Select Nome, Depto, Salario from Pessoal where Lower(Depto) = comercial STRING - Funo UPPER Objetivo: Converte todos ao caracteres para maisculo Sintaxe: UPPER(coluna_referncia ) Exemplos: Select Nome, Salario from Pessoal where Upper(Nome) = MARIA STRING - Funo SubString Objetivo: Extrair uma substring de uma String. Sintaxe: SUBSTRING(coluna_referncia FROM Inicio_index [FOR tamanho]) Exemplos: SELECT * FROM Pessoal Where SUBSTRING(Nome FROM 2 FOR 1) = a STRING - Funo TRIM Objetivo: Remover determinado caracter a esquerda, direita ou ambos de uma string. Sintaxe: TRIM([LEADING|TRAILING|BOTH] [trimmed_char] [FROM] coluna_referncia ) Strings:
PAG.113
Estatstica -Totais com Quebra Group By e Having Group By Agrupa linhas com coluna de mesmo valor em uma simples linha. GROUP BY coluna_referncia [, coluna_referncia ...] Ex.: Select Filial, Depto , Count(*) as Empregados, Sum(Salario) as Total_Salarios from Pessoal Group By Filial, Depto Having Especifica critrios de seleo para um comando Select.
PAG.114
Order By Ordenao Order By Classifica a linhas recuperadas de um comando SELECT ORDER BY coluna_referncia [ASC|DESC] [, coluna_referncia [ASC|DESC] ...] Ex.: Select Depto, Nome, Salario From Pessoal Order By Depto ASC , Salario DESC
Exemplos Comando SELECT SELECT Depto as Departamento, Count(*) as Total_Empregados, Avg(Salario) as Salario_Medio, Max(Salario) as Maior_Salario, Min(Salario) as Menor_Salario, Sum(Salario) as Total_Salarios From Pessoal GROUP BY Depto ORDER BY Depto Asc
Funes de Manipulao de Datas DATAS : Funo EXTRACT Objetivo: Extrair o Ano, Ms ou o Dia de uma Data. Sintaxe: EXTRACT (extract_field FROM coluna_referencia) Exemplos: EXTRACT(YEAR FROM DataVenda) AS YY EXTRACT(MONTH FROM DataVenda) AS MM EXTRACT(DAY FROM DataVenda) AS DD SELECT Depto, Nome, extract(day from admissao) as DiaAniversario from pessoal where extract(month from admissao) = 10 order by depto Funes para Converso de Tipos de Dados CONVERSO : Funo CAST Objetivo: Converso de um dado de um tipo para um tipo de dado especificado. Sintaxe: CAST(coluna_referencia AS data_tipo) Exemplos: CAST(DataVenda as CHAR(10)) CAST(10/05/1999 as DATE) CAST(CODVENDA as NUMERIC) Select * from Vendas Where DataVenda = CAST(10/05/1999 as DATE) O comando Select com outros comandos Select embutidos um comando Select que usa o resultado de outro comando Select embutido. Exemplos Comando SELECT Elaborar uma lista dos empregados que ganham o menor salrio pago pela empresa com o Nome, Departamento e o salrio, ordem de Depto e Nome. SELECT Depto as Departamento, Nome, Salario From Pessoal WHERE salario = (SELECT Min(Salario) from Pessoal) ORDER by Depto, Nome
PAG.115
Elaborar uma lista de empregados com o Nome, dependentes e grau de dependncia,ordem de Nome. Select Nome, Dependente, Desc_Dep from Pessoal, Depende, Cod_Dep Where (Pessoal.Codigo = Depende.Codigo) AND (Depende.CodDep = Cod_Dep.CodDep) Order By NOME
PAG.116
Elaborar uma lista de empregados com o Nome, dependentes e grau de dependncia,ordem de Nome. Select Nome, Dependente, Desc_Dep from Pessoal INNER JOIN Depende ON (Pessoal.Codigo = Depende.Codigo) INNER JOIN Cod_Dep ON (Depende.CodDep = Cod_Dep.CodDep) Order By NOME
PAG.117
2.
PAG.118
2.
PAG.119
4. 5.
Clique no boto Ok e, na propriedade Active, selecione a opo True. Execute a aplicao e compare os resultados com a figura a seguir.
PAG.120
Os dois botes laterais (<< e >>) sero usados para mover para o primeiro ou para o ltimo registro da tabela, e os dois do meio (< e >), para mover para o registro anterior ou para o registro posterior. Para conseguirmos certos efeitos, devemos conhecer seis mtodos que devero estar associados ao evento OnCLick de cada boto de presso. So eles: FIRST: Posiciona o ponteiro da tabela diretamente no primeiro registro. LAST: Posiciona o ponteiro da tabela diretamente no ltimo registro. PRIOR: Move o ponteiro da tabela para o registro imediatamente anterior ao registro atual. NEXT: Move o ponteiro da tabela para o registro imediatamente posterior ao registro atual. Para aplic-los, voc dever, primeiro, efetuar a conexo entre os componentes Table e DataSource do formulrio. Em seguida ser necessrio associar a cada um dos DBEdits, a um campo da tabela Country do banco de dados DBDemos (escolhemos esta tabela arbitrariamente). A associao dos DBEdits a um campo da tabela feita: (1) atribuindo propriedade DataSource, o componente DataSource1 e depois, (2) atribuindo propriedade DataField o nome do campo desejado (para efeito do exemplo desta apostila, escolha os campos Continent e Name).
A seguir, escreva o cdigo relativo a cada um dos botes de presso com exposto abaixo:
PAG.121
Utilizamos no cdigo dois mtodos extras, a saber: EOF e BOF. Eles so importantes uma vez que permitem detectar, respectivamente, quando nos posicionamos no primeiro ou no ltimo registro. Se nos posicionamos no primeiro registro, devemos desabilitar os botes CmdPrimeiro e CmdAnterior pois no tero nenhum efeito sobre a tabela. Por outro lado, se nos posicionamos no ltimo registro, devemos desabilitar os botes CmdUltimo e CmdProximo. Agora estamos prontos para compilar e executar a aplicao.
PAG.122
13.11 Dbnavigator
Caso voc no ache interessante ter todo o trabalho de programao do exemplo anterior, pode simplesmente usar o DBNavigator, que um componente reservado para operaes de manipulao e navegao entre registros. Atravs deste componente, alm de obtermos os mesmos resultados no que se refere a movimentao, temos a disposio recursos para incluso, alterao e excluso de registros. Para utiliz-lo basta inseri-lo no formulrio e, atravs da propriedade DataSet, conect-lo ao DataSource apropriado. Boto First Prior Next Last Insert Delete Edit Post Cancel Finalidade Move o registro corrente para o primeiro registro no DataSet , desabilita os botes First e Prior, e habilita os botes Next e Last se eles estiverem desabilitados. Move o registro corrente para o registro anterior em relao ao registro atual e habilita os botes Last e Next se eles estiverem desabilitados. Move o registro corrente para o prximo registro em relao ao registro atual e habilita os botes First e Prior se eles estiverem desabilitados. Move o registro corrente para o ltimo registro no DataSet , desabilita os botes Last e Next , e habilita os botes First e Prior se eles estiverem desabilitados. Inserso de um novo registro antes do registro corrente e coloca o DataSet no modo de Inserso. Elimina o registro corrente e coloca o prximo registro como registro corrente. Coloca o DataSet em estado de Edio para que o registro corrente possa ser modificado. Grava as modificaes feitas no registro corrente no banco de dados. Cancela a edio do registro corrente, reapresenta o registro na tela nas condies em que estava antes da edio, e desabilita o modo de Inserso e Edio se eles estiverem ativos.
PAG.123
PAG.124
Agora inseriremos um campo calculado que representar a densidade demogrfica. Para isto, clique com o boto direito na tela vazia do Fields Editor, e selecione a opo New Field. A caixa de dilogo que surgir permitir a criao de um campo especial para cculos ao qual daremos o nome de Densidade. Preencha os campos segundo ilustra a figura abaixo:
Em seguida construiremos a frmula matemtica que fornecer o valor para o novo campo. Isto deve ser feito no evento OnCalcFields do componente Table. O cdigo necessrio mostrado a seguir:
Podemos escrever este cdigo diretamente porque, quando voc usa o Fields Editor, alguns componentes relacionados com os campos so automaticamente includos no formulrio e no Code Editor. Cada vez que voc incluir ou remover campos no Fields Editor, poder ver o efeito de sua ao imediatamente no formulrio. Voc no ver os valores de um campo calculado, porque eles somente esto disponveis em tempo de execuo, uma vez que resultam da execuo de cdigo Pascal compilado. O formulrio exposto abaixo, mostra o funcionamento do campo calculado neste exemplo.
PAG.125
Observao: O mesmo procedimento para utilizao de campos calculados podem ser utilizados para Queries.
PAG.126
Estes comandos so suficientes para o nosso primeiro teste, contudo, tenha em mente que o componente Table pode fazer pesquisas somente com campos indexados. Por esta razo, voc precisa configurar a propriedade IndexFieldNames do componente Table para o valor apropriado.
Escreva para o evento OnCLick dos botes de presso Aplicar e Cancelar (cuja propriedade Name de cada um possui os valores CmdAplicar e CmdCancelar) o cdigo abaixo:
PAG.127
O campo que ser referenciado durante as pesquisas, deve ser um campo indexado e indicado atravs da propriedade IndexFieldNames . Compile e execute este projeto e informe para os edits valores numricos referentes ao contedo do campo Species No.
PAG.128
Este novo componente pode ser conectado a duas fontes de dados (DataSource) ao mesmo tempo, uma com os dados reais e uma Segunda com os dados exibidos. Basicamente queremos conect-lo ao campo CustNo do DataSource1, mas deixar que ele mostre dados extrados de outra tabela, Custormer. Para obtermos este efeito no precisaremos digitar uma linha de comando sequer. Basta ajustarmos corretamente as propriedades DBLookupComboBox, Table e DataSource. Primeiramente, faremos a conexo entre o DataSource1 e o Table1 com o banco de dados DBDemos e com sua tabela Order. Em seguida, conectaremos o DBEdit1 e o DBEdit2 do formulrio, com o DataSource1. Faremos tambm a conexo entre o DataSOurce2 e o Table2 com o banco de dados DBDemos e com sua tabela Customers. Por fim, ajustaremos as propriedades do DBLookupComboBox conforme indicado abaixo e, mudaremos as propriedades Active dos componentes Table, para True. As ppropriedades KeyField, ListFIeld e ListSource sero necessrias para relacionar as duas tabelas. Note que KeyField indica o campo CustNo, que contm os cdigos dos clientes, presentes nas duas tabelas e fundamental para o relacionamento. Tambm observe que ListField, juntamente com ListSource, indicam o campo cujo contedo ser mostrado no ComboBox, bem como sua origem na tabela Customers. Veja abaixo o efeito destes comandos e note que o nome do cliente e seu cdigo so entrelaados, ou seja, alterando-se um , aletra-se o outro.
PAG.129
Ao clicar o boto Visualizar todos os Registros, os usurio ter acesso aos campos First_Name e Occupation da tabela Clients.
Para o boto Executar Query, criamos um cdigo um pouco mais complexo, cujo objetivo ser adaptar-se s informaes fornecidas pelo usurio atravs dos Edits.
PAG.130
Compile e execute esta aplicao lembrando-se que dever informar nos Edits, os dados que iro compor as condies da clasula Where da Query, antes de clicar no boto Executar Query.
PAG.131
Como voc pode ver, ao determinarmos a forma de visualizao e a orientao da impresso, devemos clicar no boto Prosseguir. Este boto ser o responsvel pelo funcionamento correto do QuickReport. Veja a seguir os comando do evento OnClick deste boto.
PAG.132
Componente QuickReport
O primeiro componente o componente QuickRep1, encontrado no formulrio QRListForm (Formulrio container para desenhar o relatrio), e inserido automaticamente . necessrio modificar umas propriedades para que o relatrio funcione. Alm disso, tambm precisaremos modificar as propriedades do componente Master Table para indicar o banco de dados DBDemos e a tabela Animals, fazendo tambm o relacionamento do componente QuickRep1 com o Master Table atravs da propriedade DataSet.
PAG.133
No esquea de mudar para True o valor da propriedade Active do componente Master Table. Veja a figura a seguir . Ela mostra o relatrio da maneira com que o usurio veja os dados. Para chegarmos a isto, utilizamos os componentes QRLabel, QRDBText, QRSysData, QRDBImage e QRBand ( inserido de forma automtica pelo assistente) no formulrio QRListForm.
PAG.134
Para que voc possa inserir o nome do peixe, ser necessrio, na rea de Detalhe, inserir o componente QRDBText. Contudo o funcionamento correto deste componente, depende de certos ajustes em suas propriedades DataSource e DataField. O mesmo se aplica ao componente QRDBImage para mostrar a fotografia do peixe. O ttulo do relatrio e os ttulos das colunas: Nome do Peixe e Fotografia do ambiente foram escritos no espao destinado ao Titulo e cabealho de pgina, utilizando os componentes QRSysData (Titulo, Data, Hora, N Pgina, ... ) e QRLabel. A partir deste ponto, poderamos propor novas modificaes no relatrio, mas sabendo que todos os componentes e cdigos bsicos j esto devidamente colocados desejvel test-lo. Salve o projeto, compile-o e execute-o .
PAG.135
PAG.136
Herana
muito comum precisarmos de uma verso ligeiramente diferente de uma classe existente. Por exemplo, s vezes poderia ser til adicionar ou alterar um mtodo existente. Mudando o cdigo original, voc pode criar problemas de funcionamento para as Units que utilizam-se dele. Uma pssima alternativa poderia ser a de copiar o cdigo referente quela Classe e , aps fazer as alteraes necessrias, dar a classe um novo nome. Isto no recomendvel uma vez que a duplicao de mtodos poderia gerar inconsistncias com os dados utilizados. A sada protanto seria definir uma nova classe que possa aproveitar todo o cdigo de uma classe sem, claro, duplic-lo, e efetuar as devidas mudanas apenas em sua estrutura. Esta tcnica chamada de herana ou derivao. Para herdar as caractersticas de uma classe existente, necessrio indic-la na declarao da nova classe: Type TnovoForm = Class (TForm) End; A definio acima indica que a classe recm criada TnovoForm herda todos os mtodos, e elementos da classe Tform. Na verdade, por sua vez, TForm herda tambm uma srie de caractersticas da classe Tobject.
Encapsulamento
Durante o desenvolvimento de uma classe segundo uma boa abordagem orientada a objetos, o programador deve definir quais os objetos e mtodos estaro disponveis mais tarde para diversas aplicaes e, quais devero permanecer ocultos sob pena de prejudicar o bom funcionamento da classe. A tcnica de ocultamento de variveis e mtodos conhecida como encapsulamento. Certas palavras chaves devem ser utilizadas durante o desenvolvimento de uma classe, como forma de restringir o acesso completo a certos objetos e mtodos. Basicamente estas palavras chaves so: private e public. A primeira define objetos e mtodos no disponveis fora da unit em que a classe foi desenvolvida. A segunda refere-se a objetos e mtodos disponveis totalmente a patir de qualquer aplicao. Por exemplo, observe a declarao da classe abaixo: Type TnovaClasse = Class(TObject) Private X,Y, Z : Integer; Function Exemplo1(Valor : Integer): Integer; Public Nome: String; Procedure Exemplo2 (N : String); Function Exemplo3 : Boolean; End;
PAG.137
{ Herana } }
Private { Encapsulamento Dia, Mes, Ano : Integer; SData : Boolean; Procedure Separa_Dados (DataCompleta : String); Public
{ Propriedade SemanaData }
Property SemanaData: Boolean read SData Write SData default False; Constructor Inicializa; Function Data_Formatada (Dt : String) : String; End; Var Meses : array [1..12] of string[9] = ('Janeiro','Fevereiro','Maro', 'Abril','Maio','Junho','Julho', 'Agosto','Setembro','Outubro', 'Novembro','Dezembro'); implementation Constructor TData.Inicializa; { Este construtor importante para evitar erros em tempo de execuo ocasionados por uma inicializao invlida dos objetos abaixo } Begin Dia := 0; Mes := 0; Ano := 0; End; Procedure TData.Separa_Dados(DataCompleta : String); Begin Dia := StrToInt(Copy(DataCompleta,1,2));
PAG.138
{ Mtodo Data_Formatada }
Function TData.Data_Formatada(Dt : String) : String; Begin Separa_Dados(DT); if not SData Then { Verifica o valor da propriedade SemanaData } Data_Formatada := IntToStr(Dia) + ' de ' + Meses[Mes] + ' de ' + IntToStr(Ano) else Data_Formatada := FormatDateTime('dddd',strtodate(Dt)) + ', ' + IntToStr(Dia) + ' de ' + Meses[Mes] + ' de ' + IntToStr(Ano); End; end. Digite o cdigo acima e salve (File/Save) a nova unit com o nome Udatas. Em seguida clique no menu File/Close all. Agora, criaremos um novo projeto contendo uam unit e um formulrio. Para isto, clique no menu File/New application. Estamos prontos para desenvolver um projeto que lhe permita compreender como utilizar a classe Tdata. Construa agora o formulrio segundo o exemplo abaixo:
Desenhe o formulrio acima colocando no formulrio os componentes EditBox, GroupBox, dois RadioButton, tres Label e dois Button. Em seguida ajuste as propriedades dos componentes conforme o desenho acima. Tela do aplicativo em execuo:
PAG.139
PAG.140
Observaes: Foi acrescentado unit, abaixo da clasula Var, o cdigo: Data : TData. Alm disso, na clasula Uses, adicione a unit UDatas. Agora, devemos incluir a unit TData, que foi salva separadamente, no projeto que estamos desenvolvendo. Sem esta etapa, o Delphi no poder utiliz-la uma vez que ela no faz parte do projeto. Para isto, clique no menu View/Project Manager. Em seguida clique no cone Add unit . Selecone o arquivo UDatas.pas e clique no boto Abrir . A partir de agora basta compilar e executar o projeto ( menu Run/Run ).
Classes so implementadas por estruturas do tipo Class Trata-se da unio de dados e cdigo numa mesma estrutura . Extenso do tipo Record: Alm dos campos de dados incluem : Mtodos (Procedimentos e Funes sobre os dados).
Classe pode conter campos, mtodos e propriedades As propriedades parecem ser campos, mas no so. Na verdade elas definem mtodos que so automaticamente executados toda vez que o valor da propriedade lida ou alterada.
Classes e Objetos Uma vez declarada uma classe podemos declarar variveis dos respectivos tipos. A instncia da classe , que surge aps a chamada a um mtodo construtor e efetivamente ocupa espao na memria, d-se o nome genrico de objeto.
Mtodos construtores e destrutores Os Objetos so criados a partir da ativao de um mtodo construtor e so destrudos a partir da ativao de um mtodo destrutor. Os mtodos construtores e destrutores so declarados como se fossem procedimentos normais, porm no lugar da palavra procedure usada a palavra constructor e destructor. A forma de trabalhar com classes e respectivos objetos obedece uma seqncia: o A criao o O uso o A destruio do objeto
Criando um Objeto A criao do objeto ocorre quando o construtor ativado por meio de uma referncia ao nome da classe.
O que ocorre quando o construtor chamado Campos numricos, inteiros ou reais so inicializados com zero. Campos de tipo Pointer (inclusive os do tipo class) so inicializados com Nil. Os campos do tipo string so inicializados com vazio.
Usando um Objeto Os campos , mtodos ou propriedades do objeto so referenciados pela varivel do tipo class.
Implementando Mtodos
PAG.141
O Parmetro Invisvel: Self Os mtodos possuem um parmetro invisvel chamado Self. O tipo do parmetro Self o mesmo da classe a que o mtodo pertence. Durante a execuo , Self uma referncia ao objeto usado na ativao do mtodo. Tudo se passa como se os mtodos fossem declarados da seguinte forma: o Procedure TNomeClasse.NomeMetodo (Self : TNomeClasse; ...);
Destruindo um objeto Os objetos so destrudos pela chamada a um mtodo destrutor. Quando um mtodo destrutor chamado, os seus comandos so executados para liberar a rea ocupada pelo objeto.
Exemplo: Type TVetor = Class V : Array Of String; // Vetor dinmico Max , Tam : Integer; Constructor Cria (I : Integer); Destructor Destroi; Procedure Incluir(S : String); Function Pesquisa(S : String ;Var P : Integer) : Boolean; End; Implementation { TVetor } Constructor TVetor.Cria(I: Integer); begin // Aloca array dinmico com capacidade p/ I itens SetLength(V,I); // inicializa indices de controle Max := I; Tam := 0; end; Destructor TVetor.Destroi; begin V := nil; // desaloca o array dinmico end; Herana a capacidade de criarmos novas classes a partir de classes existentes. Aproveitamos a funcionalidade anterior, adicionamos funcionalidade e modificamos comportamento, criando assim uma nova classe com parte de sua funcionalidade j testada, tornando-a assim mais confivel.
Exemplo: Type Tpilha = Class(TVetor) public FTopo : String; Constructor Cria(I : Integer); Procedure Empilhar(S : String); Procedure Desempilhar; Procedure Esvaziar; End; implementation { Tpilha } constructor Tpilha.Cria(I: Integer); begin Inherited Cria(I); // Chama o construtor herdado FTopo := ''; end; Polimorfismo a capacidade de tratarmos objetos de diferentes tipos de uma mesma maneira, desde que eles tenha um ancestral comum. No Delphi todos os objetos so derivados de um tipo bsico chamado TObject. Portanto, qualquer funo, expresso ou estrutura que lide com TObject poder lidar tambm com qualquer outro tipo de objeto.
Referncias para Classes Tipos que so referncias para classes permitem a realizao de operaes diretamente sobre as classes, ao invs de sobre as suas instncias.
PAG.142
Encapsulamento A idia por trs do conceito de encapsulamento que quanto menos o usurio da classe souber sobre a implementao da classe, menos ser afetado por eventuais alteraes. Evitando que o desenvolvedor que usa a classe, crie cdigo dependente de informaes da implementao da classe.
Private Sees Private restringem o acesso s variveis, propriedades e mtodos nela declarados ao mdulo onde est definida a classe.
Protected Sees Protected restringem o acesso s variveis , propriedades e mtodos nela declarados ao mdulo onde est definida a classe e nas classes descendentes.
Public Published Sees Published no restringem o acesso s variveis , propriedades e mtodos da classe. Qualquer declarao nesta parte, alm do mesmo nvel de visualizao da seo public, gera RTTI Run Time Type Information, entre outras que as propriedades ou eventos da classe sejam manipulados atravs do Object Inspector do Delphi (Componentes). Sees Public no restringem o acesso s variveis , propriedades e mtodos da classe.
Exemplo: Type TCliente = Class Private FCodigo : LongInt; FNome : String; Protected Function GetCodigo : LOngInt; Function GetNome : String; Procedure SetCodigo(Value : LongInt); Procedure SetNome(Value : String); Public Constructor Create; Property Codigo : LongInt read GetCodigo Write SetCodigo; Property Nome : String SetNome; End; Implementation { TCliente } constructor TCliente.Create; begin FCodigo := 0; FNome := ''; end; function TCliente.GetCodigo: LongInt; begin Result := FCodigo ; end; function TCliente.GetNome: String; begin Result := FNome ; end; procedure TCliente.SetCodigo(Value: Integer); begin FCodigo := Value; end; procedure TCliente.SetNome(Value: String); begin FNome := Value; end; Biblioteca de Classes Uma biblioteca de classes um conjunto planejado de classes e construdo para ser utilizado em vrios projetos de desenvolvimento. As classes pertencentes ao conjunto so relacionadas entre si por herana ou simples utilizao mtua.
PAG.143
Componentes Personalizados So componentes construdos por voc ou qualquer desenvolvedor e no fazem parte do conjunto padro da VCL.Podemos adicionar componentes a VCL, escrevendo-os em Object Pascal.
Porque Construir Componentes? A idia compor uma aplicao atravs de fragmentos de cdigo, pr-construdos e customizveis. Desta forma uma aplicao robusta construda de forma mais confivel e rpida, pois supe-se que estes fragmentos de cdigo j tenham sido testados de modo a funcionar de forma correta e eficiente.
Componentes Viabilidade de Desenvolvimento 1. 2. 3. 4. Temos tempo o bastante para construir o componente de forma confivel? Temos certeza que no existe um componente na VCL que faz o que precisamos com a adio de uma poro de cdigo menor? Iremos utilizar o componente repetidas vezes atravs deste e outros projetos? Os esforos exigidos para construir o componente so justificados?
OOP para construo de componentes J vimos que um componente uma classe derivada de TComponent da VCL. Ao construirmos um componente estamos lidando com classes, enquanto o usurio de nosso componente ir lidar com o objeto. Para usurios o importante saber usar o componente, no importando como foram implementadas as diversas propriedades, mtodos e eventos do nosso componente.
Ancestral e Descendentes Ao construir um componente, necessrio saber o que as classes tm a oferecer, para poder decidir de qual classes o componente ir descender. necessrio saber tudo que o componente herdou e tirar o maior proveito destas caractersticas sem ter que rescrevlas. Todas as classes que esto acima do nvel hierrquico do ancestral imediato, so tambm ancestrais do componente.
Hierarquia de Classes Todo relacionamento ancestral-descendente cria uma rvore de dependncia chamada hierarquia de classes. A cada gerao de um descendende, a classe passa conter mais caracteristicas.
PAG.144
Mtodo Esttico Todos os mtodos de classe so estticos, a no ser que se diga ao contrrio. Mtodos estticos funcionam como procedures ou functions normais. A principal vantagem desde tipo de mtodo a rapidez na chamada (Execuo). TMeuComponente = Class(TComponent) Procedure FacaAlgo; (.....) End;
Mtodo Virtual Chamar um mtodo virtual igual ao esttico , porm o endereo do mtodo no definido em tempo de compilao. A declarao de um mtodo virtual adiciona uma entrada na virtual method table (VMT) que guarda os endereos de todos os mtodos virtuais de uma classe. TMeuComponente = Class(TComponent) Function Data_Hora : TDateTime; Virtual; (.....) End;
Mtodo Dynamic Mtodos dinmicos so como mtodos virtuais, exceto pelo fato de que os mtodos dinmicos no possuem entrada na VMT da classe. Isto reduz a quantidade de memria usada para alocar o objeto, porm a chamada a mtodos dinmicos mais lenta que a mtodos virtuais. TMeuComponente = Class(TComponent) Procedure FacaAlgo; Dynamic; (.....) End;
Mtodo Override So mtodos que substituem mtodos virtuais da classe ancestral. Os mtodos Override devem ser declarados com o mesmo nome e os mesmos parmetros do mtodo virtual da classe ancestral.
Exemplo: Ancestral Classe TProjeto Type TProjeto = Class ..... Function CustoAtual : Double; Virtual; Function Info: String ; Virtual; End; Implementation ... Function TProjeto.CustoAtual : Double; Begin Result := 0.0; End; Function TProjeto.Info : String; Begin Result := ; End; .... End.
Descendente Classe TProjeto Type TProjetoSoftware = Class(TProjeto) ..... Function CustoAtual : Double; Override; Function Info: String ; Override; End;
PAG.145
Mtodo Overrride Complementa o que feito no virtual Function TProjetoHardware.CustoAtual : Double; Begin // Obtem custo atual da classe superior Result := Inherited CustoAtual; // Completa com o custo atual da prpria classe Result := Result + CustoComponentes + CustoPlaca + CustoMecanica ; End; Procedure ClasseDerivada.Proc Begin Inherited Proc; // Ativa o Proc Herdado ... // Faz o que tem que fazer End; Classe pode conter propriedades As propriedades parecem ser campos, mas no so. Na verdade elas definem mtodos que so automaticamente executados toda vez que o valor da propriedade lida ou alterada . A vantagem mais importante do uso de propriedades a possibilidade destas aparecerem no Object Inspector, em tempo de desenvolvimento. Isto simplifica muito o trabalho do desenvolvedor, pois permite o controle de vrios parmetros da classe sem ter de pass-los ao construtor.
Declarao de Propriedades Property NomePropriedade : TipoPropriedade read Campo/Mtodo de Leitura [write Campo/Mtodo de Escrita] Protected FMax , FValor : Integer; // Campos Published Property Max : Integer read FMax Write FMax; Property Valor : Integer read FValor; // read-only Mtodo de Leitura - Propriedades um mtodo que controla o acesso de leitura.(Function) Type TAlgumComponente = Class(TComponent) Protected FCampo : Integer; Function GetCampo : Integer; Published Property Campo : Integer read GetCampo Write End;
FCampo;
PAG.146
SetCampo;
TIPOS PREDEFINIDOS DE EVENTOS TNotifyEvent Procedure (Sender : TOBject) Of Object; Ex: OnClick 2. TMouseEvent Procedure (Sender : TOBject; ...) Of Object; Ex: OnMouseDown 3. TDragOverEvent Procedure (Sender : TOBject; ...) Of Object; Ex: OnDragOver TIPOS DE EVENTOS PERSONALIZADO e declarao de eventos Type MeuTipoEvento = Procedure (Sender : TObject; ...) of Object; Declarao do Evento segue as regras de declarao de propriedades: Property NomeDoEvento : TTipoEvento read FCampoEvento write FCampoEvento; Registrando Componentes Registrar um componente a tarefa de fazer este componente vlido para o IDE (Integrated Development Environment). Uma vez que um componente est instalado, ele pode ser selecionado da palheta de componentes do Deplhi para ser usado nas aplicaes. O Registro de componentes baseado por unit. Se existir mais de um componente na mesma unit, estestes sero registrados em conjunto. 1.
Procedure Register Para registrar um componente adicione uma procedure Register unit do componente. A implentao desta procedure deve chamar a funo RegisterComponents para cada componente a ser registrado, passando o nome da pgina na qual o componente ser instaladoe o(s) nome(s) do(s) componente(s).
PAG.147
PAG.148
DecodeTime Decodifica um valor TDateTime em Words de hora, minuto, segundo e milissegundos EncodeDate Retorna um TDateTime a partir de Words de dia, ms e ano
PAG.149
Rotina Chr StrToInt TryStrToInt IntToStr StrToIntDef IntToHex Round Trunc StrToFloat TryStrToFloat FloatToStr FormatFloat
Descrio Byte em Char String em Integer Integer em String String em Integer, com um valor default caso haja erro Nmero em String Hexadecimal Arredonda um nmero real em um Integer Trunca um nmero real em um Integer String em Real Real em string
Nmero real em string usando uma string de formato. X := FormatFloat($##,##0.00,Y);
DateToStr StrToDate TryStrToDate TimeToStr StrToTime TryStrToTime DateTimeToStr StrPas(x) StrToDateTime Pchar(x)
FormatDateTime
TDateTime em string de data, de acordo com as opes do Painel de Controle String de data em TDateTime TDateTime em String de Hora String de hora em TDateTime TDateTime em string de data e hora PChar para String String de data e hora em TDateTime String para PChar
TDateTime em string usando uma string de formato. X:=FormatDateTime('dddd dd/mmm/yyyy',date); Qualquer tipo em outro usando argumentos do tipo Variant. Ex: Varcast(X, Y, vtString); Variant em qualquer tipo. X:=VarAsType(Y,vtString);
PAG.150
o Desenho e a Codificao
Ctrl+Shift+i Selecione as linhas que quer alinhar direita, depois
pressione as teclas Ctrl+Shift ao mesmo tempo e a tecla i para cada espao direita.
Ctrl+Shift+u
Selecione as linhas que quer alinhar esquerda, depois pressione as teclas Ctrl+Shift ao mesmo tempo e a tecla u para cada espao esquerda. Para fazer o cut/copy em uma coluna de cdigo, pressione a tecla Alt e ao mesmo tempo selecione com o mouse ou as teclas o texto que pretender. Selecione os vrios componentes de um form ao pressionar a tecla shift e ao clicar nos componentes a selecionar. Move nas vrias direes o componente selecionado.
Alt+seleo
Shift+Mouse
Ctrl+Setas
Shift+Setas
PAG.151
BIBLIOGRAFIA
. Delphi 6 Kylix Curso Completo Axcel Books do Brasil Marcelo Leo. . Delphi 5 Guia do Desenvolvedor Teixeira e Pacheco Campus. . Como programar em Delphi Makron Books Frank Engo . Aprenda em 14 dias Delphi Borland Press Editora Campus - Osier, Batson e Grobman . Delphi 4 Total Dominando a Ferramenta Brasport Mauricio Longo , Ronaldo Smith Jr. . Usando SQL no Delphi - Leandro Cristovo - Visual Books . Delphi 7 - Internet e Banco de Dados - Emerson Facunte - Brasport . Delphi 6 Programao Orientada a Objetos Faial Farhat de Carvalho - rica . Delphi 7 Dominando o Delphi 7 Marco Cant Makron Books
PAG.152