Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Delphi Basico, Notas de estudo de Análise de Sistemas de Engenharia

material simples de delphi para quem gostar de programar.

Tipologia: Notas de estudo

Antes de 2010
Em oferta
30 Pontos
Discount

Oferta por tempo limitado


Compartilhado em 15/04/2009

weverton-gustavo-barros-ferreira-me
weverton-gustavo-barros-ferreira-me 🇧🇷

1 documento

Pré-visualização parcial do texto

Baixe Delphi Basico e outras Notas de estudo em PDF para Análise de Sistemas de Engenharia, somente na Docsity! DELPHI Delphi 5 Delphi 5 2 . Sumário INTRODUÇÃO 4 1.1. PORQUEO WINDOWS? ERRO! INDICADOR NÃO DEFINIDO. 1.2. O QUESÃO AMBIENTES VISUAIS DE DESENVOLVIMENTO? 5 1.3. OQUE É O DELPHI 7 14. PORQUEDELPHI? 8 2. O AMBIENTE DE DESENVOLVIMENTO DO DELPHI 9 2.1. A JANELA PRINCIPAL 10 2.2. Os FORMULÁRIOS 12 2.3. O OBJECT INSPECTOR 16 2.4. — OEDITORDE CÓDIGO 23 2.5. — CODIFICANDO E COMPILANDO 24 2.6. — SALVANDO O PROJETO 26 2.7. TRABALHANDO COM UMA APLICAÇÃO 27 2.8. CRIANDO UMA CONSOLE APPLICATION 30 2.9. CRIANDO UMA APLICAÇÃO GUI 31 2.9.1. CRIANDO E ALTERANDO APLICAÇÃO DEFAULT 32 2.9.2. UTILIZANDO WIZARDS 32 2.10. O ARQUIVO DE PROJETO 33 2.11. MANIPULANDO COM AS OPÇÕES DO PROJETO 35 3 — ASUNITS 38 3.1. — ASSEÇÕES DE UMA UNIT 38 3.1.1. A SEÇÃO INTERFACE 38 3.1.2. A SEÇÃO IMPLEMENTATION 49 3.1.3. A SEÇÃO INITIALIZATION 50 3.1.4. A SEÇÃO FINALIZATION 51 4. | OS FORMULÁRIOS 51 4.1. CRIANDO FORMULÁRIOS 51 4.1.1. NOVOS FORMULÁRIOS 51 4.1.2. CONFIGURANDO O OBJECT REPOSITORY 52 4.2. EXIBINDO FORMULÁRIOS 53 4.2.1. MANIPULANDO COM PROPRIEDADES E MÉTODOS 53 4.2.2. NOMEANDO OBJETOS 54 4.2.3. FORMULÁRIOS MODAIS 55 4.2.4. FORMULÁRIOS NÃO MODAIS 56 4.2.5. FORMULÁRIOS MODAIS VERSUS NÃO MODAIS 57 5. COMANDOS DA LINGUAGEM 58 5.1. INSTRUÇÕES SIMPLES E COMPOSTAS 58 5.2. INSTRUÇÕES CONDICIONAIS 59 5.2.1. IF59 5.2.2. CASE 60 5.3. ESTRUTURAS DE REPETIÇÃO 61 5.3.1. FOR 61 5.3.2. WHILE 62 5.3.3. REPEAT 62 5.4. | COMANDOS DE DESVIO DE FLUXO PADRÃO 63 Página: 1 Delphi 5 Introdução 1.1. História A história da ciência da computação, ao contrário da grande maioria das ciências existentes atualmente, é bem curta. Apesar dessa ciência não ter uma vida tão longa quanto as demais. velocidade com que as mudanças e as descobertas ocorrem são, sem dúvida alguma, muito maiores. No início da história da computação, devido à pouca tecnologia existente, os computadores eram bem mais difíceis de se programar. Os programas deveriam ser escritos da forma mais otimizada possível. Não existia quantidade de memória suficiente para os programas funcionarem o que tornava a programação de computadores uma verdadeira arte e poucos eram os artistas capazes de dominar essa arte. A rápida evolução tecnológica fez com que computadores mais poderosos viessem a surgir, facilitando a vida dos programadores. Com o advento dos circuitos integrados, computadores cada vez memores e mais poderosos surgiram no mercado. Os computadores pessoais tornaram-se cada vez mais populares criando um mercado maior e mais amplo para a programação. Agora não só as grandes empresas tinham condições de terem computadores para gerenciar seus negócios mas também as pequenas empresas podiam contar com essa tecnologia. Com o crescimento do mercado de informática veio o surgimento de novas linguagens de programação que tinham por objetivo fornecer um ambiente propício para o desenvolvimento de aplicativos comerciais. A utilização de programas de computador aumentou cada vez. Porém um problema assustador parecia despontar no horizonte. A variedade de programas existentes no mercado acabava por acarretar gastos cada vez maiores para as empresas, gastos que haviam diminuído graças aos avanços tecnológicos dos equipamentos de informática (hardware). Cada programador ou equipe de programadores era responsável pelo desenvolvimento de seu aplicativo. A escolha da linguagem de programação, o desenho da interface com o usuário e a própria implementação eram feitas por esses grupos independentemente. Cada programa funcionava e se apresentava para os usuários de forma independente. Por exemplo, poderíamos ter programas que, para efetuar a saída do sistema, fosse necessário escolher um item de menu, enquanto que em outro, essa opção deveria ser efetuada através do acionamento de uma segiiência de teclas de atalho, como o pressionar das teclas <CTRL> + <S> simultaneamente, por exemplo. Isso era um péssimo negócio para as empresas que após a escolha e aquisição do programa (software) ainda eram obrigadas a gastar uma substancial quantia de dinheiro com treinamento de pessoal para a sua utilização. O gasto era ainda maior caso uma migração entre sistemas fosse necessária. Além dos gastos naturais com treinamento e aquisição do equipamento, existia um gasto indireto com a adaptação dos usuários ao novo sistema. Essas dificuldades, principalmente as financeiras, obrigavam o surgimento de algo que viesse a melhorar essa situação incômoda em que se encontrava a informática. Com todos esses problemas em mente, heis que surge um novo ambiente de trabalho no mercado. Surge o ambiente Windows, da empresa americana Microsoft. Mas o que é que houve de tão especial com esse ambiente para que ele fosse considerado a salvação para esse verdadeiro caos em que se encontrava a informática ne época? Duas palavras “mágicas” são capazes de responder a essa pergunta: padronização e facilidade de uso. É bem verdade que elas estão bem relacionadas uma com a outra mas mesmo assim, elas foram as responsáveis por uma verdadeira reviravolta no ramo da informática. Foi através do Windows que uma quantidade cada vez maior de pessoas passou a usar o microcomputador. Não só no trabalho, mas também em suas residências as ram a conhecer e tirar proveito da potencialidade da tecnologia que estava em suas Página: 4 Delphi 5 Uma interface mais amigável ao usuário passou a ser utilizada. A utilização de telas gráficas ao invés das tradicionais telas de entrada de texto passou a ser utilizada, eliminando um dos fatores principais que mantinham as pessoas longe dos computadores, a sua dificuldade de uso. Agora, ao invés de ter a tarefa de decorar inúmeros comandos que possibilitavam a utilização da máquina, o usuário poderia operar o microcomputador de forma bem mais intuitiva e simplificada. A padronização dos programas também foi um outro fator de destaque para a aceitação do novo ambiente. O Windows seguia um padrão dentro de seus aplicativos e para que novos aplicativos fossem desenvolvidos para ambiente, os padrões também deveriam ser mantidos. Dessa forma, o gasto com a adaptação a novos produtos seria feita de forma bem mais rápida, simplificada e eficiente, estimulando assim a venda de produtos para esse novo ambiente. As empresas viam no Windows a oportunidade de diminuir os elevados custos com o aprendizado de novas ferramentas e aumentar a sua produtividade. Contudo uma dificuldade passou a existir, desta vez não mais para os usuários dos computadores, mas sim para os desenvolvedores de software, a dificuldade de programai Programar nesse novo ambiente era bastante complicado. Passa a existir um grande dilema entre os programadores: continuar utilizando as linguagens mais antigas, mais simples de programar mas que, no entanto, não seguiam qualquer tipo de padronização e que, pouco a pouco, vinham perdendo espaço no mercado para os aplicativos desenvolvidos para o ambiente Windows ou mudar para o desenvolvimento de aplicativos que seguissem a padronização que estava conquistando as empresas mas que, com relação à tarefa de programação, era bem mais difícil e complexa e que, por consegiiência, mais cara para se desenvolver. Os analistas de sistemas e os programadores começaram a optar, mesmo com todas as dificuldades, por desenvolver aplicativos para o ambiente Windows. Para a felicidade de todos, as grandes empresas desenvolvedoras de linguagens de programação perceberam as dificuldades existentes nesse processo. Gigantes como a Borland (atual Inprise Corporation) e a própria Microsoft começaram a procurar desenvolver novas ferramentas de programação que viessem propiciar, de forma mais simplificada, o desenvolvimento de software para o ambiente Windows da mesma forma como haviam feito com os ambientes Turbo para o sistema operacional DOS. Várias ferramentas têm sido colocadas, nos últimos anos, à disposição dos programadores aumentando bastante o desenvolvimento de software para o ambiente Windows. Com o lançamento do Microsoft Visual Basic, um dos Ambientes Visuais de Desenvolvimento pioneiros, um aumento substancial de softwares produzidos foi observado. Outras empresas procuraram seguir o exemplo da Microsoft lançando seus próprios Ambientes Visuais de Desenvolvimento para o ambiente Windows. Contudo, o que são esses tais Ambientes Visuais de Desenvolvimento que tomaram toda a industria de desenvolvimento de software? A resposta para essa pergunta daremos a seguir. 1.2. Oque são Ambientes Visuais de Desenvolvimento? No início do desenvolvimento de software para o ambiente Windows, uma das grandes dificuldades existentes era o do desenvolvimento das interfaces. O programador via-se no meio de uma quantidade muito grande de código para que uma simples janela do Windows fosse exibida. Imagine então, o sacrifício que era necessário para o desenvolvimento do restante da interface como, por exemplo, a colocação de botões e caixas de edição de texto. Além da dificuldade existente com a simples colocação desses objetos (posteriormente nesta apostila trataremos do estudo dos conceitos básicos de Orientação a Objetos, o que tornará claro o entendimento do que seja um objeto) também chamados de controles, nas janelas do programa, ainda havia-se a idade de seu alinhamento dentro delas. Após cada tentativa de arrumação, o programador tava de uma nova compilação e execução do programa para verificar se as alterações no Página: 5 Delphi 5 código fonte provocaram o efeito desejado. Ao final desse imenso trabalho de estruturação da interface, centenas, ou até mesmo, milhares de linha de código haviam sido escritas para que tudo estivesse de acordo com o planejado pela equipe de programadores visuais responsáveis pelo projeto da interface. Tendo como um de seus objetivos facilitar todo esse proce de desenvolvimento de software, responsável muitas vezes por grande parte do tempo gasto durante o desenvolvimento, surgiram os chamados Ambientes Visuais de Desenvolvimento. A grande popularidade desses ambientes veio do fato de que eles vieram a permitir o desenvolvimento de programas simples e complexos com pouco, ou até mesmo nenhum, esforço de programação. A dificuldade com o desenvolvimento das interfaces para os programas desenvolvidos para o ambiente Windows praticamente deixou de existir. Para o programador, deixou de existir a necessidade de conhecer, entre outras coisas, uma variedade de comandos para o posicionamento dos diversos objetos que deveriam ser colocados nas janelas do Windows. Agora, para o programador, o desenvolvimento da interface seria feito de forma tão simples quanto se ele estivesse desenhando a interface em sua própria janela. O desenho da interface é feito colocando-se os componentes desejados nas janelas e ajustando suas propriedades como, por exemplo, sua largura e altura, de tal forma que a interface tome o aspecto desejado sem a necessidade de qualquer codificação por parte do programador. Por esse motivo, alguns autores chamam esse tipo de desenvolvimento rápido de interfaces de WYSIWYG, sigla originária do inglês What You See Is What You Get, que significa “O que você vê é o que você obtém”, referenciando justamente a forma de desenvolvimento das interfaces nessas Ambientes Vis de Desenvolvimento. Devido a grande facilidade com que as interfaces dos aplicativos passaram a ser desenvolvidas, uma grande parte do tempo gasto no seu desenvolvimento passou a ser economizado. Por esse motivo, alguns autores chamam esse tipo de ambiente de desenvolvimento de aplicações de RAD, que significa Rapid Application Development, do inglês “Desenvolvimento Rápido de Aplicações”. A utilização desses ambientes diminui consideravelmente o tempo e, principalmente, o custo de desenvolvimento de aplicações. Como consegiiência de facilidades e praticidade de desenvolvimento de aplicações para o ambiente Windows, é cada vez maior a procura e a aceitação de Ambientes Visuais de Desenvolvimento como o Microsoft Visual Basic (um dos pioneiros), o PowerBuilder, o Centura (antigo SQL Windows), além, é claro, do próprio Delphi. Devemos observar que o simples fato do desenvolvimento da interface da aplicação não finaliza a tarefa do desenvolvimento. Resta ainda ao programador escrever o código que deverá ser executado quando o usuário tomar determinadas ações como, por exemplo, pressionar o botão de saída do programa. Sob esse novo modelo de desenvolvimento, os programas passam a ser desenvolvidos através de um novo ponto de vista. Os programas passam a ser formados por objetos que vão sendo colocados em suas janelas (trataremos do conceito de objetos posteriormente nesta apostila), pelo ajuste de suas propriedades, para que esses objetos tenham as características desejadas pelos desenvolvedores, e pelos eventos aos quais esses objetos irão responder isto é, as possíveis ações realizadas pelos usuários do sistema ou pelo próprio sistema, como por exemplo, o clicar do mouse sobre um botão. A utilização desse novo modelo é, por muitas vezes, a parte mais difícil no processo de migração do desenvolvimento de programas das antigas linguagens procedurais para os novos ambientes de desenvolvimento baseados em eventos. O programador não pode mais supor uma ordem exata na execução do seu código fonte e deve passar a tratar isoladamente cada evento relevante de sua aplicação. Página: 6 Delphi 5 2. O Ambiente de Desenvolvimento do Delphi O Delphi, conforme citado anteriormente, ao contrário do que muita gente pensa, é um Ambiente Visual de Desenvolvimento e não uma linguagem de programação. Não existe, como dito erroneamente por muitos, a linguagem de programação chamada Delphi, mas sim um Ambiente Visual de Desenvolvimento que foi chamado de Delphi. Já esse ambiente utiliza a linguagem de programação chamada Object Pascal. Dessa forma, iremos iniciar nosso estudo de Delphi através de seu Ambiente de Desenvolvimento, também chamado de IDE, do inglês Integrated Development Environment, passando posteriormente ao estudo da linguagem de programação Object Pascal. Após o término da instalação do Delphi, podemos iniciar a sua IDE através do ícone Delphi 5 localizado na pasta Borland Delphi 5 como ilustrado na figura a seguir. ty Eine NT 40 Og Pa * Elumo Uma vez inicializada a IDE do Delphi surgirão, inicialmente, 4 janelas que irão permitir ao desenvolvedor trabalhar e desenvolver suas aplicações no Delphi, como ilustra a figura abaixo. CErDENRrE [= Did Barra de E qem Pepe E E Ep lee gal ———>» Barrade Título «— (ns mes es|o nato er | atas | Da Co 400 | in Atalho Isa Dioll» -niá é BY sAmREwE E e Menus Paleta de Componentes Object + bros Esrdicore Inspector Rebe Bart — — Formulário —> Editor de Código Existem ainda outras janelas que poderiam ser exibidas dentro da IDE do Delphi dependendo das configurações definidas pelo desenvolvedor, porém as 4 janelas exibidas acima constituem a instalação e configuração básicas do Delphi. Antes de aprendermos a linguagem Object Pascal Página: 9 Delphi 5 devemos nos familiarizar com o ambiente no qual iremos trabalhar, ou seja, devemos aprender como manipular a IDE do Delphi. Dessa forma, veremos cada uma das janelas que compõe a IDE mais detalhadamente a seguir. 2.1. A Janela Principal A janela principal da IDE do Delphi é dividida em 3 partes, são elas: a Barra de Título e Menus, a Barra de Ferramentas e a Paleta de Componentes. Apesar de termos es divisões, apenas a primeira é necessária para que a IDE do Delphi esteja em execução, podendo as duas outras, a Barra de Atalho e a Paleta de Componentes, bem como todas as demais janelas citadas anteriormente, estarem ocultas, de acordo com a vontade do desenvolvedor. Comecemos, então, nossa exploração pela IDE do Delphi através de sua Barra de Título e Menus. Na Barra de Título e Menus encontramos todas as opções que o desenvolvedor necessitará para a utilização do ambiente do Delphi. Através dos diversos menus aí localizados, o desenvolvedor poderá criar novas aplicações, dar manutenção em aplicações previamente desenvolvidas, além de configurar todo o seu ambiente de trabalho de acordo com a sua forma de programação. Veremos os principais itens de menu existentes na janela principal a medida em que formos utilizando a IDE do Delphi. A Barra de Ferramentas, também chamada de Barra de Atalhos, localizada do lado inferior esquerdo da janela principal é utilizada para acessar as funções mais frequentemente utilizadas pelo desenvolver Delphi. Nela encontramos opções tais como a abertura e salva de arquivos de código- fonte Object Pascal, compilação, execução e depuração de programas, entre outras. É importante observarmos dois pontos com relação a Barra de Ferramentas. O primeiro é que ela contém opções que também estão à disposição do desenvolvedor através de itens de menus, permitindo no entanto, um acesso mais rápido a elas. O segundo ponto, como dito anteriormente, é que ela não precisa estar visível para que a IDE do Delphi esteja ativa. Para ocultarmos a Barra de Ferramentas basta clicarmos com o botão secundário do mouse sobre ela fazendo surgir na tela um menu Popup. Nesse menu existirá |* Standard diversos itens que permitem ao desenvolvedor ocultar ou não as [o Nie diversas barras que compõe a Barra de Ferramentas, conforme ilustra a [+ Debug figura ao lado. [vw Custom fe Component Palette Através do menu Popup mostrado ao lado, podemos deixar ou não visíveis cada um dos 6 grupos de botões da Barra de Ferramentas do Delphi, além da Paleta de Componentes que será vista a seguir. Esse menu Popup poderá também ser selecionado através do menu View -> Toolbars localizado na janela principal do Delphi. Customize... A IDE do Delphi permite ainda que a Barra de Ferramentas possa ser configurada de acordo com as necessidades do desenvolvedor. Isso poderá ser feito através do menu Customize mostrado na figura anterior. Ao selecionarmos essa opção será exibida a caixa de diálogo Customize como mostrado na figura a seguir. Através dessa caixa de diálogo o desenvolvedor poderá definir também quais componentes da Barra de | Tonbars [Cimmand Ferramentas estarão visíveis, através das opções Categories, Command: localizadas na página Toolbars, bem como colocar e remover itens da Barra de Ferramentas e configurar algumas opções de exibição para esses componentes, como por exemplo, a exibição ou não dos Hints (pequenos textos explicativos) que aparecem nos Opions| Separator New Component (63 Install Component Import ActiveX Control Create Component Template. [63 Install Packages. Configure Palet. To add command buttons, drag and drop commends onto a toolbar To temove command buttons, drag them off cf a Toolbar Delphi 5 componentes a medida em que passamos o mouse por sobre eles. O processo para adicionar ou remover um elemento da Barra de Ferramentas é bastante simples. Na página Commands da caixa de diálogo Customize estão listados os menus existentes na IDE do Delphi, bem como seus respectivos itens de menu. Para adicionarmos um desses itens basta que cliquemos no item desejado arrastando-o para o grupo de botões da Barra de Ferramentas no qual desejamos colocá-lo. Feito isso basta soltarmos o elemento para que ele apareça na posição desejada. Um processo simples de Drag and Drop bastante comum na maioria dos aplicativos desenvolvidos para o ambiente Windows. A remoção de um elemento é feita de forma ainda mais simples. Para retirarmos um elemento basta arrastarmos esse elemento para fora da Barra de Ferramentas, ou seja, o processo inverso ao realizado quando colocamos o item na Barra de Ferramentas. Um fato ao qual devemos atentar é que esse processo deverá ser realizado com a caixa de diálogo Customize sendo exibida na tela. Por fim temos, na Janela Principal do Delphi, a Paleta de Componentes. Este elemento é um dos mais importantes da IDE do Delphi, uma vez que, é na Paleta de Componentes que se encontram os vários objetos que irão compor as aplicações que serão por nós desenvolvidas como, por exemplo, os botões, caixas de texto e elementos de acesso à banco de dados. A Paleta de Standard | diditiomal 44h32 | Sustem | Data Acoess | Data Controls | ADO | Intaâase | idas | In Lt ado e E) la! RA EE [E == 1 Do | + Componentes do Delphi é mostrada a seguir. Como podemos observar, a Paleta de Componentes é dividida em várias guias (Standard, Additional, Win32, etc.), cada uma das quais contendo diversos componentes de acordo com suas funções. Por exemplo, na guia Standard encontramos componentes padrões dentro de uma aplicação Windows tais como botões e caixas de texto, entre outros. Já na guia Data Access, encontramos componentes responsáveis pelo acesso de nossa aplicação aos dados contidos nos vários bancos de dados com o qual o Delphi pode trabalhar. No canto superior direito da Paleta de Componentes estão localizados dois botões que possibilitam a navegação dentro da Paleta de Componentes permitindo assim a visualização das demais guias da Paleta de Componentes. No caso ainda da guia que esteja sendo exibida naquele momento possuir uma quantidade maior de componentes do que aquela que pode ser visualizada dentro da Paleta de Componentes, serão habilitados dois botões, do lado direito e esquerdo da Paleta, responsáveis pela visualização dos demais componentes contidos na guia selecionada. Através da Paleta de Componentes o desenvolvedor poderá colocar os componentes selecionados na aplicação que ele esteja desenvolvendo. Podem ser utilizados não só componentes originários do Delphi bem como desenvolvidos por terceiros. Ou seja, dentro do Delphi podemos utilizar dentro de nossas aplicações componentes disponibilizados na Paleta de Componentes pela própria instalação do Delphi, mas também podemos instalar novos componentes e utilizá-los no desenvolvimento de nossas próprias aplicações. Dessa forma, vemos que podemos desenvolver não só aplicações, mas também componentes que poderão ser utilizados não apenas por nós mesmos, mas por outros programadores em Delphi ou em outras linguagens de programação. O desenvolvimento de novos componentes é uma atividade praticada por muitos programadores como forma principal de comercialização de seus produtos deixando, muitas vezes, em segundo plano o desenvolvimento de “aplicações comerciais”. Como consegiiência dessa possibilidade de instalação de novos componentes podemos, dentro do Delphi, configurar a Paleta de Componentes para que, entre outras coisas, ela possua novas guias que contenham esses componentes a serem instalados. É bem verdade que na maioria das Página: 11 Delphi 5 Uma outra maneira pela qual podemos colocar componentes em um formulário é através da seleção da opção Component List, localizada no menu pi E View. Ao selecionarmos a opção será exibida a caixa de diálogo Components como mostrado na figura ao lado. Através dessa caixa de diálogo podemos selecionar o componente que desejamos colocar no formulário e, logo em seguida, clicarmos o botão Add to Form. Essa opção é idêntica a primeira opção que mencionamos sobre como colocar um | [SH [Tohat componente no formulário, ou seja, o componente é colocado no centro do || Toresteor = formulário possuindo largura e altura padrão. Essa opção pode ser útil quando sabemos o nome do componente, mas não sabemos em qual guia da Paleta de Componentes ele está localizado, tornando mais rápida a busca através de seu nome ao invés de sua localização. MENA Imaginemos agora que estamos desenvolvendo uma tela de cadastro qualquer. É bastante provável que nesse formulário seja necessário colocar várias caixas de texto e botões. A tarefa de colocar esses componentes é bastante trabalhosa uma vez que tenhamos de ir colocando, um a um, os diversos componentes no formulário. Esse é o comportamento do Delphi que após colocarmos um componente qualquer no formulário volta a ter o Botão de Seleção selecionado. Nessas situações o ideal seria que pudéssemos escolher o componente que queremos colocar no formulário e fôssemos colocando-o quantas vezes quiséssemos sem que tivéssemos de selecioná-lo novamente na Paleta de Componentes. Para a nossa felicidade isso é perfeitamente possível. Para tanto basta que, mantendo a tecla Shift pressionada, selecionemos na Paleta de Componentes o componente que desejamos colocar repetidamente no formulário. Ao fazermos isso, o botão da Paleta de Componentes é selecionado, passando a ter uma cor levemente azulada como mostrado na figura abaixo, indicando que podemos colocar quantos componentes desejarmos no formulário. Uma vez selecionado, o componente permanecerá selecionado até que um outro componente seja selecionado ou que o Botão de Seleção torne-se o botão selecionado na Paleta de Componentes. Uma vez colocados os componentes no formulário, resta ao programador a tarefa de dimensioná-los e alinhá-los de forma a dar uma melhor aparência à sua aplicação, caso isso já não tenha sido feito no momento da colocação desses componentes no formulário. O dimensionamento dos componentes, como visto anteriormente, pode ser feito tanto no momento de sua colocação no formulário quanto posteriormente a ela. A maneira mais comum de dimensionarmos os componentes após a sua colocação no formulário é feita da seguinte maneira: devemos selecionar o componente que desejamos manipular e utilizando o mouse devemos clicar e arrastar um dos oito pequenos quadrados de dimensionamento existentes ao redor do componente como mostrado na figura ao lado. Essa forma de redimensionar componentes é utilizada, principalmente, quando nós estamos manipulando com apenas um único componente. Quando, no entanto, temos mais de um componente que desejamos redimensionar simultaneamente para deixá-los, por exemplo, com o mesmo tamanho, podemos utilizar a caixa de diálogo Size, mostrada abaixo. Essa caixa de diálogo é exibida tanto através da opção Size contida no menu Edit quanto através da opção Size contida no menu popup exibido ao clicarmos com o botão secundário do mouse no componente desejado. Página: 14 Delphi 5 Uma observação deve ser feita com relação ao dimensionamento dos componentes utilizando-se a caixa de [UM pa é , ? fe Ro change f€ No change diálogo Size. Apesar de podermos utilizá-la para || ghinkto males € Shih to smalest redimensionar um único componente (para isso podemos ||“ Biewtolagst pode oca! 2: = o . P . (p . P º width: € Height utilizar a opção Width e Height), a caixa de diálogo Size será utilizada com maior frequência quando estivermos trabalhando com vários componentes simultaneamente. Cancel Hep Para selecionarmos múltiplos componentes devemos clicar no primeiro componente que desejamos manipular selecionando-o assim e, em seguida, mantendo a tecla Shift pressionada, devemos clicar nos demais componentes que serão manipulados. Uma outra forma de selecionarmos múltiplos componentes é através da definição de uma área de abrangência. Para isso, o desenvolvedor deverá clicar com o mouse em uma região do formulário e, em seguida, mantendo o botão primário do mouse pressionado, arrastar o mouse demarcando a área cujos componentes nela contidos deverão ser selecionados. Após a delimitação da área desejada devemos liberar o botão primário do mouse para que, de: maneira, os componentes sejam marcados como selecionados. Uma vez que tenhamos selecionado os componentes, as opções da caixa de diálogo Size poderão ser aplicadas a eles tanto com relação à altura quanto ao comprimento desses componentes. Uma vez que sabemos como marcar vários componentes resta-nos saber como desmarcá-los, para tanto basta clicarmos em qualquer outro componente que não esteja marcado, tornado assim esse último o componente selecionado. Além da tarefa de redimensionar os componentes, resta ao desenvolvedor alinhá-los para dar uma melhor aparência ao seu programa. Para isso, da mesma forma como fizemos para redimensionar os componentes colocados no formulário, poderemos simplesmente clicar sobre os componentes selecionando-os e, em seguida, arrastá-los até a posição desejada, ou poderemos utilizar as ferramentas do Delphi para isso. Em geral, a tarefa de alinhar os componentes no formulário não é tão difícil devido à existência do grid. O grid nada mais é do que os vários pontos existentes nos formulários exibidos na IDE do Delphi. O comportamento default para os componentes é o seu auto-alinhamento em relação aos pontos do grid, ou seja, ao redimensionarmos ou arrastarmos os componentes pelo formulário eles irão sempre se posicionar de acordo com os pontos do grid facilitando, dessa forma, o trabalho do programador. Vertical Mesmo assim, existirão situações em que a tarefa não será fo change 4 Mo change tão simples como, por exemplo, caso desejemos centralizar f Lofisidos f Tops : o o alguns componentes no formulário. Apesar de podermos pn is pe cn : eia DE NãO Cah iria Right sides Battoms tentar fazer isso de forma ual”, não será difícil E Space equaly € Spscsegualy errarmos por uma diferença de um ou dois pontos do grid. €” Centerim window 4º Centerin aindow Para evitarmos que isso aconteça, poderemos recorrer às ferramentas de alinhamento que o Delphi nos oferece. Cancel Help A primeira caixa de diálogo que poderemos utilizar para alinhar os componentes é a caixa de diálogo Alignment, mostrada ao lado, obtida através da opção Align selecionada a partir do menu popup exibido ao clicarmos sobre um componente de nosso formulário. Essa caixa de diálogo é bastante semelhante à caixa de diálogo Size mostrada anteriormente. Nela podemos escolher qual o tipo de alinhamento que desejamos aplicar aos componentes selecionados tanto com relação a sua horizontal quanto a sua vertical. Novamente percebemos que a maioria das opções listadas nessa caixa de diálogo só faz sentido quando aplicadas a mais de um componente. Página: 15 Delphi 5 Porém, muitas vezes, ao invés de alinharmos os componentes através da caixa de diálogo Alignment, o fazemos através de uma outra ferramenta do Delphi, a Alignment Pallete. Para exibirmos a Alignment Pallete devemos escolher a opção de mesmo nome localizada no menu View. Ao fazermos isso nos será exibida a caixa de diálogo mostrada ao lado. A Alignment Pallete possui basicamente as mesmas funcionalidades que a caixa de diálogo Alignment mostrada acima, porém com a diferença de que as opções de alinhamento são exibidas de forma gráfica, o que torna o entendimento da funcionalidade de cada botão muito mais fácil e rápido. Além da exibição gráfica da funcionalidade de cada botão, é exibido um hint para cada um desses botões quando permanecemos com o mouse por sobre eles por um pequeno intervalo de tempo. Vimos até aqui como é fácil colocarmos os componentes nos formulários de nossa aplicação, além das várias maneiras possíveis de como podemos redimensioná-los e alinhá-los. Resta-nos, apenas, mostrar como podemos remover os componentes que não desejamos mais que permaneçam no formulário. Já podemos imaginar até como isso pode ser feito (lembre-se que a programação no ambiente Delphi é bastante intuitiva). Para removermos um ou mais componentes de nosso formulário basta que selecionemos os componentes desejados e, em seguida, pressionemos a tecla Delete ou através da opção Delete localizada no menu Edit. Caso deletemos por engano algum componente não precisamos nos preocupar, as operações de deleção podem ser desfeitas através da opção Undelete localizada no menu Edit ou através de sua tecla de atalho Ctrl + Z. 2.3. O Object Inspector Uma das principais janelas do ambiente de desenvolvimento Delphi é o Object Inspector. Ele é o principal responsável pela definição das características e | Pesstis|=1 E do comportamento de cada componente colocado nos formulários da aplicação | azistinia sendo desenvolvida. Por essa razão, em geral, ele encontra-se sempre visível ao "ii hu ER oo EE iniciarmos o Delphi. Caso isso não ocorra, para visualizarmos o Object Inspector, (fera tn. a qualquer momento dentro da IDE do Delphi podemos selecionar a opção Object esa iy Es Inspector localizada no menu View ou utilizar sua tecla de atalho F11. O Object | ciemitam a Inspector é mostrado na figura ao lado. EE HE toi E OB sia anta Como podemos observar, o Object Inspector é composto de duas partes. Um ts fi 11 ComboBox contendo a lista de componentes contidos no formulário SE + correntemente selecionado da aplicação, incluindo nesses componentes o próprio formulário. O Object Inspector contém ainda um PageControl composto por duas guias: Properties e Events. Esse ComboBox tem a finalidade de indicar o componente atualmente selecionado no formulário bem como a classe a qual ele pertence (veremos o que são classes posteriormente). Podemos também utilizar esse ComboBox para selecionar um novo componente, para isso basta que selecionemos seu nome dentre os itens que aparecem na lista do ComboBox (veremos mais adiante o que é o nome de um componente). Já o Page Control divide o Object Inspector em duas guias. A primeira delas, chamada Properties, contém as propriedades do componente correntemente selecionado, enquanto que, a segunda guia, chamada Events, possui os eventos disponíveis para esse componente. Quando selecionamos componentes diferentes, ou seja um botão e depois uma caixa de texto por exemplo, as propriedades e eventos apresentados são diferentes, ora as propriedades e eventos pertencentes ao botão e ora pertencentes à caixas de texto, sempre de acordo com o componente selecionado. Esse fato é muito importante e por isso devemos sempre nos lembrar que o Object Inspector exibirá as propriedades e eventos do componente correntemente selecionado, por isso não citaremos mais essa observação no decorrer de nosso estudo do Delphi. Ora, se o Object Inspector exibe as informações relacionadas ao componente selecionado, o que acontece quando selecionamos dois ou mais componentes simultaneamente? Quando selecionamos múltiplos componentes, o Object Página: 16 Delphi 5 entre colchetes, as propriedade que apresentam seu conteúdo entre sinais de parênteses representam objetos (veremos posteriormente a definição de classes e objetos). Essas propriedades representam novos objetos contidos dentro do componente em questão, que por sua vez também é um objeto. Veremos toda essa idéia de objetos posteriormente, por hora basta termos em mente que podem existir propriedades que representam tanto Sets quanto objetos. A figura anterior mostra a propriedade Font do formulário. Essa propriedade ilustra dois aspectos com relação a propriedades que representam objetos. Podemos observar que a propriedade Font possui, por sua vez, outras propriedades. Ao contrário do que acontecia com os Sets, cujos valores que podíamos atribuir eram apenas True ou False, as propriedades que aparecem abaixo de Font podem receber valores inteiros, strings, Sets ou até mesmo novos objetos. Uma segunda observação está no fato da existência de um botão, ao lado do valor da propriedade Font. Ao clicarmos esse botão será exibida um caixa de diálogo que nos permite preencher de forma mais agradável o valor das propriedades que foram listadas, em nosso exemplo, a propriedade Font. A figura ao lado mostra a caixa de diálogo que é exibida ao clicarmos no botão da propriedade Font. Devemos ter em mente que a caixa de diálogo mostrada não é de exibição obrigatória, ou seja, podem existir propriedades dentro de componentes do Delphi que representem objetos mas que não possuam uma caixa de diálogo para permitir uma definição mais fácil dos valroes de suas propriedades. A existência dessas caixas depende das pessoas que construíram, ou seja, programaram cada um desses componentes. É uma prática de programação bastante comum dentro do ambiente Delphi que, as propriedades de componentes que representem objetos deverm ter uma caixa de diálogo associada mas isso não torna obrigatória a existência dessas caixas de diálogo. Caso estejamos estudando o Delphi para desenvolver novos componentes devemos lembrar que, caso exista um propriedade que contenha um objeto em nosso componente, devemos desenvolver uma caixa de diálogo que permita o preenchimento das informações para esse objeto. A segunda guia existente no Object Inspector é responsável pela exibição dos Eventos aos quais o componente selecionado pode responder. | First] Event | Unêcivato ã ERESNTTE ão DriChck, Esses eventos, da mesma forma como acontecia com as propriedades, sã específicos para cada componente, ou seja, podem existir eventos comuns | res, Unlocejuery E] ou não aos diversos componentes existentes no Delphi. A figura ao lado | Grcorearom Oncresto mostra os eventos aos quais um formulário pode responder. Unbblcteie ER Ondestau Já sabemos que o Object Inspector, de forma semelhante ao que | arpeckiieo OnDeckO ver Mebremim acontece com as propriedades, exibe os eventos específicos para cada | orprsgauer componente selecionado. Porém, para que servem os eventos? Os eventos greeiicnio formam uma das partes mais importantes na programação dentro do E ambiente Windows. É através do disparo de eventos que existe a interação entre o usuário e o código escrito em cada programa. Eventos são disparados por ações do usuário ou de outros programas, e esses eventos por sua vez, executam a codificação escrita pelos programadores durante o seu desenvolvimento. No Delphi, a maneira mais simples de associarmos que código que será executado quando cada um desses eventos ocorrer é através do Object Inspector. Por exemplo, caso quiséssemos exibir uma mensagem quando o usuário clicasse no formulário, poderíamos escrever o código responsável pela exibição da mensagem e associá-lo ao disparo do evento OnClick do formulário. Podíamos também efetuar essa associação através da própria codificação porém deixamos a explanação de como isso pode ser feita para uma discussão um pouco mais avançada dentro do Delphi. A guia Events está dividida de forma semelhante à guia Properties. Do lado esquerdo estão listados os nomes dos eventos enquanto que do lado direito está o nome de qual trecho de código deverá ser executado quando o evento em questão for disparado. Com o intuito de facilitar o trabalho do desenvolvedor, o nome de cada evento segue um padrão de nomenclatura, observe que dentro do Object Inspector cada evento tem seu nome composto do prefixo On mais o evento que irá dispará-lo. Página: 19 Delphi 5 Como citado anteriormente, o Object Inspector tem como uma de suas funções associar o evento e o código a ser executado quando esse evento for disparado. Dessa forma, podemos perceber que não existe a obrigatoriedade de termos, para cada evento um código a ser executado, ou seja, podem existir eventos sem qualquer código associado. Por exemplo, não precisamos associar código algum ao evento OnClick do formulário. Mesmo que isso ocorra, como mencionado anteriormente, o Windows continuará enviando uma mensagem ao formulário toda vez que ele sofrer um clique por parte do usuário, porém nada será executado. Da mesma forma, também podemos ter inúmeros eventos “apontando” para o mesmo código, como ilustra a figura abaixo. Na figura abaixo vemos a existência de três eventos distintos que, ao serem disparados, executam o mesmo trecho de código dentro da aplicação. Evento Evento Evento Por exemplo, em nossa aplicação poderíamos ter um botão e um item de menu que nos permitam sair do programa. Não necessitamos escrever dois códigos idênticos e associa-los respectivamente ao clique no botão e ao clique do item de menu. Basta criarmos uma única codificação e associá-la a ambos os eventos, ou seja, tanto ao clique do botão quanto ao do item de menu. Isso é muito importante uma vez que nos permite uma melhor codificação e manutenção do código escrito, diminuindo a quantidade de erros durante a fase de manutenção do aplicativo. Uma vez que já sabemos que podemos associar código aos diversos eventos existentes em cada componente, resta-nos escrever esse código e criar a associação entre o código escrito e o evento desejado. Apesar de poder parecer um pouco estranho, iremos começar não pela codificação, mas sim pela associação entre o código e os eventos. Essa inversão ficará clara no decorrer de nossa explicação. Então, veremos agora as quatro alternativas que o Delphi nos oferece para código aos eventos listados no Object Inspector. . iremos construir nossa Vamos iniciar com o método m: comum de associação. Para primeira aplicação em Delphi. Inicialmente, e: aplicação não irá conter qualquer componente, ou seja, ela será composta simplesmente da janela principal como ilustrado ao lado. Para isso devemos selecionar a opção Close All no menu File e em seguida a opção New Application localizada nesse mesmo menu. Caso tenhamos modificado a aplicação anterior o Delphi irá nos perguntar se desejamos salvar as alterações efetuadas, por ora responderemos não. Suponha que desejamos exibir uma mensagem quando esse formulário for clicado. Já sabemos que o Object Inspector sempre manipula o componente selecionado e por isso devemos selecionar o formulário E E Página: 20 Delphi 5 que, nada mais é do que o componente ao qual desejamos criar a associação entre a codificação e o evento. Para selecionarmos o formulário basta que efetuemos um clique simples no formulário que este se tornará o objeto selecionado no Object Inspector. Uma vez selecionado o componente, devemos no Object Inspector, selecionar o evento que desejamos associar a codificação. Em nosso exemplo, devemos selecionar o evento OnClick uma vez que queremos exibir uma mensagem quando o formulário for clicado. Uma vez que ainda não escrevemos codificação alguma, iremos nos aproveitar de alguns recursos que o Delphi nos oferece para podermos criar tanto a codificação inicial quanto a associação dessa codificação com o evento do formulário. Para isso, vamos dar um duplo clique na região branca do lado direito do nome OncClick. Ao fazermos isso, o Delphi abre o Editor de Código, que será visto no próximo tópico, e cria um trecho de programa no qual podemos digitar o código necessário à exibição da mensagem quando o formulário for clicado, como ilustrado na figura. Esse trecho de código é chamado de “E de rocedure TrEmL. Fora lizk(cender: mio: Procedimento de Evento, do inglês Event Procedure. pesin Além da criação do trecho inicial da codificação a ser realizada, o Delphi também alterou outros trechos de código dentro do próprio Editor. Não iremos abordar agora essas demais alterações, apenas iremos salientar que as demais alterações feitas pelo Delphi são importantes quando estivermos criando por conta própria procedimentos de eventos para as nossa aplicações. Apesar de não serem alteações que um programador iniciante estará fazendo dentro do Delphi elas deverão ser observadas para um melhor entendimento do funcionamento de um programa Delphi. [Et adia ser Uma outra alteração realizada pelo Delphi, facilmente perceptível, encontra-se no Object Inspector. Agora, ao lado do evento OnClick do formulário, o Delphi criou a associação desse evento com o trecho de código que foi criado pelo póprio Delphi e listado no Editor de Código. Observe que essa associação criada nada mais é do que a informação de qual Procedimento de Evento será executado quando o evento OnClick for disparado. De forma semelhante poderíamos fazer com que o Delphi criasse qualquer Procedimento de Evento e fizesse a associação entre o procedimento e o respectivo evento. A figura ao lado mostra como ficou o Object Inspector após a associação entre o Procedimento de Evento criado e o evento OnClick do formulário. omiittom 2d Propartiso | Events | Orfetivata E DrCanfosiro Drillck m Onlose Ainlnseremy Unionstameal OrCortenPop Orcresto OnDblCick OrDeaetivate A Onblestoy Unlioekirop OrDockôvar OnDragDiop OnDiragO ver O Delphi, ao criar o Procedimento de Evento, forneceu a ele um nome OnEndDuk inicial default, formado pelo nome do componente que irá sofrer o evento, em Mesa =|| nosso exemplo o formulário, juntamente com o evento que irá disparar a ac “| execução do procedimento, no exemplo o evento Click. Apesar do Delphi fornecer um nome default para os procedimentos, muitas vezes podemos querer utilizar um outro nome para o procedimento, de tal forma que se torne mais clara a finalidade daquele trecho de código a ser executado. Por exemplo, ao invés de chamarmos o procedimento de FormClick poderíamos querer que o procedimento viesse a ser chamado de ExibirMensagem. Essa alteração pode ser facilmente realizada. Basta que mudemos o nome da associação no Object Inspector e teclemos ENTER, que ela será automaticamente refletida também no Editor de Código. Observe, no entanto, que para fornecermos o nome desejado ao Procedimento de Evento tivemos de criar um procedimento com o nome default e posteriormente muda-lo para o nome que desejávamos. Porém poderíamos ter criado o procedimento diretamente com o nome desejado. Essa é Delphi 5 mais comuns nos editores de texto tais como o WordPad. Nessa janela podiam ser exibidos um ou vários arquivos de código fonte. Cada um desses arquivos podia ser acessado através de uma guia contendo o nome do arquivo sendo exibido. Além di no Editor de Código eram exibidas informações a respeito da compilação dos programas tais como erros e warnings detectados pelo compilador Delphi. A partir da versão 4 do Delphi, o Editor de Código trouxe uma outra janela, chamada de Code Explorer, capaz de identificar e exibir de forma mais organizada informações a respeito do arquivo fonte sendo exibido, tais como declarações de constantes e variáveis. O Editor de Código possui recursos que permitem a busca e substituição de trechos de código, através do menu Search. Não entraremos em detalhe a respeito da utilização desses recursos por se tratarem de recursos comuns à maioria dos editores de texto. Além desses recursos de busca, o Editor de Código nos fornece a possibilidade de configurá-lo de tal forma a atender melhor as nossas necessidades. Para isso, devemos acessar a caixa de diálogo Editor Properties localizada no menu Tools através da opção Editor Options. Essa caixa de diálogo possui 5 guias das quais as quatro primeiras (General, Display, KeyMappings e Color) possibilitam a configuração visual do Editor de Código tais como a fonte e as cores que serão utilizadas. Já a guia Code Insight permite a configuração do recurso de mesmo nome existente no Delphi, veremos o Code Insight posteriormente. EEES - . Close Page Cher 4 ined | Dia Fa acre | Doe | Coco] Uma observação que deve ser feita | Dpenki atCursor CntEnter RO ao utilizarmos o Editor de Código Hemédtiwindw Eee . - . Browse Symbol at Cursor refere-se à manipulação dos arquivos | Te Search A E Bio ar que são exibidos. Uma vez que não Pipas a Bione desejarmos mais que um determinado | Completeciassetcusor Shft+wh3 am [ame ——3 | arquivo seja exibido não deveremos | Acilebote eua us FE) win | simplesmente clicar no ícone de É Ea RR =|| sistema localizado no canto superior | pur Cide mm É | direito do Editor. Caso façamos isso regem » estaremos fechando todo o Editor de | Eidto Bockmaks + Código e não apenas o arquivo selecionado. Para fecharmos apenas o | Debus r arquivo fonte selecionado devemos clicar com o botão secundário do ias Elio ad Onhs mouse por sobre o Editor de Código. Ao fazermos isso será exibido um escage View menu popup que permite um acesso mais rápido a diversas opções do | View Esmiorer Editor de Código, entre elas a opção Close Page, responsável for fechar | Prperies a página corrente. Como dito anteriormente, o Editor de Código, apesar de poder exibir arquivos genéricos de texto, ele é a janela do Delphi responsável pela exibição, principalmente, de arquivos que contenham código fonte escrito dentro do Delphi. Neste tópico falamos de forma genérica do Editor de Código sem nos preocuparmos com os arquivos fonte propriamente ditos. Veremos esses arquivos com bem mais detalhe no tópico abordando as units. 2.5. Codificando e Compilando Vimos até aqui algumas das maneiras de um programador possui de criar os Procedimentos de Eventos para a sua aplicação, resta-nos agora escrever o código propriamente dito, necessário para fazer com que, em nosso exemplo, uma mensagem seja exibida. Vamos optar não mais por exibir a mensagem no evento OnClick do formulário mas sim quando ocorrer o evento OnClick do botão. Para que a mensagem seja exibida basta escrevermos o seguinte código no Procedimento de Evento associado ao evento OnClick. procedure TForml.Button1Click(Sender: TObject); begin ShowMessage('Olá mundo”: end; ina: 24 Delphi 5 Observe que escrevemos código apenas no procedimento associado ao evento que desejávamos tratar. Os demais procedimentos não mais serão Ui | = [= vaiatestonsters [PE ses (procenure “Form! Exthicmensagen(Senger: Top Deuin CER Ui | EEET srdieria; al tm 1ozxa = clace(isorm (procegure “Form Buxean crter (o: Degin <nonteseage( ita rundos 1 private à Deavat ns é Public desterations ; [sr meato lime E utilizados em nossa aplicação por isso deverão ser removidos do código fonte. Para isso, muitas vezes nos sentimos tentados simplesmente a, no Editor de Código, remover o Procedimento de Evento que foi criado automaticamente pelo Delphi conforme ilustrado na figura ao lado. Contudo, se fizermos isso, uma série de erros irão ocorrer ao tentarmos compilar no: aplicação. Quando compilamos os nossos aplicativos, o Delphi procura por quaisquer erros em nosso código fonte, caso ele encontre erros ou apenas encontre trechos de código que, apesar de não representarem erros de sintaxe, poderiam ser evitados, as chamadas warnings, €: serão exibidos numa pequena janela, na parte inferior do Editor de Código, juntamente com uma pequena descrição do motivo pelo qual o erro ocorreu, conforme ilustrado na figura ao lado. Para observarmos esses erros vamos remover manualmente o Procedimento de Evento associado ao evento OnCloseQuery do formulário e em seguida vamos tentar compilar nossa primeira aplicação Delphi. Para compilarmos a aplicação basta, no menu Project, selecionarmos a opção Build Project! (abordaremos posteriormente a compilação e execução de programas mais detalhadamente). Ao tentarmos compilar a aplicação, o compilador iria detectar um erro como ilustra a figura ao lado. Esse erro ocorre uma vez removemos apenas a implementação do procedimento FormCloseQuery. O Delphi, ao criar um Procedimento de Evento, além de iniciar a escrita do código a ser executado quando o evento em questão ocorrer, ele escreve código em outros pontos do código fonte do programa, essa é a razão pela qual o erro descrito acima ocorre ao removermos, manualmente, apenas a implementação do procedimento. Para que a compilação po: continuar restando-nos, também, remover sua declaração. Podemos remover a declaração manualmente e tentar compilar a aplicação mais uma vez. (E TEroT Mt pena Urcolisdiomaricrorond cocalator Form om Isla Ee anja) Ped colei lr | fr IMeaied Imã Porém, ao tentarmos compilar a aplicação novamente um erro irá ocorrer. A explicação para esse novo erro. mostrado ao lado, também é bastante simples. Quando removemos a implementação e a declaração Ihe Horrloseuey method 'efetenced by Form UnJoseuty does ol ext é r q Remove lho reforanos? do procedimento não removemos todas as Ts E ES ocorrências desse procedimento dentro do código fonte de nossa aplicação Delphi. Lembre-se que, quando trabalhamos com o Delphi, passamos a definir E dentro dos diversos eventos que um componente pode sofrer quais executarão cada um dos procedimentos que Project CA. ABorlandDelphisAProjectsProject1.dpr escrevemos. Sabemos ainda que vários procedimentos Done: Compiled. podem estar relacionados a um único código fonte. Para Current lie: O | Totallines: 49 que isso seja possível, o Delphi é obrigado a ti ams E perei E arqmazenar, em algum local de sua codificação, essa informação. Ao removermos a códificação e a declaração do procedimento, deixamos de lado a remoção dessa indicação. Resta-nos então, remover as referências que haviam sido criadas pelo Object Inspector. O Delphi reconhece essa situação e nos questiona se desejamos que essas referências sejam removidas para que a aplicação seja compilada novamente. Página: 25 Delphi 5 Como pudemos observar, esses erros ocorreram por que o Delphi fez uma série de modificações automaticamente no código fonte de nossa aplicação ao permitirmos que ele criasse o Procedimento de Evento. Dessa forma, para evitarmos que esses erros ocorram, devemos também permitir que o Delphi remova essas alterações automaticamente para nós. E isso é tão simples de conseguirmos como foi para que essasinclusões de código fossem feitas para nós. O Delphi remove automaticamente todas os Procedimentos de Eventos e suas respectivas referencias sempre que salvamos ou tentamos compilar nossas aplicações desde que não exista nenhum código ou comentário dentro do corpo do procedimento, ou seja, entre as palavras reservadas begin e end; existentes na codificação do procedimento não deverá existir qualquer tipo de codificação nem mesmo um comentário. Após termos alterado o nosso primeiro programa, deixando apenas o procedimento associado ao evento OnClick do botão, podemos compilar a aplicação para verificar se ela faz realmente o que esperávamos. Para que possamos compilar a aplicação devemos selecionar a opção Compile Project1 existente no menu Run. Caso já tivéssemos salvo a aplicação com um nome qualquer a opção de compilação apareceria com o Olá mundo nome que tivéssemos dado à aplicação ao invés no nome Project]. Uma vez compilada a aplicação, podemos executá-la e ver o resultado de sua codificação. Para isso basta selecionarmos, no menu Run, a opção Run. A aplicação será executada e ao clicarmos no botão colocado no formulário, será exibida a mensagem ao lado. Nenhum outro evento provocará qualquer atividade uma vez que removemos todos os procedimentos exceto o evento associado ao clique do botão. Devemos nos lembrar sempre que, ao executarmos a aplicação por dentro do Delphi entramos automaticamente em modo de depuração, ou seja, caso façamos uma nova alteração no código fonte teremos de encerrar a execução antes que possamos compilar a aplicação novamente. Dessa forma, para sairmos do modo de depuração basta fecharmos a janela principal da aplicação que, dessa forma, seremos levados de volta à IDE do Delphi. 2.6. Salvando o Projeto Uma vez que terminamos o nosso primeiro aplicativo vamos salvá-lo de forma a podermos futuramente trabalhar novamente nele em nosso próprio equipamento ou em outro qualquer. Para isso, a maneira mais rápida é clicarmos no botão Save All localizado na Barra de Ferramentas. Ao fazermos isso, o Delphi irá salvar todos os arquivos que foram criados para o desenvolvimento de nosso aplicativo. O primeiro arquivo a ser salvo pelo Delphi, quando selecionamos a opção Save All, refere-se à unit que contém o código do formulário principal do nosso aplicativo (veremos as units mais detalhadamente posteriormente). Devemos fornecer um nome significativo para a unit, uma vez que esse is nome será utilizado pelo Delphi no restante do | Savein [Pops r al e decorrer do desenvolvimento da aplicação. Bol Uma observação a ser feita é que, com a prática poderemos começar a trabalhar com vários formulários dentro de nossa aplicação deixando para salvá-los depois de já termos escrito uma quantidade relativa de código. Essa prática é desaconselhada por alguns motivos entre eles a possibilidade de um queda | Fisnams [IMHEE de energia que poderia levar a perda de todo 0 | Save astype: [Delphiuni [pas] E [Eee trabalho desenvolvido, além de que, ao = Help clicarmos no botão Save A!l, o Delphi inicia o processo de gravação de todas as units contidas em nossa aplicação e, caso exista um número relativamente grande de units ficará cada vez mais complicado de, no momento da gravação, identificar cada uma dessa units de tal forma a fornecer, corretamente, seus respectivos nomes. Iremos fornecer no tópico a seguir uma explicação mais detalhada a Save Uni Página: 26 Delphi 5 configuração do ambiente bem como de configuração do próprio compilador Delphi de tal forma a permitir que, ao levarmos o aplicativo que estamos desenvolvendo para um outro computador, possamos continuar o desenvolvimento sem termos de configurar novamente todo o ambiente para atender as nossas necessidades. Mostramos a seguir um resumo das principais extensões de arquivos salvos pelo ambiente do Delphi ilustrando também o seu papel. Extensão Descrição Bpg Arquivo que contém a indicação de quais projetos compõe um Project Group bem como as diretrizes a serem utilizadas no momento de suas compilaçõe: Dpr Arquivo que contém as declarações de cada aplicativo desenvolvido no Delphi. É através desse arquivo que o compilador pode identificar quais units pertencem ao aplicativo bem como a forma com a qual o aplicativo será inicializado. Dfm Esse arquivo contém o código responsável pela definição de cada formu aplicação, ou seja, é nesse arquivo que se encontra a indicação da localização de cada componente do formulário bem como os valores a eles atribuídos dentro do Object Inspector. Pas Os arquivos com essa extensão contém código fonte escritos em Object Pascal. Esses arquivos podem ou não estar associados a arquivos dfm. Res Os arquivos com essa extensão contêm diversos recursos que serão ou poderão ser utilizados pela aplicação tais como o ícone da aplicação e bitmaps entre outros. Dof O arquivo de opções do Delphi (Delphi Options File) contém a configuração atual do projeto. Tais configurações podem ser exibidas ao selecionarmos a opção Options listada no menu Project. Cfg O arquivo de extensão cfg é gravado para possibilitar a compilação de um projeto Delphi a partir da linha de comando, sem ser neces jo que o projeto seja aberto dento da IDE do Delphi. Além dos arquivos com as extensões listadas acima, o Delphi pode gerar outros arquivos de outras extensões dependendo do tipo de aplicação que esteja sendo desenvolvido ou da configuração que tenha sido feita na IDE do Delphi. A seguir mostramos uma figura representativa de alguns dos relacionamentos existentes entre os arquivos gerados pelo Delphi. Project Group Project Project File File [Unit | [Umia | Unit [Unit | Arquivo de | | Arquivo de Formulário | | Formulário A figura acima ilustra o relacionamento existente entre os arquivos de grupo, de projeto, dmf e pas no desenvolvimento de um aplicativo Delphi. Podemos observar que as units não precisam estar vinculadas a um arquivo de formulário, porém o inverso não acontece. Ou seja, para cada formulário que colocarmos em nosso aplicativo existirá uma unit e um arquivo de formulário associado. Página: 29 Delphi 5 2.8. Criando uma Console Application Apesar de não ser o tipo de aplicação geralmente desenvolvido dentro do ambiente do Delphi, uma aplicação console é uma das mais simples que podem ser desenvolvidas. Dessa forma, iremos apenas ilustrar de maneira bastante simplificada o desenvolvimento de uma console application. Antes de começarmos devemos fechar a aplicação ou aplicações Delphi que estiverem abertas na IDE para que, dessa forma, possamos começar o desenvolvimento de uma nova aplicação. Poderíamos iniciar a nova aplicação sem ter de fechar a aplicação anterior uma vez que o Delphi a fecharia automaticamente, porém é bom nos acostumarmos a fechar por nossa própria conta os aplicativos que estivermos trabalhando antes de começamos o desenvolvimento de um novo de forma a manter uma melhor organização em nosso trabalho. Uma vez não existindo nenhum aplicativo temos dois caminhos a seguir: escolher a opção New Application localizada no menu File e começar um novo aplicativo ou escolher a opção New localizada nesse mesmo menu. Caso optemos pela primeira opção o Delphi irá propiciar o desenvolvimento de uma nova aplicação padrão. Essa aplicação irá permitir, a menos que tenhamos alterado a configuração inicial do Delphi, o desenvolvimento de uma aplicação padrão para o ambiente gráfico e não uma console application. Essa aplicação poderia ser modificada de tal forma a permitir o desenvolvimento de uma console application, porém essa não é a melhor alternativa, principalmente para aquelas pessoas que estão iniciando o processo de aprendizado dentro do Delphi. Dessa forma, resta- nos partir para a segunda opção, a seleção da opção New localizada no menu File. Ao fazermos isso, nos será apresentada a caixa de diálogo New Items mostrada ao lado. Através dessa caixa de diálogo podemos escolher dentre várias opções de elementos contidos no Object Repository. Existe a opção de escolha desde formulários pré definidos até wizards que irão facilitar o desenvolvimento de novas aplicações. Cada uma dessas opções está dividida em guias de acordo com as suas finalidades. Para darmos início à nossa console application, vamos selecionar o ícone Console Application localizado na guia New. Nos. |acteoi] er Lane | Diogs| Has | Dotatcóues| We Back Corporal Uemoo ansior a GuiBem Seatlntdo OL o fam Pode Lertelrana “lei B a Ponigor Rego Pastago mo E P Em Pie PA Uma vez selecionada essa opção, o Editor de Código do Delphi passa a exibir o código inicial de nossa aplicação como mostrado na figura. Como podemos observar, uma aplicação console é composta, inicialmente, pelo arquivo de projeto. Porém, ao contrário do que acontecia com arquivos de projeto comuns, existe no código apresentado uma diretriz de compilação que indica ao compilador Delphi que a aplicação sendo desenvolvida trata-se de uma application e não uma aplicação com interface gráfica tradicional. Excluindo essa diferença, o restante do código apresentado no arquivo de projeto é idêntico ao encontrado em aplicações gráficas tradicionais, ou seja, é composto pela dot palavra reservada program seguida pelo nome JJ. da aplicação, uma seção indicada pela palavra uses que será vista posteriormente e, por fim, um bloco begin e end que irá conter o código a ser executado pela aplicação. ae | vrugram Frujecti: E (SADPESIE consoLE) uses systrila: negm ZÉ Tusert user cudo dero console ena Devemos fazer uma pequena observação com relação ao nome da aplicação escrito logo após a palavra reservada program. Já mencionamos o fato de que , quando trabalhamos com o arquivo de projeto não devemos fazer alterações manualmente uma vez que o Delphi faz as devidas alteações quando necessárias. Essa observação também é válida quando estamos trabalhando com aplicações console. Devemos evitar alterar o nome da aplicação diretamente no código fonte de nossa aplicação uma vez que o Delphi irá fazer isso sem acarretar qualquer problema. Caso desejemos alterar o nome do aplicativo devemos fazê-lo salvando-o com o nome que desejamos através da opção Save Project as localizada no menu File. O Delphi, ao salvar o aplicativo ele alterará tanto o nome do programa contido no fonte do arquivo dpr quanto irá alterar o nome físico do arquivo. Página: 30 Delphi 5 Com o objetivo de ilustrar o desenvolvimento de uma aplicação console, vamos escrever o código necessário para executar o mais tradicional exemplo de programa, o Alô Mundo. Para isso, no lugar do comentário Insert user code here, devemos escrever o código abaixo. Writeln(* Alô Mundo”; Após escrevermos o código acima, o Editor de Código deverá estar conforme a figura abaixo. Podemos então compilar e executar nossa aplicação. Caso tenhamos optado pela compilação e posterior execução desse programa dentro do próprio Delphi, a aplicação será executada e retornará rapidamente para a IDE do Delphi. Isso ocorre, como dito anteriormente, porque quando executamos o aplicativo por dentro do Delphi, ele passa a ser executado em modo de depuração e, logo após seu término, o controle é retornado para a IDE. Uma vez que essa aplicação não faz muita coisa, ela apenas exibe uma mensagem na tela e logo em seguida é encerrada, sua execução é muito rápida. Caso desejemos observar melhor essa execução, deveremos fazê-lo através do Prompt do MS-DOS executando-a como qualquer outro aplicativo. Lado nda a & O arquivo executável de nossa aplicação console é gerado por default no diretório onde salvamos os seus arquivos fontes. Caso ainda não tenhamos salvo o aplicativo, o Delphi irá gerar o executável no diretório Projects localizado abaixo do diretório de instalação do Delphi, o qual tem sua localização default no diretório CMrquivos de ProgramasBorlanADelphis. Ao executarmos nossa aplicação veremos que será exibida a linha Alô Mundo, e em seguida o programa é finalizado. 2.9. Criando uma aplicação GUI Vimos até aqui como podemos utilizar o Delphi para criar uma aplicação console. Esse tipo de aplicação, apesar de ser ainda utilizada, não é o principal tipo de aplicação a ser desenvolvida dentro do Delphi. Por isso, vamos dar início ao desenvolvimento de nossa primeira, e mais simples, aplicação GUI. Uma aplicação GUI, do inglês Graphical User Interface, é o tipo default desenvolvido pelo Delphi, ou seja, é aquela que é executada dentro da interface gráfica do Windows, possuindo em geral um formulário através do qual o usuário irá interagir com o aplicativo. Já vimos anteriormente um exemplo de uma aplicação GUI através da qual uma mensagem era exibida quando o usuário dessa aplicação clicava no botão existente no centro do formulário. Embora a aplicação apresentada não realize muita coisa de produtiva ela já representa o início do processo de desenvolvimento de qualquer aplicação para o ambiente gráfico, ou seja, a criação de um novo projeto, a definição do formulário principal da aplicação e a colocação, nesse formulário, dos componentes que irão compor a interface entre a aplicação e o usuário. Uma vez definido o aspecto visual do formulário é dado início ao processo de programação efetiva da aplicação. São definidos quais eventos de quais componentes deverão ser tratados pelo aplicativo e, em seguida, é feita a programação desses eventos. Uma vez feita a programação, o desenvolvedor pode compilar e executar o aplicativo tanto para realização de testes e depuração quanto para a entrega desse ao cliente ou às distribuidoras do software. Vimos também alguns dos vários arquivos gerados quando salvamos nosso aplicativo bem como a interação existente entre eles. Alguns desses arquivos foram apresentados com um pouco mais de detalhe quando estávamos desenvolvendo uma aplicação console, resta-nos agora, apresentar de forma mais detalhada cada um desses arquivos dentro de uma aplicação gráfica. A criação de uma aplicação gráfica pode ser feita de forma semelhante à de uma aplicação console, ou seja, podemos selecionar a opção New Application listada no menu File e criar uma aplicação default ou poderíamos selecionar a opção New e selecionar a criação de um projeto pré definido existente dentro do Página: 31 Delphi 5 Podemos observar que existem dois tipos de declarações dentro da seção uses exibida acima. A primeira delas contém uma referência a uma unit (a unit Forms) que, a princípio, não está incluída em nosso aplicativo enquanto que a segunda é a unit associada ao formulário inicial de nosso aplicativo (a unit Unit]). A declaração da unit Forms no arquivo de projeto é importante uma vez que é nessa unit que estão as declarações de funções e variáveis necessárias ao funcionamento inicial do aplicativo e não deve ser removida. Já a segunda declaração indica a existência da Unit] dentro do projeto. A medida em que novas units vão sendo adicionadas ao projeto as suas respectivas declarações vão sendo colocadas na nessa seção uses automaticamente pelo Delphi. Outro ponto importante a ser mencionado é a forma com que o Delphi declara essas units dentro da seção uses. Observe que a declaração da unit não utiliza a sua extensão. Essa é a razão pela qual, no momento em que salvamos o projeto, ele não deve ter um nome que já tenha sido previamente atribuído a uma unit. Uma vez que, dessa forma, o compilador Delphi não teria como distinguir quando o programador estivesse fazendo referência a uma unit ou ao projeto. Um último ponto a ser discutido aqui, porém também de fundamental importância é a localização das units em disco. O Delphi, ao tentar abrir qualquer unit para compilação ou simplesmente para a sua exibição no Editor de Código, irá procurar no diretório onde o projeto foi salvo, ou no path definido dentro do arquivo de projeto. Caso tenhamos salvo uma unit dentro de um diretório diferente daquele no qual o projeto foi salvo, essa informação ficará armazenada no arquivo de projeto e, quando tentarmos abrir esse projeto em um outro computador, o Delphi irá procurar por essa unit na localização onde ele havia sido salvo. uses Forms, Unit] in 'Unitl.pas' (Forml), Unit2 in ../Unit2.pas' (Form2), Unit3 in 'Unit3.pas'; No exemplo acima, temos três units contidas no projeto, as duas primeiras referentes aos formulários 1 e 2, e a última uma unit que não está vinculada a qualquer formulário. Observe que a unit2 não foi salva no mesmo diretório que o projeto e sua localização está indicada através do seu caminho relativo em relação ao qual o projeto foi salvo. Devemos ter cuidado uma vez que, ao salvarmos as units em diretórios diferentes daquele no qual o projeto foi salvo estamos, também, dificultando o processo de backup dos arquivos fonte pertencentes a esses projetos. Uma outra definição colocado no arquivo de projeto refere-se a qual arquivo de recursos será utilizado pela aplicação sendo desenvolvida. Em geral esse arquivo possui o mesmo nome que o arquivo de projeto porém com a extensão RES. Essa informação é passada ao compilador por intermédio da diretiva de compilação $8R conforme mostrado abaixo. [SR RES) O asterisco colocado nessa diretiva indica que o arquivo de recursos irá possuir o mesmo nome que o arquivo de projeto. No caso de desejarmos incluir um arquivo com nome diferente bastaria que, no lugar do asterisco, fosse informado o nome desse arquivo. O último trecho do arquivo de projeto, definido pelas palavras reservadas begin e end indica, como acontecia com as aplicações console, o código a ser executado inicialmente pelo aplicativo. Porém, o código escrito nessa seção é manipulado diretamente pelo Delphi e não devemos mexer diretamente com ele a menos que tenhamos certeza absoluta do que estamos fazendo uma vez que, uma alteração equivocada nesse trecho do programa poderá provocar seu mal funcionamento ou, até mesmo, a impossibilidade de sua execução. Em uma aplicação gráfica, como a exibida acima, o código escrito entre o begin e o end poderá conter o código responsável pela alocação de memória dos formulários e a execução real da aplicação. Veremos posteriormente como podemos criar formulários dinamicamente durante a execução de nosso aplicativo. Nesses casos, a alocação de memória para esses formulários não será feita mais no arquivo de projeto mas begin Application Initialize; Application.CreateForm(TForml, Forml); Application.CreateForm(TForm2, Form2); bina: 34 Application Run; end. Delphi 5 sim em algum ponto antes do qual será necessária a exibição desse formulário. 2.11. Manipulando com as opções do projeto Uma vez que dentro do Delphi trabalhamos sempre com projetos devemos aprender a configurar cada um deles. A configuração das opções de nossos projetos é feita através da item de menu Options contido no = opção, a caixa de diálogo mostrada ao lado é exibida. Essa caixa de EEE « a ss Es 1 es || responsáveis pela configuração do projeto aberto na IDE do Delphi 17 | |pais delas a seguir. smm fd a respeito da caixa de diálogo Project Options é a guia Forms, contém, basicamente, um combobox e dois listboxes. O combobox ulário principal de nossa aplicação. Sempre que criarmos um projeto, b inicialmente. Porém nada impede que desenvolvamos o formulário te. Uma vez criado o novo formulário, para tornarmos esse novo ão basta selecionarmos no combobox o formulário desejado. Já os dois listboxes contidos na guia Forms são utilizados para identificar quais formulários de nossa aplicação «ão criados ou não pelo Delphi automaticamente. Aqueles TI criar manualmente deverão estar listados no listbox Available forms enquanto que aqueles que devem ser criados automaticamente estarão no listbox Auto- create forms. Uma vez que apresentamos as opções contidas nesta guia temos duas observações a fazer. A primeira observação está relacionada ao próprio arquivo de projeto. Como citado anteriormente, não devemos fazer alterações diretamente no arquivo de projeto uma vez que o Delphi irá manipular com 1 Puta EEE esse arquivo diretamente. Essa situação pode ser facilmente observada. Para isso, vamos criar uma nova aplicação que irá conter três formulários de acordo o eia com as figuras ao lado. Conforme podemos observar, a criação dos formulários foi feita de tal forma que o formulário principal da aplicação foi o formulário Forml, porém decidimos que o formulário que deveria ser utilizado como formulário principal seria o segundo formulário, ou seja, o formulário Form2. Veremos posteriormente qual a finalidade dos formulários Forml e Form3. Já sabemos como fazer essa alteração, porém vamos observar o arquivo de projeto antes de realizarmos essa alteração para compararmos as alterações feitas pelo Delphi posteriormente. 1: ua 4 1 o 4 Za usa : a: begin de| begin Application.Initialize; tel Application .Initialize; Application.CreateForm(TForml, Forml); ibid Application.CreateForm(TForm2, Form2): Application.CreateForm(TForm2, Form2); Application.CreateForm(TForml, Forml); Application.CreateForm(TForm3, Form3); Application.CreateForm(TForm3, Form3); Application.Run; Application Run; end. end. Página: 35 Delphi 5 A segunda observação refere-se aos listboxes apresentados nessa caixa de diálogo. Ao criarmos uma aplicação dentro do Delphi e definirmos um ou mais formulários, o Delphi tem, por definição, a criação automática de todos esses formulários, ou seja, ao executarmos o aplicativo, antes dele começar a sua execução real exibindo a sua janela principal, será alocada memória para todos esses formulários. Esse comportamento tem tanto seu lado positivo quanto seu lado negativo. O lado positivo está no fato de que, ao tentarmos exibir qualquer formulário definido em nosso projeto, sua exibição será feita de forma mais rápida uma vez que ele já foi construído em memória. Porém, uma vez que já alocamos memória para todos os formulários da aplicação, poderemos estar reservando recursos do computador que nunca serão utilizados, no caso por exemplo de um formulário pouco exibido, o que não é muito bom. Para evitar esses dois extremos o Delphi permite-nos selecionar quais formulários deverão ser criados ou não automaticamente durante o início da execução do programa. Para ilustrarmos os efeitos de termos um formulário criado automaticamente ou não no arquivo de projeto vamos, em nosso exemplo, mover o formulário Form3 do listbox Auto-create forms para o listbox Available forms. Ao fazermos isso, podemos perceber que a linha referente a criação do formulário Form3, contida no arquivo de projeto, foi removida conforme ilustrado ao lado. Da mesma forma, poderíamos ter feito essa alteração diretamente no arquivo de projeto sem termos de alterar essa informação na caixa de diálogo Project Options, como havia acontecido com a definição do formulário principal de nossa aplicação. begin Application Initialize; Application.CreateForm(TForm2, Form2); Application.CreateForm(TForml, Forml); Application.Run; end. A princípio poderíamos pensar que a alteração procedure TForm2.Buttonl Click(Sender: TObject); de definição entre aqueles formulários criados begin automaticamente e aqueles que estão Forml.Show: disponíveis para o uso do desenvolvedor não end; traria qualquer problema para a programação, porém isso não é verdade. Para demostrarmos procedure TForm2.Button2Click(Sender: TObject); esse problema, bastante comum quando ainda begin não temos muita experiência em programação Form3.Show; principalmente para o ambiente Windows, end; vamos criar dois procedimentos, cujo código estamos apresentando ao lado, associados respectivamente, ao evento OnClick em cada um dos botões colocados no formulário principal de nosso aplicativo, o Form2. Observe que não devemos escrever todo o código, mas sim as linhas contidas entre o begin e o end de cada procedimento. Uma vez que tenhamos escrito o código de cada procedimento dores e podemos compilar a aplicação. A tentativa de compilação irá resultar ra = =|| em três erros conforme mostra a figura ao lado. A única opção que Ci M teria: a temos nesse momento é pressionar o botão OK. Ao fazermos isso, uma mensagem semelhante aquela apresentada abaixo é exibida. Por ora não iremos fornecer uma explicação a respeito do significado dessa mensagem. Apenas vamos clicar no botão Yes. Feito isso uma segunda caixa de diálogo, desta vez ári á exibi Fom om eferenceslotm'Forni! deokredin ui Int” wnichis rot inyour referente ao formulário Form3 será exibida e, q) ER E novamente, devemos clicar o botão Yes. O Delphi retorna para o Editor de Código para que possamos No tentar compilar novamente a nossa aplicação. Desta vez, a aplicação será compilada sem problemas, gerando o executável de nosso aplicativo. Podemos então executá-lo dentro do ambiente Delphi como também fora dele. Ao executarmos a aplicação, o formulário principal da aplicação será exibido. Nele, como poderíamos esperar, estão O) ssspggeem eim morra nose pet ts CODE contidos dois botões que, ao serem clicados, irão executar o código que escrevemos anteriormente. Ao clicarmos no primeiro botão o formulário Form! é exibido uma vez que essa foi a função do código que escrevemos no evento OnClick do botão Button! . Porém, ao clicarmos no botão 2 a mensagem de erro mostrada ao lado é exibida. A ocorrência desse erro deve-se justamente a não criação automática do formulário pelo Delphi. Uma vez que ainda não criamos o formulário, ou seja, nenhuma memória foi alocada para conter os valores atribuídos às suas propriedades e métodos, ao Página: 36 Delphi 5 comparação às demais seções que podem estar contidas em uma unit. Esse comportamento é idêntico independentemente das units pertencerem ao mesmo projeto ou estarem contidas em projetos distintos. Já sabemos que a seção interface é utilizada para tornar diversos tipos de declarações disponíveis para outras units. Porém, não basta apenas escrevermos na seção interface o código que desejamos compartilhar com outras units para que esse compartilhamento ocorra. Para que isso seja possível, algumas ações por conta do programador devem ser realizadas. Veremos agora, as cláusulas nas quais a seção interface está dividida e como poderemos utiliza-las para declarar código e tornar esse código compartilhado com outras units. 3.1.1.1.A cláusula Uses A cláusula uses é utilizada dentro da seção interface de uma unit para indicar quais units contém declarações em suas seções interface que são necessárias à compilação da | unit UExemplol; unit atual. O código ao lado mostra a utilização da cláusula uses dentro de | interface uma unit. Nesse exemplo a unit corrente, chamada de UExemplol, | uses . . possui em sua cláusula uses localizada Windows, Messages, SysUtils, Classes, Graphics; na seção interface referências a 5 units. | --- Ao declararmos essas units passamos a ter acesso a todas as declarações feitas em suas seções interface. Ou seja, caso exista a declaração de uma variável chamada resposta dentro da unit SysUtils, a partir desse momento ela poderá ser referenciada e utilizada na unit UExemplol sem qualquer problema. Como pudemos observar, as units constantes na cláusula uses estão separadas por vírgula e não estão listadas com suas extensões. Além disso, a declaração é finalizada por um ponto-e-vírgula. Essa cláusula não é obrigatória, porém é amplamente utilizada na maioria das aplicações que serão desenvolvidas. Duas observações se fazem necessárias com relação à utilização da cláusula uses dentro de um projeto Delphi. A primeira delas refere-se ao encadeamento de declarações na cláusula uses. O Delphi não possibilita o Les el E encadeamento de Linit 2; — | Liit — | Unit I; declarações. Ou seja, caso existam três units na qual a primeira E o o utiliza a segunda que Liaiê 2 Linis 2 Linit 3 por sua vez utiliza a terceira, as declarações contidas na terceira não estarão disponíveis para uso na primeira unit. Caso isso seja desejável, a primeira unit deverá fazer referência diretamente a terceira unit. A segunda observação refere-se a um problema que ocorria com bastante fregiiência nas versões mais antigas do Delphi, a referência circular. Esse problema ocorre quando as declarações feitas na cláusula uses de duas ou mais units ocasionam a formação de um círculo. A figura ao lado ilustra a ocorrência de uma referência circular. Esse problema impede que a compilação do projeto seja feita e por isso deve ser evitada. Já sabemos que podemos fazer referência a declarações existentes em outras units contidas tanto no projeto corrente quanto em qualquer outro projeto relacionando o nome da unit na cláusula uses, porém ainda não sabemos como fazer essas declarações. Dessa forma, iremos apresentar as demais cláusulas que podem ser definidas dentro da seção interface de uma unit. 3.1.1.2.Tipos básicos do Delphi Antes de começarmos a falar a respeito de declarações de variáveis e constantes que podem ser utilizadas pelo nosso projeto devemos tomar conhecimentos dos principais tipos de dados que estão disponíveis no Delphi. Existe uma quantidade muito grande de tipos pré-definidos que podem ser utilizados pelos programadores no desenvolvimento de suas aplicações, por esse motivo, iremos apresentar no quadro abaixo apenas um pequeno resumo daqueles tipos de dados que serão mais utilizados no desenvolvimento de nossas aplicações. Página: 39 Delphi 5 Tipo Básico Faixa de valores Byte 0..255 Word 0..65535 Integer 2147483648 .. 2147483647 Cardinal O .. 4294967295 Real 2.9x 10"-39..1.7 x 10138 Extended 3.6x 1014951... 1.1 x 1014932 Currency -922337203685477.5808.. 922337203685477.5807 Char Um caractere String Aproximadamente 2231 caracteres Boolean Valor booleano (True ou False) TDateTime Data e hora 3.1.1.3.Declarações de tipos Além dos tipos básicos apresentados acima e ainda, aqueles que mesmo não tendo sido exibidos acima compõe os tipos básicos do Delphi, o desenvolvedor ainda dispõe da possibilidade de criar seus próprios tipos de dados. Uma vez que esses novos tipos de dados forem criados, eles podem ser utilizados normalmente como se fossem tipos básicos da linguagem, podendo ser declaradas variáveis e constantes a partir deles. Existem cinco possibilidades de criarmos novos tipos de dados dentro do Delphi, são elas: e Tipossimples e Conjutnos (Sets) e Tipos Enumerados e Registros e Classes Colocamos nessa definição a possibilidade de criarmos classes como um novo tipo de dado por duas razões básicas. A primeria delas deve-se ao fato de que a localização de suas declarações é a mesma dos demais tipos de dados vistos, todos estão localizados na cláusula type da unit. A | unit UExemplol; segunda razão é devido a forma de utilização das mesmas, ou seja, uma vez | interface declarada uma classe ela pode ser utilizada na declaração de variáveis, que no caso de type estarmos trabalhando com classes serão nome = string[50]; chamados de objetos, que pertençam a ela funcionario = record entre outras coisas. Independentemente do fnome : nome; fato de estarmos trabalhando com classes ou idade : byte; qualquer outro novo tipo de dados, ao ser end; declarado, ele será sempre colocado no TForml = class (TForm) mesmo trecho da unit, ou seja, em sua seção End; type, seção responsável por conter todas as novas declarações de tipos dentro de uma unit. O exemplo ao lado ilustra a declaração de novos tipos de dados. Dois pontos podem ser observados tendo em vista o exemplo dado. O primeiro ponto refere-se ao fato de podermos ter várias declarações de novos tipos dentro de uma mesma cláusula type. Esse ponto que estamos abordando agora não é válido apenas quando estamos definindo novos tipos de dados. Cada uma das cláusulas até aqui apresentadas ou aquelas que ainda serão vistas possuem seu escopo definido até o Página: 40 Delphi 5 início da próxima cláusula. Dessa forma não é necessária a cada nova definição de tipo a colocação da palavra reservada type. O segundo ponto que devemos observar é a própria declaração de novos tipos de dados. No exemplo apresentado acima são declarados três novos tipos. O primeiro deles refere-se à criação de um tipo simples, já o segundo a um registro enquanto que o terceiro refere-se a uma classe. 3.1.1.3.1.Tipos de dados simples A declaração de um novo tipo simples é a mais fácil dentre as três. Quando declaramos um novo tipo simples não estamos fazendo nada mais do que criando uma espécie de sinónimo para um tipo de dados já existente, seja ele um tipo de dados básico ou um outro tipo criado também na cláusula type. No exemplo dado a seguir, está sendo criado um novo tipo de dados chamado nome. Esse novo tipo é, simplesmente, uma nova representação para o tipo de dados básico string que, neste caso, irá possuir um tamanho máximo de 50 caracteres. Uma vez que declaramos o novo tipo nome, podemos passar a utilizá-lo em novas declarações, como foi feito dentro da declaração do tipo funcionario. Apresentamos a seguir a sintaxe para a declaração de um novo tipo de dados simples. intaxe NomeNovoTipo = TipoBasico; Exemplo Nome = string[50]; Como podemos observar na sintaxe apresentada acima, a declaração de novos tipos de dados simples restringe-se basicamente à atribuição de um novo nome a um tipo de dados básico ou que tenha sido previamente definido na cláusula type. Podemos então perguntar qual a finalidade de declararmos um tipo de dados simples! A resposta é mais semântica do que prática. Uma vez que criemos um novo tipo de dados simples, como o tipo de dados nome criado no exemplo anterior, torna-se muito mais simples o entendimento da funcionalidade das variáveis desse novo tipo do que no caso de sua não existência, ou seja, ao declararmos uma variável pertencente a esse tipo de dados fica clara a sua finalidade, a de estar manipulando um nome. Uma outra vantagem em estar trabalhando com um tipo de dados simples está na manutenção do código fonte criado. Caso desejemos alterar o tamanho das variáveis do tipo nome basta que o façamos em um único lugar que essa alteração será refletida em todas os pontos do programa onde variáveis desse tipo haviam sido declaradas. 3.1.1.3.2.Conjutos Uma segunda maneira de declararmos novos tipos de dados dentro do Delphi é através da declaração de conjuntos (sets). Um conjunto funciona de forma semelhante à um array (a declaração de arrays será vista posteriormente dentro da declaração de variáveis) podendo conter uma série de valores simultaneamente dentro de sua definição. A seguir apresentamos a sintaxe e alguns exemplos relacionados à declaração de um tipo de dados conjunto. Sintaxe NomeNovoTipo = set of TipoBasico Exemplo Respostas = set of char; Resultados = set of 1..50; A declaração de conjuntos permite que sejam criadas variáveis que irão conter um conjunto de valores válidos dentro daqueles fornecidos através da declaração do novo tipo. No exemplo acima, a declaração do tipo de dados Respostas irá permitir que variáveis desse novo tipo armazenem um conjunto de caracteres, bem como o tipo de dados Resultados irá permitir o armazenamento de um conjunto de valores de 1 à 50. Apesar de ainda não termos mostrado como é feita a declaração de variáveis dentro do Delphi, o exemplo a seguir ilustra a atribuição de valores à variáveis dos tipos criados no exemplo acima. Para obter informações a respeito da declaração de variáveis, o leitor deve consultar a próxima seção deste capítulo. Página: 41 Delphi 5 end; Observe que ao declararmos o tipo de dados TFuncionario estamos, antes de tudo, respeitanto um padrão adotado no desenvolvimento de novos registros, e posteriormente como iremos observar, como também de novas classes, iniciando o nome de cada novo tipo com a letra “T”. Uma vez feita essa observação com relação ao nome do tipo de dados, voltemos à explicação do exemplo propriamente dito. Nesse exemplo, podemos observar a existência de quatro campos dentro do tipo TFuncionario, são eles: os campos Nome, Cargo e Setor do tipo string e o campo Idade que armazena um valor inteiro. Devemos observar também que poderíamos ter criado campos de qualquer tipo de dados, até mesmo de tipos de dados Record desde que eles tivessem sido previamente declarados. A declaração de tipos de dados registro é útil devido a possibilidade de podermos agrupar valores dentro de uma única declaração. Quando, por exemplo, declararmos uma variável desse tipo de dados estaremos colocando todas as informações a respeito de um funcionário em um único lugar, permitindo o acesso rápido a cada um desses campos por intermédio de uma única variável. Exemplo Func.Nome José da Silva”; Func.Idade := 18 Func.Cargo “Analista de Sistemas”; X:= Func.Idade; Os exemplos acima ilustram a utilização de uma variável do tipo de dados TFuncionario declarado anteriormente. Neles vemos como podemos atribuir e ler valores dos campos de um record. O acesso a cada campo do record é feito através da utilização do operador ponto. Para tanto basta que o valor que esteja sendo atribuído, bem como a variável na qual o valor esteja sendo colocada a partir de um campo do record possuam o mesmo tipo de dados. 3.1.1.3.5.Classes O último tipo de dados que iremos abordar refere-se ao conceito de classes. O Delphi, por ser uma linguagem que suporta os conceitos da programação orientada a objetos permite a declaração tanto de novas classes quanto de objetos. A declaração de objetos será vista na próxima seção. Feita essa observação vamos começar nosso estudo em relação à declaração de classes dentro do Delphi. A declaração de classes é bastante semelhante à declaração de um tipo de dados record vista anteriormente. Sintaxe NomeNovaClasse = class Declarações da Classe end; Exemplo TClasseFuncionario = class Nome : string[50]; Salario : currency; Procedure Aumento(pct : real): end; Apesar de estarmos apresentando neste momento a sintaxe para a declaração de uma classe, essa sintaxe não está completa. Basicamente, o que ilustramos aqui é a sintaxe bastante semelhante à da declaração de um record, onde a diferença encontrada até este momento entre as duas declarações, é a substituição da palavra reservada record pela palavra reservada class. No exemplo dado, podemos perceber pelo menos mais uma grande diferença entre as declarações de records e classes no que diz respeito à possibilidade de declararmos métodos dentro da declaração de uma classe, fato esse que não pode ocorrer dentro da Página: 44 Delphi 5 definição de um record. No entanto, deixaremos para depois a descrição mais detalhada da sintaxe da declaração de uma classe. 3.1.1.4.Declarações de variáveis Uma vez que já conhecemos alguns dos tipos básicos existentes dentro do Delphi e também sabemos como criar novos tipos de dados a partir desses tipos básicos, vamos explorar a principal razão da existência de tipos de dados dentro de uma linguagem de programação, a declaração de variáveis. 3.1.1.4.1.Declarando variáveis simples De forma semelhante ao que aconteceu com a declaração de tipos, o Delphi também possui uma cláusula responsável pela declaração de variáveis, a cláusula var. O exemplo ao lado mostra a utilização da cláusula var. Como podemos observar, a declaração de variáveis é feita logo após a palavra reservada var, que indica o início das declarações de variáveis. Podemos declarar uma ou várias variáveis. Os nomes das variáveis devem ser seguidos por sinal de dois pontos e, em seguida, o nome referente ao tipo da variável sendo declarada. Podem ser declaradas variáveis de qualquer tipo de dados válido, seja ele um tipo de dados básico ou um novo tipo de dados declarado na cláusula type da unit. No entanto, as declarações de variáveis pertencentes a tipos de dados declarados na seção type só é válida desde que a declaração do novo tipo de dados tenha sido feita antes da declaração da variável ou ainda em uma unit que esteja contida na cláusula uses da unit na qual a variável está sendo declarada. unit Unit2; unit Unit2; interface interface type var TNome = string[50]: Nome : TNome: var type Nome : TNome; TNome = string[50]: implementation implementation end. end. Acima apresentamos dois exemplos de declaração de variáveis. O primeiro exemplo funciona perfeitamente e pode ser compilado sem qualquer problema. Já o segundo exemplo, caso tentemos compila-lo, irá resultar em erro de sintaxe. O erro ocorre uma vez que estamos tentando declarar a variável Nome que supostamente é do tipo TNome. Para o Delphi, no momento da compilação da linha referente à declaração da variável Nome, não existe definido nenhum tipo de dados chamado TNome. Dessa forma, as declarações feitas no segundo exemplo apresentado acima não funcionam e resultam em erro de sintaxe. Resta-nos fazer duas pequenas observações a respeito da declaração de variáveis dentro do Delphi. A primeira refere-se à declaração de múltiplas variáveis. Quando desejamos declarar várias variáveis de um mesmo tipo de dados podemos fazê-la separando cada variável por uma vírgula e, ao final das declarações dos nomes das variáveis, colocamos o sinal de dois pontos e o tipo dessas variáveis. A Segunda observação refere-se à possibilidade de declaração de várias cláusulas var dentro de uma mesma seção interface. Apesar de podermos declarar várias dessas cláusulas, tal tipo de procedimento não é muito comum e deve ser evitado por uma simples questão de estética e organização do código fonte. 3.1.1.4.2.Declarando variáveis arrays A declaração de variáveis array, também conhecidas em outras linguagens de programação como vetores, também pode ser feita dentro do Delphi. A declaração de arrays é útil quando desejamos declarar uma série de variáveis de mesmo tipo de dados, cujo acesso a elas deve ser feito de forma conjunta. Não faz parte do escopo deste material falar sobre a finalidade de uma declaração de arrays, mas sim definir a sintaxe adotada pelo Delphi para a declaração desse tipo de variável. Para uma explicação mais detalhada em relação à utilização de arrays, o leitor deve consultar material específico sobre estruturas de dados. Página: 45 Delphi 5 Sintaxe NomeVar : array [Poslni..PosFin] of Tipo; NomeVar : array [PosInil..PosFinl, ..., PosIniN..PosFinN] of Tipo; Exemplo Gabarito : array [1..20] of char; Provas : array [1..16, 1..20] of char; A sintaxe apresentada acima ilustra dois tipos possíveis de declarações de arrays. A primeira delas refere- seà declarações de arrays unidimensionais enquanto que a segunda mostra como podemos declarar arrays multidimensionais. No primeiro exemplo, a declaração da variável gabarito que pode conter vinte caracteres cada um deles nas posições de 1 a 20 do array, respectivamente. Já no segundo exemplo, a variável gabarito representa um array bidimensional, semelhante a uma tabela contendo 16 linha com 20 colunas em cada uma delas, onde em cada campo desta tabela podemos colocar um caractere. Algumas observações fazem-se necessárias em relação à declaração de arrays bem como o acesso aos valores neles contidos. A primeira observação diz respeito a sintaxe da declaração do array. Como mostrado acima, na declaração do array é estabelecida tanto a posição inicial quanto a final dos elementos do array. Através dessa definição fica também estabelecida a quantidade de elementos que poderão estar contidos nesse array. Para esses valores podemos estabelecer qualquer numeração, porém as numerações mais comuns para a posição inicial do array é a posição O ou a posição 1, como feito nos exemplos anteriores. Apesar disso, fica a critério do desenvolvedor a definição de quais serão as faixas de valores a serem utilizadas. A segunda observação refere-se ao acesso aos valores contidos no array. Para acessarmos cada elemento contido no array devemos fazer referência a posição em que esse elemento ocorre dentro do array. O exemplo abaixo ilustra algumas das diversas formas que podemos utilizar para fazer referência a uma posição específica do array. Exemplo Gabarito[12] : Provas [5, 20] Provas [5] [20] Os exemplos acima ilustram como acessar um elemento de um array unidimensional bem como exibe duas maneiras de acessarmos o mesmo elemento em um array bidimensional. 3.1.1.5.Declarações de constantes Um outro tipo de declaração bastante comum em muitas | unit Unit2; linguagens de programação é a declaração de constantes. Como não poderia deixar de ser, o Delphi também permite | interface a declaração de constantes que poderão ser utilizadas em seu código fonte. Como vem acontecendo com outros | const tipos de declarações, a declaração de constante também DiasNaSemana = 7; possui um local especial na qual elas ocorrem, a cláusula Companhia = Tbratec"; const. A figura ao lado exemplifica a declaração de SalarioMinimo = 151.00; constantes dentro de uma unit do Delphi. A sintaxe da declaração de constantes é semelhante àquela vista para a declaração de variáveis. Devemos colocar o nome da constante a ser declarada seguida no sinal de igualdade e o valor a ser atribuído. Essa é a sintaxe a ser utilizada na maioria das declarações de constantes. Porém, como veremos a seguir, existem algumas exceções a essa sintaxe. HorasNoDia = byte(24); DiasDoAno : integer = 365; implementation end. No exemplo apresentado podemos observar dois pontos interessantes em relação à declaração de constantes. O primeiro ponto refere-se a possibilidade de informarmos o tipo de dados ao qual a constante Página: 46 Delphi 5 3.1.2. Exemplo procedure ProcExemplo (const Argumento : integer); Quando declaramos um argumento como sendo um parâmetro constante, estamos indicando que o argumento passado para a função ou procedimento não pode tt | ec+ ser alterado no corpo do procedimento. Caso tentássemos alterar o valor do argumento dentro do corpo da função ou procedimento, ao compilarmos a aplicação o Delphi iria acusar um erro como mostra a figura ao lado. Esse comportamento assemelha-se ao que seria esperado se tivéssemos declarado uma variável local ao procedimento ou função. A grande vantagem em relação à declaração de uma constante local está no fato de, ao passarmos como (amo É argumento para a função, estaremos criando uma [series tones va o “ » dinami ; E ES ER 'constante” dinamicamente, uma vez que o valor da tapa constante é atribuído no momento da chamada da função ou procedimento. A seção implementation Vimos na seção anterior a seção interface. Nela pudemos declarar novos tipos, variáveis e constantes. Essas declarações podiam ser disponibilizadas para outras units, pertencentes ou não ao projeto corrente, como se fossem declarações globais. Agora vamos dar início ao estudo da seção implementation. Essa seção assemelha-se bastante à seção interface uma vez que nela podemos também declarar novos tipos, variáveis e constantes da mesma maneira como havíamos feito anteriormente através da utilização das palavras reservadas type, var e const conforme mostramos ao lado. A diferença básica existente entre as declarações feitas na seção implementation daquelas que fazemos na seção interface está na visibilidade dessas declarações. Eai ui Vos | EE a [EE Tee [EE vs ativa Ki E es ampienencataom me = atrimataras «Ly af EE pas fm 4 Como mencionamos em nossa explicação a respeito da seção interface, as declarações nela efetuadas possuem caráter global, ou seja, podem ser vistas e utilizadas em qualquer outra unit desde que essa unit esteja incluída em sua cláusula uses. Por outro lado, as declarações feitas na seção implementation possuem caráter local, ou seja, podem apenas ser utilizadas dentro da própria unit onde estão declaradas Além do aspecto visibilidade, vimos que uma outra função da seção interface é a possibilidade de podermos declarar funções e procedimentos. Porém, além de termos a possibilidade de declararmos esses procedimentos na seção interface, o que os tornam procedimento e funções disponíveis as demais units, devemos ainda escrever a codificação para os mesmos, ou seja, devemos escrever o corpo de cada um desses procedimentos. A codificação do corpo desses procedimentos e funções é feita na seção implementation da unit. É importante salientar que não necessitamos declarar o cabeçalho dos procedimentos na seção interface, no caso em que desejamos escrever funções ou procedimentos locais a unit corrente, basta escrevermos o corpo dessas diretamente na seção implementation. Independentemente de qual seja a visibilidade que desejamos dar as funções e procedimentos que iremos escrever, a forma com que iremos escrever esses procedimentos é exatamente a mesma. A seguir mostramos a sintaxe que deverá ser utilizada na escrita do corpo de cada um dos procedimentos ou funções a serem declaradas nas units do projeto. É importante observar que a sintaxe que iremos apresentar é um pouco diferente quando estivermos tratando da implementação de procedimentos e funções pertencentes a uma classe. Sintaxe procedure NomeProc (Argumentos : TipoDeDados); Begin Código do procedimento Página: 49 Delphi 5 3.1.3. end; Exemplo procedure ExibeMsg(Msg : string); begin ShowMessage(Msg): end; Observe que ao escrevermos o corpo de cada procedimento ou função devemos repetir todo o cabeçalho antes de colocarmos as palavras reservadas begin e end. Entre essas duas palavras reservadas é que iremos escrever efetivamente o código a ser executado. Uma vez que já sabemos tanto como declarar funções quanto como escrever o corpo de cada uma delas, devemos nos lembrar que as funções diferenciam-se dos procedimentos pelo fato de retornarem um valor para o ponto de onde elas foram chamadas. Por isso resta-nos mostrar, dentro do corpo da função, como podemos indicar qual valor deve ser retornado, ao local da chamada da função. Sintaxe Result := ValorRetorno; NomeFuncao := ValorRetorno; Exemplo Result := True; VerificaCPF := True: ifx<3 then Result := true Else Result := False; Observe que existem duas maneiras de retornarmos um resultado para a função. A primeira delas é através da utilização da palavra reservada result. Result nada mais é do que um argumento implícito contido no cabeçalho de cada uma das funções que declaramos. Ao atribuirmos valores à palavra reservada result estamos informando ao Delphi quais valores desejamos retornar ao ponto em que a função foi chamada. A segunda maneira através da qual podemos retornar resultados de funções é através da atribuição do valor desejado ao próprio nome da função. No exemplo acima, o valor true é atribuído ao próprio nome da função VerificaCPF. A seção initialization A seção initialization é uma seção opcional dentro da declaração de uma unit, iniciando-se pela palavra reservada initialization e prosseguindo até o início da seção finalization ou o término da unit. Essa seção é utilizada para colocar códigos que devem ser executados durante a inicialização do aplicativo. Nela colocamos declarações como, por exemplo, a inicialização de variáveis. A figura ao lado mostra a utilização da seção initialization dentro de uma unit. Observe que nessa seção podemos tome = atrimagrar]s colocar desde simples atribuições de valores a variáveis que Dm ate é it foram declaradas em outras seções da unit ou de outras units, lana o bem como outras codificações mais complexas. Ao Tossodou — 365 observarmos o código existente na seção initialization, [EE podemos observar que as declarações feitas nessa seção sap fr E assemelham-se a declarações que poderiam ter sido feitas em qualquer função ou procedimento existente em uma unit. A principal diferença é que o código que escrevemos na seção Página: 50 Delphi 5 3.1.4. initialization será executado automaticamente no início da execução do programa, enquanto que, para executarmos outros procedimentos deveríamos chamar esses procedimentos para que o código associados a eles sejam executados. A seção finalization A seção finalization é a última seção que pode ser declarada dentro de uma unit, podendo existir apenas se a seção initialization tiver sido previamente declarada. Nessa seção são declarados códigos a serem executados ao término da execução do programa. Uma vez que a seção initialization de uma unit seja executada, o Delphi garante a execução da seção finalization correspondente. Dessa forma, podemos perceber dois pontos em relação às declarações feitas na seção finalization de uma unit. A primeira delas é que essas declarações são, em geral, responsáveis pela liberação de recursos que tenham sido alocados na seção initialization. O segundo ponto é que, uma vez que as declarações contidas na seção initialization podem não ter sido concluídas corretamente, ou seja, pode ter havido algum erro durante a sua execução, o código que escrevemos na seção finalization deve ser robusto o suficiente para lidar com essas situações. 4.0s Formulários 4.1. 4.1.1. Uma vez que já possuímos conhecimento suficiente a respeito do ambiente Delphi, podemos iniciar nosso aprendizado naqueles itens que mais serão utilizados no desenvolvimento de nossos aplicativos. Como não poderia deixar de ser, vamos iniciar esse processo através do estudo dos formulários que, dentro das aplicações desenvolvidas para o ambiente WindowsO, irão estar presentes em sua grande maioria. Criando formulários Já sabemos que por estar contido na maioria das aplicações desenvolvidas para o ambiente Windows, ao iniciarmos o Delphi ou um novo projeto, um novo formulário será criado e definido como o novo formulário principal para a nossa aplicação. Esse formulário principal não será, muito provavelmente, o único formulário que estará contido nessa aplicação. Além disso, poderão existir situações em que o desenvolvedor deseja definir um novo padrão para o formulário principal de novas aplicações, diferentemente daquele formulário, sem qualquer componente, conforme definido pela instalação padrão do Delphi. Até mesmo para os novos formulários que iremos criar, podemos desejar que esse padrão seja alterado. Antes de mostrarmos como alterar o comportamento padrão, nós vamos mostrar as três principais formas através das quais podemos criar novos formulários dentro do ambiente do Delphi. Novos formulários As duas primeiras maneiras que o desenvolvedor possui de criar um novo formulário são idênticas. A primeida delas acionada pelo item de menu New Form contido no menu File, e a segunda através no speed button New Form localizado na Barra de Ferramentas da janela principal do Delphi. Em amabas as situações, um novo formulário é criado se utilizando sempre da definição de qual formulário foi estabelecido como o default para a configuração do Delphi em vigor. A segunda maneira que o desenvolvedor Delphi possui de criar um formulário é através da seleção do item de menu New localizado no menu File. Ao selecionarmos esse item de menu, o Delphi irá exibir a caixa de diálogo New Items. Essa caixa de diálogo é exibida contendo o Object Repository, ou seja, um Repositório de Objetos a partir do qual o desenvolvedor poderá escolher objetos previamente criados e utilizá-los em suas aplicações. O Object Repository está dividido em guias de acordo com a funcionalidade de cada objeto nelas contido. Por exemplo, na guia Forms estão contidos modelos de formulários enquanto que na guia Dialogs estão contidos modelos de caixas de diálogo. Existem também algumas guias especiais como é o caso da guia New que B 4% oa contém objetos mais comuns que podem ser utilizados em vários [“waz" Drtts Cm e tipos de aplicações. Já a guia Project] é uma guia especial, cujo B nome depende do nome da aplicação corrente, ou seja, ao rabino salvarmos o projeto com um outro nome, o título dessa guia será modificado, passando a exibir o nome do projeto corrente. Nessa guia, ao contrário do que ocorre nas demais, estão contidos os E] Ba o E RB Página: 51 Delphi 5 4.2.2. Nomeando objetos O Delphi como o próprio desenvolvedor necessita de uma forma através da qual poderá manipular com as propriedades e métodos dos componentes dentro de uma aplicação. A maneira pela qual essa referência é feita é através do nome desses componentes. Cada componente dentro da aplicação, incluindo o próprio formulário, deverá possuir um nome. A propriedade name é a única existente em todos os componentes dentro do Delphi. Existem duas regras que devem ser seguidas durante a atribuição de nomes a cada objeto existente na aplicação. A primeira regra refere-se à composição do nome do objeto. O nome de cada objeto não deverá ser composto por caracteres acentuados. Além de não podermos utilizar caracteres acentuados, a utilização de espaços não é permitida. Caso tentemos definir o nome de um componente utilizando qualquer um desses caracteres não permitidos, o Delphi nos informará do erro conforme ilustrado ao lado. Observe que no exemplo existem dois erros. O primeiro devido a tentativa de utilizar um caractere acentuado e o segundo devido à utilização do espaço em branco separando o nome do Q “Fomuái ias ro: a vei component name | componente. Ao invés disso, deveríamos utilizar caracteres sem acentuação e, em substituição ao espaço em branco, poderíamos ter utilizado o caractere underscore, o que resultaria no nome Formulario Principal. Um comentário deve ser feito em relação à atribuição de nomes aos componentes dentro de uma aplicação Delphi. Uma vez atribuído um valor à propriedade name de um componente que exiba ou contenha texto como é o caso de uma caixa de texto, um botão, ou o próprio formulário, a propriedade desse componente que contem o texto a ser exibido é alterada automaticamente para conter o nome que foi atribuído ao componente. No exemplo acima, caso atribuíssemos Formulário Principal à propriedade name do formulário, tanto essa propriedade quanto a propriedade caption seriam alteradas. Um detalhe com relação a esse comentário está no fato de que essa atribuição só é feita no caso da propriedade caption nunca ter sido alterada. Uma vez que tenhamos alterado a propriedade caption e posteriormente venhamos a alterar a propriedade name, essa alteração em nada modificará o valor previamente atribuído à propriedade caption. Um outro comentário que deve ser feito está relacionado com a escrita de código dentro da aplicação. Lembre-se que, para manipularmos propriedades e métodos dentro do Editor de Código fazemos sempre referência ao nome do componente. Uma vez que já tenhamos escrito código, manipulando com um determinado componente, e desejemos alterar seu nome, o Delphi não irá varrer todo o código da aplicação para realizar essa alteração para nós. Cada ponto em que o nome desse componente ocorre deve ser alterado de tal forma a que, na próxima compilação do aplicativo, nenhum erro ocorra. A segunda regra que deve ser observada na atribuição de nomes a componentes de nossa aplicação se refere à unicidade desses nomes. O valor da propriedade name para cada componente deverá identificá-lo unicamente dentro da aplicação. A princípio poderíamos imaginar que, devido a essa regra, nenhum componente poderia ter o nome idêntico a um outro componente existente na aplicação, porém isso não é de todo verdade. Quando estamos tratando com formulários sim, não poderão existir dois formulários com os mesmos nomes, ou seja, os mesmos valores atribuídos às suas propriedades name. Já com os demais componentes essa regra só é aplicada para os componentes colocados no mesmo formulário. Componentes localizados em formulários distintos podem possuir nomes idênticos uma vez que o Delphi os identificará unicamente através da composição do nome do formulário juntamente com o nome do componente como mostrado no quadro abaixo. Exemplo Formulario, Principal.ButtonOK.Caption = “OK”; FormCadCliente.ButtonOK.Caption := “Confirma”; Observe no quadro acima os códigos que poderiam ter sido escritos em um procedimento de evento qualquer. Neles vemos a atribuição de valores à propriedade caption de dois componentes distintos que possuem o mesmo nome. Isso é possível uma vez que esses componentes estão localizados em formulários distintos. O exemplo dado acima também é proveitoso para mostrar como podemos alterar valores de propriedades de componentes localizados em outros formulários que não aquele no qual o componente foi colocado. Quando estamos escrevendo código queira alterar propriedades ouexecutar métodos de componentes contidos no próprio formulário no qual o procedimento de evento foi criado, é opcional a Página: 54 Delphi 5 4.2.3. colocação do nome do formulário antecedendo o nome do componente que se deseja manipular. Já quando desejamos manipular com componentes contidos em outros formulários, essa referência é obrigatória. Exemplo ButtonOK.Caption := “OK”; //Escrito no próprio formulário Formulario, Principal.ButtonOK.Caption = “OK”; //Escrito em outro. ButtonOK.Caption := “Confirma”; //Escrito no próprio formulário FormCadCliente.ButtonOK.Caption Confirma"; //Escrito em outro. Caption := “Título”; O último exemplo mostra uma atribuição a uma propriedade sem referenciar o nome de qualquer componente. Esse código irá compilar e executar normalmente caso ele tenha sido escrito dentro de um procedimento de evento associado a qualquer formulário ou componente a ele pertencente. Nesse caso, como não foi colocado a que componente ele está associado, o Delphi interpreta que o desenvolvedor está fazendo referência ao próprio formulário para o qual o código foi escrito. Ou seja, através desse código estaríamos alterando o caption do formulário. O motivo pelo qual o Delphi interpreta a codificação dessa maneira é melhor compreendida quando trabalharmos com os conceitos de Orientação a Objetos, por ora devemos apenas nos lembrar das regras de atribuição de nomes aos componentes e de como podemos utilizar esses nomes para escrever a codificação de nossos aplicativos. Formulários modais Apesar da nomenclatura não ser muito comum, a ocorrência e E = = exibição de formulários modais é bastante comum em aplicações desenvolvidas para o ambiente Windows. Um exemplo que ocorre com muita frequência é durante a exibição de caixas de diálogo nesses aplicativos. Por exemplo, ao selecionarmos a opção Open localizada no menu File do próprio Delphi, é exibida a caixa de diálogo responsável pela abertura de arquivos a serem exibidos no Editor de Código. Enquanto essa caixa de diálogo permanecer aberta, ou seja, sendo exibida, o desenvolvedor não pode voltar ao desenvolvimento da aplicação utilizando as demais janelas da IDE do Delphi. Isso ocorre porque a caixa de diálogo Open foi exibida de maneira modal. As janelas exibidas de maneira modal têm como uma de suas características o fato de deterem o controle da execução da aplicação até que elas sejam fechadas. Apesar de serem muito comuns durante a execução de caixas de diálogo elas podem ocorrer em qualquer outra situação dependendo, é claro, da funcionalidade de cada janela dentro da aplicação. A exibição de uma janela de forma modal é bastante simples, bastando para isso, a execução de um método pertencente ao formulário, o método ShowModal. Vamos construir um pequeno exemplo para ilustramos a utilização do método ShowModal. Iniciemos, portanto, uma nova aplicação e coloquemos um botão nesse formulário conforme ilustrado na figura ao lado. Além do formulário principal para o nosso exemplo iremos precisar de um segundo formulário, formulário esse que será exibido de forma modal ao clicarmos no botão do Form. Esse segundo formulário não precisa conter nenhum componente conforme ilustra a figura ao lado e pode ser criado através da opção New Form contida no menu File. Resta-nos agora criar o procedimento de evento associado ao evento OnClick do botão chamado Button! e escrever o código necessário à exibição do formulário chamado Form2. O processo de criação do procedimento de evento pode ser feito utilizando- Página: 55 Delphi 5 4.2.4. se qualquer um dos métodos descritos anteriormente e por isso não será, de agora em diante, explicitado. Em relação aos nomes dos componentes, por questões de praticidade, serão mantidos, porém, caso seja de desejo do desenvolvedor alterá-los essas alterações deverão ser feitas agora antes do início da codificação como foi discutido anteriormente. A codificação final para o procedimento de evento será a mostrada a seguir. procedure TForml.Buttonl Click(Sender: TObject); begin Form2.ShowModal; end; Antes de compilarmos e executarmos a aplicação vamos observar o código acima. Nele podemos observar um ponto importante relativo à chamada do método ShowModal. Uma vez que esse código foi escrito a partir de um procedimento de evento pertencente ao formulário Forml, ao fazermos referência a um método de um outro formulário, Essa o Form2, essa referência teve de ser feita utilizando-se a referência [E completa ao método, incluindo o nome do formulário que teria seu (icq E [ideia método executado, ou seja, o Form2. Caso não tivéssemos colocado a Finas Cnlarimas [Eros > referência ao Form2, a aplicação poderia ser compilada sem problema algum, porém, ao invés de exibir o segundo formulário ao clicarmos no botão Button!, o aplicativo iria exibir o próprio Forml, o que, em nosso caso particular iria provocar um erro que explicaremos posteriormente. Por ora vamos apenas compilar a nossa aplicação. Ao tentarmos compilar a nossa aplicação uma mensagem de erro será exibida como mostrado ao | [7% ragtime Fi eae filos lado. Esse erro ocorreu por uma razão bem simples UEL apegar oa que, por incrível que possa parecer, já foi explicada 5 E anteriormente. Apesar de toda a codificação estar Ee pes) correta esquecemos de um pequeno detalhe. No procedimento de evento que acabamos de escrever tentamos executar um método de um objeto que não está localizado na unit corrente. Vimos que, todas as vezes que desejarmos utilizar qualquer definição localizada em uma outra unit que não na que estamos codificando, uma referência à unit na qual essas definições estão localizadas deverá ser feita na cláusula uses da unit sendo codificada. Foi exatamente isso que aconteceu. Estamos nos referenciando a um objeto, o Form2, definido na unit2 a partir da unit] sem ter feito referência a essa unit. Devemos então adicionar à unit? à cláusula uses da unit]. Quando nos referenciamos à formulários o Delphi exibe a caixa de diálogo mostrada ao lado permitindo que ele próprio efetue essas alterações para nós. Não devemos, no entanto, nos habituar com isso, pois o Delphi só irá nos ajudar nessas situações, nas demais deveremos nos preocupar em incluir as units na cláusula uses. Após clicarmos no botão Yes para adicionarmos a unit2 à cláusula uses da unit! podemos compilar e executar a aplicação e verificar o comportamento dos formulários ao clicarmos no botão. Agora que já sabemos como podemos exibir formulários de forma modal vamos estudar como o Delphi é capaz de exibir formulário de forma não modal. Formulários não modais De forma idêntica à exibição modal, o Delphi exibe formulários de forma não modal através da execução de um método pertencente ao formulário. Esse método chama-se Show e executado de forma idêntica ao método ShowModal visto anteriormente. Para ilustrarmos o funcionamento desse método podemos substituir o exemplo para que o formulário Form2 passasse a ser exibido de forma não modal. Basta alterarmos o código escrito no procedimento de evento associado ao evento OnClick do botão para que isso ocorra conforme mostrado abaixo. Página: 56 Delphi 5 Como podemos observar, uma instrução composta possui em seu corpo uma ou várias instruções simples e, pode até mesmo, possuir outras instruções compostas. Apesar de não ser tão perceptível nesse momento a finalidade de estarmos utilizando instruções compostas elas são muito úteis no desenvolvimento de aplicações uma vez que as intruções, simples ou não, contidas em uma instrução composta, são consideradas pelo compilador como uma única instrução simples. As instruções compostas são largamente utilizadas não isoladamente como no exemplo anterior mas como parte de intruções mais complexas, compondo as instruções condicionais e de laços, ou de repetição, que serão vistas a segui: 5.2. Instruções Condicionais 5.2.1. As instruções condicionais são aquelas que determinam o fluxo de execução do programa através da verificação de uma condição booleana. No Delphi existem dois tipos de instruções booleanas, a instrução if ea instrução case. 1 A instrução if é uma das instruções mais comuns nas linguagens de programação existindo até na linguagem assembler e, como não poderia deixar de ser, também existe no Object Pascal. No quadro abaixo ilustramos as duas formas básicas que o comando if pode aparecer um um programa escrito em Object Pascal acompanhado de alguns exemplos. Sintaxe If <condição> then <instrução> ; if <condição> then <instrução> else <instrução>; Exemplos if x>=y then ShowMessage('Limite ultrapassado”) ; if odd(x) then ShowMessage('O número é ímpar") else ShowMessage('O número é par"): if (x >0)and (x< 10) thenx:i=x+ 1; 1f(x> 3) and (y <= 5) then 1 x>=y then 1fx=y then ShowMessage('X é igual a Y') Else ShowMessage('X é maior do que Y*) Else ShowMessage('X é menor do que Y"); Como podemos observar no quadro acima, a instrução if possui, basicamente, duas formas. A primeira delas é constituída apenas da instrução if seguida da instrução a ser realizada no caso da condição booleana a ser testada resulte em um valor verdadeiro enquanto que a segunda permite que tanto uma intrução seja realizada no caso do resultado da condição ser verdadeira quanto no caso dela ser falsa. Um detalhe extremamente importante relacionado com a instrução ife que resulta em muitos erros principalmente para Página: 59 Delphi 5 5.2.2. pessoas inexperientes com o Delphi é que a instrução que precede o else não deve ser terminada com um ponto-e-vírgula ao contrário do que acontece com as demais instruções da linguagem. Um segundo ponto a ser observado no exemplo acima é a possibilidade de termos comandos ifaninhados, ou seja, uns dentro dos outros conforme mostrado no último exemplo dado acima. Um outro ponto que pode ser observado através dos exemplos é que a instrução a ser executada tanto pelo comando if no caso da condição ser verdadeira quanto pelo else no caso dela ser falsa, pode ser tanto uma instrução simples quanto ums instrução composta. Observe o exemplo a seguir. Exemplos if (x>=y) and (y < 10) then x =x-I yo=y+h if (x>=y) and (y < 10) then Os exemplos apesar de semelhantes têm execuções diferentes. No primeiro exemplo, a primeira instrução só será é executada no caso do resultado da expressão booleana for verdadeira enquanto que a segunda instrução será executada independentemente do resultado da expressão booleana. Já no segundo exemplo, ambas as instruções serão executadas apenas no caso do resultado ser verdadeiro. Essa é a principal finalidade das instruções compostas, agrupar instruções a serem executadas em instruções condicionais e de repetição. Case A medida em que vamos escrevendo instruções ifs aninhadas elas vão tendo seu entendimento cada vez mais complexo, dificultando o desenvolvimento e a manutenção do código escrito. Em substituição à escrita de ifs aninhados, o Object Pascal oferece a instrução case. A instrução case permite, da mesma maneira que a instrução if, o controle condicional relativo ao fluxo do programa, porém esse controle é feito de forma mais clara e, em muitos compiladores, de forma mais eficiente em relação ao código gerado. Sintaxe Case <Seletor> Then <Rótulo 1>: <Instrução 1> ; <Rótulo 2>: <Instrução 2> ; <Rótulo n>: <Instrução n> ; end; Case <Seletor> Then <Rótulo 1>: <Instrução 1> ; <Rótulo 2>: <Instrução 2> ; <Rótulo n>: <Instrução n> ; else <InstruçãoOutroCaso>; end; Exemplos Case Caractere Then “a” 1 ShowMessage('Caractere inválido”) ; *dº: begin Página: 60 Delphi 5 end: end; Case Nota Then 0: Texto := “Reprovado”; Aprovado” ; Parabens”: 10: Texto end; Observemos o quadro anterior. Nele está sendo mostrado as duas sintaxes possíveis para a escrita de uma instrução case dentro de um programa em Object Pascal. Em ambos os casos, a instrução case é utilizada para executar uma instrução, simples ou composta, dependendo do valor do seletor passado. O seletor será, na grande maioria dos casos, uma variável cujo valor deseja-se ser testado. Um detalhe a ser observado na utilização da instrução case está na restrição da utilização de tipos de variáveis como seletores para uma instrução case. O Object Pascal só permite que sejam utilizados seletores de tipos de dados ordinais. Dessa forma, não são permitidos, por exemplo, a utilização de seletores do tipo string nem de ponto flutuante. Um fato interessante relacionado à instrução case aparece nos rótulos que podem ser utilizados dentro da instrução. Nos exemplos fornecidos podemos observar que podem ser utilizados desde valores simples, valores múltiplos, ou até mesmo uma faixa de valores a serem testados. Caso nenhum dos valores definidos pelos rótulos do comando case represente o valor fomecido pelo seletor da instrução poderá ser definido dentro da instrução, um rótulo else que será executado nessas situações. Ou seja, o else dentro de uma instrução case identifica as instruções a serem executadas no caso de nenhum dos rótulos fornecidos. O else é opcional dentro de uma instrução case. 5.3. Estruturas de Repetição As instruções que vimos até agora são bastante úteis durante o desenvolvimento de uma aplicação. No entanto existem ainda algumas outras instruções que permitem o controle do fluxo de execução do programa de forma repetitiva e não só de forma sequêncial baseada em uma condição booleana como acontecia com as instruções condicionais. Por isso, iremos dar início ao estudo das instruções do Object Pascal responsáveis pelo controle do fluxo de execução de um programa através da repetição de suas instruções com base em condições booleanas. 5.3.1. For A primeira instrução de repetição que iremos estudar é a instrução for. Essa instrução é amplamente utilizada quando desejamos repetir uma ou um conjunto de intruções por um determinado número fixo de vezes. Por esse motivo, a intrução for utiliza-se de um contador para determinar se essa quantidade de interações que o laço deverá realizar já foi atingido ou não. Sintaxe for <Contador := <ValorInicial> to <ValorFinal> do <Instrução>; for <Contador := <Valorinicial> downto <ValorFinal> do <Instrução>; Exemplos for Cont:=1 to 10 do Acum := Acum + Cont; for Cont:= 10 downto 1 do Acum := Acum + Cont; 1 to 10 do := Acum + Cont; ShowMessage(IntToStr(Acum)): End; for Cont:=1 to 10 do Cont := Acum + Cont; Errado O quadro acima mostra as duas sintaxes possíveis para a instrução for. As duas funcionam da mesma maneira diferenciando-se uma da outra unicamente pela forma como o contador é utilizado. Na primeira sintaxe apresentada, o contador é incrementado a cada interação do laço. Já na segunda, o contador é Página: 61 Delphi 5 with <objeto/variável> do <Instrução>; Exemplos Funcionario. Nome := * André"; with Funcionario do Funcionario. Idade := 26: begin Funcionario.Cargo = “Analista de Sistemas”: Nome := “André”; Idade := 26; Cargo = * Analista de Sistem End; Forml.Font.Size := 16; with Forml.Font do xi=x+ 1; begin Forml.Font.Style := [ 7; Size := 16: Forml.Font.Color := clBlue: x=x+; Style:=[]: Color := clBlue: end; O quadro acima mostra a sintaxe que deve ser utilizada quando desejarmos utilizar a instrução with. Observe que, como parte da instrução, podemos utilizar tanto um objeto quanto uma variável. Essas duas possibilidade também estão ilustradas no quadro acima. No primeiro exemplo temos a utilização de uma variável, previamente declarada na seção var, chamada Funcionário. Essa variável tem como seu tipo TFuncionario, declarado anteriormente quando explicamos o tipo de dados Record. No exemplo temos tanto o código utilizado sem a instrução with como com ela. Observe que, ao utilizarmos a instrução with não precisamos colocar, antes de cada campo da estrutura, a variável que estava sendo manipulada. Além da utilização de variáveis do tipo record, mostrada no primeiro exemplo, a instrução with também pode ser utilizada com objetos. O segundo exemplo apresentado, ilustra essa situação. Nele manipulamos com propriedades do objeto Font, que por sua vez pertence ao objeto Form1. Com esse exemplo podemos também observar que podemos, dentro da instrução with, manipular com vários níveis de definições de objetos. Também nesse último exemplo podemos observar que nem todas as intruções contidas na instrução with necessitam obrigatoriamente tratar com propriedades ou campos pertencentes ao objeto, ou variável, sendo manipulado. Nesse exemplo, temos uma intrução responsável pelo incremento da variável x, declarada anteriormente em uma seção var. O compilador duarnte a fase de compilação do aplicativo, [Error] Unit. pas(25] ' [Fatal Error] Project. dpr(5): Could not compile uzed unit Unit] pas” identifica que essa variável não pertence ao objeto sendo manipulado e verifica se existe uma variável x que tenha sido declarada anteriormente. Caso exista, a compilação é feita normalmente, caso contrário uma mensagem de erro é retornada na parte inferior do Editor de Código informando o erro conforme ilustrado na figura abaixo. 6.Manipulando Formulários Iniciamos os nossos estudos trabalhando com os formulários. Vimos como eles podem ser exibidos através de dois de seus métodos e as diferenças entre a exibição de formulários modais e não modais. No entanto, demos uma parada nesse estudo de tal forma a aprendermos alguns dos comandos existentes no Delphi responsáveis pela determinação do fluxo de execução de nossos aplicativos. Essa para foi de extrema importância uma vez que, no decorrer de nosso aprendizado do Delphi, necessitaremos desses comandos para podermos escrever aplicativos que façam algo mais do que simplesmente exibir uma caixa de diálogo ou um formulário. De agora começaremos a aprender um pouco mais sobre os formulários aprendendo novas propriedades, métodos e eventos úteis. Devemos ressaltar que não iremos abordar, no decorrer de nosso estudo, todas as propriedades que os componentes que iremos estudar apresentam uma vez que, se isso fosse feito, seria impossível terminarmos esse estudo. Essa mesma observação também é válida tanto para os métodos quanto para os eventos de cada componente a ser estudado. Além disso, alguns componentes apresentam propriedades em comum, nesses casos não iremos abordar essas propriedades todas as vezes que elas ocorrerem, apenas em sua primeira ocorrência. Página: 64 Delphi 5 6.1. Principais propriedades Vamos ser apresentados agora às principais propriedades de um formulário. Antes de começarmos devemos saber que já conhecemos a propriedade name que aparece em todos os componentes do Delphi e que, a alteração do valor dessa propriedade, é uma das primeiras coisas a ser feita ao iniciarmos o desenvolvimento de uma aplicação, no caso da propriedade name do formulário, ou ao colocarmos um componente qualquer no formulário. Com o objetivo de ilustrarmos a funcionalidade das principais propriedades do formulário, nós iremos construir um pequeno aplicativo, no início com pouca ou mesmo nenhuma funcionalidade, apenas para que possamos observar o comportamento de cada propriedade a ser estudada. Em seguida, vamos resumir a utilização de cada propriedade em um quadro ilustrativo. Dessa forma, vamos começar uma nova aplicação através da selecção da opção New Application, localizada no menu File. Caso tenhamos feito alguma alteração na aplicação atual, o Delphi irá nos perguntar se desejamos salvar ou não essas alterações. Para salvarmos basta selecionarmos o botão Yes e darmos nomes tanto às units quanto à própria aplicação como já visto anteriormente. Uma vez que tenhamos criado uma nova aplicação vamos colocar alguns componentes em seu formulário principal. Será necessário um componente button e dois componentes edit conforme mostrado na figura ao lado. Podemos observar que colocamos um dos componentes edit, propositadamente, em um local que ele não possa ser visto completamente dentro do formulário, isso não tem importância agora uma vez que estamos simplesmente querendo ilustrar algumas das propriedades do formulário. Uma vez que tenhamos colocado esses componentes vamos alterar algumas das propriedades do formulário e depois vamos criar dois procedimentos, o primeiro associado ao evento OnClick desse formulário e não do botão como poderíamos pensar inicialmente, e o segundo associado ao evento OnClick do botão. Comecemos pela alteração de algumas das propriedades do formulário. A primeira propriedade que iremos modificar é a propriedade AutoScroll, trocando o valor true pelo valor false. Ao fazermos isso podemos observar uma mudança no visual do formulário. Agora, a barra de rolagem que existia no rodapé do formulário desapareceu. A propriedade AutoScroll é responsável por definir se o formulário irá ou não exibir automaticamente barras de rolagem no caso de serem colocados componentes em regiões fora da área de exibição de um formulário. Essa propriedade é importante quando queremos desenvolver aplicações que possuam uma quantidade excessiva de componentes em seus formulários. Um fato importante que pudemos observar é que, ao alterarmos o valor da propriedade AutoScroll, o efeito da alteração é refletido direta e imediatamente na aplicação sendo desenvolvida, mesmo estando ainda em sua fase de desenvolvimento dentro da IDE do Delphi. Devemos ter cuidado porque muitas outras propriedades, ao terem seus valores alterados, só permitem a visualização dos efeitos da alteração durante a execução do aplicativo e não dentro da própria IDE. A segunda propriedade que iremos alterar é a propriedade Borderlcons. Observe que essa propriedade é do tipo set e apresenta como itens quatro valores distintos: biSystemMenu, biMinimize, biMaximize e biHelp. Vamos alterar essa propriedade de tal forma que ela só possua os elementos biSystemMenu e biHelp ativos, ou seja, com valor true atribuído a esses itens enquanto que as demais irão possuir o valor false. Ao contrário do que aconteceu com a propriedade AutoScroll, ao alterarmos a propriedade Borderlcons não observamos qualquer alteração no formulário. Isso porque as alterações realizadas na propriedade Borderlcons só são percebidas quando a aplicação estiver sendo executada e não dentro da IDE do Delphi. Esse comportamento também é bastante comum entre as propriedades não só do formulário mas também de muitos outros componentes. Uma outra propriedade que iremos alterar neste nosso exemplo é a propriedade Border Style. Observe que et TCustomForm Borderstyie Deserplon Rede e he aan ne aee he fra Pote Eonde Sl cen be a ot-1e line Fm End Sl ses Value Meaning Mes esizeçae tendard é +39 ez esizos e; sig sine border neu Stade rsizsabe border al; vendia Eee ed ho Mt aged lcd o acca nronriadade á uma nronriadade que fito gu lies 1H Frans EPT FRASE ari possui uma série de valores possíveis a serem atribuídos a ela, são izeable, bsToolWindow e bsSizeToolWin. Esses são os valores E dados enumerado chamado TFormBorderStyle, criado no Delphi a ao lado. Com isso já sabemos que, no caso de desejarmos alterar execução, ou seja, através de código escrito utilizando Object Página: 65 Delphi 5 Pascal, a atribuição deverá ser feita diretamente utilizando-se um desses valores, não podendo, portanto, ser utilizadas aspas ou qualquer outro delimitador. Daremos um exemplo posteriormente de como poderemos fazer tal codificação. Por ora vamos alterar o valor dessa propriedade para bsSingle. A propriedade Caption é a propriedade do formulário mais alterada no desenvolvimento de aplicações. Vamos alterá-la também de tal forma a ela possuir o valor Meu primeiro exemplo. Observe que a medida em que vamos digitando, o texto contido na barra de título do formulário vai se modificando de tal forma a conter exatamente o texto sendo digitado. Antes mesmo de executarmos a aplicação já sabemos qual a finalidade dessa propriedade dentro de um formulário. Por fim vamos alterar os valores contidos em três propriedades do formulário. São elas a propriedade FormStyle, a propriedade Icon e a propriedade WindowsState. A propriedade Icon contém um objeto do tipo Ticon e por isso sua atribuição dentro do Editor de Código do Delphi não pode ser feita de modo tão imediato quanto pode ser feito com valores de tipos básicos, sets ou mesmo enumerados. São necessários alguns cuidados adicionais como a criação do objeto entre outros, que serão vistos posteriormente quando estivermos trabalhando com os conceitos de orientação a objetos. Porém, quando definimos os valores para essas propriedades através do Object Inspector, o Delphi encarrega-se desses detalhes para o desenvolvedor. Para selecionarmos um valor para a propriedade Icon devemos clicar o botão que aparece no Object Inspector ao selecionarmos essa propriedade. Será exibida a caixa de diálogo Picture Editor, mostrada ao lado, que irá permitir que selecionemos um arquivo que contém um ícone a ser exibido para este formulário. Para definirmos o ícone a ser utilizado devemos clicar o botão Load, selecionar o arquivo e, em seguida clicar no botão Ok. Em nosso exemplo vamos selecionar o arquivo “factory.ico”, localizado no diretório *cNArquivos de ProgramasArquivos Comuns'Borland ShareImagesNcons”. Observe que ao selecionarmos o arquivo e clicarmos o botão Ok na caixa de diálogo Picture Editor, o ícone localizado no canto superior esquerdo do formulário é alterado para exibir o ícone selecionado. Devemos lembrar que ao alterarmos o ícone do formulário, mesmo que esse ícone seja o ícone do formulário principal da aplicação, não estamos alterando o ícone da aplicação, que é mostrado quando a minimizamos, mas sim o ícone do próprio formulário. Para alterarmos o ícone da aplicação devemos fazê-lo através da caixa de diálogo Project Options mostrada anteriormente. Já as duas outras propriedades, FormsStyle e WindowsState, são propriedades de tipos enumerados que possuem os valores fsMDIChild, fsMDIForm, fsNormal e fsStayOnTop para a primeira propriedade e wsMaximized, wsMinimized e wsNormal para a segunda. A propriedade FormStyle é responsável pela definição do tipo de formulário a ser exibido pela aplicação. Dependendo de qual o valor atribuído a essa propriedade o formulário terá um comportamento diferente dentro da aplicação. Dos valores possíveis o mais comum é fsNormal que indica um comportamento normal para o formulário, ou seja, indica que o formulário pertence a uma aplicação SDI (Simple Document Interface), tais como o próprio Delphi por exemplo. Além das aplicações SDI temos também as aplicações MDI (Multiple Document Interface) como, por exemplo, o Microsoft Word até a sua versão para o Office 97. Vamos alterar o valor da propriedade FormStyle para fsStayOnTop. Novamente não observamos qualquer alteração no formulário dentro da IDE do Delphi. A última propriedade que iremos abordar pertencente ao formulário é a propriedade WindowState. Podemos perceber a funcionalidade dessa propriedade sem ao menos alterá-la uma vez que os valores que podemos atribuir a ela já nos dão uma idéia de sua funcionalidade. Essa propriedade é responsável pela definição do estado do formulário, determinando se ele está minimizado, maximizado ou normal. Para ilustrarmos a utilização dessa propriedade vamos criar um procedimento de evento associado ao evento OnClick do botão. Esse procedimento deverá ter o código mostrado abaixo. procedure TForml.Buttonl Click(Sender: TObject); begin WindowState := wsMaximize; end; O código acima ilustra dois pontos importantes da programação utilizando o Object Pascal. O primeiro refere-se a atribuição de valores a variáveis de tipos enumerados. Como já havia sido mencionado anteriormente, a atribuição é feita diretamente, sem a utilização de aspas ou qualquer outro identificador. O Página: 66 Delphi 5 como tipo de borda que estejamos atribuindo ao nosso formulário bem como com os valores que tenhamos colocado na propriedade Borderlcons, pois caso tenhamos removido o ícone de sistema o usuário não terá como fechar o formulário a menos que utilize as teclas ALT + F4 ou finalize a tarefa utilizando o gerenciador de tarefas do Windows. Antes de fecharmos a aplicação e retornarmos para a IDE do Delphi vamos observar o efeito de uma outra propriedade do formulário que alteramos no Object Inspector. Vamos tentar alternar entre as aplicações que estejam em execução utilizando as teclas ALT + TAB. Ao fazermos isso, podemos perceber que conseguimos alternar entre as aplicações porém o nosso aplicativo Delphi sempre permaneceu por sobre as demais janelas. Isso ocorreu devido a alteração feita na propriedade FormsStyle. Ao colocarmos o valor fsStayOnTop fizemos com que esse formulário sempre permanecesse sobre as demais aplicações independentemente de qual aplicação esteja sendo manipulado naquele momento. O último ponto que vamos observar antes de fecharmos a aplicação se refere à posição como o formulário foi exibido. A menos de uma coincidência fantástica o formulário não deve ter sido exibido no centro da tela como poderíamos querer que tivesse acontecido. Se observarmos melhor, o formulário foi exibido exatamente na mesma posição em que ele se encontrava quando estávamos desenvolvendo-o na IDE do Delphi. Isso ocorre graças a uma propriedade do formulário que define tanto a posição como, em alguns casos, o tamanho do formulário com que ele é exibido pela primeira vez. Vamos fechar a aplicação e retornar à IDE do Delphi. No Object Inspector podemos observar uma propriedade chamada position pertencente ao formulário. Essa é a propriedade responsável por essa definição. Observe que o valor default para ela é poDesigned, ou seja, de acordo com que foi definido quando estava na IDE. Caso desejássemos que o formulário fosse exibido no centro da tela bastaria alterarmos o valor dessa propriedade para poScreenCenter. Verifique na ajuda do Delphi os possíveis valores para essa propriedade e o que cada um deles faz. Um ponto que pode ser observado nas propriedades sets e de tipos enumerados do Delphi é que os valores seguem um padrão de nomeação. As duas primeiras letras de cada valor identifica, de alguma maneira, a propriedade a qual ele pertence. Por exemplo, os valores da propriedade Borderlcons começam pelas letra bi, já os valores para a propriedade Position começam pelas letras pó e assim sucessivamente. Caso desejemos desenvolver novos tipos devemos seguir esse padrão para que outros desenvolvedores consigam trabalhar com esses tipos de forma mais amigável. O quadro a seguir traz um resumo das principais propriedades vistas até aqui. Propriedade Valores Finalidade ActiveControl Componentes do Form Definir o componente ativo de um formulário Borderlcons biSystemMenu, biMaximize, | Determinar quais botões estão disponíveis no canto superior biMinimize, biHelp diretiro do formulário BorderStyle bsDialog, bsSingle, bsNone, | Determinar o tipo de borda que será utilizado pelo formulário. bsSizeable, bsToolWindow, bsSizeToolWin Caption String qualquer Texto a ser exibido na barra de título do formulário FormStyle tsNormal, fsMDIChild, | Determina o tipo de formulário a ser exibido. tsMDIForm, fsStayOnTop Icon Objeto da classe Ticon Ícone a ser exibido no canto superior esquerdo do formulário. Position poDesigned, poDefault, | Determina a posição e tamanho pré-definidos para alguns poDefaultPosOnly, tiupos de formulários. poDefaultSizeOnly, poScreenCenter, poDesktopCenter, poMainFormCenter, poOwnerFormCenter WindowsState wsNormal, — wsMinimized, | Determina como o formulário será exibido na tela. wsMaximized 6.2. Principais métodos Uma vez que vimos as principais propriedades da classe formulário podemos dar início ao estudo de seus principais métodos. Durante o nosso estudo sobre formulários modais e não modais já fomos apresentados Página: 69 Delphi 5 6.3. 71. a dois desses métodos: show e showmodal. Como vimos esses métodos são responsáveis pela exibição de formulários dentro de nossas aplicações. Além desses, existem outros métodos dentro da classe formulário que devem ser estudados. Já que sabemos como exibir formulários começar o nosso estudo a respeito dos principais métodos dos formulários sendo apresentados ao método responsáveis por fechá-lo. De forma semelhante ao que foi feito para ilustrar as principais propriedades do formulário, iremos construir uma pequena aplicação para ilustrar tanto os principais métodos quanto os principais eventos existentes para um formulário. Dito isso, vamos começar a nossa nova aplicação, salvando a aplicaçãio anterior se necessário. Desta vez, vamos criar a aplicação manipulando com as propriedades que já foram vistas na seção anterior, por exemplo, alterando os nomes dos formulários e componentes que forem sendo criados. Principais eventos 7.Componentes de Interface Componentes Básicos de Interface 71.1. Menus Lembra-se como era penoso fazer um Menu em qualquer linguagem de ambiente caracter? Pois é! Na programação delphi pode esquecer todo aquele tempo e esforço, pois é apenas alguns clicks e atribuir nomes e títulos as opções/comandos e pronto o menu principal está pronto para uso. MAINMENU (Menu Principal) Página de Componentes: Standard — Classe: TMAINMENU Propriedades Items Chamar o Editor de Menu para inclusão de Itens Dicas No editor de Menu dê um click com o botão da direita do mouse em um item pa * Inserir ou deletar o item: e Criar sub-menu no item atual; e Ir para outro Menu. Propriedades de cada ITEM (domenu) Checked Marcado ou Não-Marcado ? ShortCut Configurar tecla de Atalho GroupIndex Se <> 0 indica que pertence a um grupo de Itens Radioltem Só pode ter um item marcado no grupo” Nota.: Para inserir um separador de Menu é só colocar no Caption de um item um “-” (hífen). Você quer que quando o usuário der um click pressionando o botão da direita apareça um menu flutuante (Local/Rápido/Suspenso)? | Não tem o que fazer! A maioria dos componentes possuem um propriedade chamada PopUpMenu é só nela você indicar o “name” do componente PopUpMenu disponível que você preparou. Abaixo temos o componente PopUpMenu em estudo: Página: 70 Delphi 5 PopUPMENU (Menu Flutuante ou Local) Página de Componentes: Standard — Classe: TPOPUPM. Propriedades AutoPopUp Charmar automaticamente? Alingment Exibir: no centro, esquerda ou direita do click? Obs.: Propriedades do Item do PopUpMenu é igual ao do Menu Principal 7.1.2. Botões BUTTON (Botão de Comando) Página de Componentes: Standard — Classe: TButton Propriedades Caption Título (Legenda) do objeto. Apenas para o usuário ler. Name Nome do objeto quando referenciado na Unit. Utilizado no código-fonte. Default Se Pressionar “Enter” esse botão será o acionado ? Cancel Se pressionar “Esc” esse botão será acionado ? ShowHint Apresentar o “Hin t” (Dica de Ajuda flutuante) ? Hint Texto da Descrição (Dica de Ajuda) flutuante. ShowHint = True para funcionar ModalResult Retorno que o botão emitirá quando usado Visible Visível ou Invisível ? Enabled Habilitar ou desabilitar ? Top Distância do Topo do Formulário Left Distância da Esquerda do Formulário Height Altura do Objeto (Tamanho Vertical) Width Largura do Objeto (Tamanho Horizontal) TabStop Receber foco com a tecla “TAB” ? TabOrder Número de Ordem para receber o foco quando pressionada a tecla “TAB” Name = 'ButtonAlterar Enabled = False Caption = "Alterar Tamanho! (Obs.: Visto avenas na execucão) Enabled = True Left=280 Top Width = 105 Height = 25 Hint = 'Um click para alterar o tamanho" ShowHint = True TabStop = True Procedure TForml. ButtonAlterarClick (Sender: 1 TObjecy: OnClick = Button AterarClick | pegin Alterar Tamanho ButtonAlterar. Height := Button Alterar.Height + 10: Figura 7 - Desabilitado ButtonAlterar Width end: ButtonAlterar.Width + 10: Página: 71 Delphi 5 q” eepo Obrigatóri - Opcional: Apenas Caracter alfabético SO” - Opcional: “9” Apenas Caracter Numérico Pular espaços em branco iniciais a O próximo caracter é literal “>? Sem verificação de MATÚSCULAS/minúsculas “em Converte para MAUÍSCULAS o que segue “e Converte para minúsculas o que segue Estrutura da String de Configuração no EDITMASK !(999)000-0000;1; Composição da Máscara (de fone por Exemplo). a 1 salvar tudo (Literal e Dados) e O salvar apenas os Dados (Números ou Letras) Caracter exibido para posições vazias (limpas). 7.2. Melhorando a interface 7.2.1. PANEL (Painel) [E Página de Componentes: Standard — Classe Tpaner Propriedades Align Posição do Componente no Formulário BevelInner Contorno Interno: Baixo, nenhum e Alto Relevo BevelOuter Contorno Externo: Baixo, nenhum e Alto Relevo BevelWidth | Largura da Linha de Contorno 7.2.2.CHECKBOX (Caixa de Seleção) Página de Componentes: Standard — Classe: TCHECKBOX Propriedades Checked Marcado ou Não-Marcado ? Alignment Alinhamento do Texto State Tipos de Marcas: Marcado Preto, Marcado Cinza ou Não-Marcado AllowGrayed | Se “True” então podemos ter três “State”, senão apenas dois (Marcado ou Não-Marcado) 7.2.3. RADIOBUTTON (Botão de Rádio) Dicas Nas propriedades - BevelInner, BevelOuter & BevelWidth você poderá dar um efeito 3D muito Dicas Observe abaixo o entre as propriedades: AllowGrayed = True relacionamento Checked State True cbChecked False cbGrayed False cbUnChecked Página de Componentes: Standard — Classe: TRADIOBUTTON Página: 74 Delphi 5 Propriedades Checked Marcado ou Não-Marcado ? Alignment Alinhamento do Texto 7.24. RADIOGROUP (Grupo de Botões de Rádio) El Página de Componentes: Standard — Classe: TRADIOGROUP Dicas Para adicionar opções (ou botões ) ao grupo de botões de rádio faça o Propriedades Columns Quantidade de Colunas no Componente a propriedade Items do, RadioGroup e quando vê o botão com a (...) dê um click; 2. No memo da caixa de diálogo que] apareceu digite as opções, uma em cada linha, e dê OK. ItemIndex Informa o Índice do Item Selecionado. Se —1 então nenhum item foi selecionado Items Lista de Itens do Componente. 8.Depurando aplicações 8.1. Depois do projeto compilado há sempre a necessidade, para teste ou por problemas de resultado, do desenvolvedor querer depurar o seu programa procurando o(s) erro(s) ou apenas testando o fluxo do programa. Então nesta aula vamos estudar o depurador integrado do ambiente. | E aprender a fazer pontos de parada, verificar valores dos identificadores e entender as categorias de informações de depuração no Delphi. Temos que ter em mente, primeiramente, que o depurador interno (integrado) é chamado toda vez que você executa um programa no ambiente Delphi & outra coisa importantíssima o Delphi é uma ferramenta de programação visual para aplicações Windows (ambiente gráfico) e, sendo como tal, os seus programas não são uma segiiência de comandos executados um a um, como em qualquer linguagem de ambiente caracter (Clipper, Cobol, Fortran, C...). Entretanto, são baseados em mensagens (eventos), não existindo a possibilidade de executar passo a passo cada linha do código-fonte. Sendo assim, devemos marcar pontos de parada (interrupção) nos trechos de código que você quer depurar. Principais Comandos de Passo a Passo Step Over, F8 (Passo a Passo por sobre o código. Não entrar em cada sub-rotina); Step Into, F7 (Passo a Passo por dentro do código. Entra em cada sub-rotina) 82. Depuração desde o Início 8.3. 8.4. Sem executar solicite Step Over (F8 ou Run-Step Over) ou Step Into (F7 ou Run-Step Into); Da execução à depuração Execute o Projeto (botão Run ou F9): Dê uma Pausa (botão Pause da SpeedBar ou Menu Run-Program Pause); Depuração Passo a Passo (Step Over ou Step Into); Obs.: Leia sempre a barra de título principal do Delphi para ver o estado do depurador intemo (Running [executando programa] ou Stopped [aguardando: F7, E8 ou F9] Quando ficar em Loop Infinito ou Travar No ambiente integrado Delphi: Página: 75 Delphi 5 Solicite o Reset da Execução (Run-Program Reset) Fora do ambiente de desenvolvimento Delphi: Apenas um vez pressione [Ctr+Alt+Del]; Na lista de programas em execução selecione o "rebelde" e Finalize-o. Obs.: Para depurar também o Módulo "Program" do Projeto (arquivo DPR) selecione na Caixa de Diálogo "Environment Option” na guia (página) "Preferences" o item "Step Program Block” 8.5. Marcando Pontos de Parada (interrupção) Escolha a linha e: Coloque o curso na linha que você quer uma parada e Pressione FS ou Dê um click na barra cinza vertica ao lado da margem esquerda do editor na altura da linha ou Dê um click solicitando o Menu flutuante na linha e escolha o comando "Toggle Breakpoit" SEE e HE Ugeomet | Poeomet | Uegii | Ctriangu | Vpv TudoOk : Boolean; al Vpv Lado 4, Vpy Lado E, Vpv Lado c : integer; le begin jo if (EditLado A.Text = '') or (EditLado B.Text ='') or begin + ShowHessage (' Informe todos os tamanhos dos lado |: Exit; end; f Aqui Deveria melhorar e muito a consistência, até pa o . Vpv Lado B := StrToInt (EditLado B. Text): . Vpv Lado C := StrToInt (EditLado C.Text): part [Insert Visualização de um Ponto de Parada 8.6. Verificando Valores nos Identificadores Dica de Avaliação de Sobrevôo (Fly-by evalution hints): Apresenta uma dica contendo o valor de qualquer identificador quando debaixo do ponteiro do mouse. Disponível apenas na depuração: MessageDI3 ('Digitar, apenas, muneros.' , ntInformal Exct; ena; ࣠(StrTolnt (Sender as TEdit).Text) in [1..99]) Then begin Case (Sender as TEd:t) .Tag of : Ob Geo 3Lados. Ladolm 1 Visualização do Uso do Recurso Página: 76 Delphi 5 Havendo erro ou não serão executadas... > End; / Fim do Try... Finally ) 10.Banco de Dados em Delphi Um dos recursos que agrada mais aos programadores na programação Delphi é a parte de Banco de Dados. A facilidade de se trabalhar a conexão e as referências no aplicativo aos elementos do banco de dados. E a ausência dos detalhes de baixo nível que sempre aparecem, especialmente nos aplicativos cliente/servidor (travar, liberar... ). Os componentes Delphi específicos para banco de dados, sejam para acesso ou controle. Deixando tudo mais fácil e diminui em muito a codificação. Com certeza tudo, em programação visual, é uma questão de "setagem" das propriedades dos componentes. Como você já observou até agora com a maioria dos componente visuais e não-visuais. Em Delphi o aplicativo não tem acesso direto aos dados. Há uma interface que gerencia e viabiliza o processo de controle da fonte de dados para o seu aplicativo e sem ela nada funciona. O nome dessa interface é BDE (Borland Database Engine). Abaixo a Estrutura de Acesso a Banco de Dados no Delphi: Aplicativo Delphi BDE =] ODBC | SQL Links T Arquivo Texto Paradox Access dBase Arquivos Excel InterBase ASCii Oracle Oracle . InterBase FoxPro Informix Access SysBase MS-SQL Server e Outros Y Interface de Dados & FoISSQL Server 1. Formatos Nativos: 1.1. BDE dá acesso direto a vários formatos, como: dBase (.dbf), Paradox (.db), ASCII(.txt), FoxPro(.dbf) e Access (.mdb): 1.2. BDE + SQL Links acesso para servidores remotos, formatos: Oracle, DB2, Informix, InterBase, Sybase e MS-SQL Server; 2. ODBC (Conectividade de Banco de Dados Aberta) da Microsoft, formatos: Access, Arquivos Excel, Oracle, InterBase, SQL Server, arquivo de Texto e etc... . Y Utilitário Delphi para Banco de Dados: 1. DataBase DeskTop: Utilitário para criar, manter e alimentar tabelas de vários formatos. 2. DataBase Explorer ou SQL Explorer: Utilitário para manutenção e consulta de Alias (apelido que informa onde está a fonte de dados e qual o seu formato), consulta e inserção/exclusão de dados das tabelas, montagem de consultas por meio de código SQL e manutenção de dicionários; 3. Form Wizard: Assistente de criação de formulário de Banco de Dados (Menu DataBase-Form Winzard...): 4. BDE Administrator: Utilitário que gerencia a configuração e os "Alias" (apelidos); 5. Data Migration Wizard: Assistente de Conversão de formatos de dados: Com certeza você já está ciente desta terminologia, mas não custa relembrar: e Tabela: Conjunto de Tuplas (Linhas/Registros) e Atributos (Colunas/Campos); e Arquivo de formato Simples de Dados: Conjunto de Registros (linhas) e Campos (colunas). e Consulta: Tabela dinâmica e não física, resultante de uma Seleção ou União; Página: 79 Delphi 5 * Banco de Dados baseado em Tabelas: Um só arquivo contendo um conjunto de Tabelas, Consultas (Visões), Índices, Procedures ... em que qualquer operação de consulta resulta em um Tabela de Dados ; e Banco de Dados baseado em Registros: Conjunto de Arquivos (simples de dados, índices e memo) separados fisicamente em que qualquer operação de consulta resulta em Registros; e Técnicas de Ajustamento: Indexação e Ordenação. As duas formas de fonte de dados: a Baseado em Registros e a Baseado em Tabelas são acessadas pelo Delphi e você pode trabalhar com arquivos simples de dados (Baseado em Registros), como no formato dBase, com os seus índices e "campos MEMOSs" em arquivos separados, porém em uma mesma pasta de arquivos (diretório). Ou, trabalhar com formato Interbase (Baseado em Tabelas), que tem todas as tabelas, consultas, índices e ... em um só arquivo. Para o BDE, quanto ao acesso, é a mesma coisa pois ele possui um abordagem particular que trata os dois da mesma forma. É como se ele, o BDE, olhando para uma Pasta de Arquivos dos arquivos dBase (dados, index e memo) visse um Banco de Dados baseado em Tabelas. Tratando todo e qualquer arquivo de registros como uma tabela. Porém por natureza um Banco de dados baseado em Tabelas e totalmente diferente, ideologicamente e tecnologicamente falando, de um Banco de dados baseado em Registros. O último não são suportadas certas operações. Quanto a indexação e/ou ordenação são feitas automaticamente após um deleção ou inclusão. 10.1. O que é um Alias (Apelido)? O alias é uma referência ou vínculo relacionado a um Banco de Dados. Pense no antigo comando Path do "falecido" DOS que informava o caminho para se encontrar os comandos do sistema operacional. Lembra- se?! Bem, para cada banco de dados (Bas. em Tabelas ou em Registros) há um nome relacionado a ele que facilita muito porque você não precisar digitar um caminho (unidade e caminho [NomeDoArquivo]) para referencia-se a um determinado Banco de dados e ter acesso a ele . Basta setar o nome do Alias no componente e você acessará a qualquer elemento do Bando de Dados. -Conheceremos os componentes mais tarde. 10.1.1. DataBase DeskTop Para cria suas tabelas, índices (primários e secundários), integridade referêncial, senhas, editar dados e fazer manutenções. Você usará o utilitário DataBase DeskTop. I Para Abrir uma tabela: 1. Escolha no Menu: File - Open; 2. Indique o Alias do Banco de Dados ou a Pasta de Arquivos; 3. Escolha o nome da tabela; IH. Para Editar Dados (fazer manutenção dos dados) de uma tabela: 1. Abraa tabela; 2. Escolha no Menu: Table - Edit Data. HI Para Restrutura uma tabela: 1. Abraa tabela; 2. Escolha no Menu: Table - Restructure IV. Passos para criar uma tabela e índice primário: 1. Carregue o utilitário e escolha no seu menu File - New - Table; 2. Indique o formato (tipo da tabela); 3. Na criação da Estrutura é só digite o nome do campo (use o "TAB" para navegar); 4. Estando no Tipo pressione "Barra de Espaço" (com o Mouse dê um Clique o botão da direita) e escolha o tipo; Defina o Tamanho; Estando no "Key" (Chave Primária) e sendo o campo atual a chave primária ou parte dela pressione "Barra de Espaço" (usando o Mouse dê um Duplo-Clique) e aparecerá um "*", 7. Defina os outros campos repetindo os passos de 3 a 6; 8. Terminado salve a tabela em uma Pasta de Arquivos ou indicando um Alias. am Página: 80 Delphi 5 Fole roster: Taole propertizs: Feeld Neme Type Size Key E ERERA A + Dee, 2 NormeDoFunc as A 3 Endereco?unc A és [7 1. Required Fic à DetaDeNascFure D 2 Minimamvalue: 3 Masimum val: 4 Deja val: me Caixa de Diálogo "Create Table" do DataBase DeskTop V. Passos para criar índices secundários: Entre na Caixa de Diálogo "Create Table" do DataBase DeskTop; Acesse a Caixa de Combinação "Table Properties" e opte por "Secondary Indexes"; Logo abaixo da caixa de combinação existe um botão de título "Define", pressione-o; Na caixa de Diálogo “Define Secondary Indexes" escolha os campos e passe-os para lista de campos do índice; Salve a índice com um nome sugestivo. Define Secondary Index Ele: Indexed fields: o] [Fomec NR Change order: Indey options TO Unique senstive med T Descending Cond || hã Caixa de Diálogo "Define Secondary Index" 10.1.2. Tipos dos Campos (Paradox & dBase) Já que vamos trabalhar com Paradox e/ou dBase, então vamos observar seus tipos: FORMATO PARADOX Tipo Tamanho Nota Alpha (A) 1-255 Alfanumérico Number (N) - Ponto Flutuante Money ($) - Formato Moeda Short (S) - Numerico curto Página: 81 Delphi 5 4.2. Tabela de Dependentes (nome do arquivo: Dependente.DB): Campo Tipo | Tamanho | Ch. Primária | Índice Secundário CodDepend Alpha 3 x NomeDepend Alpha 45 x DataDeNascFunc Date CodFunc Alpha 3 4.3. Tabela de Cargos (nome do arquivo: Cargo.DB): Campo Tipo | Tamanho | Ch. Primária | Índice Secundário CodCargo Alpha 3 x NomeCargo Alpha 25 x 4.4. Tabela de Departamentos (nome do arquivo: Departamento.DB): Campo Tipo | Tamanho | Ch. Primária | Índice Secundário CodDepart Alpha 3 x NomeDepart Alpha 25 x 10.3. Restruturando o Banco de Dados É claro que você não vai trabalhar assim. Fazendo e refazendo, mas às vezes acontece e você quer alterar. Por isso vamos vivênciar o trabalho de restruturação de tabelas, para quando for necessário você não ter dificuldades. Para apagar um campo use: [Ctrl]+[Del]. Para mover clique no número de ordem do campo e arraste-o. Altere seguindo as orientações abaixo: 1. Alterar Funcionários (Altere apenas os listados e o elemento em negrito-Itálico): Campo Tipo | Tamanho | Ch. Primária | Índice Secundário CodFunc Short x CodUF Short NotaFunc Memo 20 Obs.: CodUF substituirá o campo UfFune 2. Restruturar Dependentes (Alterar os elemento em negrito-Itálico e Trocar as posições de CodFunc e CodDepend): Campo Tipo | Tamanho | Ch. Primária | Índice Secundário CodFunc Short X X CodDepend Short X NomeDepend Alpha 45 X DataDeNascFunc Date 3. Alterar Cargos (Altere apenas os listados e o elemento em negrito-Itálico): Campo Tipo [Tamanho | Ch. Primária | Índice Secundário CodCargo Short x 4. Alterar Departamentos (Altere apenas os listados e o elemento em negrito-Itálico): Campo Tipo | Tamanho | Ch. Primária | Índice Secundário CodDepart Short x 5. Criar a Tabela de Estados e UF's (nome do arquivo: EstadosUF.DB): Página: 84 Delphi 5 Campo Tipo | Tamanho | Ch. Primária | Índice Secundário CodUF Short x NomeEstado Alpha 25 SiglaUF Alpha 2 Obs.: É obvio que há uma solução de manipulação de UF que não armazenado no BD, porém optamos por essa para usarmos um componente de BD com essa tabela. Complemento à nossa rápida modelagem: Funcionário 10.4. Os Componentes de Banco de Dados | Há duas categorias de componentes, quando se fala de Banco de Dados: os componentes de Acesso e os componentes de controle. Os "de Acesso", pelo nome já dá para saber que, cuidam de toda parte relacionada ao acesso ou vínculo com parte (tabelas...) ou todo o banco de dados, enquanto os "de Controle" trabalham com as informações (registros ou campos) que estão nas tabelas ou consultas-SQL. 10.4.1. Conjunto de Dados (DataSet) Antes de mais nada temos que saber o que é um DataSet. Um Dataset é Conjunto de todas as ocorrências ou "registros" de uma tabela ou consulta-SQL. O Dataset (Conjunto de Dados) pode está, em um certo momento, em um dos principais estados abaixo listados: 1.Tabela ou Consulta-SQL Fechada (dbInactive): 2.Em Consulta (dbBrowser): 3.Em Pesquisa, preparada para busca de informação, (dbSetKey); 4.Em Edição, atribuições de informações ao dataset, (dsEdit) & 5.Em Inserção, inclusão de novas informações ao dataset, (dbInsert) Nota.: Nesta aula iremos estuda os métodos que possibilitam a mudança do estado de um DataSet. 10.4.2. Acesso ao Banco de Dados (Data Access) Componentes que interagem com o bancos de dados. Iremos estudar os seguintes: Table (Tabela, gera um DataSet), Query (Consulta-SQL, gera um DataSet) e DataSouree (especifica o DataSet, "resultado" de uma Table ou Query) que será a Origem de Dados para os controles de dados). Na segiiência falamos sobre os controles de dados... Você já viu a Estrutura Geral de Acesso a Banco de Dados, porém não viu a estrutura de vínculos dos componentes de banco de dados em um aplicativo Delphi. | Abaixo temos uma Estrutura Exemplo: APLICATIVO DELPHI DBEditCodigo E E DalaSourceProduto DataSourceBusca | sá TableProduto QueyBusca DBEditNome DBEditReferencia DBEditCodPedido DBEditDataPedido Arquivo(s) Físico(s) Página: 85 Delphi 5 10.4.3. TABLE (Representa uma Tabela física) Figura - Estrutura de Vínculos dos componentes de banco de dados. [| Página de Componentes: DataAccess — Classe: TTABLE Indica e representa uma tabela física de um certo Banco de dados, gerando um DataSet para a mesma. Não pode ser utilizada diretamente pelos "outros componentes”, (DataSource). Atenção!!! As propriedade estão posicionada na ordem que devem ser setadas (configuradas). Propriedades Name Nome Identificador do componente DataBaseName Nome do Banco de Dados ou Alias TableName Nome da tabela física do banco de dados Exclusive DataSet não compartilhado (exclusivo)? ReadOnl) DataSet apenas de Leitura? MasterSouce Nome Identificador do DataSource da Tabela Mestre MasterField Campo da Tabela Mestre IndexFieldNames | Nome do Campo que se quer indexar IndexName Nome do Index (índice secundário) que se quer indexar Active Abrir o DataSet ? RecordCount Apenas em Tempo de Execução possui a quantidade de "Registros" do DataSet. Ex.: LabelQuantDeRegistros.Caption := IntToStr ( Tablel.RecordCount ): Métodos MUDANÇA DE ESTADO DO DATASET Open Abrir um DataSet (Table ou Query). Ex.: Tablel.Open; Close Fechar um DataSet. Ex.: Query2.Close; Edit Ativa o modo de Alteração para o "registro" corrente do DataSet Insert Inserir um "registro" vazio e torná-o corrente no DataSet Post Grava o "registro" atual no DataSet Cancel Aborta ou Cancela uma Alteração (Edit) ou Inclusão (Insert) Delete Apaga o "registro" corrente do DataSet Refresh Atualiza o DataSet de uma Table Append Anexa um "registro" vazio no final e torná-o corrente no DataSet de uma Table PESQUISA SetKe; Preparar o DataSet indexado de uma Table para Pesquisa KeyFieldCount Quando um índice é composto por mais de um campo você deve atribuir o número do campo pelo qual quer basear sua pesquisa. Ex.: Tablel.KeyFieldCount := 0: [Explicação: vai baseado no primeiro campo/ GotoKey Retorna "True" se a pesquisa exata teve êxito. If Table.GotoKey Then ShowMessage (' Código já existe!); GotoNearest Retorna "True se a pesquisa aproximada ou inexata teve êxito. If Table.GotoNearest Then ShowMessage (Iniciais encontradas POSICIONAMENTO First Ao primeiro Last Ao último Next Ao próximo, Prior Ao Anterior MoveBy () Mova-se "n” "registros". Ex. 1º: 5 registro à frente: Tablel.MoveBy(5); Ex. 2º: 5 registro para trás: Tablel.MoveBy(-5); necessitando de um componente intermediador Página: 86 Delphi 5 Esses componentes não tem acesso direto a tabela física, necessitam de um DataSource que indique um certo DataSet (Table ou Query). Antes de entrarmos no componentes de Cont fizemos no Nosso Aplicativo: Formulário Principal com Menu; Formulário de Entrada (Splash) com som; Formulário Sobre; Sn Bem, só falta os Cadastros role de Dados (data-aware). Vamos nos lembrar do que já Formulários Secundários chamados pelas opções do Menu Entretenimento (Multimídia); O Banco de Dados (as tabelas paradox em um diretório) e seu Alias; O Módulo de Dados (DataModule) referenciando as tabelas do Nosso Alias; Funcionários e Dados Gerais (Departamentos e Cargos ) e os relatórios. Vamos dar uma olhada na interface final dos formulários envolvidos nos cadastros: Bódigo 3 Nome [Contabilidade | Classificação (E Pelocódigo € PeloNome Quantidade de Departamentos Cadastrados: 4 AL Fechar Em um só formulário os cadastros de departamentos e cargos. As páginas possuem a mesma interface. Nesse formulário existirá: inclusão, exclusão e alteração, só que trabalharemos sem código. Você vai ver como isso funciona. EEE Blovo. já. ff dps. Plug da 4 + Foto Código Nome . 1 Jestoslimaneio Neste formulário temos o cadastro DataNascimento | Sexo de funcionário. A interface muda um [10/10/40 (E Masculino Femiriy pouco quando estamos em uma das Pega cao e || | operações. Gsm Nesse formulário existirá: inclusão, Penido god |] exclusão e alteração, agora usando um meto pm Ra pouco de código Object Pascal. Nota uídico Quark de Funcionário Cadastiados: 6 recta Este formulário será apresentado quando [Advogado do Dr. Mauro Gomes por 7 anos e Dependentes E 1 FayPeo 20/02/91 2 Faulo Cayteu 30/08/93 pressionarmos o botão Lista Dependentes do cadastro de funcionário. Ele é um Cadastro simples sem código algum para os dependentes, porém automaticamente são relacionados ao funcionário atual (corrente). Isso por causa das propriedades: MasterSource e MasterFields da Table dos Dependentes. Página: 89 Delphi 5 rr Uritérios de Busca Digite o Nome O | Este formulário será apresentado |" Quadio de Funcionários ———— 4 Ativos € Demitidos fº Todos [emo Masculino € Feminino (E Todos quando pressionarmos o botão Buscar do cadastro de funcionário. Resultado Recepcionista Mato Grosso! | E Carla Maya Gerente Pernambuco. 1 Caros Lima Neto Gerente Pernambuco leo pia Quantidade de Funcionários encontrados: & ch Nele pesquisaremos por um ou alguns funcionário. O resultado da busca será gerado por código SQL de uma Query. Agora que já fomos apresentados aos formulários de cadastro vamos continuar com o assunto e no momento adequado iremos trabalhar em cada um neles. Propriedades Comuns aos Controles de Dados DataSource Name do DataSource relacionado ao DataSet (Table ou Query) requerido DataField Name do campo do DataSet (Table ou Query) ao qual se quer ter acesso 10.5.1. DBTEXT (Etiqueta para Banco de Dados) Página de Componentes: DataControls — Classe: TDBTEXT Tem o mesmo objetivo da Label, não permitir acesso do usuário ao seu conteúdo. 10.52. DBEDIT (Caixa de Texto para Banco de Dados) Página de Componentes: DataControls — Classe: TDBEDIT Tem o mesmo objetivo e uso do Edit. 10.5.3. DBMEMO (Caixa de Texto Longo para Banco de Dados) Página de Componentes: DataControls — Classe: TDBMEMO Utilidade e objetivo igual ao componente Memo. 10.5.4. DBIMAGE (Área de Imagem para Banco de Dados) Página de Componentes: DataControls — Classe: TDBIMAGE fr E E, Extensão do componente Image para vínculo com um campo Gráfico de um DataSet. Página: 90 Delphi 5 10.5.5. DBCHECKBOX (Caixa de Seleção para Banco de Dados) [E] Página de Componentes: DataControls — Classe: TDBCHECKBOX Extensão do componente CheckBox para vínculo com um campo Lógico de um DataSet. 10.5.6. DBRADIOGROUP (G. de Botões de Rádio p/ Banco de Dad. Página de Componentes: DataControls — Classe: TDBCHECKBOX Extensão do componente RadioGroup para vínculo com um campo de um DataSet que possua múltipla escolha ou opção. Propriedades Particulares Items Nomes dos botões (itens) do grupo Values Valor, de cada item, que será encaminhado ao campo se o item (botão) for escolhido. Cada valor para o seu respectivos item. Obs.: Se não for indicado os valores, por padrão, será encaminhado ao campo da tabela o título do item escolhido pelo usuário. 10.5.7. DBNAVIGATOR (Navegador para Banco de Dados) Es Página de Componentes: DataControls — Classe: TDBNAVIGATOR Possibilita o deslocamento (navegação) entre os "registros" e aplicação das operações (inclusão, deleção e alteração) num DataSet. Propriedades Particulares DataSource Name do DataSource relacionado ao DataSet (Table ou Query) à controlar Hints Descrição no idioma do usuário para cada botão do componente de navegação VisibleButtons Apresentar este botão ? ConfirmDelete Sempre perguntar antes de apagar ? Propriedade de Evento OnClick Quando for clicado um dos botões. | Pode-se no procedimento de Evento verificar qual foi o botão clicado. Botões: nbInsert, nbEdit, nbPost, nbCancel... E 10.5.8. DBLOOKkUPCOMBOBOX (Seleção Fechada) Página de Componentes: DataControls Classe: TDBLOOKUPCOMBOBOX Possibilita relacionamento ou conexão com duas Origens de Dados. — A Primeira é do DataSet mestre (a principal) e a Segunda é do DataSet secundário. Exemplo de um caso: Não queremos que na tabela de funcionários guarde-se o nome do estado pois criaria um redundância (repetição) de Dados, então na tabela funcionário guardaremos um código identificador que represente aquele estado e consegiiêntemente teremos uma segunda tabela que terá todos os estados. Bem, agora temos outro problema pois o usuário não vai querer decorar o código de cada estado, então teremos que baseados no código do estado achar o nome do estado correspondente e apresentá-lo. Isso é bem natural! Porém será necessário escrever algumas linhas de código e gasta-se Página: 91 Delphi 5 PageControl consulta Há um DbText aqui será Departamentos | Cargos | exibido sempre na mejajrjmj+|=[a[2| je : DBEdit que estará em apenas de Aqui temos um MaskEdit que será exibido e usado apenas na inclusão TEC 1] DBNavigator Déda Nemo leitura quando em consulta Quniidade de Departamentos Cadastrados: É E Label que receberá a Bevel / E Í Í RE Se quantidade Atual de registros do DataSet Etapa II: 1. Quando o usuário solicitar a inclusão você apresentará o MaskEdit do código, ocultará o DBText do código, desabilitará o RadioGroup e liberará a entrada de dados do DBEdit do Nome; Quando o usuário cancelar ou gravar, fazer o inverso do item acima; Na inclusão quando o usuário sair do MaskEdit do Código você deverá Pesquisar com o método SetKey se esse código já existe e proceder adequadamente. Atenção! Lembre-se que usando "SetKey" você mudará o Estado do DataSet devendo usar o método "Insert" para poder incluir, se o código não 5 Para se fazer a pesquisa solicitada no item acima a tabela deverá está indexada pelo código, antes você deverá obrigatoriamente guarda a indexação anterior a inclusão para depois da inclusão aplicá-la; Quando o usuário usar o RadioGroup para trocar a classificação você deverá indexar o Dataset alterando a propriedade IndexFieldNames; Na parte abaixo do RadioGroup onde há a informação de quantidade de registro você deverá usar a propriedade adequada para atualizar a label com essa informação quando apresentar o formulário e, também, - quando fizer inclusões ou exclusões; 10.7.2. Cadastro de Funcionário (consulta) Etapa I: Usando o Editor de Campos adicione todos os campos da tabela de funcionários (dê um clique com o botão da direita em cima da TableFunc e escolha a opção "Fields Editor". Aparecerá um lista flutuante repita a operação sobre essa lista, mas escolha a opção "Add fields" e pressione o "OK"); 2. Faça as Instruções de 1 a 5 do formulário anterior para esse novo formulário; Os DBEdits para o Cargo, Departamento e UF faremos uma abordagem para aparecer os nomes se baseando nos códigos (CodDepart, CodCargo e CodUF), respectivos, que possuímos no registro atual do funcionário. Por enquanto apenas coloque-os nas posições como na imagem abaixo, sem setar as propriedades de Banco de Dados; 4. Imagens exibidas nos Botões: novo (Filenew.bmp), Alterar (Edit.bmp), Apagar (Trash.bmp), Buscar(Crdfile2.bmp) e Dependentes (Docstack.bmp) estão no diretório de images para botões do Delphi (... Delphi 3Wmageslbuttons); 5. Todos os componente de entrada de dados, vistos na figura abaixo, são da página Data Controls. ficara Um RadioGroup Comum que asicaçã (Pe mo erimme ST fará a mudança do o o IndexFieldNames do DataSet Chamará o formulário de Pesquisa o No - Pee oe Um DBNavigator — ágina: 94 DataNascimento | Sexo [10/02/43 Ss €º Feminino Endereço [Fa ima Fio. 5570 -Samto Marcos - Acad PE NWisentada à vma Omar te É Delphi 5 Bem, creio que você já montou uma interface como a da figura acima. Então vamos aos detalhes das Querys uma para o nome do Cargo e a outra para o nome do Departamento, informações que constam em outras tabelas. Iremos utilizar o "Query Builder” utilitário que é encontrado na versão Client-Server. Ele vai nos ajudar a construir o código SQL que é necessário aos componentes do tipo Query. 10.7.3. Query Nome do Cargo I. Passos para montagem do Código SQL da Query: 1. 2. No "DataModule" coloque uma Query e o seu DataSource para Nome do Cargo; Dê um Clique com o botão da direita e escolha a opção Query Builder; Aparecerá um caixa de diálogo solicitando o ALIAS do Banco de Dados, informe; Agora foi exibida outra caixa de diálogo solicitando as tabelas envolvidas para construção do nosso código SQL, escolha a tabelas: Cargo e depois a de funcionário, nesta ordem. E feche a caixa de diálogo; Relacione, arrastando o campo CodCargo e soltando-o no de mesmo nome na outra tabela, no sentido tabela Cargo para a tabela funcionário, as tabelas envolvidas. Irá aparecer uma linha de conexão (relacionamento) ligando as duas tabelas; Pronto! Pressione o botão que tem uma imagem de Chec para salvar na propriedade SQL da query. Terminamos o código SQL, vamos indicar o parâmetro agora .... IL Passos para indicação do parâmetro da Query: Ainda com o DataSer da Query fechado (Query.Active = False); Dê duplo-clique na propriedade SQL para editar o código SQL: Na cláusula "Where" substitua o nome da tabela "funcionario." por dois-pontos (: ). Com isso você indicou quem é o parâmetro; Dê duplo-clique na propriedade Params e será exibida um caixa de diálogo para definição do parâmetro; Nessa caixa de diálogo, que já contem o nome do campo que você lá no código SQL indicou com os dois-pontos que era um parâmetro, informe o tipo desse parâmetro; Vincule o DBEdit Nome do Cargo à query. Pronto, acabou! Agora é só ativar a Query (Query. Active = True) para testar tudo; 10.7.4. Query Sigla da UF & Query Nome do Departamento Página: 95 Delphi 5 & Repita os passos: Montagem do Código SQL da Query & Indicação do parâmetro da Query, para as outras Querys (UF e Nome do Departamento), escolhendo as tabelas e campos correspondentes a informações E E QuesyCargoDoFunc DataSourcelCargoDoFune: E?) ER E 5 QuesyDepatDoFunc DataSourceDepantDoFunc E? Er E E QuervE stadoD oFunc DataSourceE stadoD oFunc Figura - Querys com Parâmetro e seus DataSources Y” Quando a parte de consulta tudo pronto. Agora vamos trabalhar na interface para incluir & alterar. E depois você poderá colocar as instruções necessárias para os botões de comando (novo, alterar, apagar...). 10.7.5. Cadastro de Funcionário (Incluir & Alterar) Etapa II: Instruções para Inclusão: CEREIRTAERE 1. Quando o usuário solicitar a inclusão você apresentará o MaskEdit do código, os botões Gravar, Abandonar, Ler foto e os DBLookUpComboBoxs; ocultará o DBText do código, os DBEdits: Nome do Cargo, Foto Data Nascimento Sexo E Masculino O Feminino Departamentoos e UF, e os botões que não se Endereço ur apresentam na figura ao lado e liberará as [= entradas de dados do DBEdits e DBMemo; 2. Quando o usuário cancelar ou gravar fazer o inverso do item acima; 3. Na inclusão quando o usuário sair do MaskEdit do Código você deverá Pesquisar com o método SetKey se esse código já existe e proceder adequadamente; 4. Para Carregar a foto use um componente OpenPictureDialog para ajudar. E já que adicionar-mos os campos será possível usar o método "LoadFromFile ( )" no o campo Gráfico para carregar a fotografia. 7 FoiDemitido Cargo Departamento Quant. de Funcionários Cadastrados: Figura - Interface da inclusão DBLoopUpComboBoxs DBLoopUpComboBox para Estado Listará: Sigla e Nome dos Estados Código Data Nascimento fior10/40 Endereço ua do Aluguel, 456 - São Geraldo - Cabo Camo] DBLoopUpComboBox para Cargo Listará: Nome dos Cargos TT FoiDemtno Página: 96 Lista Dependentes. Departamento o [lurídico FEcvagado do Dr Mauro Eoriebiiade” ||
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved