146
Sumário PRIMEIROS PASSOS ___________________________ 3 ANATOMIA DE UMA JANELA _________________________________ 5 MENU, BARRA DE FERRAMENTAS E PALETA DE COMPONENTES _____________ 6 Barra de Ferramentas __________________________________ 6 PALETA DE COMPONENTES __________________________________ 7 JANELAS DO DELPHI ______________________________________ 8 PRIMEIRO PROGRAMA _______________________ 10 ADAPTAR AS PROPRIEDADES DOS OBJETOS ____________________ 12 SALVAR ______________________________________________ 22 EXEMPLO I- CALCULADORA __________________ 26 PROPRIEDADES ____________________________________ 34 BorderStyle __________________________________________ 34 Default ______________________________________________ 35 Tabstop _____________________________________________ 36 Name _______________________________________________ 37 Caption _____________________________________________ 37 Text ________________________________________________ 37 MÉTODO _____________________________________________ 38 Setfocus _____________________________________________ 38 VARIÁVEIS NO DELPHI ___________________________________ 38 Formas de Declarar uma Variável ________________________ 39 FORMATAÇÃO DE NÚMEROS _______________________________ 39 Formatando Data e Hora: ______________________________ 40 MODIFICANDO A CALCULADORA ___________________________ 41

00200 - Delphi 5

Embed Size (px)

Citation preview

Page 1: 00200 - Delphi 5

Sumário

PRIMEIROS PASSOS ___________________________ 3ANATOMIA DE UMA JANELA _________________________________ 5MENU, BARRA DE FERRAMENTAS E PALETA DE COMPONENTES _____________6Barra de Ferramentas __________________________________ 6PALETA DE COMPONENTES __________________________________ 7JANELAS DO DELPHI ______________________________________ 8

PRIMEIRO PROGRAMA _______________________ 10ADAPTAR AS PROPRIEDADES DOS OBJETOS ____________________ 12SALVAR ______________________________________________ 22

EXEMPLO I- CALCULADORA __________________ 26PROPRIEDADES ____________________________________ 34BorderStyle __________________________________________ 34Default ______________________________________________ 35Tabstop _____________________________________________ 36Name _______________________________________________ 37Caption _____________________________________________ 37Text ________________________________________________ 37

MÉTODO _____________________________________________ 38Setfocus _____________________________________________ 38VARIÁVEIS NO DELPHI ___________________________________ 38Formas de Declarar uma Variável ________________________ 39FORMATAÇÃO DE NÚMEROS _______________________________ 39Formatando Data e Hora: ______________________________ 40MODIFICANDO A CALCULADORA ___________________________ 41

Celta Informatica
Todos os direitos reservados e protegidos pela Lei 5.988 de 14/12/73. Nenhuma parte deste livro, sem previa autorizacao por escrito de Jose Arnaldo Rodrigues (Celta Informatica), podera ser reproduzida total ou parcialmente, por qualquer processo, eletronico, fotocopia, mecanico ou sistema de processamento de dados. Obrigado pela preferencia, Celta Informatica. http://www.celtainformatica.com.br E-mail: [email protected] Fone: (11) 4331-1586
Page 2: 00200 - Delphi 5

DEPURAÇÃO _________________________________ 46

EXEMPLO II - JOGO DA VELHA _______________ 51

EXEMPLO III - BLOCO DE NOTAS _____________ 65

EXEMPLO IV - RELÓGIO DESPERTADOR ______ 79

MÉTODO GRÁFICO ___________________________ 83DESENHO DE PONTO _____________________________________ 83CORES _______________________________________________ 84DESENHO DE LINHAS ____________________________________ 85DESENHO DE RETÂNGULOS ________________________________ 90DESENHO DE ELIPSES ____________________________________ 92FIGURAS _____________________________________________ 93

EXEMPLO V - CATÁLOGO _____________________ 99INSERINDO UMA NOVA UNIDADE ___________________________ 101TIPOS DE DADOS ______________________________________ 102REGISTROS __________________________________________ 103PONTEIRO DE REGISTROS ________________________________ 106

BANCO DE DADOS SIMPLES _________________ 113DATABASE DESKTOP _____________________________________114

INTEGRANDO MS-WORD COM DELPHI ______ 137

LISTA DE EXERCÍCIOS_______________________ 144

Page 3: 00200 - Delphi 5

Página: 3

Delphi 5

Celta Informática - F: (11) 4331-1586

��������

PRIMEIROS PASSOS

Vantagens : - Facilidade em alterações e implementações- Melhor Estruturação do código- Velocidade- Verdadeira orientação a objetos

Delphi possui um ambiente de desenvolvimento fácil de usar, com umagrande Biblioteca de Componentes Visuais (VCL - Visual ComponentLibrary). A VCL contém código de botões campos, rótulos, gráficos, cai-xas de diálogo e acesso e tabelas de bancos de dados, e foi desenvolvi-da levando em conta as velocidades no desenvolvimento de aplicativos ena execução destes aplicativos.

O rápido desenvolvimento de aplicativos é possível graças aos várioscontroles disponíveis na paleta de componentes, onde o programadorescolhe um destes componentes, e coloca-o diretamente no local dese-jado, dentro de um formulário. O formulário será a janela do aplicativoapresentada ao usuário.

Page 4: 00200 - Delphi 5

Página: 4

Delphi 5

Celta Informática - F: (11) 4331-1586

O Delphi trabalha com eventos que dão início à alguma rotina de traba-lho, ou seja, o programa fica parado até que um evento ocorra. Ele utilizao modelo orientado objetos, permitindo além do uso de objetos existen-tes, também a criação de outros tantos.Um programa tradicional, feito para ser executado em DOS, é organiza-do em torno de estruturas de dados com um loop principal e uma sériede sub-rotinas constituindo o aplicativo, com procedimentos e funçõesseparados para manipular os dados.

Um programa orientado a objetos e eventos é organizado em torno deum conjunto de objetos. Onde objeto é uma variável com propriedadesque o definem, e vários códigos dando funcionalidade a este objeto. Ouseja, objetos são estruturas que combinam dados e rotinas em umamesma entidade.

Um Objeto possui dados internos, que não podem ser acessados por ou-tros objetos e dados externos, também chamados de propriedades, estaspodendo ser acessadas de fora deste objeto. De maneira semelhante, umobjeto possui rotinas internas que são usadas apenas internamente e roti-nas externas, também chamadas de métodos, que podem ser acessadasexternamente.Um carro é um objeto que possui propriedades e métodos. A tabela abaixolista algumas propriedades e comportamentos do objeto real carro.

freartipo de pinturaacelerarpotência do motormudar marchacomprimentodar partidacorMétodosPropriedades

Um método é uma rotina própria do objeto que o dá funcionalidade, ouseja, torna-o vivo, e as propriedades fazem o intercâmbio entre o objeto eo programa.

Page 5: 00200 - Delphi 5

Página: 5

Delphi 5

Celta Informática - F: (11) 4331-1586

ANATOMIA DE UMA JANELA

A figura abaixo mostra uma janela típica do Windows com seus compo-nentes básicos, que no Delphi chamamos de formulário.

Moldura - Os quatro lados do formulário que definem seu tamanho.

Barra de Título - Na parte superior da moldura com nome do formulárioe documento corrente.

Menu de Controle - À esquerda da Barra de Título. Um botão com oícone que representa o programa.

Botões de Tamanho - À direita da Barra de Título. O botão da esquer-da possui um traço, o outro com uma janela ou duas janelinhas dese-nhadas. Se forem duas janelinhas, mostra que o formulário estámaximizado, e se for uma janela um pouco maior indica que o formulárioestá em seu tamanho normal, podendo ser maximizado. O botão comtraço minimiza a janela.

Barra de Menu - Está abaixo da barra de título e contém as opções decontrole do aplicativo.

Área do Cliente - É a parte interna do formulário, também chamada deárea do documento, utilizada para inserir os controles da aplicação.

Área Externa à Janela - É sua Mesa de Trabalho onde você pode tertantos aplicativos abertos quantos necessitar e a memória do seu com-putador permitir.

Janela - Uma Janela é plena quando podemos dimensioná-la (mini,maxi e restaurá-la) e movê-la.

Page 6: 00200 - Delphi 5

Página: 6

Delphi 5

Celta Informática - F: (11) 4331-1586

MENU, BARRA DE FERRAMENTAS E PALETA DE COMPONENTES

Barra de Ferramentas

Page 7: 00200 - Delphi 5

Página: 7

Delphi 5

Celta Informática - F: (11) 4331-1586

PALETA DE COMPONENTES

A Paleta de Componentes, possui todos os controles necessários para aconstrução da janela - formulário - como um programa de desenho livre.Para incluir um controle no formulário, existem dois métodos:

1 -Duplo-clique no ícone da paleta de componentes insere o controle nocentro do formulário com um tamanho padrão.

2 -Selecionar o ícone na paleta de componentes e depois dar um cliqueno formulário, na posição desejada para o objeto (canto superior es-querdo deste).

Estes controles podem ser dimensionados, depois de inseridos, a qual-quer momento durante o desenvolvimento. Primeiro, selecione o contro-le dando um clique nele e depois arraste um dos oito botõesdimensionadores que circundam este objeto.

Page 8: 00200 - Delphi 5

Página: 8

Delphi 5

Celta Informática - F: (11) 4331-1586

JANELAS DO DELPHI

Formulário

É a janela que aparece no centro da tela do Delphi. Essa é a janela queserá mostrada durante a execução do programa com todos os objetosincorporados.

Controles

Existem vários tipos de objetos no Delphi, entre eles, formulários e con-troles. Controles são todos os objetos que compõem um formulário.Um controle é qualquer objeto que o usuário possa manipular desde quenão seja uma janela (formulário).

Object Inspector

Nesta janela escolhemos como serão as características de cada objetodo formulário (botões de comando, quadros de texto, formulários, e ou-tros), e a que eventos eles responderão, definindo como eles serão apre-sentados e operados pelo código. Cada objeto possui um conjunto es-pecífico de propriedades, com seus valores, associadas a eles. Ao tra-balharmos nos diferentes objetos, a janela Object Inspector nos permi-tirá mudar as propriedades do objeto com o qual estamos trabalhando.Esta janela possui além da divisória Properties a divisória Events ondeestão listados todos os eventos possíveis de ocorrerem com o objetoselecionado.

Page 9: 00200 - Delphi 5

Página: 9

Delphi 5

Celta Informática - F: (11) 4331-1586

Existem propriedades que podemos mudar enquanto construímos nos-so projeto, ou seja, em tempo de projeto, e outras propriedades que sópodemos mudar durante a execução do programa, neste caso em tem-po de execução.

Na janela Object Inspector mostrada anteriormente, temos algumas daspropriedades do formulário assim que iniciamos o Delphi.

Caixa de Objeto - Esta caixa mostra o objeto atualmente selecionado,através dela também poderemos selecionar todos os objetos do formu-lário ativo, alterando as suas propriedades, basta dar um clique na seta,que um menu de cortina se abre, onde poderemos selecionar um objeto.

Nome - Contém o nome do objeto atualmente selecionado, que seráutilizado pelo código. Este nome está na propriedade Name.

Tipo - Nesta posição encontraremos qual é o tipo (classe) do objetoselecionado, se ele é um TForm (formulário), TButton (botão de coman-do), TLabel (legenda), ou então um TEdit (quadro de texto).

Coluna de Propriedades - Exibe todas as propriedades que podemosmodificar em tempo de projeto.

Coluna de Valores - Exibe o valor da propriedade correspondente.

Barra de status – Mostra a quantidade de propriedades que ocultas.

Page 10: 00200 - Delphi 5

Página: 10

Delphi 5

Celta Informática - F: (11) 4331-1586

PRIMEIRO PROGRAMA

Para iniciar, vamos construir um programa que quando for dado um cliqueno botão de comando, será mostrada uma mensagem. E posteriormen-te poderemos alterar a apresentação desta mensagem através de ou-tros botões.

Existem três passos principais para a escrita de uma aplicação no Delphique iremos seguir:

••••• Desenhar as janelas que se deseja usar.Inserir no formulário os controles que serão necessários

••••• Adaptar as propriedades dos objetos.Alterar as propriedades dos controles às necessidades da

aplicação

••••• Escrever o código para os eventos associados.Esta é a parte mais complexa do desenvolvimento, é elaque dá a funcionalidade ao programa, são as rotinas quecomeçam a ser executadas a partir de um evento.

Desenhar as janelas que se deseja usar.

Page 11: 00200 - Delphi 5

Página: 11

Delphi 5

Celta Informática - F: (11) 4331-1586

1. Comece inserindo uma Label (legenda) e um Button (botão de co-mando) no formulário, de uma das duas maneiras:

a - Dando um duplo clique na barra de ferramentas sobrecontrole desejado;

b - Selecionar o controle e dar um clique no formulário.

2. Ao passar o ponteiro do mouse sobre o controle, nos será mostrado oseu nome e tipo.

3. Observe que ao selecionar um objeto, é possível arrastá-lo eredimensioná-lo dentro do formulário utilizando uma das alçasdimensionadoras. Enquanto o controle é movido, o Delphi mostra suaposição, e quando redimensionado aparecem as dimensões.

Sendo: Top = distância entre o topo do formulário e o objeto.Left = distância entre o lado esquerdo do formulário e o obje-

to.Width = largura do objeto.Height = altura do objeto.

4. Arraste o Botão para as coordenadas (40,80) e o Label para (8,16).

Page 12: 00200 - Delphi 5

Página: 12

Delphi 5

Celta Informática - F: (11) 4331-1586

ADAPTAR AS PROPRIEDADES DOS OBJETOS

Para alterar as propriedades de um objeto, ele tem que estar seleciona-do (com as oito alças dimensionadoras visíveis), depois procurar a pro-priedade a ser alterada na janela Object Inspector, e escolher (no casode valores padrão) o seu valor, ou então digitar um novo valor.

Dimensione o formulário da seguinte maneira:

Selecione a propriedade Height, e atribuir a ela o valor de 150.

Selecione a propriedade Width dando o valor de 180.

Page 13: 00200 - Delphi 5

Página: 13

Delphi 5

Celta Informática - F: (11) 4331-1586

Os valores dados para estas propriedades correspondem a Pixels, quesão os pontos do monitor. Sendo o tamanho do objeto no monitor depen-dente da resolução de vídeo utilizada pelo computador.

Altere também as propriedades Name e Caption. A propriedade Name éa identificação do objeto no código da aplicação, pode ser de qualquertamanho mas só são considerados os primeiros 255 caracteres, devecomeçar com uma letra ou uma sublinha (_) não pode conter espaço, eapós o primeiro caractere são permitidos números, letras (não portugue-sas) ou sublinha.

A propriedade Caption é a palavra que aparecerá como título da janela,com até 255 caracteres.

Após você alterar estas quatro propriedades (Caption, Height, Name eWidth) do formulário, ele estará conforme a figura a seguir:

Page 14: 00200 - Delphi 5

Página: 14

Delphi 5

Celta Informática - F: (11) 4331-1586

Agora, altere as propriedades do Label e do Button conforme a figura aseguir. O caractere & quando utilizado na propriedade Caption sublinhao caracter seguinte a ele, identificando-o como atalho para o Windows.

Após alterar a propriedade Caption do controle Label este ficará peque-no, pois a propriedade AutoSize está com o valor True, ou seja, o tama-nho do Label estará sempre de acordo com o conteúdo de Caption.

Page 15: 00200 - Delphi 5

Página: 15

Delphi 5

Celta Informática - F: (11) 4331-1586

Escrever o código para os eventos associados.

O código é escrito na janela Code editor, para acessá-la, selecione obotão Iniciar do formulário e na Object Inspector, clique na página Eventsdando um duplo clique na parte direita da linha que contém o eventoOnClick - a rotina escrita para este evento será executada quando ousuário der um clique no botão Iniciar.

Janela Code Editor

O Code Editor possuí duas seções, o editor de código propriamente ditoe o explorador de código (Code Explorer). O editor de código é utilizadopara acessar o código da aplicação que você está desenvolvendo.

Page 16: 00200 - Delphi 5

Página: 16

Delphi 5

Celta Informática - F: (11) 4331-1586

Já o explorador de código permite navegar entre os diversos procedi-mentos e objetos presentes na aplicação utilizando um diagrama emárvore, com os objetos representados pelos seguintes ícones:

Caso você queira, é possível fechar o explorador de código com um cliqueno seu canto superior direito e abri-lo novamente escolhendo no menuView >> Code Explorer ou Shift+Ctrl+E quando o Code Editor estiverativo.

No Code Editor observamos o nome da procedure, identificando qual oobjeto e o evento que dará início à execução do código, e onde está loca-lizado este objeto. O parâmetro Sender informa ao Delphi qual compo-nente recebeu o evento que chamou a execução deste procedimento.

Todas as instruções a serem executadas por um procedimento devemestar entre as palavras reservadas Begin e End.

Page 17: 00200 - Delphi 5

Página: 17

Delphi 5

Celta Informática - F: (11) 4331-1586

O Code Editor também pode ser acessado dando-se um duplo cliqueno objeto que se queira criar um código exibindo o evento utilizado commaior freqüência, o que não impede a criação de outros códigos utilizan-do mais de um evento para o mesmo componente.

Este primeiro projeto (Início), mostrará uma mensagem no labellblMensagem (objeto) com um clique (evento) no botão btnIniciar (ob-jeto). Ou seja, o programa alterará a propriedade caption de lblMensagem,que contém o texto a ser exibido ao usuário.

Atribuímos valores a uma propriedade de objeto seguindo o padrão:

objeto + . + propriedade + := + valor da propriedade ;

Abra o Code Editor no procedimento do evento OnClick para o botãobtnIniciar e digite o código conforme a seguinte figura. Repare que aodigitar o ponto após lblMensagem, e aguardar alguns instantes, o Delphiexibirá uma lista de propriedades e métodos do objeto Label, que recebeo nome de Code completion.

Para escolher uma propriedade do lblMensagem utilize as setas de dire-ção do teclado e então pressione a tecla Enter quando a propriedadedesejada estiver seleciona, inserindo-a na linha de comando. Ou então,digite a primeira letra da propriedade desejada, e se ela for a seleciona-da, tecla Enter.

Page 18: 00200 - Delphi 5

Página: 18

Delphi 5

Celta Informática - F: (11) 4331-1586

Continue com o código, seguindo a figura mostrada abaixo. Quando fordado um clique em Iniciar, será mostrada a mensagem “Você deu umclique em Iniciar”.

Clique no botão Run da barra de ferramentas ( ), ou pressione a

tecla F9, para o Delphi compilar e executar o projeto. Quando o progra-ma estiver em execução, clique no botão Iniciar para ver o resultado.

Page 19: 00200 - Delphi 5

Página: 19

Delphi 5

Celta Informática - F: (11) 4331-1586

Finalize a execução do projeto com Alt+F4 ou no botão Finalizar ( ) dabarra de título da janela.

Para alternar a visualização entre o Formulário e o Code Editor, utilize o

botão Toggle Form/Unit ( ) da barra de ferramentas ou a tecla F12.

No Delphi existem propriedades que possuem valores predefinidos paraseus valores, como por exemplo a propriedade Alignment. Quando édado um clique na seta da caixa de valor dessa propriedade, aparecemos tipos de alinhamento para o texto dentro do componente. Essas pro-priedades com valores predefinidos também podem ser alteradas comum duplo-clique sobre seu valor, alternado entre todos os valores dispo-níveis.

Selecione o objeto Label através da Caixa de Objeto da janela ObjectInspector, e altere a propriedade Alignment para taCenter, centralizan-do o texto que aparecerá no label.

Altere também a propriedade AutoSize para False, e no formulário au-mente o tamanho do label.

Page 20: 00200 - Delphi 5

Página: 20

Delphi 5

Celta Informática - F: (11) 4331-1586

Além das propriedades descritas acima, com padrões predefinidos, exis-tem outras que possuem inúmeras escolhas, que ao invés de uma seta,possuem três pontos na sua caixa de valor, sendo o caso da propriedadeFont.

Quando damos um clique nos três pontos, aparece um Quadro de Diálo-go onde escolheremos o formato da fonte da mensagem apresentada.

Se for dado um clique no sinal de soma ao lado da propriedade, seráaberta uma lista com seus parâmetros, que podem ser alterados de modosemelhante à caixa de diálogo.

Page 21: 00200 - Delphi 5

Página: 21

Delphi 5

Celta Informática - F: (11) 4331-1586

No projeto Iniciar, teste as alterações defonte e observe as mudanças. Na figura aseguir, foi utilizada a fonte Arial com tama-nho de 14 pontos.

Observe na figura acima que o texto não coube na área de exibição dolabel e nem no formulário, este problema é corrigido utilizando-se umadas duas opções disponíveis. A primeira é alterar para True a proprieda-de WordWrap do label, esta propriedade insere uma mudança de linhaquando o texto atinge a margem direita do objeto. A segunda é alterar ostamanhos do label e do formulário da mesma forma que no Windowsredimensionamos as janelas. Como mostram as figuras a seguir.

Page 22: 00200 - Delphi 5

Página: 22

Delphi 5

Celta Informática - F: (11) 4331-1586

SALVAR

Um projeto em Delphi trabalha com vários arquivos. Um arquivo paracada formulário, outro para unidade e um arquivo para o projeto. Osarquivos de unidades possuem a extensão .PAS, o arquivo do projeto.DPR e o do formulário, .DFM. E outros arquivos que são:

.CFG - armazena as definições de configuração do projeto.

.DOF - contém o compilador e as definições de linker, diretóriosde procura, informação de versão, e assim sucessiva-mente.

.RES - contém os resources do projeto como o como o íconede aplicação, bitmaps e cursores.

.DCU - contém informações sobre a última compilação reali-zada, para que o Delphi compile somente o que foimudado no código numa próxima vez.

.EXE - arquivo criado pelo compilador para ser executado pelousuário.

Quando o projeto é salva, o Delphi solicita apenas os nomes dos arqui-vos de unidade e projeto, os outros ele cria automaticamente.

Salvando o primeiro programa

No menu, selecione File >> Saveall ou clique no botão Save All ( ) dabarra de ferramentas, o que abre a caixa de diálogo para salvar doWindows, pedindo para dar um nome ao arquivo do formulário, extensão.pas, dê o nome de PrimeiroUnt.pas e clique em Salvar. A seguir, apare-cerá o mesmo quadro pedindo para dar um nome ao arquivo de projeto,extensão .dpr, dê o nome de Primeiro.dpr e clique em Salvar. Os no-mes dos arquivos da unidade e do projeto deverão ser diferentes, apesarda extensão já o ser, pois o Delphi não aceita nomes iguais para arquivosde projeto e unidades.

Page 23: 00200 - Delphi 5

Página: 23

Delphi 5

Celta Informática - F: (11) 4331-1586

Page 24: 00200 - Delphi 5

Página: 24

Delphi 5

Celta Informática - F: (11) 4331-1586

O projeto agora está salvo. É preciso escolher um ícone que o represen-tará na tela do Windows. No menu principal do Delphi, selecione Project>> Options..., e escolha a página Application.

Clique no botão Load Icon... , e procure o ícone About.ico, no diretório\Borland \Delphi5\Objrepos, escolha Abrir para voltar à janela ProjectOptions. Dê um título ao programa e pronto, o programa já possui umícone e um título associados.

Page 25: 00200 - Delphi 5

Página: 25

Delphi 5

Celta Informática - F: (11) 4331-1586

Compile o projeto utilizando o menu Project >> Compile Primeiro, ge-rando um arquivo executável contendo as últimas alterações realizadassem executar o projeto. Agora, você tem um programa que pode serexecutado em qualquer microcomputador que possua o sistemaWindows, sem necessariamente ter o DELPHI ou de suas bibliotecasinstalados.

Verifique no Windows Explorer todos os arquivos que compõem esteprojeto.

Exercício:

Adicione mais um botão ao formulário que altera a cor e o estilo da fontedo lblMensagem. Digitando o seguinte código:

procedure TfrmInicio.btnAlterarClick(Sender: TObject);begin lblMensagem.Font.Color:=clRed; lblMensagem.Font.Style:=[fsBold];end;

O valor das contantes de cor e estilo são facilmente encontradas na ObjectInspector, basta selecionar a propriedade e verificar sua caixa de valo-res. A constante para estilo aparece entre colchetes pois ela faz parte deuma lista com seus próprios valores, True e False para cada estilo, de-vendo estar entre colchetes os estilos assumidos como True. Como porexemplo: lblMensagem.Font.Style:=[fsBold, fsItalic], para fonte em negrito eitálico.

Page 26: 00200 - Delphi 5

Página: 26

Delphi 5

Celta Informática - F: (11) 4331-1586

EXEMPLO I- CALCULADORA

Para iniciar um novo projeto, escolha a opção New Application do menuFile.

Para inserir várias vezes o mesmo objeto no formulário, dê um clique noícone do objeto escolhido enquanto pressiona a tecla Shift, ele ficarácom a aparência mostrada na figura abaixo.

Após selecionar o controle Edit, como descrito anteriormente, insira trêsdeles no formulário dando cliques na área de cliente, não se preocupan-do com a estética. Após inserir todos os componentes, clique no cursorbitmap em forma de seta na Paleta de Componentes para desativar oícone selecionado.

O Delphi oferece um recurso para realizar rapidamente alinhamento en-tre objetos, que será utilizado para alinhar os Edit no formulário.

Primeiro selecione os objetos a serem alinhados. Pressione a teclaShift enquanto é dado um clique em cada um deles, ou arraste o pontei-ro do mouse formando um retângulo de seleção, selecionando todos aomesmo tempo como mostra a figura a seguir.

Page 27: 00200 - Delphi 5

Página: 27

Delphi 5

Celta Informática - F: (11) 4331-1586

Depois disso, pressione o botão direito do mouse sobre um Edit, paraaparecer o pop-menu. Escolha Align..., aparecendo então o diálogoAlignment.

Escolha Space equally (igualmente espaçado) para alinhamento hori-zontal, e Tops (topo) para o alinhamento vertical.

Page 28: 00200 - Delphi 5

Página: 28

Delphi 5

Celta Informática - F: (11) 4331-1586

Após o alinhamento o formulário estará de acordo com a figura:

Insira os objetos restantes da maneira que preferir, posicionando-os deacordo com a figura a seguir:

Page 29: 00200 - Delphi 5

Página: 29

Delphi 5

Celta Informática - F: (11) 4331-1586

Utilize o alinhamento Horizontal - Center in window para o Button2.

Altere as propriedades assinaladas dos Objetos conforme a figura a seguir:

Neste projeto, o usuário digitará um número em edtNum1, outro emedtNum2, e quando ele der um clique no botão btnIgual, o resultado damultiplicação aparecerá em edtResult. O botão btnLimpar é utilizadopara limpar as caixas de texto (edit).

O programa trabalha basicamente com dois eventos :

- Clique em btnIgual (=)- Clique em btnLimpar (Limpar)

Para escrever o código, inicie dando um duplo clique no btnIgual o quefaz o Code Editor aparecer com o cursor no procedimento btnIgualClick.

O editor de código possui várias ferramentas que auxiliam o programa-dor durante a digitação do programa. Uma delas é a Code Completion(conclusão de código), que lista as propriedades, métodos e eventosapropriados à classe em uso.

Enquanto estiver digitando o código e após digitar Valor1:=, pressioneCtrl+Espaço para exibir a Code Completion, procure a funçãoStrToFloat (transforma uma string em número com ponto flutuante) emseguida pressione Enter.

Page 30: 00200 - Delphi 5

Página: 30

Delphi 5

Celta Informática - F: (11) 4331-1586

Com um clique-direito na lista do Code Completion, ela pode ser orde-nada por área ou por ordem alfabética.

Outra ferramenta é o Code Parameters (parâmetros de código), quemostra uma lista dos parâmetros exigidos pela rotina ou função. Estalista aparece logo após a abertura de parêntese.

Na figura anterior, a função StrToFloat necessita de um parâmetro dotipo String (cadeia de caracteres), que no exemplo está na propriedadeText do edtNum1.

Page 31: 00200 - Delphi 5

Página: 31

Delphi 5

Celta Informática - F: (11) 4331-1586

Digite o restante do código como mostrado a seguir.

Abra o procedimento do evento OnClick do btnLimpar, digitando os co-mandos a seguir:

Execute o projeto e para utilizá-lo, entre com um número em edtNum1,outro em edtNum2 e dê um clique em “=”, e o resultado da multiplicaçãoaparecerá em edtResult.Para mudar o campo ativo, é utilizada a tecla Tab. A ordem de tabulaçãocorresponderá à ordem em que os controles foram colocados no formu-lário. Esta ordem é determinada pela propriedade TabOrder dos contro-les, caso o seu projeto não esteja, coloque-o na seguinte ordem:

Page 32: 00200 - Delphi 5

Página: 32

Delphi 5

Celta Informática - F: (11) 4331-1586

4btnLimpar3btnIgual2edtResult1edtNum20edtNum1TabOrderObjeto

Para alterar esta propriedade, selecione o controle, e no Object Inspectormude seu valor. Como o Delphi não aceita controles com TabOrder iguais,talvez seja necessário utilizar algum valor temporário diferente da tabela.

É possível alterar a ordem de tabulação acessando o popup-menu. Dêum clique-direito sobre qualquer componente escolhendo a opçãoTabOrder ( ), abrindo o quadro de diálogo Edit Tab Order,onde altera-se a ordem de todos os controles inseridos no formulário.Modifique a ordem selecionando o controle na lista e clique nas setaspara cima ou para baixo, de acordo com a figura a seguir:

Execute o projeto e observe as alterações feitas na ordem de tabulação.

Page 33: 00200 - Delphi 5

Página: 33

Delphi 5

Celta Informática - F: (11) 4331-1586

Como o usuário pode alterar o valor de edtResult mesmo após a multipli-cação ter sido efetuada, é necessário definir as propriedadesTabStop:=False e ReadOnly:=True deste controle, para evitar este in-conveniente.

Nas aplicações para Windows, os botões de comando geralmente sãoacionados com um clique, mas há aqueles que acionam com a teclaEnter. No projeto da calculadora, o botão que acionará com Enter será obtnIgual, faça com que propriedade Default desse botão fique com ovalor True. Fazendo aparecer um contorno mais espesso no botão, dan-do a indicação que se a tecla Enter for acionada, o evento OnClick ocor-rerá.

Page 34: 00200 - Delphi 5

Página: 34

Delphi 5

Celta Informática - F: (11) 4331-1586

PROPRIEDADES

BorderStyle

Retorna ou dá um valor para o estilo de borda do objeto;

objeto.BorderStyle := [valor]

Existem 6 tipos de bordas:

1 - bsDialog O formulário não possui os botões demaximizar e nem de minimizar. Não éredimensionável.

2 - bsNone Nenhuma borda

Page 35: 00200 - Delphi 5

Página: 35

Delphi 5

Celta Informática - F: (11) 4331-1586

3 - bsSingle Fixa Simples, o formulário só é dimensionávelatravés dos botões de minimizar e maximizar.

4 - bsSizeable Borda Redimensionável

5 - bsSizeToolWin Semelhante à bsToolWindow,mas é dimensionável.

6 - bsToolWindow Não mostra os botões de maximizar ede minimizar. Não é redimensionável,mostrando somente o botão de fechar ea barra de título com a fonte reduzida.E o formulário não aparece na barra detarefa do Windows 95.

As Bordas Fixas não podem ser dimensionadas em tempo de execução.Ou seja, o usuário não poderá mudar o tamanho do formulário.

Default

Retorna ou dá o valor de um botão de comando em um formulário;

object.Default :[= booleano]

Default= FalseTrue

Page 36: 00200 - Delphi 5

Página: 36

Delphi 5

Celta Informática - F: (11) 4331-1586

Quando esta propriedade de um TButton estiver como True o Delphi cha-mará o evento OnClick sempre que a tecla Enter for pressionada.

Ex: Desejo que o botão btnMultiplicar seja o default:

btnMultiplicar.Default := True;

Desejo saber se o botão cmdMultiplicar é default ou não, e o resultadoserá armazenado na variável booleana Estado:

Estado := btnMultiplicar.Default;

Tabstop

Retorna ou dá o valor ao objeto indicado;

objeto.TabStop: [= booleano]

TabStop = FalseTrue

Ex: Para alterar a ordem de tabulação dos botões em tempo de execu-ção basta incluir estas linhas em algum procedimento:

btnMultiplicar.TabStop := 0;btnDividir.TabStop := 1;btnSomar.TabStop := 2;btnSubtrair.TabStop := 3;

Para saber qual a ordem de tabulação do objeto edtNum1 earmazená-la em uma variável que conterá a ordem de tabulação doobjeto:

Ordem_Tab:= edtNum1.TabStop;

No ambiente Windows é comum mudarmos o foco entre os controlescom a tecla Tab. Quando não quisermos que o usuário acesse determi-nado controle usando Tab, definimos a propriedade TabStop desse con-trole como False.

Page 37: 00200 - Delphi 5

Página: 37

Delphi 5

Celta Informática - F: (11) 4331-1586

Name

Esta propriedade contém o nome que é dado ao objeto como referênciapara o código e definição de propriedades. Em tempo de execução, retornao nome usado por um controle;

objeto.Name

Ex: Desejo exibir o Name do formulário em um edit:

editNome_Form.Text := frmCalculadora.Name;

Captionobjeto.Caption := [string]

Determina o texto mostrado na barra de título do formulário, o texto den-tro de um controle ou um título na barra de menu.

Ex: Para alterar a Caption do botão Limpar após seu uso, basta inseriresta linha no procedimento cmdLimpar_Click:

btnLimpar.Caption := ‘Iniciar’

Text

Retorna o texto que está escrito na área de edição de um quadro de texto(TextBox), ou escreve um string nesta área;

objeto.Text := [string];

Page 38: 00200 - Delphi 5

Página: 38

Delphi 5

Celta Informática - F: (11) 4331-1586

MÉTODO

Setfocus

Dá o foco ao objeto indicado;

objeto.SetFocus

Fixa o foco a um formulário ou controle. Somente pode ser usado paraum formulário ou controle visível.

VARIÁVEIS NO DELPHI

Variável é um local nomeado da memória, onde são guardados dadosque podem ser mudados em tempo de execução. O nome de uma vari-ável pode ter até 255 caracteres, tem que começar com uma letra, nãopode conter caracteres brasileiros e ser única. O nome pode conternúmeros e sublinhados e não pode ser uma palavra reservada.

Existem vários tipos de variáveis, sendo cada tipo específico para o tipode dado a ser armazenado.

-263+1 a 263-18Comp3,4.10-4932 a 1,1.10493210Extended5.10-324 a 1,7.103088Double1,5.10-45 a 3,4.10384Single2,9.10-39 a 1,7.10386Real

TiposReais

Double - word - sized Booleano4LongBollWord - sized Booleano2WordBollByte - sized Booleano1ByteBool1 byte booleano1Boolean

TiposBooleanos

0 a 655352Word0 a 2551Byte-2147483648 a 21474836474LongInt-32768 a 327672Integer-128 a 1271ShortInt

FaixaNúmero de BytesTiposInteiros

Page 39: 00200 - Delphi 5

Página: 39

Delphi 5

Celta Informática - F: (11) 4331-1586

Formas de Declarar uma Variável

As variáveis são declaradas usando-se a palavra reservada var, o nomeda variável, dois pontos e o tipo de dado a ser armazenado nesta variável.

varValor1: Real;

Elas podem ser declaradas em três locais diferentes, conforme a suaabrangência:

1. Variável Local: ela será utilizada somente pelo procedimento ondeestá declarada, terminado o procedimento ela desaparecerá da me-mória. É declarada logo após o cabeçalho do procedimento.

2. Variável a nível de unidade: a variável será utilizada por todos osprocedimentos e funções da unidade. É declarada logo após a pala-vra reservada implementation.

3. Variável a nível de projeto: é a variável que poderá ser utilizada portoda a aplicação, ou seja, poderá ser utilizada por outras unidades. Édeclarada na seção interface da unidade.

FORMATAÇÃO DE NÚMEROS

A função FloatToStr, transforma um número em texto, mas não padroni-za sua apresentação. Caso necessite formatar a exibição de um núme-ro, use a seguinte função:

FormatFloat(formato , expressão), onde:

- formato = a maneira como deverá ser mostrada a expressão.- expressão = expressão numérica a ser formatada.

Page 40: 00200 - Delphi 5

Página: 40

Delphi 5

Celta Informática - F: (11) 4331-1586

Formatando números:

5,00E-1-5,00E+005,00E+000,00E+0050%-500%500%0%$0,50($5,00)$5,00$#.##0,00;($#.##0,00)$1($5)$5$#.##0;($#.##0)0,5-5,05,0#.##0,01-55#.##00,50-5,005,000,001-5505 decimal5 negativo5 positivoFormato

Em “formato” o número 0 será mostrado ou trocado pelo caractere emsua posição, já o caracter nírus (#) não será mostrado. Pode-se inserirsímbolos na função Format, como no exemplo: $ , % ou E.

Formatando Data e Hora:

Para formatar data e hora use a função FormatDateTime:

FormatDateTime (formato , data);

03/07/98 9:30d/m/yy h:mm8:50:20 ah:mm:ss a/p08:50 AMhh:mm AM/PM02-domdd-ddd18-Ago-1998dd-mm-yyyy10/5/98d/m/yyExibidoFormato

Page 41: 00200 - Delphi 5

Página: 41

Delphi 5

Celta Informática - F: (11) 4331-1586

MODIFICANDO A CALCULADORA

No formulário da calculadora, selecione o botão btnIgual e pressione atecla Delete. O botão de igual desaparecerá do formulário, mas o seucódigo continuará no editor de códigos. Abra o editor de códigos, e ob-serve que a procedure TfrmCalculadora.btnIgualClick continua no mes-mo lugar. Exclua também o label com X.

Modifique o formulário frmCalculadora como o exemplo a seguir, inserin-do e dimensionando um novo botão:

Selecione o novo botão, copie ( ) e cole ( ) maistrês botões semelhantes. Depois posicione-os de acordo com a figura:

Page 42: 00200 - Delphi 5

Página: 42

Delphi 5

Celta Informática - F: (11) 4331-1586

Algumas propriedades podem ser alteradas ao mesmo tempo para umgrupo de objetos selecionados. Como exemplo, selecione todos os bo-tões criados anteriormente e altere as propriedades Font.Size e Font.Stylede todos ao mesmo tempo.

Como o símbolo de divisão é encontrado na fonte Symbol, é necessárioalterar o propriedade Font.Name do botão e depois, abrir o Mapa decaracteres do Windows e procurar pelo símbolo da divisão na fonteSymbol, copiando e colando para a propriedade Caption deste botão.

Provavelmente o caractere que aparecerá na caixa de propriedade nãoserá o mesmo do botão, pois a fonte da Object Inspector não é Symbol,portanto não se preocupe com este problema. Faça o mesmo processopara o botão de raiz.

O procedimento para o antigo botão btnIgual será agora aproveitado nobotão btnMultiplicacao. Selecione o botão btnMultiplicacao e na ObjectInspector abra a página Events escolhendo a opção btnIgualClick para oevento OnClick. Fazendo com que este procedimento que antes era deum botão agora possa ser disparado por outro.

Page 43: 00200 - Delphi 5

Página: 43

Delphi 5

Celta Informática - F: (11) 4331-1586

As duas variáveis Valor1 e Valor2 que antes pertenciam a apenas umprocedimento, agora deverão ser utilizadas pelos procedimentos dasoutras operações. Para que isso ocorra, retire-as do procedimentoTfrmCalculadora.btnIgualClick e declare-as na seção Implementationda unidade. Será usada também a função FormatFloat para formatar aapresentação do resultado.

Page 44: 00200 - Delphi 5

Página: 44

Delphi 5

Celta Informática - F: (11) 4331-1586

Substitua o tipo de operação em btnIgualClick, e nos demais botões,utilizando as ferramentas Copiar e Colar.

Os operandos das quatro operações são:

/Divisão*Multiplicação-Subtração+Soma

A função exponenciação está programada em uma unidade do Delphi,que possui diversas funções matemáticas complexas, chamada Math.Uma delas é a função Power(base, expoente) que será utilizada paraefetuar a operação de raiz disparada pelo botão btnRaiz.

Primeiro é necessário incluir esta unidade na seção Uses da Unit.

Page 45: 00200 - Delphi 5

Página: 45

Delphi 5

Celta Informática - F: (11) 4331-1586

Depois digite o código associado ao evento OnCLick do botão btnRaiz.

Todo bom programador coloca em seu código linhas de comentário paraque ele ou outra pessoa possam guiar-se no código durante uma manu-tenção, pois com o tempo, o caminho para determinado resultado podeser esquecido. No Delphi as linhas de comentário são precedidas porduas barras ( // ), ou o texto do comentário estar entre chaves ( { ... } ).

Salve e execute o programa, testando os vários formatos de apresenta-ção dos números, com alterações nos parâmetros de apresentação dafunção FormatFloat.

Page 46: 00200 - Delphi 5

Página: 46

Delphi 5

Celta Informática - F: (11) 4331-1586

DEPURAÇÃO

Quando construímos uma aplicação, é possível errarmos na sintaxe du-rante a digitação, fornecendo parâmetros errados ou trocando nomes devariáveis, ou então, criarmos erros lógicos que são detectados comosaídas incorretas do programa. Para resolver estes problemas o Delphipossui várias ferramentas que controlam a execução do programa for-necendo uma execução passo-a-passo e exibindo valores de parâmetros.

Quando o Delphi compila o programa(Ctrl+F9) e encontra algum erro de sin-taxe ele mostra a linha onde está o erro,dando uma dica do problema, na parteinferior da janela do Code Editor.

Praticaremos a depuração de programas construindo um aplicativo quenos dê como saída uma lista com os seguintes números: 18, 21, 24, 27e 30. Construa um formulário com um botão e um quadro de lista -

ListBox ( ), sem alterar nenhuma propriedade dos componentes:

Entre com o seguinte código, exatamente como está, para o botão:

Page 47: 00200 - Delphi 5

Página: 47

Delphi 5

Celta Informática - F: (11) 4331-1586

Compile o programa pressionando Ctrl+F9, e observe os erros de sinta-xe encontrados pelo Delphi. São erros que indicam a não declaração ouexistência da variável T e do objeto Lista. A linha destacada em verme-lho indica aonde o compilador parou.

Declare a variável T como do tipo inteiro semelhante à i e altere a propri-edade Name da ListBox para Lista, e compile novamente.

Page 48: 00200 - Delphi 5

Página: 48

Delphi 5

Celta Informática - F: (11) 4331-1586

Desta vez foi apresentado um erro onde o tipo de dado requerido é umString mas o fornecido pela variável T é Integer. Para corrigir, transfor-me o conteúdo da variável T em String utilizando a função IntToStr() nalinha onde ocorreu o erro.

Lista.Items.Add (IntToStr(T));

Após esta correção, o compilador não detectará mais nenhum erro desintaxe. Portanto, execute este exemplo pressionando F9.

Observe que a saída do programa não corresponde à desejada, consta-tando a existência de erros lógicos neste projeto.

A função digitada está incorreta pois ela não varia em função do valor dei, altere então a seguinte linha:

T:= 3*5+I;

Mesmo após a inclusão da variável I, a saída do programa ainda nãoestá como desejada.

Page 49: 00200 - Delphi 5

Página: 49

Delphi 5

Celta Informática - F: (11) 4331-1586

Para continuar a resolução deste problema, acompanhe o programa pas-so-a-passo verificando o valor das variáveis em cada momento. Primei-ro insira um ponto de parada (Breakpoint), onde o programa será exe-cutado até este ponto e depois pára.

Para inserir um Breakpoint, dê um clique na barra do lado esquerdo dalinha que deseja ser a parada. Quando desejar remover o Breakpointbasta dar um novo clique na mesma posição.

Quando for dado um clique no botão, o programa começará a executar eirá parar na linha do Breakpoint exibindo o Code Explorer. Para continuara executar o programa passo-a-passo pressione F7, até a linha que estáindicada na figura abaixo como linha corrente.

Page 50: 00200 - Delphi 5

Página: 50

Delphi 5

Celta Informática - F: (11) 4331-1586

Verifique o valor atual de uma variável posicionando o ponteiro sobre ela,e aguardando uns instantes para o Delphi mostrar seu valor.

Avance o programa aos passos até a finalização, acompanhando a vari-ação dos valores.

A saída somente estará correta quando 5+I estiver entre parênteses -(5+I), executando primeiro a soma e depois a multiplicação.

Digite os parênteses e execute o programa, que agora apresentará asaída correta.

Page 51: 00200 - Delphi 5

Página: 51

Delphi 5

Celta Informática - F: (11) 4331-1586

EXEMPLO II - JOGO DA VELHA

Este próximo exemplo de projeto é o conhecido Jogo da Velha, onde ousuário irá jogar contra o computador que não “pensa” suas jogadas,pois ele trabalha com jogadas aleatórias, e ao final da partida será mos-trado um quadro de mensagem informando quem ganhou a partida.

Insira um botão de comando no formulário dimensionando-o como umquadrado, e depois, copie (Ctrl+C) e cole (Ctrl+V) mais oito botões iguais.Formando um total de nove botões.

Estes botões de comando são nomeados automaticamente de Button1a Button9, de cima para baixo. Arraste-os de forma que fiquem como afigura a seguir.

Como programa do jogo irá modificar a propriedade Caption dessesbotões, é necessário iniciar o jogo com todos botões em branco. Primei-ro selecione todos os botões ao mesmo tempo, para isso, posicione oponteiro do mouse em um canto do formulário e depois arraste-o até queo retângulo pontilhado envolva todos os botões.

Page 52: 00200 - Delphi 5

Página: 52

Delphi 5

Celta Informática - F: (11) 4331-1586

Vá até a janela Object Inspector e deixe a propriedade Caption embranco. Qualquer propriedade que for alterada enquanto a seleção esti-ver ativa, servirá para todos os botões. Altere também as propriedadesName, Caption e BorderStyle do formulário.

UNIDADE (UNIT)

Uma Unit possui as seguintes seções: • Cabeçalho• Interface• Implementação

O cabeçalho identifica o nome da Unit. Ele é bem compacto, contendo apalavra reservada Unit e o nome da unidade, que não precisa ser o mes-mo nome do arquivo .PAS, que a contém.

Na seção Interface declaramos as variáveis e códigos que podem serusados por códigos de outras unidades e lista todas as outras Units queela precisa “ver”. Se esta Unit precisar utilizar algum recurso de outraUnit, deveremos referenciar esta outra Unit na cláusula uses da seçãode interface.

Na seção Implementation são declarados os códigos e variáveis perten-centes exclusivamente à unidade.

UNIDADE <nome da unidade>;

INTERFACESeção de interface

IMPLEMENTATIONSeção de implementação

FIM.

Page 53: 00200 - Delphi 5

Página: 53

Delphi 5

Celta Informática - F: (11) 4331-1586

Na seção de Interface da unidade que está sendo construída, está sen-do definido o tipo TfrmJogo (o formulário) pertencente à classe TForm, aseguir, são listados todos os controles, seus tipos, e procedimentos per-tencentes ao formulário.

A figura abaixo mostra a listagem da Unit do projeto:

unit Unit1;

interface

uses Windows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs;

type TfrmJogo = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; private { Private declarations } public { Public declarations } end;

var frmJogo: TfrmJogo;

implementation{$R *.DFM}

end.

Page 54: 00200 - Delphi 5

Página: 54

Delphi 5

Celta Informática - F: (11) 4331-1586

O projeto Jogo da Velha, utiliza dois procedimentos que não estão asso-ciados a nenhum controle, são eles JogoNovo e Verificar. Estes proce-dimentos devem primeiro ser primeiro declarados para depois seremimplementados, declare os procedimentos JogoNovo e Verificar na defi-nição de tipo do formulário como mostra a listagem abaixo. Logo mais,faremos a implementação destes procedimentos que nada mais é doque a construção do seu código.

Declare também a variável Botao na seção Implementation. Esta vari-ável é uma matriz unidimensional com nove elementos do tipo TButton,ou seja, cada variável dessas possui as mesmas propriedades de umbotão de comando. Esta matriz poderia ser bidimensional contendo nú-meros inteiros (array [1..3, 1..3] of Integer) ou strings.

Page 55: 00200 - Delphi 5

Página: 55

Delphi 5

Celta Informática - F: (11) 4331-1586

Quando o projeto iniciar, o formulário será carregado na memória e nestemomento ocorre o OnCreate, onde será escrito um procedimento deinício do jogo. Dê um duplo clique no formulário para ter acesso ao editorde código, ou selecione o formulário, vá até o Object Inspector esco-lhendo a páginas Events, dando um duplo clique em OnCreate.

Entre com o seguinte código:

Page 56: 00200 - Delphi 5

Página: 56

Delphi 5

Celta Informática - F: (11) 4331-1586

No procedimento acima, a procedure Randomize inicializa o gerador denúmeros aleatórios utilizando como base o relógio do sistema. Nas pró-ximas linhas são atribuídos valores à variável Botao[n], associando-a aosbotões do formulário. E logo a seguir é chamada a procedure JogoNovo.

Salve a Unit como JogoVelhaUnt.pas e o projeto como JogoVelha.dpr.

Agora implemente o procedimento JogoNovo na seção Implementation,como segue. Declare também a variável NumeroVezes que poderá serutilizada por todos os procedimentos desta Unidade.

Uma declaração de procedure tem a seguinte forma:

procedure Nome (Lista de parâmetros); Diretivas; Declarações locaisbegin Instruçõesend;

Page 57: 00200 - Delphi 5

Página: 57

Delphi 5

Celta Informática - F: (11) 4331-1586

A Lista de parâmetros, Diretivas e Declarações locais são opcionais.Uma Lista de parâmetros é uma seqüência de parâmetros que deverãoser enviados pela linha de instrução que chamou a procedure. Cadaparâmetro possui um nome seguido pela identificação de tipo, eles po-dem ser precedidos pelas palavras reservadas var ou const indicandovariável ou constante respectivamente.

Exemplos:

(X, Y: Real)

(var S: string; X: Integer)

(HWnd: Integer; Text, Caption: PChar; Flags: Integer)

(const P; I: Integer)

As Diretivas informam à procedure como ela tratará os parâmetros ecomo será a construção deste procedimento em relação a outros anteri-ores.

No cabeçalho, observamos que o nome completo da procedure é com-posto do nome do objeto que contém a procedure (Form) e o nome dechamada da mesma procedure.

O procedimento JogoNovo, inicia um novo jogo apagando todas as le-gendas dos botões e fazendo uma nova jogada aleatoriamente.

A variável I do tipo inteiro (Integer) é de uso exclusivo deste procedimen-to. Findo o procedimento, ela deixará de existir.

Para apagar as legendas é usada a instrução for...to...do, que irá emloop apagando as legendas. Aqui a variável Botao[ I ] identifica os botõesdo formulário usando como índice a variável I do loop for...to...do. Ainstrução for...to...do, pode ser também for...downto, para decrementaro valor da variável de controle (I).

No exemplo, existe somente uma linha de comando após o do, se fos-sem necessárias mais declarações, seria necessário usar begin...end;

Page 58: 00200 - Delphi 5

Página: 58

Delphi 5

Celta Informática - F: (11) 4331-1586

como uma maneira de agrupar estas declarações, indicando que todasfazem parte do loop for...to...do, como mostra o exemplo abaixo :

for i:=1 to 3 dobegin Botao[i].Caption:=''; Botao[i+1].Caption:=''; Botao[i+2].Caption:='';end;

Na linha M:= Trunc (Random *10), é atribuído um valor inteiro à variávelM entre 1 e 9.

A procedure Random gera um número do tipo Real X entre 0 e 1 (0<=X<1),que é multiplicado por 10 e aproveitada sua parte inteira, que apesar deser um número inteiro é do tipo Real, não podendo ser utilizado paraindicar um botão.

Para converter um número real em inteiro, utiliza-se as funções Truncou Round. Trunc, retorna a parte inteira de um número, enquanto Roundarredonda um número real.

-3-2-2,7222,5-1-1-1,4211,5111,4RoundTruncReal

No código é utilizada a função Trunc para retornar o índice do botão queterá sua legenda alterada.

O próximo passo é fazer o código dos botões, dê um duplo clique noButton1 para a janela de código aparecer, e copie o exemplo. Faça omesmo para os demais botões modificando apenas o nome daquele queterá sua legenda alterada.

Page 59: 00200 - Delphi 5

Página: 59

Delphi 5

Celta Informática - F: (11) 4331-1586

O evento OnClick nos botões é que dará partida ao programa. O proce-dimento associado a este evento, incrementará o número de jogadas(NumeroVezes), mudará a legenda do botão e chamará o procedimentopara verificar quem ganhou e se o jogo terminou.

Construa o procedimento Verificar na seção de implementação da uni-dade, como segue:

procedure TfrmJogo.Verificar ();label 1,2;var I: Integer;begin if (Button1.Caption=’X’) and (Button2.Caption=’X’) and (Button3.Caption=’X’) then goto 1; if (Button4.Caption=’X’) and (Button5.Caption=’X’) and (Button6.Caption=’X’) then goto 1; if (Button7.Caption=’X’) and (Button8.Caption=’X’) and (Button9.Caption=’X’) then goto 1; if (Button1.Caption=’X’) and (Button4.Caption=’X’) and (Button7.Caption=’X’) then goto 1; if (Button2.Caption=’X’) and (Button5.Caption=’X’) and (Button8.Caption=’X’) then goto 1; if (Button3.Caption=’X’) and (Button6.Caption=’X’) and (Button9.Caption=’X’) then goto 1; if (Button1.Caption=’X’) and (Button5.Caption=’X’) and (Button9.Caption=’X’) then goto 1;

Page 60: 00200 - Delphi 5

Página: 60

Delphi 5

Celta Informática - F: (11) 4331-1586

if (Button3.Caption=’X’) and (Button5.Caption=’X’) and (Button7.Caption=’X’) then goto 1;

repeat I:=Trunc (Random * 10) untilBotao[I].Caption=’’ ; Botao[I].Caption:=’O’;

if (Button1.Caption=’O’) and (Button2.Caption=’O’) and (Button3.Caption=’O’) then goto 2; if (Button4.Caption=’O’) and (Button5.Caption=’O’) and (Button6.Caption=’O’) then goto 2; if (Button7.Caption=’O’) and (Button8.Caption=’O’) and (Button9.Caption=’O’) then goto 2; if (Button1.Caption=’O’) and (Button4.Caption=’O’) and (Button7.Caption=’O’) then goto 2; if (Button2.Caption=’O’) and (Button5.Caption=’O’) and (Button8.Caption=’O’) then goto 2; if (Button3.Caption=’O’) and (Button6.Caption=’O’) and (Button9.Caption=’O’) then goto 2; if (Button1.Caption=’O’) and (Button5.Caption=’O’) and (Button9.Caption=’O’) then goto 2; if (Button3.Caption=’O’) and (Button5.Caption=’O’) and (Button7.Caption=’O’) then goto 2; if NumeroVezes= 4 then begin ShowMessage (‘Partida Empatada’); JogoNovo; exit; end; exit;

1: begin ShowMessage (‘Você Ganhou’); JogoNovo; exit; end;

2: begin ShowMessage (‘Eu Ganhei’); JogoNovo; exit; end;end;

Page 61: 00200 - Delphi 5

Página: 61

Delphi 5

Celta Informática - F: (11) 4331-1586

Logo após o cabeçalho, temos as declarações locais. Usamos a decla-ração label para definir os locais de desvio da instrução goto. E tambémdeclaramos a variável I como do tipo integer.

A instrução repeat declaração until expressão; repete a declaração en-quanto a expressão for verdadeira. No exemplo, o programa selecionaráum botão aleatoriamente, até que seja encontrado um botão “vazio” -Caption:= ‘’, preenchendo-o com “O”, indicando a jogada do computa-dor.

A procedure ShowMessage, mostra um quadro de mensagem com obotão de Ok. O programa fica parado até que o usuário dê um clique emOk, retornando à linha seguinte no procedimento.

O Windows possui quadros padronizados de mensagem que servempara emitir avisos e recolher opções de tratamento dessas mensagens.Podemos incrementar o programa do Jogo da Velha criando um quadrode mensagem com vários botões e que retorne uma resposta do usuá-rio, indicando qual botão foi escolhido. Para isso utilizamos a funçãoMessageBox.

Esta função pertence à biblioteca do Windows (API). O Delphi a relacio-na ao objeto do tipo TApplication.

MessageBox (Mensagem ,Título, Tipo);

Onde:mensagem - expressão mostrada dentro do quadro de diálogo.

tipo - somatória de números, conforme o que queremosque seja exibido no Quadro de Mensagem, seguin-do a tabela Tipo.

título - título do Quadro de Mensagem (barra de tí-tulo).

Mude o código do procedimento Verificar como mostrado abaixo, decla-rando a variável Resposta como Inteiro - Resposta: Integer.

Page 62: 00200 - Delphi 5

Página: 62

Delphi 5

Celta Informática - F: (11) 4331-1586

1: begin Resposta:=Application.MessageBox (‘Você ganhou, quer JogarNovamente?’,’Vencedor’,36); if Resposta = 7 then Close; JogoNovo; exit; end;

2: begin Resposta:=Application.MessageBox (‘Eu ganhei, quer JogarNovamente?’,’Vencedor’,36); if Resposta = 7 then Close; JogoNovo; exit;

end;

O argumento Tipo possui os seguintes valores para a funçãoMessageBox:

Terceiro botão com foco512Segundo botão com foco256Primeiro botão com foco0Ícone de Informação64Sinal de Aviso48Sinal de Pesquisa32Sinal de Stop16Botões Repetir e Cancelar5Botões Sim, Não4Botões Sim, Não, Cancelar3Botões Anular, Repetir e Ignorar2Botões de OK e Cancelar1Somente o botão de OK0SignificadoValor

Teste o projeto alterando o valor de tipo para Messagebox, faça a suasoma escolhendo um item de cada seção.

Page 63: 00200 - Delphi 5

Página: 63

Delphi 5

Celta Informática - F: (11) 4331-1586

A variável Resposta, conterá a resposta do usuário que segue o padrãoda tabela abaixo.

Botão Não foi pressionado7Botão Sim foi pressionado6Botão Ignorar foi pressionado5Botão Repetir foi pressionado4Botão Anular foi pressionado3Botão Cancelar foi pressionado2Botão OK foi pressionado1SignificadoValor

O programa verificará se o botão Não foi pressionado, e se foi, fechará oformulário principal, encerrando sua execução.

No exercício, todos os botões realizam basicamente a mesma operaçãoquando respondem ao evento OnClick. Vamos alterar o projeto para queexista somente uma procedure que trate o evento OnClick para todos osbotões.

Primeiro apague as linhas entre begin...end dos procedimentos relati-vos aos botões exceto o Button1Click. Compile o projeto (Ctrl+F9) paraque o Delphi exclua estes procedimentos do editor de código - qualquerprocedimento “vazio” será excluído.

Dê um clique-direito no Code Explorer e no menu escolha Rename,alterando o nome do procedimento Button1Click para ButtonClick.

Page 64: 00200 - Delphi 5

Página: 64

Delphi 5

Celta Informática - F: (11) 4331-1586

Após a compilação, os procedimentos associados aos demais botõesserão excluídos do editor de códigos e como conseqüência, estes bo-tões não responderão mais ao evento OnClick. Acesse a página Eventsdo Object Inspector, associando a procedure ButtonClick como res-posta ao evento Onclick para todos os botões. Desta forma todos elesexecutarão o mesmo procedimento a partir do evento OnClick.

Por último altere a procedure ButtonClick para que ela reconheça o botãoque recebeu o evento OnClick, alterando sua Caption.

procedure TfrmJogo.ButtonClick(Sender: TObject);begin NumeroVezes:=NumeroVezes + 1; (Sender as TButton).Caption:= ‘X’; Verificar;end;

O parâmetro Sender indica qual objeto recebeu o evento acionador daprocedure, podendo ser utilizado nos casos em que vários objetos exe-cutam a mesma função.

Page 65: 00200 - Delphi 5

Página: 65

Delphi 5

Celta Informática - F: (11) 4331-1586

EXEMPLO III - BLOCO DE NOTAS

O próximo exemplo de projeto será um editor de texto simples do tipocaractere. Com ele será possível alterar o tipo e tamanho da fonte utili-zada em todo o texto, recortar, colar e copiar partes selecionadas e tam-bém salvar e abrir o texto utilizando as caixas de diálogo padrão fornecidaspelo Delphi.

Monte o formulário conforme o exemplo:

Defina a propriedade Align do componente Memo como alCliente. Estapropriedade faz com que o Memo ocupe toda a área do cliente do formu-lário, mesmo que este seja redimensionado.

O Delphi possui componentes visíveis e não visíveis. Os componentesvisíveis são aqueles que durante a execução do programa são vistospelo usuário. Até aqui todos os componentes utilizados nos exemplossão visíveis, como TEdit, TButton, TForm e outros.

Os componentes não visíveis não aparecem na janela do usuário emtempo de execução, estando visíveis apenas em tempo de projeto. Sãoeles, Timer, menus, caixas de diálogo comuns e controles de acesso adados.

Page 66: 00200 - Delphi 5

Página: 66

Delphi 5

Celta Informática - F: (11) 4331-1586

O exemplo de Bloco de Notas usará um componente MainMenu e qua-tro componentes da paleta Dialogs - OpenDialog, SaveDialog,FontDialog e ColorDialog.

Para começar a editar o menu, dê um duplo-clique no controle MainMenuque está no formulário, abrindo o diálogo Menu Designer.

É nesta janela que o menu do programa será construído. Observe que oprimeiro título já está selecionado.

Vá até o Object Inspector e mude a propriedade Caption para &Arqui-vo e pressione Enter - para acesso via teclado, a letra de atalho deve serprecedida pelo “&” comercial. Este procedimento, cria o menu Arquivo emove a barra de destaque para o lado direito, dê um clique logo abaixo daopção Arquivo para inserir um item neste menu. Repare que o Delphicoloca um nome para cada menu e opção de menu baseado na proprie-dade Caption, no caso do menu Arquivo, Name:=Arquivo.

Porém é útil seguir uma certa norma que identifica o objeto a partir deseu nome. Esta norma consiste na utilização de três letras como prefixodo nome de cada objeto. Como exemplos temos:

Botãobtn Editedt Item de menuitm Menumnu

Label lbl

Formfrm

Page 67: 00200 - Delphi 5

Página: 67

Delphi 5

Celta Informática - F: (11) 4331-1586

Monte as demais opções do menu seguindo a figura do Menu Designermostrada abaixo. Para criar um separador no menu, digite apenas umsinal de menos ( - ) na propriedade Caption do item abaixo de Salvar.

Terminado o menu Arquivo, inicie o menu Editar como segue abaixo.Definindo as teclas de atalho na propriedade ShortCut para cada itemdo menu.

Page 68: 00200 - Delphi 5

Página: 68

Delphi 5

Celta Informática - F: (11) 4331-1586

Quando chegar ao item Formatar Fonte, escolha a opção CreateSubmenu do PopupMenu, para criar um submenu deste item.

O sub-menu do item Formatar Fonte, deverá estar igual a figura mos-trada abaixo. Como o Delphi não reconhece caracteres brasileiros, onome dado ao item Itálico será Itlico, suprimindo do Name o caractere á( Name:= Itlico).

Page 69: 00200 - Delphi 5

Página: 69

Delphi 5

Celta Informática - F: (11) 4331-1586

Feche o Menu Designer, voltando ao formulário principal. Adicione ascaixas de diálogo que irão formatar a fonte exibida no componente Memo,e aquelas que irão abrir e salvar arquivos. Os componentes destas cai-xas estão na paleta Dialogs do Delphi.

Acabamos de desenhar o nosso formulário, colocando nele todos os seuscomponentes, os visíveis e os não visíveis. Mesmo os componentesnão visíveis estando sobre o componente Memo, não atrapalharão a apre-sentação do texto.

Salve seu trabalho para dar início à construção do código.

As caixas de diálogo são mostradas através do método Execute. Estemétodo responde True se o usuário selecionou Ok, indicando que o pro-grama deverá responder às alterações da caixa de diálogo exibida. Se ousuário não quiser efetuar as mudanças, será retornado False.

Dê um clique no item Novo do menu, para chamar o procedimento as-sociado. Este procedimento terá a função de limpar a caixa Memo1 edesabilitar as opções de edição do texto. Estas opções estarãodesabilitadas até que se tenha um texto para Recortar, Copiar ou Colar.Siga o código mostrado a seguir:

Page 70: 00200 - Delphi 5

Página: 70

Delphi 5

Celta Informática - F: (11) 4331-1586

procedureTfrmBlocoNotas.itmNovoClick(Sender:TObject);begin memTexto.Clear; itmRecortar.Enabled:=False; itmCopiar.Enabled:=False; itmColar.Enabled:=False;end;

A opção Abrir trabalhará com a caixa de diálogo OpenDialog, verificandoo valor retornado por Execute e carregando o conteúdo do arquivo sele-cionado, na propriedade Lines do objeto memTexto.

procedureTfrmBlocoNotas.itmAbrirClick(Sender:TObject);begin if OpenDialog.Execute then memTexto.Lines.LoadFromFile(OpenDialog.Filename);end;

Digite o código para as outras caixas de diálogo. Elas trabalham alterandoas propriedades do Memo após as mudanças realizadas pelo usuário.

Page 71: 00200 - Delphi 5

Página: 71

Delphi 5

Celta Informática - F: (11) 4331-1586

procedureTfrmBlocoNotas.itmSalvarClick(Sender:TObject);begin if SaveDialog.Execute then memTexto.Lines.SaveToFile(SaveDialog.Filename);end;

procedureTfrmBlocoNotas.itmFonteClick(Sender:TObject);begin FontDialog.Font:=memTexto.Font; {inicializa a FontDialog com a font deMemo} if FontDialog.Execute then memTexto.Font:=FontDialog.Font;end;

A linha entre chaves indica um comentário, não sendo tra-tada pelo compilador do Delphi.

procedureTfrmBlocoNotas.itmCorClick(Sender:TObject);begin ColorDialog.Color:=memTexto.Color; if ColorDialog.Execute then memTexto.Font.Color:=ColorDialog.Color;end;

Como o memo está ocupando toda área docliente no formulário, fica praticamente impos-sível selecionar o formulário para alterar suaspropriedades. Para alterar alguma proprieda-de ou abrir algum procedimento de eventodele, selecione o formulário na caixa de obje-to do Object Inspector.

Page 72: 00200 - Delphi 5

Página: 72

Delphi 5

Celta Informática - F: (11) 4331-1586

Quando começar a execução do programa, o evento OnCreat ocorrepara o formulário, e o procedimento deste evento irá apagar o conteúdodo Memo e desabilitar as opções do menu Editar.

procedure TfrmBlocoNotas.FormCreate(Sender:TObject);begin memTexto.Clear; itmRecortar.Enabled:=False; itmCopiar.Enabled:=False; itmColar.Enabled:=False;end;

As opções Recortar e Copiar do menu Editar, estarão ativas assim que oMemo contiver algum texto. Cada vez que ocorre uma mudança no Memo,o evento OnChange é gerado.

procedureTfrmBlocoNotas.memTextoChange(Sender:TObject);begin itmRecortar.Enabled:=True; itmCopiar.Enabled:=True;end;

Os recursos de Recortar, Colar e Copiar utilizam o objeto TClipBoard.Com ele nós usamos a área de transferência do Windows e podemostrocar informação entre programas. O objeto Memo possui métodos pró-prios para trabalhar com o Clipboard, eles estão nos procedimentos paraos itens do menu Editar mostrados abaixo.

procedureTfrmBlocoNotas.itmRecortarClick(Sender:TObject);begin memTexto.CutToClipboard; itmColar.Enabled:=True; {habilita oitem Colar}end;

Page 73: 00200 - Delphi 5

Página: 73

Delphi 5

Celta Informática - F: (11) 4331-1586

procedureTfrmBlocoNotas.itmCopiarClick(Sender:TObject);begin memTexto.CopyToClipboard; itmColar.Enabled:=True;end;

procedureTfrmBlocoNotas.itmColarClick(Sender:TObject);begin memTexto.PasteFromClipboard;end;

As opções Negrito e Itálico, formatarão o texto e mudarão também apropriedade Checked do item no menu, indicando que elas estão ativas.Os procedimentos associados à negrito e itálico, trabalham junto com oprocedimento Fonte que verificará o estado das opções alterando aspropriedades da fonte do Memo.

Inicie declarando o procedimento Fonte na seção de definição do tipoTfrmBlocoNotas - o formulário. E com o cursor ainda na mesma linha,clique-direito e no menu escolha a opção Complete Class at Cursor oupressione Ctrl+Shit+C, para o Delphi adicionar o esqueleto do procedi-mento na seção Implementation.

procedure itmCopiarClick(Sender:TObject);procedure itmColarClick(Sender: TObject);procedure Fonte;private { Private declarations }public { Public declarations } end;

Page 74: 00200 - Delphi 5

Página: 74

Delphi 5

Celta Informática - F: (11) 4331-1586

Após Ctrl+Shit+C, você terá:

Digite:

procedure TfrmBlocoNotas.Fonte;begin if not itmNegrito.Checked and not itmItalico.Checked then memTexto.Font.Style:= []; if itmNegrito.Checked and not itmItalico.Checked then memTexto.Font.Style:= [fsBold]; if not itmNegrito.Checked and itmItalico.Checked then memTexto.Font.Style:= [fsItalic]; if itmNegrito.Checked and itmItalico.Checked then memTexto.Font.Style:= [fsBold, fsItalic];end;

procedure TfrmBlocoNotas.itmNegritoClick(Sender: TObject);begin itmNegrito.Checked:= not itmNegrito.Checked; Fonte;end;

procedure TfrmBlocoNotas.itmItalicoClick(Sender: TObject);begin itmItalico.Checked:= not itmItalico.Checked; Fonte;end;

Page 75: 00200 - Delphi 5

Página: 75

Delphi 5

Celta Informática - F: (11) 4331-1586

Quando o usuário clicar na opção Sair do menu Arquivo, fechará o for-mulário, e como este é o único formulário do programa, a execução deleserá finalizada. O formulário é fechado com o método Close.

procedure TfrmBlocoNotas.itmSairClick(Sender: TObject);begin Close;end;

Salve seu trabalho, e teste o programa pressionando F9.

Nós já aprendemos a associar um ícone ao projeto, agora iremos apren-der a fazer um ícone personalizado, utilizando o aplicativo Image Editordo Delphi. Para inicializá-lo, vá até a opção Tools do menu principal doDelphi, e escolha Image Editor.

Escolha a opção New do menu File, e IconFile.

Page 76: 00200 - Delphi 5

Página: 76

Delphi 5

Celta Informática - F: (11) 4331-1586

Na janela de propriedades, escolha uma matriz de 32 x 32 pixels e 16 cores.

Desenhe um ícone semelhante ao da figura abaixo, utilizando recursossemelhantes ao programa Paint do Windows. A cor de fundo (verde)funciona como uma cor Cromaqui - transparente ao fundo.

Salve seu ícone memorizando o nome completo incluindo o caminho. Efeche o aplicativo Image Editor.

Page 77: 00200 - Delphi 5

Página: 77

Delphi 5

Celta Informática - F: (11) 4331-1586

O formulário possui no canto superior esquerdo o ícone padrão do Delphi.Para trocar este ícone pelo criado anteriormente, deveremos alterar apropriedade Icon do formulário atribuindo a ela o ícone que acabamos dedesenhar.

Use este ícone para representar o Bloco de Notas no Windows, da mes-ma forma descrita para a Calculadora.

Quando o usuário escolhe as opções Abrir e Salvar do menu, as caixasde diálogo Abrir e Salvar como são abertas aguardando uma entrada dedados. Até agora neste exemplo estas caixas exibiam todo tipo de arqui-vo sem nenhum tipo de filtro.

Porém ao observarmos os aplicativos desenvolvidos por outras pessoasnotamos que estes diálogos possuem uma lista com o nome de Arqui-vos de tipo. Neste exemplo que estamos construindo, altere a proprie-dade Filter do OpenDialog deixando-a conforme a figura.

Page 78: 00200 - Delphi 5

Página: 78

Delphi 5

Celta Informática - F: (11) 4331-1586

Altere também a propriedade Filter do SaveDialog deixando-a igual àprimeira linha do OpenDialog. E a propriedade DefaultExt, que indica aextensão padrão para o nome do arquivo que será salvo caso o usuárionão escolha nenhuma.

Page 79: 00200 - Delphi 5

Página: 79

Delphi 5

Celta Informática - F: (11) 4331-1586

EXEMPLO IV - RELÓGIO DESPERTADOR

Este projeto contém um outro componente não visível - o TTimer. Estecomponente gera o evento OnTimer a intervalos regulares determina-dos em sua propriedade Interval. Esta propriedade esta expressa emmilisegundos, ou seja, para que o evento OnTimer ocorra a cada segun-do: Interval:=1000. Se Interval:=0 o Timer estará desativado.

Devemos ter cuidado na programação do Timer, porque mesmo ele sen-do capaz de gerar um evento a cada milisegundo, o procedimento quetrata o evento pode demorar mais do que o valor de Interval, ocorrendoperda de algumas execuções do procedimento ligado a ele, ou se Intervalfor muito pequeno pode ocorrer travamento do programa.

Construa o formulário como mostrado abaixo.

A propriedade Caption dos Label1 e Label2 deverá estar em branco. NoLabel1, será apresentada a hora do sistema, e em Label2 a data atual.

O componente RadioGroup permite construir um grupo de botões deopção, utilizamos estes botões quando precisarmos selecionar opçõesmutuamente excludentes. Só poderá haver um botão de opção selecio-nado por vez, em cada grupo de botões ou no formulário caso o botãoesteja fora de algum grupo.

Page 80: 00200 - Delphi 5

Página: 80

Delphi 5

Celta Informática - F: (11) 4331-1586

As opções de escolha do RadioGroup estão na propriedade Items.Quando selecionamos esta propriedade, a janela String list editor émostrada, nela editamos os botões de opção do grupo. Entre com asduas opções, como mostrado a seguir.

Feito o formulário, vamos digitar o código para os eventos associados.

Declare primeiro as variáveis Ligado e Tecla. Ligado indicará qual botãode opção está selecionado, e Tecla armazenará um caractere digitadono teclado.

implementationvar Ligado: Boolean; Tecla: Char;{$R *.DFM}

Page 81: 00200 - Delphi 5

Página: 81

Delphi 5

Celta Informática - F: (11) 4331-1586

Quando o formulário for criado, o botão Desligado será selecionado atra-vés da linha “rdgControle.ItemIndex:= 0”. A propriedade ItemIndex, indi-ca qual botão do grupo está selecionado.

Colocaremos a data do sistema em lblData (Label2) usando a funçãoFormatDateTime, de acordo com a tabela mostrada no projeto da Calcu-ladora.

procedure TfrmRelogio.FormCreate(Sender: TObject);begin rdgControle.ItemIndex := 0; lblData.Caption:=FormatDateTime(‘dddd,dd”de”mmmm”de”yyy’, Date); {a função Date retorna a data do sistema}end;

A propriedade ItemIndex do rdgControle será igual a 1 se o botão Ligadofor selecionado, e igual a 0, caso Desligado esteja selecionado.

procedure TfrmRelogio.rdgControleClick(Sender:TObject);begin if rdgControle.ItemIndex = 1 then Ligado:=True else Ligado:=False;end;

Quando o usuário digita algo em um quadro Edit, o ocorre eventoKeyPress. No procedimento a seguir, é realizada uma validação doscaracteres para definir a hora de acionamento do despertador. Caso nãoseja um caractere válido, é soado um alarme e este caractere é excluídodo Edit.

O evento KeyPress envia para a procedure, o parâmetro Key do tipoChar, sendo esta variável verificada pelo programa.

procedure TfrmRelogio.edtHoraKeyPress(Sender:TObject; var Key:Char);

begin Tecla:=(Key);

Page 82: 00200 - Delphi 5

Página: 82

Delphi 5

Celta Informática - F: (11) 4331-1586

if ((Tecla<‘0’)or(Tecla>‘9’))and(Tecla <> ‘:’) then begin Beep; Key:=chr(0); {a função chr(X:byte), retorna o caractere correspondente ao número X na tabela ASCII} end;end;

Quando o evento Timer ocorrer (no caso a cada segundo - Interval:=1000),será feita uma verificação do conteúdo do edtHora e se o alarme estáLigado ou não. O Timer também atualiza a hora mostrada no lblHora(Label1). Se a hora que está no edtHora for menor ou igual a hora dosistema e a variável Ligado verdadeira, o Beep soará.

procedure TfrmRelogio.TimerTimer(Sender: TObject);begin if (edtHora.Text <= TimeToStr(Time))and (Ligado) then begin Beep; Beep; end; lblHora.Caption:=TimeToStr(Time);end;

Page 83: 00200 - Delphi 5

Página: 83

Delphi 5

Celta Informática - F: (11) 4331-1586

MÉTODO GRÁFICO

Embora o uso dos métodos gráficos - que permitem desenhos de linhas,círculos e retângulos - sejam complexos, poderá ser divertido e útil paraquem deseja sofisticar seus programas. A seguir, conheceremos al-guns destes recursos através de exemplos simples.

O Sistema de coordenadas do Delphi, possui o seu ponto de origem(0,0) no canto superior esquerdo da tela, ao contrário do que nós estamosacostumados desde Descartes.

A escala utilizada no Delphi é o Pixel, que representa um ponto visível natela, de acordo com a resolução do monitor.

As funções e procedimentos para desenho, estão agrupadas em umobjeto da classe TCanvas, o Delphi cria para nós um objeto deste tipo denome Canvas. É com este objeto que desenhamos na tela pois, a tela érealmente um objeto da classe TCanvas.

DESENHO DE PONTO

Para desenhar um ponto usamos a propriedade Pixels, do objeto Canvas;

Canvas.Pixels [x,y]:= cor;

Onde:Canvas - é o objeto do tipo TCanvas, declarado desta forma, oponto será desenhado na área do cliente - Formulário.x,y - coordenadas horizontal e vertical, respectivamente. Elas sãoabsolutas, ou seja, a partir da origem.cor - especifica uma cor para o ponto.

Page 84: 00200 - Delphi 5

Página: 84

Delphi 5

Celta Informática - F: (11) 4331-1586

O exemplo abaixo desenha um ponto vermelho nas coordenadas (50,50)do formulário com um clique no botão.

CORES

O Delphi possui três formas diferentes de atribuir valores para o parâmetrocor de um objeto gráfico, são elas:

a) RGB - (NRed, NGreen, NBlue), onde NRed, NGreen e NBlue podemvariar de 0 a 255.

Ponto vermelho: Canvas.Pixels[x,y,]:= RGB(255,0,0);

Page 85: 00200 - Delphi 5

Página: 85

Delphi 5

Celta Informática - F: (11) 4331-1586

b) $00bbggrr - onde bb, gg e rr variam em hexadecimal de 00 a FF.

Ponto Amarelo: Canvas.Pixels[x,y]:= $0000FFFF;

c) Usando uma das constantes válidas para o objeto TColor.

Cores fixas :clAqua, clBlack, clBlue, clDkGray, clFuchsia, clGray,clGreen, clLime, clLtGray, clMaroon, clNavy, clOlive, clPurple,clRed, clSilver, clTeal, clWhite, e clYellow.Cores definidas pelo sistema: clActiveBorder, clActiveCaption,clAppWorkSpace, clBackground, clBtnFace, clBtnHighlight,clBtnShadow, clBtnText, clCaptionText, clGrayText, clHighlight,clHighlightText, clInactiveBorder, clInactiveCaption,clInactiveCaptionText, clMenu, clMenuText, clScrollBar, clWindow,clWindowFrame, e clWindowText.

Exemplo: Ponto Azul - Canvas.Pixels[x,y]:= clBlue:

DESENHO DE LINHAS

Para desenhar no Delphi, usamos a propriedade Pen do objeto TCanvas,que nada mais é que uma caneta invisível. Podemos alterar o modocomo esta caneta desenha em nossa tela.

O Delphi indica a posição desta caneta através da propriedade PenPos.

Uma linha é desenhada utilizando-se os métodos MoveTo e LineTo paramover a Pen (caneta). MoveTo posiciona a caneta em um determinadolugar no formulário. LineTo traça uma linha, que vai da posição corrente(PenPos) até as coordenadas especificadas.

Copie o procedimento abaixo, inserindo-o no mesmo formulário do exem-plo do ponto.

Page 86: 00200 - Delphi 5

Página: 86

Delphi 5

Celta Informática - F: (11) 4331-1586

procedure TForm1.Button1Click(Sender: TObject);begin with Canvas do begin MoveTo(0,0); LineTo(100,ClientHeight); {ClienteHeight:=Altura da área de cliente no formulário} LineTo(200,50); end;end;

Quando queremos alterar várias propriedades ou métodos de um mes-mo objeto, nós não precisamos indicar o seu nome em todos as linhas,basta usarmos a instrução with ... do. Esta instrução significa que entreas palavras reservadas begin ... end, o uso do objeto ficará implícitopara qualquer acesso a uma de suas propriedades ou métodos.

Canvas.Pen.Style:= psDot;Canvas.Pen.Color:=clBlue;

ou

with Canvas.Pen dobegin Style:= psDot; Color:=clBlue;end;

No exemplo acima, utilizamos este recurso com o objeto Canvas e seusmétodos MoveTo e LineTo.

Page 87: 00200 - Delphi 5

Página: 87

Delphi 5

Celta Informática - F: (11) 4331-1586

O tipo TCanvas usa como propriedades outros dois tipos de objetos: oTPen e TBrush. O TPen é a nossa caneta, este tipo possui propriedadesque modificam a forma das linhas a serem desenhadas, são elas:

Color - define a cor da linhaWidth - define a espessura da linha - em pixelsStyle - determina o tipo de linha.

Modifique o exemplo anterior, como mostrado a seguir:

procedure TForm1.Button1Click(Sender: TObject);begin with Canvas do begin MoveTo(0,0); LineTo(100,ClientHeight); Pen.Color:=clBLue; LineTo (200,50); end;end;

Note que a segunda linha desenhada é da cor azul.

Vamos montar exemplos que usem as outras duas propriedades - Widthe Style.

procedure TForm1.Button1Click(Sender: TObject);var Estilo: array [0..6] of TPenStyle; i: Integer; SX: Integer; SY: Integer;begin Estilo[0]:= psSolid; Estilo[1]:= psDash; Estilo[2]:= psDot; Estilo[3]:= psDashDot; Estilo[4]:= psDashDotDot; Estilo[5]:= psClear; Estilo[6]:= psInsideFrame; SX := ClientWidth; SY := ClientHeight; with Canvas do

Page 88: 00200 - Delphi 5

Página: 88

Delphi 5

Celta Informática - F: (11) 4331-1586

begin SY:=Trunc(SY/8);{a procedure Trunc, transforma um valor do tipo Real em tipo Inteiro} for i:= 0 to 6 do begin Pen.Style:= Estilo[i]; MoveTo(0,(i*SY)+20); LineTo(SX,(i*SY)+20); end; end;end;

Começamos declarando a matriz Estilo como do tipo TPenStyle. Nes-ta matriz serão armazenados todos os estilos da caneta.

ClientWidth e ClientHeight, retornam um valor do tipo inteiro indicandoo tamanho da área do cliente no formulário, quando este número é divi-dido ele passa a ser um tipo Real, então nós precisamos convertê-losnovamente em Inteiro para que os métodos MoveTo e LineTo possamaproveitá-los.Antes de executar o exemplo acima, altere a propriedade Color de Form1para clWhite (Color:=clWhite) para uma visualização melhor das linhas,teremos então todos os estilos de linha desenhados no formulário mos-trado abaixo:

Altere o procedimento anterior, para serem mostradas as várias espes-suras de linha.

Page 89: 00200 - Delphi 5

Página: 89

Delphi 5

Celta Informática - F: (11) 4331-1586

procedure TForm1.Button1Click(Sender: TObject);var i: Integer; SX: Integer; SY: Integer;begin SX := ClientWidth; SY := ClientHeight; with Canvas do begin SY:=Trunc(SY/8); {a procedure Trunc, transforma um valor do tipo Real em tipo Inteiro} for i:= 0 to 6 do

begin Pen.Width:= i+1; MoveTo(0,(i*SY)+20); LineTo(SX,(i*SY)+20); end; end;end;

Page 90: 00200 - Delphi 5

Página: 90

Delphi 5

Celta Informática - F: (11) 4331-1586

DESENHO DE RETÂNGULOS

Para desenhar retângulos use o método Rectangle do TCanvas. Comoparâmetros são utilizadas as coordenadas dos cantos superior esquer-do e inferior direito do retângulo.

Canvas.Retangle (X1, Y

1 , X

2, Y

2);

Digite o exemplo abaixo.

procedure TForm1.Button1Click(Sender: TObject);begin with Canvas do begin Rectangle (10,10,110,110); Rectangle (130,10,260,110); end;end;

Page 91: 00200 - Delphi 5

Página: 91

Delphi 5

Celta Informática - F: (11) 4331-1586

Observe que o desenho ficou por trás do botão, isto ocorre por que obotão está acima do formulário e o desenho faz parte da tela do formulá-rio, o botão seria como uma borracha sobre um papel desenhado.

Para preenchermos estes retângulos, usamos o tipo TBrush que comoTPen, é uma propriedade do TCanvas. As propriedades mais comunsdo TBrush são:

Color - define a cor do interior da figuraStyle - indica o padrão de preenchimento

As cores são as mesmas da Pen e os estilos são: bsSolid, bsClear,bsBDiagonal, bsFDiagonal, bsCross, bsDiagCross, bsHorizontal ebsVertical.

Faça o exemplo a seguir:

procedure TForm1.Button1Click(Sender:TObject);begin with Canvas do begin Brush.Style:=bsFDiagonal; Brush.Color:=clBlack; Rectangle (10,10,110,110); Brush.Color:=clRed; Brush.Style:=bsHorizontal; Rectangle (130,10,260,110); end;end;

Page 92: 00200 - Delphi 5

Página: 92

Delphi 5

Celta Informática - F: (11) 4331-1586

DESENHO DE ELIPSES

O desenho de elipses é feito com o método Ellipse. A elipse ou o círculosão desenhados usando-se as duas coordenadas de um retângulodelimitador - imaginário - onde a figura estará inscrita. Faça o exemplo aseguir.

procedure TForm1.Button1Click(Sender:TObject);begin with Canvas do begin Rectangle(10,40,80,100); Ellipse (10,40,80,100); Ellipse (90,50,250,90); Brush.Style:=bsSolid; Brush.Color:=clGreen; Ellipse (153,53,187,87); Brush.Color:=clWhite; Ellipse (168,55,173,85); end;end;

Page 93: 00200 - Delphi 5

Página: 93

Delphi 5

Celta Informática - F: (11) 4331-1586

FIGURAS

O Delphi permite a inclusão de figuras no formulário através do objeto

Image ( ), onde poderemos carregar arquivos dos tipos EMF, WMF,

BMP ou ICO.

As figuras são vistas como valores da propriedade Picture do controleImage. Podemos atribuir um valor para esta propriedade em tempo deprojeto, ou utilizar a procedure LoadFromFile para carregar um arquivode imagem durante a execução do programa.

Construiremos agora um projeto que irá carregar sucessivas figuras emum controle Image a cada clique em um botão.

Abra o programa Paint do Windows e desenhe quatro figuras semelhan-tes às mostradas abaixo, salvando-as com os nomes indicados.

Page 94: 00200 - Delphi 5

Página: 94

Delphi 5

Celta Informática - F: (11) 4331-1586

Estas figuras darão a impressão de movimento da “luz”.

Para o código do botão utilizaremos a estrutura case...of. O Delphi pos-sui modelos de código (code templates) caso o programador não selembre da sintaxe exata de determinada estrutura, estes modelos po-dem ser editados ou adicionados novos modelos. Para ativar o codetemplate, pressione Ctrl+J para exibir uma lista com os códigos permiti-dos.

Entre com o código a seguir para o botão até o ponto indicado, pressioneCtrl+J e escolha case statement na lista.

Page 95: 00200 - Delphi 5

Página: 95

Delphi 5

Celta Informática - F: (11) 4331-1586

Complete o código seguindo a listagem a seguir.

implementationvar sinal:Integer;{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);begin with Image do begin case Sinal of 0:begin picture.loadfromfile (‘c:\...\frame1.bmp’); sinal:=1; end; 1:begin picture.loadfromfile (‘c:\...\frame2.bmp’); sinal:=2; end; 2:begin picture.loadfromfile (‘c:\...\frame3.bmp’); sinal:=3; end; 3:begin picture.loadfromfile (‘c:\...\frame4.bmp’); sinal:=0; end; end; {case} end; {with}end; {procedure}

procedure TForm1.FormCreate(Sender: TObject);begin Sinal:=1; Image.Picture.LoadFromFile (‘c:\...\frame1.bmp’);end;

Page 96: 00200 - Delphi 5

Página: 96

Delphi 5

Celta Informática - F: (11) 4331-1586

Executando o programa:

Ao invés de cada figura ser carregada do disco quando necessitarmos,poderemos incluir todas de uma só vez no aplicativo.

Vamos então alterar o programa anterior copiando o controle Image ecolando três cópias dele no formulário, todos na mesma posição. Inclu-indo também um controle Timer para que a mudança entre as figurasocorra automaticamente.

Altere a propriedade Enabled:=False do Timer. E para os controle Image,Visible:=False e na propriedade Picture carregue as figuras utilizadasanteriormente - Frame1.bmp a Frame4.bmp.

Digite o código a seguir:

procedure TForm1.ButtonClick(Sender: TObject);begin if Button.caption=’&Parar’ then begin Button.caption:=’&Automático’; Timer.enabled:=False;

Page 97: 00200 - Delphi 5

Página: 97

Delphi 5

Celta Informática - F: (11) 4331-1586

exit; {sai da procedure, sem executar as linhas seguintes} end; Timer.enabled:=True; Button.caption:=’&Parar’;end;

procedure TForm1.TimerTimer(Sender: TObject);begin case Sinal of 0:begin Image1.Visible:=True; Image4.Visible:=False; Sinal:=1; end; 1:begin Image2.Visible:=True; Image1.Visible:=False; Sinal:=2; end; 2:begin Image3.Visible:=True; Image2.Visible:=False; Sinal:=3; end; 3:begin Image4.Visible:=True; Image3.Visible:=False; Sinal:=0; end; end;end;

procedure TForm1.FormCreate(Sender: TObject);begin Sinal:=1; Image1.Visible:=True;end;

Page 98: 00200 - Delphi 5

Página: 98

Delphi 5

Celta Informática - F: (11) 4331-1586

Como próximo passo vamos incluir um controle ScrollBar ( ) que irácontrolar a variação da propriedade Interval do Timer.

Altere as propriedades da ScrollBar de acordo com a figura a seguir:

Onde:Kind - especifica se a scrollbar será horizontal ou vertical.LargeChange - determina o quanto muda a posição quando ousuário clica a barra de rolagem em um de seus lados.Max - especifica o valor máximo da posição.Min - especifica o valor mínimo da posição.SmallChange - determina o quanto muda a posição quando ousuário clica nas setas da barra de rolagem.

Digite a procedure a seguir para o evento OnChange da ScrollBar, queocorre quando o usuário muda a posição da barra de rolagem.

procedure TForm1.ScrollBarChange(Sender: TObject);begin Timer.interval:=ScrollBar.position; {A propriedade position contém o valor da posição da barra de rolagem, e varia entre 100 e 1000 neste exemplo.}end;

Page 99: 00200 - Delphi 5

Página: 99

Delphi 5

Celta Informática - F: (11) 4331-1586

EXEMPLO V - CATÁLOGO

Neste projeto de catálogo telefônico, trabalharemos com acesso a arqui-vos do tipo aleatório. Ele será constituído por três Units e dois Formulári-os. Duas Units serão associadas aos formulários e a outra Unit conteráapenas códigos de acesso ao disco (HD) sem estar associada a ne-nhum formulário.

Inicie um novo projeto e crie o formulário, inserindo e modificando aspropriedades dos objetos, como a figura abaixo.

Altere a propriedade Filter do controle SaveDialog, para salvar o catálo-go no formato de arquivos binários (.dat)

Page 100: 00200 - Delphi 5

Página: 100

Delphi 5

Celta Informática - F: (11) 4331-1586

Dê um clique-duplo no controle MainMenu para editar o menu, conformeo exemplo.

Deveremos inserir um novo formulário ao nosso projeto que será utiliza-do para selecionar um determinado registro do arquivo de dados. Parainserir um novo formulário ao projeto, escolha a opção New Form do

menu File ou clique no botão New Form ( ) na barra de ferramentas.

Monte este novo formulário como mostrado abaixo.

Este novo formulário irá apresentar ao usuário os nomes de pessoas -registros no arquivo - contidos no catálogo através do componenteComboBox (caixa combinada).

O ComboBox, é um controle de edição associado à uma lista contendoitens disponíveis para a escolha do usuário. O usuário poderá tanto digitaruma opção no quadro de edição, quanto escolher uma opção fornecidapela lista associada.

Page 101: 00200 - Delphi 5

Página: 101

Delphi 5

Celta Informática - F: (11) 4331-1586

A propriedade Style, determina o tipo de ComboBox que iremos traba-lhar, que pode ser:

csDropDown - Cria uma lista drop-down com uma caixa de texto, paraentrada de texto manualmente. Todos itens são strings de qualquer com-primento.

CsSimple - Cria uma caixa de texto associada a uma caixa de listasuspensa. Esta lista não aparecerá em tempo de execução a menosque o ComboBox seja dimensionado para acomodá-la.

CsDropDownList - Cria uma lista drop-down com uma caixa de texto,mas o usuário não poderá entrar com texto manualmente.

csOwnerDrawFixed - Cria uma lista drop-down com uma caixa de tex-to, para entrada de texto manualmente. Mas cada item do ComboBoxterá seu comprimento em caracteres determinado pela propriedadeItemHeight.

CsOwnerDrawVariable - Cria uma lista drop-down com uma caixa detexto, para entrada de texto manualmente. Os itens neste ComboBoxpodem ter comprimento variável.

Vamos alterar a propriedade Style do combobox para csDropDownList,pois não queremos que o usuário altere o conteúdo do combo. Evitandoque o usuário entre com um nome de pessoa inexistente.

INSERINDO UMA NOVA UNIDADE

Uma Unit pode estarvinculada a um for-mulário ou não, nósiremos criar uma Unitnão vinculada a ne-nhum formulário. Es-colha a opção New...do menu File ou o

botão New ( ) nabarra de ferramentase aparecerá a janelaNew Itens, escolhaUnit.

Page 102: 00200 - Delphi 5

Página: 102

Delphi 5

Celta Informática - F: (11) 4331-1586

O Delphi criará uma nova Unit não vinculada a nenhum formulário, jácom o cabeçalho pronto. Onde iremos digitar as rotinas de acesso aodisco.

TIPOS DE DADOS

No Delphi nós podemos criar nossos próprios tipos de dados, para fazeristo, declare o seu tipo de dado dentro de um bloco Type, antes do blocode definição de variáveis Var:

typeTMeusValores = ShortInt;

varVenda, Custo : TMeusValores;

É interessante definir um tipo de variável, porque quando tivermos umafamília de variáveis relacionadas e for necessário mudar o tipo de todaselas, basta alterar a declaração de definição de tipo destas variáveis:

typeTMeusValores = LongInt;

Venda e Custo eram variáveis ShortInt, após a nova definição passam aser LongInt.

Page 103: 00200 - Delphi 5

Página: 103

Delphi 5

Celta Informática - F: (11) 4331-1586

REGISTROS

Para armazenar os dados de uma pessoa (Nome, Endereço e Telefone),usamos um registro. Registro é um tipo de dado que reúne alguns itensde tipos diferentes, nosso tipo registro terá o nome de TPessoasReg.Em um projeto podem existir várias variáveis do tipo TPessoasReg.

Declare o novo tipo na seção Interface da nova Unit (DiscoUnt - nomesalvo em disco).

unit DiscoUnt;

interface

type {registro com dados pessoais} TPessoasReg=record CNome: string[30]; CTelefone: string[15]; CEndereco: string[40];end;

TPessoas = file of TPessoasReg;

var PesArq: TPessoas;

O Delphi possui um tipo denominado arquivo, que permite escrever eler arquivos em disco. Para declarar um tipo arquivo, associamos o nomeda variável a um tipo de dado previamente existente. No nosso caso:TPessoasReg.

Na listagem acima definimos além do tipo TPessoasReg, o tipo TPessoas,definindo-o como um tipo de arquivo formado por registros do tipoTPessoasReg.

Os campos são declarados como String de tamanhos fixos pois, casonão fossem declarados os tamanhos, eles iriam ocupar o espaço de 255Bytes.

Page 104: 00200 - Delphi 5

Página: 104

Delphi 5

Celta Informática - F: (11) 4331-1586

Logo após, informamos ao Delphi que existe um tipo de arquivo compos-to por esse registro, e também declaramos uma variável do tipo dessearquivo de registros, essa variável conterá o nome do arquivo aberto emdisco.

Algumas procedures e functions, precisam de parâmetros para trabalha-rem, nós declaramos esses parâmetros no cabeçalho da procedure, in-dicando um nome de referência, o seu tipo de dado e o prefixo var. Pri-meiro declaramos as procedures na seção Interface e depoisimplementamos na seção Implementation.

procedure AbrirArq(var A:TPessoas;var NomeArq:string; var N:boolean);procedure FecharArq(var A:TPessoas);procedure GravarArq(var A:TPessoas;var RegN:integer; var Reg:TPessoasReg);procedure LerArq(var A:TPessoas;var RegN:integer; var Reg:TPessoasReg);

implementation

procedure AbrirArq(var A:TPessoas;var NomeArq:string; var N:boolean);begin Assign (A, NomeArq); if N then Rewrite (A) else Reset (A);end;

procedure FecharArq (var A:TPessoas);begin Close (A);end;procedure GravarArq (var A:TPessoas;var RegN:integer; var Reg:TPessoasReg);begin Seek (A,RegN); Write (A,Reg);end;

Page 105: 00200 - Delphi 5

Página: 105

Delphi 5

Celta Informática - F: (11) 4331-1586

procedure LerArq (var A:TPessoas; var RegN:integer; var Reg:TPessoasReg);begin Seek (A,RegN); Read (A,Reg);end;

end.

Antes de abrir um arquivo para leitura e gravação, nós temos que associá-lo a uma variável do mesmo tipo dos registros contidos no arquivo emdisco. Para isso usamos a procedure Assign. Assign diz ao Delphi quetodas as operações com a variável terão ligação com um arquivo emparticular.

Assign(variável, nome do arquivo);

Após a associação, abrimos o arquivo com uma das seguintes formas:

1) Reset - abre um arquivo existente para leitura ou gravação.2) Rewrite - abre um arquivo novo para leitura ou gravação. Caso jáexista o arquivo, todos os dados anteriores serão perdidos.

Reset(nome do arquivo)Rewrite(nome do arquivo)

Para gravar ou ler um registro, usamos as funções Write e Read, infor-mando a variável do arquivo e em qual variável estará ou conterá o regis-tro.

Write(variável arquivo,variável registro)Read(variável arquivo,variável registro)

Page 106: 00200 - Delphi 5

Página: 106

Delphi 5

Celta Informática - F: (11) 4331-1586

PONTEIRO DE REGISTROS

O ponteiro do arquivo indica qual registro será afetado com a próximaoperação de leitura ou gravação. Sempre que um arquivo é aberto, oponteiro é posicionado no início do arquivo. Cada operação de leitura ougravação, move o ponteiro um registro à frente. Ou seja, se o registro 3for lido, o ponteiro estará apontando para o registro 4, e a próxima opera-ção será realizada com o registro 4.

Para acessar um registro aleatoriamente, usamos a procedure Seek.Esta procedure posiciona o ponteiro no registro que quisermos, antes deuma leitura ou gravação.

Seek(variável arquivo,número registro)

Os registros em um arquivo são numerados seqüencialmente a partir doregistro 0. Existem mais duas funções úteis para manipulação de arqui-vos, FileSize e FilePos. A primeira indica quantos registros o arquivotem, e a segunda indica a posição do ponteiro.

Para ligarmos as Units, devemos colocar o nome das Units acessadasna seção uses. Uma vez declarada uma unidade na seção uses deoutra unidade, você poderá referenciar qualquer coisa na seção deinterface da unidade nomeada. Feita esta ligação, poderemos acessaras variáveis e procedures da outra unidade.

O formulário frmCatalogo (CatalogoUnt), terá acesso aos procedimen-tos das unidades ProcurarUnt e DiscoUnt. Então, declare estas duasunidades logo após as unidades já colocadas pelo Delphi.

unit CatalogoUnt;

interface

usesWindows, Messages, SysUtils, Classes, Graphics,Controls,Forms, Dialogs, Menus, StdCtrls,ProcurarUnt,DiscoUnt;

Page 107: 00200 - Delphi 5

Página: 107

Delphi 5

Celta Informática - F: (11) 4331-1586

Declare as variáveis utilizadas na unidade CatalogoUnt, como mostradoabaixo.

private { Private declarations } strArqNovo,strArqAtual: string; bolNovo,bolArquivoAberto: boolean; {Prefixos str= variável string bol=variável boolena}public { Public declarations } end;

Comece a implementação dos procedimentos associados aos objetos eseus eventos, seguindo as listagens abaixo.

procedure TfrmCatalogo.itmNovoClick(Sender: TObject);begin edtNome.Text:=’’; edtTelefone.Text:=’’; edtEndereco.Text:=’’; bolNovo:=True; strArqNovo:=’Temp.dat’; strArqAtual:= strArqNovo; DiscoUnt.AbrirArq (PesArq, strArqNovo, bolNovo); {Executa procedimento na unidade DiscoUnt} bolArquivoAberto:=True;end;

procedure TfrmCatalogo.itmAbrirClick(Sender: TObject);begin edtNome.Text:=’’; edtTelefone.Text:=’’; edtEndereco.Text:=’’; if OpenDialog.Execute then begin strArqAtual:=OpenDialog.Filename; bolNovo:=False; DiscoUnt.AbrirArq (PesArq, strArqAtual, bolNovo) end else Exit; bolArquivoAberto:=True;end;

Page 108: 00200 - Delphi 5

Página: 108

Delphi 5

Celta Informática - F: (11) 4331-1586

Para se referir a um procedimento em outra unidade, nós informamos primeiro onome da unidade e depois o nome do procedimento: DiscoUnt.AbrirArq(...);.

procedure TfrmCatalogo.btnNovoClick(Sender: TObject);var Reg: DiscoUnt.TPessoasReg; intRegN: Integer;begin edtNome.SetFocus; if not bolArquivoAberto then begin ShowMessage (‘Abra primeiro um arquivo’); exit; end; if btnNovo.Caption=’&Novo’ then begin edtNome.Text:=’’; edtTelefone.Text:=’’; edtEndereco.Text:=’’; btnNovo.Caption:=’A&dicionar’; end else begin with Reg do begin CNome:=edtNome.Text; CTelefone:=edtTelefone.Text; CEndereco:=edtEndereco.Text; end; frmProcurar.cbxLista.Items.Add (edtNome.Text);

intRegN:= FileSize(PesArq); DiscoUnt.GravarArq (PesArq, intRegN, Reg); btnNovo.Caption:=’&Novo’; end;end;

procedure TfrmCatalogo.btnAtualizarClick(Sender: TObject);var Reg : TPessoasReg; intRegN :integer;begin with Reg do begin CNome:=edtNome.Text;

Page 109: 00200 - Delphi 5

Página: 109

Delphi 5

Celta Informática - F: (11) 4331-1586

CTelefone:=edtTelefone.Text; CEndereco:=edtEndereco.Text; end; frmProcurar.cbxLista.Items.Add (edtNome.Text); intRegN:= FilePos(PesArq)-1; DiscoUnt.GravarArq (PesArq, intRegN, Reg);end;

procedure TfrmCatalogo.FormCreate(Sender: TObject);begin bolArquivoAberto:=False;end;

procedure TfrmCatalogo.itmSalvarClick(Sender: TObject);begin if SaveDialog.Execute then begin strArqNovo:=SaveDialog.Filename; DiscoUnt.FecharArq (PesArq); RenameFile(strArqAtual,strArqNovo); {a função RenameFile,renomeia um arquivo} bolNovo:=False; DiscoUnt.AbrirArq (PesArq, strArqNovo, bolNovo); end;end;

procedure TfrmCatalogo.btnProcurarClick(Sender: TObject);begin frmProcurar.ShowModal;end;

Page 110: 00200 - Delphi 5

Página: 110

Delphi 5

Celta Informática - F: (11) 4331-1586

Para mostrar outro formulário, usamos o método Show ou ShowModal.Show abre uma janela que pode ser alternada entre outras janelas doaplicativo, enquanto ShowModal não aceita uma troca da janela ativa.Com ShowModal o usuário só poderá ir para outra janela, após ter fecha-do a janela Modal.

Comece a construção do código para o formulário frmProcurar, infor-mando ao Delphi que ela irá acessar a unidade DiscoUnt.

unit ProcurarUnt;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls,DiscoUnt;

Declare as variáveis intReN e Reg.

private { Private declarations } intRegN: Integer; Reg: TPessoasReg;

Page 111: 00200 - Delphi 5

Página: 111

Delphi 5

Celta Informática - F: (11) 4331-1586

Siga a listagem abaixo para os eventos associados.

procedure TfrmProcurar.FormActivate(Sender:TObject);begin cbxLista.Clear; {limpa o conteúdo do ComboBox} Seek (PesArq,0); while Not Eof (PesArq) do {enquanto não chegar ao final do arquivo, faça} begin Read(PesArq,Reg); cbxLista.Items.Add (Reg.CNome); end;end;

procedure TfrmProcurar.btnCancelarClick(Sender:TObject);begin Close;end;

procedure TfrmProcurar.btnOkClick(Sender: TObject);begin intRegN:=cbxLista.ItemIndex; DiscoUnt.LerArq (PesArq,intRegN,Reg); with frmCatalogo do begin edtNome.Text:=Reg.CNome; edtEndereco.Text:=Reg.CEndereco; edtTelefone.Text:=Reg.CTelefone; end; Close;end;

Page 112: 00200 - Delphi 5

Página: 112

Delphi 5

Celta Informática - F: (11) 4331-1586

Para preencher um quadro combo com dados, temos duas possibilida-des:

1) Usar o método Add para a sua propriedade Items. Emtempo de execução.

2) Editar a propriedade Items em tempo de projeto.

Por fim, declare a unidade CatalagoUnt na seção Implementation. Por-que a unidade ProcurarUnt também se referencia à CatalogoUnt, mas seCatalogoUnt for declarada na seção uses da interface, o Delphi geraráum erro de referência circular.

implementation

uses CatalogoUnt;

{$R *.DFM}

Salve, execute e teste o programa.

Page 113: 00200 - Delphi 5

Página: 113

Delphi 5

Celta Informática - F: (11) 4331-1586

BANCO DE DADOS SIMPLES

Um banco de dados pode ser definido como um conjunto unificado deinformações compartilhadas por pessoas autorizadas de uma organiza-ção. A função de um Banco de Dados é permitir o armazenamento e arecuperação de informações necessárias para as pessoas da organiza-ção tomarem decisões.

Um Banco de Dados é formado por um conjunto de arquivos de dados,também chamados de tabelas. Em uma tabela temos, linhas e colunas.Onde uma linha contém informações a respeito de um item em particu-lar, e a coluna possui uma parte das informações de uma linha. A seguiré mostrada uma tabela de Clientes.

446-3987Márcio1507070-8580José012

572-2258Aline005879-9687Marina002554-8788Aldair001

TelefoneNomeCódigo

A tabela mostrada acima possui os campos ou colunas: Código, Nome eTelefone. E em cada linha temos a identificação de um cliente em parti-cular.

Cada tabela em um banco de dados possui um campo que identificaunicamente cada registro. O conjunto de atributos ou campos utilizadospara gerar este índice é conhecido como chave primária. Nós pode-mos escolher qualquer campo de uma tabela para ser uma chave primá-ria, sempre levando em consideração que ela deva ser curta. Por exem-plo, usar um campo numérico é melhor do que um campo formado porstrings. Como a chave primária determina a singularidade de um regis-tro, quando se usa um string não poderemos ter dois registros com omesmo nome de cliente.

Na tabela do exemplo acima, o mais sensato é determinar o campo Có-digo como chave primária dela.

Além de determinar os campos e a chave primária da tabela, tambémteremos que definir o tipo de dado, comprimento, formato e o domí-nio para cada campo desta tabela.

Page 114: 00200 - Delphi 5

Página: 114

Delphi 5

Celta Informática - F: (11) 4331-1586

Tipo de Dado: refere-se ao conteúdo do dado, podendo ser numérico,alfabético, data, hora ou cadeia de caracteres longa ou curta.

Comprimento: refere-se ao tamanho ou número máximo de posiçõesque poderá assumir o valor ou conteúdo de cada dado.

Formato: refere-se à forma com que os dados deverão ser editados ouapresentados, definindo-se as posições de símbolos.

Domínio: especifica se os valores dos dados pertencem a uma lista devalores predefinidos, podendo estar em uma lista, ou satisfazer uma re-gra.

DATABASE DESKTOP

No grupo de programas do Delphi, encontramos o utilitário DatabaseDesktop, que permite a criação e manipulação de banco de dados dediversos formatos.

O nosso próximo exemplo, trabalhará duas tabelas. Uma com o cadas-tro dos clientes e outra com as vendas realizadas para estes clientes.

Execute o Database Desktop, selecionando a opção Database Desktopno menu Tools.

Page 115: 00200 - Delphi 5

Página: 115

Delphi 5

Celta Informática - F: (11) 4331-1586

Abra uma nova tabela como mostra a figura:

Escolha o tipo Paradox 7. Aparecendo então a caixa de diálogo CreateParadox 7 Table.

Digite o nome para o primeiro campo (Codigo) e mude para tipo de cam-po (Type) usando a tecla Tab. Com o campo Type selecionado, de umclique-direito nele, para exibir o menu pop-up com todos os valores parao tipo de campo. As letras sublinhadas correspondem à letra de atalhopara cada tipo de dado. O campo CODIGO será definido como tipo Alpha.Apesar de ser um campo com números nós não iremos realizar nenhumcálculo matemático com ele, por isso o definimos como Alpha.

Page 116: 00200 - Delphi 5

Página: 116

Delphi 5

Celta Informática - F: (11) 4331-1586

O campo Codigo será a chave primária para a identificação dos clientesna tabela Clientes. Para definir um campo como chave primária, pressi-one qualquer tecla quando o campo Key estiver selecionado, marcandoeste campo com um * - asterisco.

Page 117: 00200 - Delphi 5

Página: 117

Delphi 5

Celta Informática - F: (11) 4331-1586

Dê continuidade à entra dos outros campos, seguindo o modelo apre-sentado abaixo.

Salve esta tabela como Clientes.db.

Page 118: 00200 - Delphi 5

Página: 118

Delphi 5

Celta Informática - F: (11) 4331-1586

Logo após, monte uma nova tabela Paradox7 de acordo com a figura,salvando-a como Vendas.db.

Para a tabela Vendas relacionar-se com a tabela Clientes, deveremosdefinir o campo Codigo como índice secundário na tabela Vendas.

No ComboBox Table properties, selecione a opção Secondary Indexese clique no botão Define..., aparecendo a caixa de diálogo DefineSecondary Index.

No diálogo Define Secondary Index, selecione o campo Codigo e dêum clique na seta para introduzi-lo como campo índice, e finalmente dêum clique no botão OK para aceitar a opção.

Será então solicitado um nome para este índice, digite ICodigo.

Page 119: 00200 - Delphi 5

Página: 119

Delphi 5

Celta Informática - F: (11) 4331-1586

Salve novamente a tabela e saia do Database Desktop, através do menuFile >> Exit.

O Delphi possui um assistente para a construção de formulários de aces-so a Banco de Dados (Form Wizard), nós iremos utilizá-lo para construiro projeto de banco de dados que utiliza as tabelas de Clientes e Vendasmontadas anteriormente.

Volte ao Delphi, e exclua o formulário Form1 que o Delphi cria junto comum novo projeto. No menu Project, escolha a opção Remove from

Project..., ou o botão ( ) na barra de ferramentas, e exclua Form1 nãosalvando o arquivo. Pois o Form Wizard criará um novo formulário auto-maticamente.

Page 120: 00200 - Delphi 5

Página: 120

Delphi 5

Celta Informática - F: (11) 4331-1586

Excluído o formulário, inicie o wizard a partir do menu Database >>Form Wizard... do menu. O Database Form Wizard é um assistentepara a criação de Formulários envolvendo banco de dados. Este assis-tente ajudará na definição dos campos a serem mostrados e o layout doformulário, além de incluir um componente DBNavigator, que será usadopara a navegação entre os registros das tabelas.

DBNavigator

O primeiro formulário terá duas divisões, uma para cada tabela. A primei-ra conterá os dados relativos a um cliente, e a segunda as comprasrealizadas por este cliente. Inicie o Form Wizard, seguindo as opçõesmostradas nas figuras a seguir; pressionando o botão Next para conti-nuar com o assistente.

Page 121: 00200 - Delphi 5

Página: 121

Delphi 5

Celta Informática - F: (11) 4331-1586

Estas opções criam um formulário com duas divisões, usando compo-nentes TTable. Um componente TTable realiza a conexão entre o for-mulário e uma tabela do banco de dados. Ele é um componente visívelsomente em tempo de projeto - semelhante ao componente TTimer.

Inclua a tabela Clientes.db, como sendo a master query. Ou seja, atabela que irá comandar a apresentação dos dados.

Page 122: 00200 - Delphi 5

Página: 122

Delphi 5

Celta Informática - F: (11) 4331-1586

Clique no botão >> para incluir todos os campos da tabela Clientes.dbno formulário.

A opção Vertical posiciona os campos dentro do formulário, um acimado outro.

Page 123: 00200 - Delphi 5

Página: 123

Delphi 5

Celta Informática - F: (11) 4331-1586

Alinhamento Left, posiciona as legendas ao lado esquerdo dos quadrosde Edit.

Defina a tabela Vendas.db como a tabela de detalhes.

Inclua todos os campos da tabela Vendas, e a seguir, escolha o formatoGrid para a apresentação da tabela Vendas.

Page 124: 00200 - Delphi 5

Página: 124

Delphi 5

Celta Informática - F: (11) 4331-1586

Selecione os campos que farão a ligação entre as duas tabelas, esco-lhendo ICodigo como índice. Em Detail Fields e Master Fields, seleci-one o campo Codigo como campo de junção em ambas as tabelas epressione Add. Como mostrado a seguir.

Page 125: 00200 - Delphi 5

Página: 125

Delphi 5

Celta Informática - F: (11) 4331-1586

Após o clique em Add, clique no botão Next. A seguir finalize a execuçãodo Form Expert com a criação de apenas um formulário.

Page 126: 00200 - Delphi 5

Página: 126

Delphi 5

Celta Informática - F: (11) 4331-1586

Vamos agora, alterar as propriedades de alguns componentes do formu-lário.

Comece alterando o tamanho do Panel3, alterando antes sua proprieda-de Align para alBottom, a fim de visualizar todos os dados dos clientes. Eredesenhe o formulário como a figura abaixo.

Para formatar a entrada de dados, ou seja, definir o formato do dado,para a tabela Clientes.db, dê um duplo-clique em Table1 para acessar oeditor de campos (fields edit). Selecione o campo CEP e no ObjectInspector, procure a propriedade Edit Mask. Esta propriedade abre oquadro de diálogo Input Mask Editor onde poderemos escolher umamáscara para o campo CEP, escolha Long Zip Code e na caixa InputMask elimine um dígito 9 da segunda parte da máscara, como mostramas figuras a seguir.

Page 127: 00200 - Delphi 5

Página: 127

Delphi 5

Celta Informática - F: (11) 4331-1586

Altere também a propriedade EditMask do campo Telefone, escolhendo amáscara Phone e adicionando um número 9 na primeira parte do núme-ro telefônico. Feche a Input Mask Edit.

Selecione o campo Codigo em Table2, e mude a propriedadeVisible:=False, para não aparecer o código do cliente no componenteDBGrid, pois ele já será exibido por um componente Edit.

Selecione o EditEstado e altere a propriedadeCharcase:=ecUpperCase, para que os caracteres neste TEdit sejamapresentados em maiúscula.

Insira um botão BitBtn no Formulário com as seguintes definições depropriedades:

Caption:=Sai&rKind:=bkCLose

A propriedade Kind do BitBtn determina qual desenho será mostrado naface do botão. Esta propriedade também implementa algumas funçõesao botão eliminando linhas de código, neste caso não será necessárionenhuma linha de código para fechar o formulário.

Finalmente, mude a propriedade Active dos dois componentes TTable(Table1 Table2) de False para True. Isto tornará o Table ativo tanto emtempo de projeto quanto em tempo de execução. Ao ativarmos o Table,os controles TEdit mudarão seu conteúdo, passando a exibir o primeiroregistro da tabela a eles ligada.

Page 128: 00200 - Delphi 5

Página: 128

Delphi 5

Celta Informática - F: (11) 4331-1586

Dê o nome de frmClientes ao Formulário e salve como ClientesUnt.pas.

O próximo formulário será construído manualmente, sem o uso do FormWizard. Não utilizaremos o Form Wizard por questões didáticas, maseste novo formulário também poderia ser construído utilizando o assis-tente.

Este segundo formulário servirá para cadastrar vendas. O usuário sele-cionará um nome de cliente já cadastrado, a partir de um quadro combo,digitará a data da venda e escolherá um produto, através de botões deopção, definindo também a quantidade de itens de um mesmo produto eo valor total da venda.

Insira um novo formulário ao projeto a partir do menu File >> New Form

ou clique no botão New Form ( ). Monte este novo formulário utilizan-

do os componentes da paleta Data Controls mostrados na figura a se-guir.

Page 129: 00200 - Delphi 5

Página: 129

Delphi 5

Celta Informática - F: (11) 4331-1586

Altere as propriedades indicadas na tabela a seguir para alguns compo-nentes.

TrueShowHintnavVendasNamedsrVendasDataSourceDbNavigatordsrClientesNametblClientesDataSetDataSource2TrueActivetblClientesNameClientes.dbTableNameC:\Banco dadosDatabaseNameTable2dsrVendasNametblVendasDataSetDataSource1TrueActivetblVendasNameVendas.dbTableNameC:\Banco dados DatabaseNameTable1ValorPropriedadeComponente

Page 130: 00200 - Delphi 5

Página: 130

Delphi 5

Celta Informática - F: (11) 4331-1586

Selecione todos os DBEdit, dando um clique em cada um enquanto pres-siona a tecla Shift, e altere a propriedade DataSource de todos ao mes-mo tempo para dsrVendas. Depois selecione um por vez e altere a pro-priedade DataField correspondente a cada DBEdit.

Dê um duplo-clique em tblVendas para editar o campo Data. Repare quea janela Fields Editor aparece vazia sem nenhum campo listado. Clique-direito no Fields Editor e escolha a opção Add Fields..., selecione todosos campos e pressione Ok, para inserir todos os campos da tabelaVendas.db no Fields Editor.

Voltando ao Fields Edit, selecione o campo DATA e altere o formato dapropriedade EditMask para Date. Após a inserção de todos os camposda tabela Vendas no componente tblVendas, as propriedades destes cam-pos podem ser acessadas diretamente através do Object Inspector.Como ilustra a figura a seguir.

Page 131: 00200 - Delphi 5

Página: 131

Delphi 5

Celta Informática - F: (11) 4331-1586

O componente DbLookupComboBox, exibe os valores de um campo emuma lista, onde o usuário poderá escolher um valor para este campo.Os valores exibidos pertencem a uma tabela e quando o usuário fizeruma escolha, o valor escolhido será vinculado a uma outra tabela.

No formulário Vendas, o nome do cliente virá da tabela Clientes e quandoinserirmos a venda, o nome do cliente escolhido será vinculado a estavenda na tabela Vendas através da chave primária Codigo.

Portanto o DbLookupComboBox trabalha com duas tabela simultanea-mente, uma que fornece os dados para a lista e outra que está associa-da ao DbLookupComboBox. A tabela abaixo explica as propriedadesrelativas a esta vinculação.

Indica qual campo será mostrado na lista doquadro combo.

ListField

Indica qual o campo da tabela acima seráusado como vínculo.

KeyField

Determina a tabela que fornecerá os dadospara a lista.

ListSourceIndica o campo associado.DataFieldIndica qual tabela associada.DataSourceUsoPropriedade

Page 132: 00200 - Delphi 5

Página: 132

Delphi 5

Celta Informática - F: (11) 4331-1586

Siga a tabela abaixo para determinar as propriedades doDbLookupComboBox.

NOMEListFieldCodigoKeyFielddsrClientesListSourceCodigoData FielddsrVendasData SourceValorPropriedade

A lista de clientes será vinculada através do campo Codigo mas estaráexibindo ao usuário, o campo Nome.

O componente DBRadioGroup apresenta uma série de opçõespredefinidas a serem selecionadas pelo usuário, contendo um botão paracada opção. Estas opções são determinadas pela propriedade Items.O valor do campo na tabela associada ao DBRadioGroup, será o mes-mo valor do botão selecionado.

Selecione o DBRadioGroup e edite a propriedade Items, configurandotrês opção para produtos vendidos, de acordo com o modelo a seguir.

Page 133: 00200 - Delphi 5

Página: 133

Delphi 5

Celta Informática - F: (11) 4331-1586

Altere outras propriedades DBRadioGroup conforme a tabela mostradaabaixo:

NOMEListFieldCodigoKeyFielddsrClientesListSourceCodigoData FielddsrVendasData SourceValorPropriedade

Salve o formulário com o nome de VendasUnt.Pas. A sua forma final émostrado abaixo.

O próximo formulário será a abertura do programa. A partir dele serãochamados os dois formulários construídos anteriormente.

Acrescente um formulário vazio ao projeto e construa-o da seguinte for-ma:

Page 134: 00200 - Delphi 5

Página: 134

Delphi 5

Celta Informática - F: (11) 4331-1586

A propriedade Hint dos SpeedButtons, contém o texto que será mos-trado quando o mouse ficar parado por alguns instantes sobre o botão.Define ShowHint:=True, para ativar esta função.

Os dois controles DBNavigator também possuem a propriedade Hint,defina para eles ShowHint:=True e altere o texto que será mostrado aousuário modificando a propriedade Hints.

Page 135: 00200 - Delphi 5

Página: 135

Delphi 5

Celta Informática - F: (11) 4331-1586

Com isto concluímos a construção da interface gráfica com o usuário.

Temos então no projeto três formulários: frmControle, frmClientes efrmVendas. Salvos em suas respectivas unidade: ControleUnt,ClientesUnt e VendasUnt.

Começaremos o código pelo frmControle.

implementation

uses VendasUnt, ClientesUnt;

{$R *.DFM}procedure TfrmControle.spbSairClick(Sender: TObject);begin Close;end;procedure TfrmControle.spbVendasClick(Sender: TObject);begin frmVendas.Show;end;

procedure TfrmControle.spbClientesClick(Sender: TObject);begin frmClientes.Show;end;

Código para frmVendas.

procedure TfrmVenda.btnSairClick(Sender: TObject);begin frmVenda.Hide; {o método Hide esconde o Formulário, mas não o elimine da memória, enquanto que o método Close retira o formulário da memória }end;

Page 136: 00200 - Delphi 5

Página: 136

Delphi 5

Celta Informática - F: (11) 4331-1586

Antes de compilar o projeto, verifique se o formulário inicial do programaé mesmo o frmControle. No menu Project >> Option..., defina o formu-lário frmControle como o Main Form

Execute o programa pressionando F9.

Page 137: 00200 - Delphi 5

Página: 137

Delphi 5

Celta Informática - F: (11) 4331-1586

INTEGRANDO MS-WORD COM DELPHI

Na paleta Server do Delphi encontramos diversos componentes que per-mitem uma conexão COM (Components Object Model) com a famíliaOffice. O padrão COM, desenvolvido pela Microsoft, oferece mais recur-sos ao programador que o uso da OLE Automation. Com estes compo-nentes o programador pode automatizar tarefas utilizando recursos deoutros programas.

É possível criar um relatório no Word e depois realizar alterações atravésde um programa feito em Delphi. Facilitando a vida de usuários quenecessitam editar estes relatórios, criando uma personalização a partirde um documento padrão.

Como exercício inicial, iremos criar um documento no Word com o textoescrito no componente Memo do projeto Bloco de notas.

Abra o projeto Bloco de Notas construído anteriormente. Adicione umbotão e os componentes WordApplication e WordDocument da paletaServer.

Altere o nome dos componentes:

WDWordDocumentWAWordApplicationbtnWordButton1

Page 138: 00200 - Delphi 5

Página: 138

Delphi 5

Celta Informática - F: (11) 4331-1586

Digite o seguinte código para o botão de comando.

procedure TfrmBlocoNotas.btnWordClick(Sender:TObject);varNomeArquivo: OLEVariant;

beginWA.Connect; //Inicializa o WordWD.Activate; //Exibe o aplicativo WordWD.NewInstance; //Cria um novo documentoWD.Content.InsertAfter(memTexto.Lines.Text);//Insere textoNomeArquivo:=‘C:\Temp\Bloco.doc’;//String em OLEVariantWA.ActiveDocument.SaveAs(NomeArquivo,EmptyParam,EmptyParam,

EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam);WD.Close; //Fecha documento

end;

Inicialmente é dada a abertura do Word e depois cria-se um novo docu-mento. A procedure InsertAfter adiciona um texto o final do documento,mas poderia ser InsertBefore para texto antes.

Na lista de code completion é possível observar todos os procedimentose funções associadas à cada um desses objetos. Na ajuda do WordBasicé possível encontrar detalhes sobre a operação de cada procdimento.

A partir do Word abra o Editor do Visual Basic (Ferramentas >> Macro) ena sua ajuda procure por SaveAs, escolhendo a opção Método SaveAs.

Note que este método requer a definição de onze parâmetros para salvaro arquivo. Mas para salvar o texto digitado no programa, é necessárioapenas informar o nome do arquivo a ser salvo, mantendo os demaisparâmetros vazios. Isto faz o Word manter os valores padrão para cadaopção de salvamento.

Execute o programa. Digite algum texto no Memo e depois dê um cliqueno botão Word, notando que o texto será escrito no documento, salvo edepois fechado.

Page 139: 00200 - Delphi 5

Página: 139

Delphi 5

Celta Informática - F: (11) 4331-1586

Segundo exemplo com o uso dos componentes COM para Word seráfeito com o programa de Banco de dados. Este programa terá um botãono formulário Vendas que ao ser clicado, abrirá um documento modelo,alterará algumas palavras, baseadas no pedido corrente, salvando o do-cumento com outro nome.

Abra o programa Banco de dados criado anteriormente, incluindo umcomponente WordApplication e um botão no formulário frmVendas.

No Word digite um documento semelhante ao mostrado na figura a se-guir, mantendo as palavras chave que serão substituídas pelo programa:DATAHOJE, NUMEROPEDIDO, NOMECLIENTE,PRODUTONOME,QUANTIDADEPRODUTO e VALORTOTAL. Salve este documento como nome de Recibo.doc.

Page 140: 00200 - Delphi 5

Página: 140

Delphi 5

Celta Informática - F: (11) 4331-1586

A maneira mais fácil de saber quais métodos implementar no programaem Delphi para efetuar as mudanças necessárias no texto, é criar umamacro no Word e depois editar e copiar no Code explorer traduzindo-apara a linguagem Object Pascal, pois ela estará em WordBasic.

Grave uma macro substituindo a palavra DATAHOJE por qualquer outra,pois o que nós desejamos é apenas a sintaxe utilizada pelo Word. Alistagem a seguir mostra uma macro que substitui o texto DATAHOJEpor “24 de Janeiro” com a opção de substituir todas.

Sub Macro1()‘‘Macro1 Macro‘Macro gravada 24/07/00 por Jair‘Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text = ”DATAHOJE”.Replacement.Text = ”24 de Janeiro”.Forward = True.Wrap = wdFindContinue.Format = False.MatchCase = False.MatchWholeWord = False.MatchWildcards = False.MatchSoundsLike = False.MatchAllWordForms = False

End WithSelection.Find.Execute Replace=wdReplaceAll

End Sub

Page 141: 00200 - Delphi 5

Página: 141

Delphi 5

Celta Informática - F: (11) 4331-1586

Na unidade do formulário frmVendas, acrescente um procedimento cha-mado Substituir que terá por função substituir cada palavra do documen-to. Este procedimento receberá dois parâmetro que são o texto a sersubstituído e o substituto.

Na implementação do procedimento Substituir, cole a macro gravada noWord.

Associe os métodos ao componente WordApplication (WA) e retire osmétodos de limpeza da procura (ClearFormatting) que serão utilizadossomente uma vez. A seguir, traduza para Object Pascal.

procedure btnReciboClick(Sender: TObject);procedure Substituir(Texto, TextoSub: String);

private{ Private declarations }

implementation

procedure TfrmVendas.Substituir(Texto, TextoSub: String);{Texto contém a palavra que será substituída e TextoSub a substituta}varRepor: OLEVariant;//Tipo de variável aceita nos métodos Word

beginRepor:= wdReplaceAll;//Constante definida em Word97.paswith WA.Selection.Find dobeginText := Texto;Replacement.Text := TextoSub;Forward := True;Wrap := wdFindContinue;//Constante definida em Word97.pasFormat := False;MatchCase := True;// = True para não ser tudo maiúsculoMatchWholeWord := False;MatchWildcards := False;MatchSoundsLike := False;MatchAllWordForms := False;

Page 142: 00200 - Delphi 5

Página: 142

Delphi 5

Celta Informática - F: (11) 4331-1586

end;WA.Selection.Find.Execute(EmptyParam,EmptyParam,EmptyParam,

EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Repor);

end;

O evento OnClick do botão, abre o arquivo Recibo.doc, limpa asformatações de procura, chama o procedimento Substituir para cadacampo do documento, atribuindo a eles os valores do registro correntenas tabelas, e por último salva com outro nome e fecha o documento.

procedure TfrmVendas.btnReciboClick(Sender: TObject);varNomeArquivo: OLEVariant;

beginNomeArquivo:=’C:\Temp\Recibo.doc’;WA.Documents.Open(NomeArquivo,EmptyParam,EmptyParam,

EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);

WA.Selection.Find.ClearFormatting;WA.Selection.Find.Replacement.ClearFormatting;Substituir (‘DATAHOJE’,FormatDateTime

(‘dd” de “mmmm” de “yyyy’,Date));Substituir(‘NUMEROPEDIDO’,tblVendasNumero.Value);Substituir(‘NOMECLIENTE’,tblClientesNome.Value);Substituir(‘PRODUTONOME’,tblVendasProduto.Value);Substituir(‘QUANTIDADEPRODUTO’,tblVendasQuantidade.AsString);Substituir(‘VALORTOTAL’,tblVendasValor.AsString);NomeArquivo:=’C:\Temp\Recibo’ +

tblVendasNumero.Value + ‘.doc’;

WA.ActiveDocument.SaveAs(NomeArquivo,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);

WA.ActiveDocument.Close(EmptyParam,EmptyParam,EmptyParam);end;

Page 143: 00200 - Delphi 5

Página: 143

Delphi 5

Celta Informática - F: (11) 4331-1586

Execute o programa e no formulário frmVendas, clique no botão Recibopara ver o Word abrir o documento, alterar o texto, salvar e fechar comoutro nome.

Page 144: 00200 - Delphi 5

Página: 144

Delphi 5

Celta Informática - F: (11) 4331-1586

LISTA DE EXERCÍCIOS

1. Qual a diferença entre um programa feito para trabalhar sob o DOSe outro construído através do Delphi?

2. O que encontramos na Paleta de Componentes?

3. Qual a função da janela Object Inspector?

4. Quais os passos para desenvolver um programa em Delphi após aanálise do projeto?

5. No primeiro programa que desenvolvemos, coloque um botão decomando que apague o conteúdo do label, e outro que finalize o pro-grama.

6. Na calculadora, mesmo redefinindo a propriedade TabStop do Editde resultado, o usuário poderá alterar o resultado da operação. Queoutro controle poderíamos utilizar no lugar de um TEdit para exibir oresultado sem que o usuário possa alterar seu valor? Altere o proje-to.

7. O ícone escolhido para representar o projeto, não estará presenteno formulário. Qual propriedade deveremos alterar para que o íconerepresentante do projeto também esteja no formulário? Responda eexecute.

8. Altere os botões do Jogo da Velha para o tipo BitBtn, e reconstrua oprojeto para alterar as propriedades Kind e Caption, exibindo nos

botões os ícones - e .

9. No Jogo da Velha, sempre o computador inicia uma nova partida.Altere o código para que o programa pergunte ao usuário quem inici-ará uma nova partida.

10. No projeto Bloco de Notas, quando escolhemos a opção Sair, oprograma não pergunta se queremos salvar as alterações realiza-das no texto. Inclua uma variável booleana na seção Implementation,alterando o seu valor no procedimento Memo1Change e verifican-do-a no momento de encerrar o programa.

Page 145: 00200 - Delphi 5

Página: 145

Delphi 5

Celta Informática - F: (11) 4331-1586

11. Inclua mais um botão no Relógio Despertador com a opção deSoneca, soando o Beep dez minutos após o primeiro despertar.

12. Construa um projeto que mostre todos os tipos de preenchimentos(hachuras) dentro de círculos em um único formulário.

13. Construa um exemplo semelhante ao da luz em movimento, masque a figura ao invés de ser desenhada em outro aplicativo, sejadesenha por instruções (ellipse e rectangle) contidas dentro do pro-grama em Delphi.

14. Substitua o controle ComboBox por um ListBox no exemplo deCatálogo, com pesquisa pelo número do telefone.

15. No último exemplo, crie mais uma tabela de Estoque, e a cadavenda realizada os valores de estoque deverão ser atualizados.

16. Crie mais duas tabelas, uma de Fornecedores e outra de Com-pras, semelhantes a Clientes e Vendas, e acrescente os campos aoseu critério.

Page 146: 00200 - Delphi 5

Celta Informáticahttp://www.celtainformatica.com.br