Sunteți pe pagina 1din 79

Sumrio

Introduo a Banco de Dados e Linguagem SQL..................................................................... 5 Relacionamento entre Tabelas.................................................................................................... 7 A Linguagem SQL....................................................................................................................... 8 Acessando Banco de Dados pelo Delphi................................................................................... 10

Abrindo e fechando uma tabela..................................................................................................15 Inserindo, Editando e Gravando Dados......................................................................................16


Eventos do Componente Table ................................................................................................. 17

Usando Aliases pr-definidos.....................................................................................................18


Mais de um Formulrio no Mesmo Aplicativo ............................................................................ 22 Usando o componete Query...................................................................................................... 24

Instrues SQL com Query ........................................................................................................24 Somando os valores de um campo .............................................................................................25 Buscando o Maior e o Menor Valor...........................................................................................27 Usando Apenas Uma Query Para Vrias Consultas...................................................................28 Obtendo o Nome do Produto Alm do Maior e Menor Preo ...................................................30 Usando outros comandos SQL com Query ................................................................................31 Usando o comando INSERT e UPDATE ..................................................................................33
Introduo ................................................................................................................................ 40 Verses do InstallShield ............................................................................................................ 40 Usando o InstallShield para Delphi 5.0...................................................................................... 41 Usando o InstallShield para Delphi 6.0...................................................................................... 52 Usando o InstallShield para Delphi 7.0...................................................................................... 59 Usando o Inno Setup................................................................................................................. 61

Dicas Para um Bom Software de Instalao ..............................................................................74 Instalao de arquivos: dicas teis .............................................................................................74 Criando chaves no registro.........................................................................................................75 Associando extenses de arquivos ao seu programa..................................................................76 Protegendo e criptografando o instalador com uma senha.......... Erro! Indicador no definido. Protegendo com um nmero serial.............................................. Erro! Indicador no definido.
Referncia Bibliogrfica ............................................................................................................ 79

Introduo a Banco de Dados e Linguagem SQL


O Delphi, quando integrado com banco de dados (BD), amplia significativamente os horizontes do programador. Vamos conhecer, neste captulo, alguns conceitos que podero ser utilizados em diversas situaes. Um Banco de Dados (BD) um conjunto de arquivos que armazena informaes com um determinado objetivo. Por exemplo, um banco de dados do setor contbil de uma empresa ir armazenar informaes contbeis pertinentes quela empresa, tais como fluxos de caixa e as totalizaes das contas de Ativo e Passivo. Do mesmo modo, o banco de dados da Folha de Pagamento armazenar nomes de funcionrios, valor dos salrios de cada um, etc. No devemos confundir Banco de dados com Sistema Gerenciador de Banco de Dados (SGBD). Este ltimo permite uma viso macro do sistema, do qual fazem parte inclusive os softwares responsveis pela administrao e utilizao do BD. O objetivo de se ter banco de dados, portanto, o de unir informaes em um s lugar, que podero ser modificadas a qualquer tempo. Isso significa que podemos interagir com o BD, atravs de transaes. Uma transao um conjunto de comandos que devem ser executados com o intuito de trocar informaes com o BD antes que informaes definitivas sejam gravadas. Aps executar-se uma transao, poderemos ou no confirm-la e, a sim, estaremos ou no gravando aquelas informaes pertinentes transao no BD. Grava-se uma transao num BD atravs de um comando COMMIT e descartam-se transaes atravs de um comando ROLLBACK. Quando, ao invs de um COMMIT (confirmao), optamos por enviar ao Banco um ROLLBACK, estamos descartando todas as modificaes realizadas no BD desde sua ltima gravao. Por exemplo: suponha que um usurio do R.H. est conectado ao BD da empresa realizando modificaes em salrios de alguns cargos. No momento em que ele altera o valor do salrio do cargo Gerente de Produo de R$ 2.000,00 para R$ 4.000,00 apenas ele prprio est ciente disso. Outro usurio conectado ao mesmo Banco e olhando os dados do mesmo cargo somente enchergar esta modificao quando o funcionrio que a est editando enviar um COMMIT ao sistema. A ento a alterao ser gravada e estar disponvel para consulta. Para modificar ou criar dados novos em um BD h um conjunto especfico de comandos que podemos utilizar e que encontra-se agrupado numa linguagem chamada SQL (Structure Query Language). A maioria dos Bancos de Dados traz consigo um aplicativo que suporta esta linguagem para que a comunicao com os dados fique padronizada. Quando falamos em banco de dados, necessrio tambm que se fale em Triggers. Triggers so conjuntos de funes que disparam aes, normalmente associadas a instrues SQL (como INSERT, UPDATE e DELETE). Estas aes esto relacionadas eventos do banco de dados e podem ser de 6 tipos: BEFORE INSERT BEFORE UPDATE BEFORE DELETE AFTER INSERT AFTER UPDATE AFTER DELETE

A sintaxe do comando para criao de triggers :


CREATE TRIGGER <Nome-da-Trigger> FOR <Tabela> AFTER INSERT POSITION <n> AS Begin //cdigos a serem executados pela Trigger End;

Para tornar o conceito mais claro, saiba que, usando triggers, podemos obrigar o BD a executar alguma ao especfica toda vez que ele saia, por exemplo, do modo de insero (o que corresponderia ao evento AFTER INSERT). Observe o exemplo a seguir, onde utilizamos a sintaxe para a criao de uma trigger para o Interbase:
CREATE TRIGGER MaxSalario FOR Empregado AFTER INSERT POSITION 5 AS Begin UPDATE Empregado SET Salario = 3000.00 WHERE Salario > 3000.00 End;

O trigger acima impede que qualquer funcionrio cadastrado na tabela Empregado tenha seu salrio aumentado para mais de R$ 3.000,00. Isso equivale dizer que, se algum tentar cadastrar um funcionrio com um salrio de R$ 4.000,00, no momento em que for confirmado o cadastro (atravs de um COMMIT), o banco ir executar a trigger chamada MaxSalario. Essa trigger perceber que h um salrio recm-cadastrado acima do valor permitido e ir modific-lo para o teto mximo de 3.000,00. Quem se encarregar da modificao ser o comando UPDATE, colocado na trigger. O parmetro POSITION necessrio quando se cria triggers porque podemos ter mais de uma trigger para cada evento disparado pelo Interbase, razo pela qual cada um receber um nmero distinto entre 0 e 32.767 - preferencialmente no sequencial, para que seja possvel incluir novas triggers entre duas j existentes, se preciso. POSITION, pois, define a ordem em que as triggers sero executadas. Ainda relativo a BDs, precisamos definir Stored Procedures. Tambm chamadas de Procedimentos Armazenados, as Stored Procedures so funes que ficam armazenadas dentro do BD e que podem ser executadas a qualquer momento por uma instruo SQL, a partir de uma outra Stored Procedure, de um trigger ou mesmo de um aplicativo Delphi. A sintaxe abaixo pode ser usada para criar uma stored procedure em um banco Interbase:
CREATE PROCEDURE <Nome> (Parametros-de-Entrada) RETURNS (Parametros-de-Sada) AS Begin //comandos a serem executados pela Stored Procedure End

Eis um exemplo de uma Stored Procedure:

CREATE PROCEDURE Aumento (Indice Float) AS Begin

UPDATE Empregado SET Salario = Salario * :Indice End

A stored procedure acima, ao ser executada, aumentaria o salrio de todos os funcionrios de acordo com o ndice (parmetro Indice) de aumento passado. Para executar esta stored procedure passando um aumento de 10%, faramos assim:

EXECUTE PROCEDURE Aumento (1.10)

Relacionamento entre Tabelas


Os sistemas de banco de dados atuais baseiam-se em um modelo matemtico derivado da Teoria dos Conjuntos e que desenvolveu-se mais fortemente a partir da dcada de 70. Trata-se do Modelo Relacional. Os sistemas que suportam esse conceito so chamados Sistemas Gerenciadores de Bancos de Dados Relacionais (SGBDR). Dentre os bancos baseados neste modelo, temos: Interbase, da Borland, MS-SQL Server e MS-Access, da Microsoft, Oracle (da empresa homnima), IBM-DB2, da IBM, e outros. Bancos de dados relacionais trabalham com tabelas. Um banco pode ter diversas tabelas, nas quais esto armazenadas dados de uma mesma entidade. Por exemplo, no banco de dados da empresa SG-TECNOLOGIES, pode haver uma tabela chamada Empregado, que guarda o registro de todos os funcionrios da casa. Uma tabela composta da juno de uma ou mais linhas e uma ou mais colunas, tal qual numa planilha de MS-Excel. J que um BD formado por mais de uma tabela, possvel tambm que na empresa citada tambm haja uma tabela chamada Cargo, que mantm os nomes e uma breve descrio dos cargos existentes. Podemos, na verdade, imaginar a existncia de diversas tabelas. Mas para que cada uma delas no represente um amontoado de informaes dispersas, elas precisam manter um relacionamento. Se um funcionario da tabela Empregado ocupa um determinado cargo na empresa, provavelmente a tabela Cargo deve fazer alguma referncia a ele tambm. Mas como se d isso? Em bancos relacionais, temos o conceito de Chave Primria e Chave Estrangeira. Atravs delas especificamos como uma tabela relaciona-se com a outra. Observe abaixo um esquema onde duas tabelas so unidas:

O campo CODIGO da tabela Empregado identifica cada funcionrio cadastrado por um cdigo nico. Como no deve haver mais de um funcionrio com o mesmo cdigo, este campo, durante a criao da tabela, foi definido como sendo chave primria. Chave primria justamente isso: no se pode repetir valores num determinado campo. Por sua vez, na tabela Cargo, cada nome de cargo tambm tem um cdigo. Impossvel haver um cargo com o mesmo cdigo; portanto, definiu-se aqui tambm como chave primria. Agora, para que cada funcionrio pudesse ser enquadrado num cargo, criou-se um campo a mais na tabela Empregado (aparentemente sem utilidade), que serve para guardar a associao entre funcionrio e seu cargo. Esta a nossa Chave Estrangeira. Ele referencia, na verdade, a chave primria de outra tabela.

Figura 1 - Relacionamento entre tabelas

A tabela de funcionrios, tendo o campo CARGO como chave estrangeira (cujos valores vm do campo CODIGO da tabela Cargo), realiza a associao desejada. Assim sendo, conclui-se que o funcionrio JOS um Gerente de Setor e que o sr. ABREU e o sr. SILVA so operrios.

A Linguagem SQL
Desenvolvida nos laboratrios da IBM na primeira metade dos anos 70, a SQL constitui-se numa linguagem de acesso a banco de dados. Baseia-se nos princpios lanados por E. F. Codd, tendo sido projetada para viabilizar a construo de um produto relacional pela IBM. Apesar dessa origem, constitui-se hoje num padro internacional para os SGBDRs [Sistema Gerenciador de Banco de Dados Relacionais], com especificaes formalizadas pela ANSI (o ltimo padro publicado de 1992) e adotadas em maior ou menor grau por vrios fornecedores de bancos de dados, tendo sido implementada inclusive por produtos no exatamente relacionais1. A linguagem SQL bastante ampla, suportando comandos para criao e manipulao de banco de dados, de tabelas, bem como de recuperao de dados. (...) a linguagem ainda oferece recursos de segurana, permitindo criar usurios do banco de dados e restringir seu acesso a eles2. Quando se deseja interagir diretamente com o banco de dados, sem o uso de uma linguagem de programao como a Delphi, deve-se escolher uma ferramenta para editar e executar os comandos SQL. Digitam-se os comandos SQL no editor da ferramenta, que tem alguma maneira de executar o comando. No Interbase, que vem com o Delphi Professional (verso Local Interbase) e com o Enterprise (verso para cinco usurios), h uma ferramenta chamada WISQL. Ela tem duas janelas: na superior, digita-se a sentena SQL, e na inferior, verificam-se os resultados (...)3.
1 2 3

MUNARI, 1997 SONNINO, 2000 Idem

Os comandos definidos pela linguagem SQL podem ser divididos em: DML (Data Manipulation Language) - permite consultar, alterar, adicionar e remover informaes dos bancos de dados. Este grupo rene os comandos mais utilizados. So comandos DML: Comandos INSERT DELETE UPDATE SELECT Para que serve Inserir dados Remover dados Modificar dados existentes Consultar dados existentes

DDL (Data Definition Language) permite gerenciamento e criao de estruturas no BD, tais como criar tabelas ou remover ndices. So comandos DDL: Comandos CREATE DROP ALTER Para que serve Cria uma tabela, uma coluna ou uma restrio Deleta uma tabela Altera as definies de uma tabela

DCL (Data Control Language) possibilita a definio de contas de usurios autorizados a acessar o BD, alm de permitir definir algumas limitaes de uso. So comandos DCL: Comandos GRANT REVOKE Para que serve Concede privilgios a um usurio Retira privilgios de um usurio

Acessando Banco de Dados pelo Delphi


O Delphi pode acessar a grande maioria dos bancos de dados existentes no mercado utilizando seus prprios componentes ou de terceiros. Para aplicaes mais simples, a Borland / CodeGear (fabricante do Delphi) desenvolveu uma interface de acesso a bancos de dados chamada de BDE - Borland Database Engine. A BDE, por meio de drivers para cada banco de dados, permite acessar da mesma maneira tanto uma base de dados desktop quanto uma cliente-servidor. Isto traz muita flexibilidade: pode-se criar o sistema utilizando-se Paradox e implantar o sistema definitivo usando-se Oracle, sem grandes modificaes4. Inicialmente, trabalharemos com tabelas Paradox um tipo simples, porm bastante eficiente para que possamos adquirir uma viso prvia dos componentes de acesso a banco de dados do Delphi. O Paradox, um sistema de banco de dados relacional baseados em tabelas, mundialmente conhecido desde os primrdios da Informtica; rivalizou durante anos com o DBase, que era o melhor de todos os bancos. O Paradox tem como diferencial ser um banco de dados relacional (o DBase no era), permitindo que suas tabelas se relacionem umas com as outras. Para criar tabelas Paradox usaremos o programa Database Desktop, que acompanha o Delphi. Voc pode encontr-lo dentro do menu Tools do prprio Delphi ou acessando o menu Iniciar > Todos os Programas (ou apenas Programas, dependendo da configurao do seu Windows) > Borland Delphi 7 > Database Desktop. No Database Desktop, clique em File > New > Table. Escolha Paradox 7 e clique em OK. Uma nova tela exibida, onde devero ser preenchidos os campos que iro compor a tabela:

SONNINO, 2000

10

Figura 2 - Criando tabelas com Database Desktop

Vamos entender o que significa cada coluna da janela que foi aberta: Field Name onde devemos digitar o nome do campo da tabela. Por exemplo: NomeCliente, Endereco, Cidade, Estado, etc. Type permite que voc escolha qual ser o tipo do campo. Todo campo precisa ter um tipo associado a ele, de acordo com o tipo de dado que ser armazenado. Por exemplo, NomeCliente ir guardar dados do tipo texto; logo, devemos escolher Alpha (representado pela letra A). J um campo chamado QuantidadeVendida poderia ser Inteiro Longo (Long Integer, representado por I). Size define o tamanho mximo do campo, ou seja, o nmero mximo de caracteres que aquele campo ser capaz de armazenar para cada registro criado. Em tabelas Paradox, campos numricos do tipo inteiro no precisam dessa especificao. J outros campos exigem esta informao, tal como o tipo Alpha, cujo tamanho pode variar de 1 caractere a 255 ou o tipo Memo (representado por M), capaz de armazenar num nico arquivo algo entre 1 e 240 caracteres. Key a coluna Key permite selecionar um campo como chave-primria, isto , um campo no qual nenhum dado poder ser repetido.

Para o nosso exemplo, vamos criar uma tabela de clientes com apenas quatro campos: Nome, Endereco, Cidade e Estado. Para iniciar, clique logo abaixo da palavra Field Name e digite Nome. Pressione ENTER para avanar para a coluna seguinte e digite A (este ser o tipo do campo: Alpha). Pressione ENTER de novo para mudar para a coluna Size e defina um tamanho de 80 caracteres (deve ser mais do que suficiente para nomes de clientes). Finalmente, pressione ENTER mais uma vez e, ento, pressione a barra de espaos. Surgir um asterisco (*) em Key,

11

indicando que o campo Nome ser chave-primria. Isso quer dizer que, em nossa tabela de clientes, no poderemos cadastrar dois clientes com o mesmo nome. Pressione ENTER de novo e repita os mesmos passos para prosseguir com a criao dos demais campos. Ao final, a tabela dever ficar assim:

Figura 3 - Viso final da tabela

Evite utilizar acentuao nos nomes de campos o que inclui todos os acentos, inclusive a cedilha. Isso pode trazer problemas se precisarmos referenci-los em cdigo no Delphi.
Clique em Save As e escolha uma pasta do seu computador para armazen-la. Em Nome do Arquivo, digite Clientes e, ento, clique em OK. Isso criar um arquivo chamado Clientes.db, que armazenar todos os dados cadastrais inseridos pelo usurio, e um arquivo chamado Clientes.PX, arquivo-ndice responsvel pela manuteno da chave-primria da tabela. Antes de deixarmos o Database Desktop, ainda precisamos definir um Alias para a tabela. Mas o que isso? Um alias um apelido que a BDE usa para encontrar as tabelas do sistema. Em tabelas Paradox ou DBase, este alias aponta para a pasta onde ficam as tabelas. J em bancos de dados cliente-servidor, ele configurado de maneira a encontrar as tabelas, no necessariamente apontando para a localizao fsica dos dados. O alias tem uma vantagem extra: caso se queira mudar a localizao das tabelas ou mesmo o banco de Figura 4 - Tela para criao do Alias dados utilizado, no necessrio 12

alterar o programa: basta alterar para onde o alias aponta.5 Para criar um alias, clique em Tools > Alias Manager... e, na tela que se abrir, clique no boto New. No campo Database alias, digite um nome para seu alias. Pode ser qualquer coisa, mas sem acentuao ou espaos. Em Driver type, deixe Standard selecionado Standard a opo padro para tabelas Paradox e DBase. Em Path, voc deve digitar o caminho em que se encontra a tabela de clientes que acabamos de criar. Voc pode optar por clicar no boto Browse... e procur-la na hierarquia de pastas, se no tiver certeza do caminho exato. Feito isso, clique em OK, OK de novo e, depois, em Sim. Pronto. O seu alias est criado e voc j pode sair do Database Desktop. Voltemos, agora, ao Delphi para criarmos um aplicativo que permite cadastrar dados em nossa tabela e pesquis-los. Para isso, inicie um aplicativo novo clicando em File > New > Application. Procure a paleta BDE e coloque um componente Table no seu formulrio. Este componente permitir o acesso aos dados da tabela Clientes. Vamos configur-lo para isso, ento. No Object Inspector, procure a propriedade DatabaseName e selecione o Alias que voc acabou de criar. Mais abaixo, em TableName, procure suas tabela Clientes: ela dever aparecer listada ali. Vamos, agora, informar ao componente Table quais campos da tabela queremos ver em nosso formulrio. D dois cliques em Table e, ento, com o boto direito do mouse, escolha a opo Add Fields.... Selecione todos os campos e clique em OK. Voc ter algo semelhante Figura 5. Fazendo isso, nosso componente Table j sabe quais sero os campos disponveis para nossa aplicao, mas se deixarmos apenas assim, nosso usurio no possuir acesso a eles. Precisamos, ento, torn-los disponveis tambm no formulrio. Para isso, selecione todos os campos do Table e arraste-os com o mouse, soltando-os bem em cima do formulrio. Vrios objetos, semelhantes a Labels e Edits sero acrescentados automaticamente ao formulrio. So, na
Figura 5 - Campos da tabela

verdade, objetos Labels (especficos para referenciar objetos vindo de tabelas) e DBEdits (Edits que acessam os campos das tabelas). Cada campo tem seu

SONINNO, 2000

13

prprio Label e DBEdit, conforme mostrado na figura a seguir:

Figura 6 - Formulrio com DBTexts e DBEdits

necessrio reduzir um pouco o tamanho destes DBEdits para que caibam na tela. Segurando SHIFT no teclado, clique em cada um deles para selecionar todos ao mesmo tempo e, ento, no Object Inspector, procure a propriedade Width, referente largura dos componentes. Altere-a para um valor bem menor, algo em torno de 500 ou 400, por exemplo. Pressione ENTER e seus campos ficaro com um tamanho bem mais adequado. Aproveite e note tambm que, ao arrastar os campos para o formulrio, alm dos componentes j citados, outro item apareceu: um Datasource ( ). Este objeto liga-se automaticamente Table para fazer uma ponte entre os DBEdits e a tabela. Como arrastamos os campos, ele apareceu automaticamente, mas isso nem sempre acontecer. Em alguns casos, ser necessrio busc-lo na paleta Data Access e adicion-lo manualmente. Como podemos perceber olhando para a Figura 5, foi muito fcil colocar os campos da tabela no formulrio. Ao serem arrastados para o form, eles automaticamente se tornam componentes do tipo DBEdit. O DBEdit um componente semelhante ao Edit (que j estudamos anteriormente, na Parte 1 dessa apostila), mas com a vantagem de que ele se conecta diretamente com os campos da tabela. Isso significa que, tudo o que for digitado neles, ser gravado, posteriormente, na tabela. E os rtulos que indicam os nomes dos campos, tais como Nome, Endereco, etc, so componentes DBText, tambm criados automaticamente durante o arraste.

14

Mas para que os dados possam ser gravados, a tabela precisa estar aberta, isto , precisa estar devidamente posicionada na memria para aguardar pela entrada de dados. Podemos fazer isso mudando a propriedade Active do componente Table para True. Mas esse mtodo possui seus inconvenientes.

Abrindo e fechando uma tabela


Sempre que abrimos uma tabela atravs do Object Inspector, os dados desta tabela so imediatamente carregados para a Figura 7 - Abrindo a tabela memria do computador. O que acontece aqui que, muitas vezes, isso desnecessrio, uma vez que, enquanto estamos desenvolvendo o aplicativo, no temos a necessidade de manter tais dados ocupando espao desnecessariamente na memria RAM o que, dependendo da quantidade de dados, pode at deixar o desenvolvimento mais pesado, mais lento. Para evitar isso, voc pode abrir e fechar sua tabela usando a mesma propriedade Active via cdigo. Mas, qual evento podemos usar para isso? Sempre que um formulrio criado na memria, executado o evento OnCreate do Form. E sempre que ele fechado, o evento OnClose chamado. Portanto, podemos utiliz-los para, respectivamente, abrir e fechar a tabela (ou tabelas) do aplicativo. Observe como ficaria o cdigo para abrir a tabela:
procedure TForm1.FormCreate(Sender: TObject); begin Table1.Active := True; end;

E, para fechar:
procedure TForm1. FormClose(Sender: TObject; var Action: TCloseAction); begin Table1.Active := False; end;

Caso seu aplicativo tenha mais de uma tabela, devemos informar todas as tabelas que desejamos abrir e fechar:
procedure TForm1.FormCreate(Sender: TObject); begin Table1.Active := True; Table2.Active := True; Table3.Active := True; end;

15

procedure TForm1. FormClose(Sender: TObject; var Action: TCloseAction); begin Table1.Active := False; Table2.Active := False; Table3.Active := False; end;

Opcionalmente, voc tambm poder usar o mtodo Open e o mtodo Close para, respectivamente, abrir e fechar suas tabelas, ao invs de usar a propriedade Active. Observe como seria:
procedure TForm1.FormCreate(Sender: TObject); begin Table1.Open ; end;

E, para fechar:
procedure TForm1. FormClose(Sender: TObject; var Action: TCloseAction); begin Table1.Close; end;

Inserindo, Editando e Gravando Dados


Para podermos inserir dados e grav-los, precisamos colocar a tabela no que chamamos de modo de insero. Quando a tabela assume esse estado, o componente Table passa a permitir que o que est sendo digitado seja realmente inserido numa propriedade chamada EditText do DBEdit. E ao mandarmos que os dados sejam gravados, tudo o que estiver na propriedade EditText , de fato, transferido do componente para a tabela fsica no disco e salvo adequadamente. Podemos conseguir tudo isso com um simples componente: o DBNavigator, da paleta Data Controls. Trata-se de uma barra com 10 botes, cada um com uma funo especfica.

16

Figura 8 - O componente DBNavigator

O boto de adio (+) aquele que precisamos para colocar a tabela em modo de insero; j o grava os dados. Alm disso, as setas permitem a navegao pelo cadastro. Veja abaixo boto qual a finalidade de cada boto:

Boto

Funo

Vai para o primeiro registro da tabela Volta um registro Avana para o registro seguinte da tabela Avana para o ltimo registro Insere um novo registro Deleta o registro atual Modifica o registro atual Grava um registro Cancela a modifcao ou a insero de um novo registro, desde que ainda no tenha sido gravado Atualiza os dados na tela, enviando um comando refresh para a tabela

Eventos do Componente Table


O componente Table permite o tratamento de vrios eventos atravs da guia Events do Object Inspector. Vale a pena olhar, ao menos, trs deles: 17

AfterInsert AfterEdit

evento disparado sempre que se insere um novo registro numa tabela; evento disparado sempre que se altera (edita) um registro existente;

AfterPost evento disparado sempre que se grava as modificaes ou confirma-se a insero de um novo registro. Atravs da manipulao desses eventos podemos personalizar algumas mensagens para o usurio, indicando o que est acontecendo com a tabela assim, o usurio sentir que detm um maior controle sobre as operaes com o banco de dados. Vamos usar uma Barra de Status (StatusBar, da paleta Win32) para mostrar algumas mensagens cada vez que um dos trs eventos citados ocorrer. Selecione, ento, o componente Table e, para cada um deles, insira o cdigo apropriado:

procedure TForm1.Table1AfterInsert(DataSet: TDataSet); begin StatusBar1.SimpleText := 'Inserindo dados ...'; end; procedure TForm1.Table1AfterPost(DataSet: TDataSet); begin StatusBar1.SimpleText := 'OK'; end; procedure TForm1.Table1AfterEdit(DataSet: TDataSet); begin StatusBar1.SimpleText := 'Editando ...'; end;

Usando Aliases pr-definidos


O Delphi j traz, na BDE, alguns aliases pr-definidos, com vrias tabelas em Paradox e DBASE criadas para demonstrao. O mais importante o DBDEMOS, que aponta para C:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Data. L, h diversas tabelas que podemos usar para testar alguns recursos. Vamos fazer isso agora. Crie uma nova aplicao, coloque um componente Table no form1 e, na propriedade DataBaseName do Table, selecione DBDEMOS; na propriedade TableName coloque animals.dbf. D dois cliques no objeto Table e, na janela que se abre use o boto direito do mouse e selecione Add Fields.... Os campos mostrados na Figura 9 iro aparecer. Clique em OK para adicionar todos eles e, em seguida, arrasteos para o formulrio.

Figura 9 - Campos da tabela Animals.dbf

18

Ajuste os campos no form para que fiquem semelhantes Erro! Fonte de referncia no encontrada.. Adicione, ainda, um DBNavigator (da paleta Data Controls) e, atravs de sua propriedade DataSource, conecte-o ao Datasource1. Para visualizarmos o que j temos cadastrado ali, precisamos abrir a tabela, o que sempre interessante fazermos via cdigo. Para isso, no evento OnCreate do form, coloque isto:

Figura 10 - Layout da aplicao com DBDEMOS

procedure TForm1.FormCreate(Sender: TObject); begin Table1.Open; end;

Ainda no layout, aumente um pouco as dimenses do objeto DBImage para que as figuras que esto no banco de dados possam ser vistas por completo. Uma largura de 200 pixels por 185 de altura deve ser suficiente:

Figura 11 - Modificando o layout

19

Execute sua aplicao pressionando F9 e veja os dados contidos nesta tabela:

Figura 12 - Dados da tabela 'animals.dbf'

Note que as imagens da tabela so armazenadas num campo do tipo BINARY (ou BLOB Binary Large Object), que permite a insero de dados que no sejam caracteres numricos, lgicos ou de texto. Se voc abrir a tabela animals.dbf no Database Desktop ver estes dados:

Para campos que armazenam figuras o Delphi traz um componente especfico para exibi-las: o DBImage. Ele capaz de ler os dados binrios l armazenados e carreg-los no componente para visualizao. Claro que voc tambm pode inserir suas prprias figuras ali, desde que Figura 13 - Registros da tabela estejam no formato Bitmap do Windows (.Bmp). Vamos fazer isso com nossa aplicao. Adicione um boto abaixo do DBImage e altere seu Caption para Inserir Figura. interessante ainda adicionarmos um componente no-visual chamado OpenPictureDialog, da paleta Dialogs, que nos permite buscar pelas pastas do sistema a figura deseja e selecion-la para insero no banco.

D dois cliques no boto que voc adicionou para gerar um evento OnClick para ele. L, digite o seguinte:

20

procedure TForm1.Button1Click(Sender: TObject); begin if (Table1.State in [dsInsert]) then begin if OpenPictureDialog1.Execute then Table1BMP.LoadFromFile ( OpenPictureDialog1.FileName ); end; end;

Note o que estamos fazendo aqui. Primeiro, antes de inserirmos qualquer coisa na tabela, precisamos descobrir se ela est em modo de insero. O modo de insero acontece sempre que se pressiona o boto + do DBNavigator. Assim, com a comparao if (Table1.State in [dsInsert]) ... estamos verificando se a tabela (atravs da propriedade State) contm o estado dsInsert. Se sim, indica que o boto de insero foi pressionado e podemos prosseguir com o cadastro. O passo seguinte chamar para execuo o componente OpenPictureDialog atravs do mtodo Execute. Este mtodo exibe a caixa de dilogo de Abrir arquivo, tpica do Windows (Figura 14). Sempre que selecionamos um arquivo e clicamos em Abrir nesta janela, o mtodo Execute retorna True; quando clicamos em Cancelar, retorna False. Desse modo, if a linha
OpenPictureDialog1.Exe cute then ... est

Figura 14 - Caixa de OpenPictureDialog

verificando se o mtodo est retornando True (a ausncia de =true numa comparao faz subentender que se est verificando se a condio apresentada verdadeira). Sendo verdadeira, a instruo da linha logo abaixo ser executada: Table1BMP.LoadFromFile ( OpenPictureDialog1.FileName ) diz para o campo BMP da tabela Table1 carregar o contedo selecionado em OpenPictureDialog. Esse contedo, que o caminho completo de pastas at o nome do arquivo escolhido, fica guardado em FileName. Assim, o mtodo LoadFromFile( ) da tabela carrega o contedo encontrado em FileName. Teste sua aplicao. Execute-a, clique em + e, ento em Inserir Figura. Escolha uma imagem qualquer em clique em Abrir na caixa de dilogo. Sua figura ser inserida. Aproveite o modo de insero e cadastre um nome para seu animal, alm do tamanho (SIZE), peso (WEIGHT) e local (AREA) onde ele costuma habitar. Para gravar os dados, clique no boto .

21

Mais de um Formulrio no Mesmo Aplicativo


Um programa de computador, normalmente, no utiliza um formulrio, mas, sim, vrios deles. Alm do formulrio principal, que ser a janela inicial do programa, o usurio dever poder entregar com outras janelas, seja aps ter clicado num item de menu, seja aps um clique num menu boto. Para que o nosso programa tenha mais de uma janela, devemos adicionar um novo form a ele. Isso pode ser feito clicando-se no menu File > New > Form. Normalmente, fazendo isso, um novo form, chamado provisoriamente de form2, adicionado ao seu programa. Para que isso funcione corretamente, no entanto, necessrio alguns ajustes. Da maneira como est, os dois formulrios sero criados ao mesmo tempo na memria RAM do computador. algo desnecessrio, j que o usurio no ir utilizar os dois forms ao mesmo tempo. Alm do mais, um formulrio a mais na memria indica consumo de recursos que pode ser evitado. bvio que apenas um formulrio a mais no ir consumir uma quantidade desastrosa de memria, mas um aplicativo que tenha cem formulrios criados automaticamente j ser algo mais complicado. Para evitar isso, devemos modificar uma determinada opo para que o form2 seja criado apenas quando for realmente preciso. V ao menu Project > Options e selecione a guia Forms .Voc ver algo como mostrado a seguir:

Figura 15 - Formulrios em 'Auto-Create'

Na rea retangular Auto-create forms, clique sobre o Form2 e pressione o boto

> . Isso

22

indicar ao aplicativo que este formulrio no mais dever ser criado automaticamente e, sim, manualmente. Clique em OK para confirmar. Finalmente, para que o Form1 chame o Form2, podemos usar esse cdigo:

Form2: = TForm2.Create (self); Form2.ShowModal;

Fazendo isso, nosso form2 ser devidamente criado na memria atravs do mtodo Create() e mostrado no vdeo com o mtodo ShowModal. interessante notar duas coisas: o mtodo Create( ) precisa saber quem o proprietrio (chamado de Owner pelo Delphi ) do form que est sendo criado e, por esse motivo, passa-se funo o parmetro Self, indicando que ele mesmo (o prprio form2 ) responsvel pela sua manuteno na memria . Ainda h mais um detalhe: ao fechar o form2, j que ele foi criado manualmente, devemos garantir que a memria usada por ele seja realmente liberada. Para isso, no evento OnClose do formulrio digite o cdigo a seguir:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; Form2 := nil; end;

O cdigo acima garante que a memria alocada pelo Delphi para armazenar o formulrio 2 seja liberada (Action := caFree) e garante que, se algum endereo de memria ainda aponta para uma varivel chamada Form2, esse referncia seja desfeita (Form2 := nil).

23

Usando o componete Query


O componente Query, presente na paleta BDE, facilita bastante a pesquisa em tabelas, pois permite a utilizao direta de comandos SQL Structured Query Language. Neste captulo, veremos alguns exemplos de como utilizar este componente. Para as explicaes a seguir, usaremos, inicialmente, uma tabela Paradox chamada Produtos com esta estrutura: Salve a tabela usando o mesmo Alias utilizado no captulo anterior desta apostila. Ainda usando o Database Desktop, vamos inserir alguns dados em nossa tabela apenas para no perdermos o foco de nossa aplicao. Clique nos botes Field View e Edit Data do software para habilit-lo para insero e edio de dados.

Figura 16 - Estrutura da tabela

Instrues SQL com Query

Observe, inicialmente, uma simples consulta select utilizando uma Query. Para isso, monte uma aplicao semelhante mostrada na Figura 2Figura 17. Adicione ao form uma Query, um Datasource e um DBGrid (da paleta Data Controls). Agora, vamos criar um vnculo entre estes componentes. Com o DBGrid selecionado, v ao Object Inspector e procure por sua propriedade Datasource. Clique nela e escolha a opo Datasource1.

Agora, clique no seu componente Datasource, presente em seu formulrio e conecte-o com a Query, selecionando Query1 na propriedade DataSet. Por fim, clique na Figura 17 - Pequena aplicao com Query Query1 e, na propriedade DataBaseName, procure o 24

Alias para sua tabela Produtos. No boto Pesquisar, digite o cdigo a seguir:

Query1.Close; Query1.SQL.clear; Query1.SQL.add(select * from Produtos.db where PRODUTO like +Edit1.Text+%); Query1.Open;

Vamos s explicaes. A propriedade SQL uma lista de texto (chamada de Stringlist) que permite adicionar um comando por linha. esta propriedade que executada quando disparamos a Query. Por isso, adicionamos a um select para nossa consulta. Mas para que esta propriedade possa ser editada, a Query precisa estar fechada. Portanto, comeamos nosso cdigo com Query1.Close. Em seguida, para garantirmos que no h restos de consultas ou cdigos SQL anteriores, promovemos uma limpeza na propriedade SQL, removendo qualquer linha de comando que, porventura, l existisse (Query1.SQL.Clear). Com SQL.Add adicionamos um comando SQL e, depois, para execut-lo, chamamos o mtodo Open da Query. Desse modo, nosso boto Pesquisar, ao ser acionado, buscar qualquer nome de produto que se inicie com os caracteres digitados no Edit do seu form e ir mostr-lo no DBGrid.

Somando os valores de um campo


Uma maneira muito eficiente de se obter a totalizao de valores de uma determinada coluna da tabela atravs da linguagem SQL. Com ela, podemos no somente realizar consulta de valores como tambm som-los. O comando a seguir faz isso:

Select SUM(preco) as Total

from Produtos.db

O comando acima faz a soma (SUM) de todos os valores cadastrados no campo Preco e totalizaos num campo virtual recm-criado chamado Total. Usando o componente Query, podemos fazer a mesma coisa atravs de sua propriedade SQL. Essa propriedade permite armazenar comandos SQL e execut-los em um aplicativo Delphi.

25

Figura 18 - Sentena SQL numa Query

Para tanto, selecione o componente Query clicando uma vez sobre ele e, depois, no Object Inspector, clique na sua propriedade SQL. No pequeno editor que aparecer, digite a sentena SQL mostrada anteriormente (observe a Figura 18). D OK. Depois, clique na sua propriedade DatabaseName e localize seu alias, selecionando-o. Em seguida, d dois cliques na Query e, com o boto direito do mouse, clique em Add Fields... para adicionar o campo Total ao componente. Desse modo, o Query saber que existe um campo com esse nome na nossa consulta, mesmo ele no pertencendo tabela fsica. Para que isso funcione, precisamos abrir a Query. Podemos fazer isso atravs do evento OnClick de algum boto ou item de menu, digitando o seguinte:
Query1.close; Query1.open; ShowMessage(Query1Total.asString);

Isso executar a Query e mostrar o somatrio em uma caixa de mensagens. No entanto, podemos alterar isso para que o resultado seja mostrado numa barra de status (StatusBar) ou num Label. No primeiro caso, o cdigo ficaria como este:
Query1.close; Query1.open; StatusBar1.SimpleText := Query1Total.asString ;

Ou, se preferir o Label:


Query1.close;

26

Query1.open; Label1.Caption := Query1Total.asString ;

Buscando o Maior e o Menor Valor


Usando os mesmos princpios mostrados anteriormente, podemos tambm buscar, dentre os preos existentes na tabela, qual deles o maior e qual o menor. A sintaxe no mudaria muito:

Select MAX(preo) as Maior from Produtos.db

O comando acima busca o maior (MAX) preo de todos os valores cadastrados no campo Preo e armazena-o num campo virtual recm-criado chamado Maior. Para que isso funcione, podemos adicionar uma nova Query no formulrio (que seria nossa Query2) e inserir esta linha de comando em sua propriedade SQL. Feito isso, clique na propriedade DatabaseName da nova Query e localize o mesmo alias. Depois, d dois cliques na Query e, com o boto direito do mouse, clique em Add Fields... para adicionar o campo Maior ao componente. Finalmente, para que esta nova consulta funcione, precisamos abri-la da mesma maneira como fizemos com a anterior. Use o evento OnClick de algum boto ou item de menu, digitando o seguinte:
Query2.close; Query2.open; StatusBar1.SimpleText :=

Query1Maior.asString ;

O exemplo acima est supondo que se deseja exibir o maior valor numa barra de status (StatusBar). Vamos fazer o mesmo para localizar o menor preo da tabela. Insira uma outra Query, que ser nossa Query3 e, em sua propriedade SQL, digite o seguinte:

Select MIN(preo) as Menor from Produtos.db

O comando acima busca o menor (MIN) preo de todos os valores cadastrados no campo Preo e armazena-o num campo virtual recm-criado chamado Menor. Ligue a Query3 ao seu respectivo alias, adicione o campo Menor lista de campos da Query e, depois, use um evento OnClick para disparar a consulta:
Query3.close; Query3.open; StatusBar1.SimpleText :=

Query3Menor.asString ;

O exemplo acima mostra o resultado numa barra de status (StatusBar). 27

Usando Apenas Uma Query Para Vrias Consultas


Observe que, embora tudo tenha funcionado a contento, foi necessrio usarmos uma Query para cada consulta. Isso significa que, se precisssemos realizar vinte consultas, precisaramos ter adicionado vinte componentes Query! Deve haver um meio mais fcil de resolver isso... E h, de fato. Ns adicionamos mais de uma Query porque os campos virtuais que queramos mostrar em cada uma delas possuam nomes diferentes. Numa consulta, ele se chamava Total; em outra, Maior e, na terceira, Menor. Poderamos, simplesmente, criar um campo genrico qualquer, chamado Valor e, via cdigo, modificar a propriedade SQL da Query para que se adequasse a cada uma das consultas. Ou seja, digitaramos uma delas diretamente na propriedade SQL disponvel no Object Inspector apenas para podermos adicionar o campo Valor Query e as demais seriam inseridas via cdigo. Vamos fazer isso. Remova as Query2 e Query3 do seu formulrio e vamos nos concentrar apenas na Query1. Selecione-a e, em sua propriedade SQL, modifique o comando existente para este:

Select SUM(preco) as Valor from Produtos.db

O comando acima faz a mesma soma (SUM), porm totalizando-a num novo campo virtual recm-criado chamado Valor. Isso significa que o campo anterior, chamado Total, no mais existir e precisamos delet-lo. Clique duas vezes sobre o componente Query, clique sobre o campo Total e pressione DELETE no teclado. Agora, adicione o novo campo Valor: d dois cliques na Query e, com o boto direito do mouse, clique em Add Fields... para adicion-lo. O campo Valor deve aparecer listado no componente. Agora, no evento OnClick que contm o cdigo para exibir o somatrio dos campos, substitua este cdigo:
Query1.close; Query1.open; StatusBar1.SimpleText := Query1Total.asString ;

por este:
Query1.close; Query1.SQL.Clear; Query1.SQL.add(select SUM(preco) AS Valor from Produtos.db); Query1.open; StatusBar1.SimpleText := Query1Valor.asString ;

Note as alteraes feitas: duas linhas a mais de cdigo foram utilizadas. A linha Query1.SQL.Clear faz com que todo contedo existente na propriedade SQL do objeto seja apagado. Isso importante, uma vez que pretendemos usar a mesma Query para realizar mais de uma operao: a de somatrio, a de valor mximo e de mnimo. Limpando-a assim, temos certeza de que nenhum resto do cdigo anterior ficou sobrando na consulta o que, invariavelmente, causaria um erro de execuo ao abr-la. 28

A linha Query1.SQL.add(select SUM(preo) AS Valor from Produtos.db) adiciona uma nova linha de comando propriedade SQL, j que limpamos todo seu contedo. Depois, abrimos a Query usando o mtodo Open. Para conseguirmos obter o maior e o menor valor cadastrado na tabela, usaremos a mesma Query, apenas modificando um pouco os comandos SQL utilizados. Desse modo, substitua o cdigo abaixo:
Query2.close; Query2.open; StatusBar1.SimpleText :=

Query2Maior.asString ;

por este:
Query1.close; Query1.SQL.Clear; Query1.SQL.add(select MAX(preo) AS Valor from Produtos.db); Query1.open; StatusBar1.SimpleText := Query1Valor.asString ;

Observe que a primeira grande mudana que temos aqui com relao ao nome da Query: substitumos o nome Query2 (que deletamos do form) por Query1. Na ltima linha, tambm substitumos o campo Query2Maior (que deixou de existir) por Query1Valor nico campo existente na Query atual. E, claro, limpamos a propriedade SQL da consulta para eliminar qualquer vestgio dos comandos de somatrio e adicionamos o novo comando, para selecionar o maior preo existente: Query1.SQL.add(select MAX(preo) AS Valor from Produtos.db). Assim, estamos ganhando tempo de processamento e economizando referncias a componentes diversos, centralizando tudo em uma nica Query, apenas alterando-a via cdigo. Falta, ainda, a busca pelo menor valor que, antes, estava desse jeito:
Query3.close; Query3.open; StatusBar1.SimpleText :=

Query3Menor.asString ;

Modifique o cdigo para que fique assim:


Query1.close; Query1.SQL.Clear; Query1.SQL.add(select MIN(preo) AS Valor from Produtos.db); Query1.open; StatusBar1.SimpleText := Query1Valor.asString ;

Do mesmo modo, note que no usamos mais Query3 e, sim, Query1. Na ltima linha, tambm substitumos o campo Query3Menor (que deixou de existir) por Query1Valor e, ainda, limpamos a propriedade SQL para evitar conflito com os comandos anteriores. E o cdigo para

29

localizar o menor valor foi adicionado atravs da funo Add: Query1.SQL.add(select


MIN(preo) AS Valor from Produtos.db).

Obtendo o Nome do Produto Alm do Maior e Menor Preo


At agora, utilizamos as instrues SQL MAX e MIN para obtermos o maior e o menor preo. Mas a desvantagem do que fizemos que, embora tenhamos descoberto os valores desejados, ficamos sem saber qual era o produto de preo mais elevado e qual o de menor valor. Uma consulta como esta, que no retorne o nome do produto, dificilmente ser til na prtica. Portanto, ser necessrio alter-la. Pensemos da seguinte maneira: para conseguirmos obter o nome de um produto, precisamos de um comando SQL como este:

Select produto, preco from Produtos.db

Isso nos retorna todos os produtos e preos cadastrados, independentemente de quais sejam seus valores. Se combinarmos este comando com o comando anteriormente utilizado, ento conseguiremos selecionar apenas o nome de produto cujo preo contm o critrio desejado. Observe como ficaria:

Select produto, preco from Produtos.db where preco = (Select MAX(preco) from Produtos.db)

Note o que fizemos: a primeira parte do comando, Select produto, preco from Produtos.db where preo =, seleciona os campos produto e preo da tabela produtos onde o preo igual a um determinado valor, enquanto a segunda parte, (Select MAX(preo) from Produtos.db), nos traz o maior preo. Assim, estamos dizendo que queremos encontrar o produto e o preo cujo preo dever ser igual quele obtido em resposta ao parmetro MAX da segunda parte da instruo SQL. Observe tambm que no utilizamos nenhum campo virtual desta vez (como fizemos anteriormente com MAX(preo) as Valor ...), j que o que desejamos visualizar so os campos produto e preo propriamente ditos, e no outro.

30

Usando outros comandos SQL com Query


No precisamos usar apenas o tradicional select com uma Query. Praticamente, qualquer comando SQL aceito pelo Paradox e podemos us-lo em nossas consultas. Observe este exemplo onde usamos o comando DELETE do SQL:

Figura 19 - Usando o comando DELETE do SQL

Aqui temos um DBGrid, um componente Edit, um Button e uma Query com seu Datasource correspondente. Vamos incluir um cdigo no boto Deletar que far com que a nossa Query seja preenchida por um comando SQL que apague os registros cujos nomes contiverem a palavra informada no Edit:
Procedure TForm1.Button1Click(Sender: TObject) begin Query1.SQL.Clear; Query1.SQL.add(delete from clientes.db where nome LIKE %+Edit1.Text+%); Query1.ExecSQL; End;

O comando acima far com que os dados que coincidirem com o critrio digitado no Edit seja deletado. Por exemplo, se o usurio digitar A (a letra A, sem as aspas), e houver mais de um nome que contenha a letra A, todos esses nomes sero deletados sem aviso prvio, pois o comando Delete no pede confirmao antes de apagar dados. Portanto, numa situao real, devese tomar cuidado ao utiliz-lo. Observe tambm que, aqui, no usamos Query1.Open para executar a Query e, sim, Query1.ExecSQL. Isso porque o Query1.Open s vlido para instrues que retornem dados. Por exemplo, um select retorna uma coleo de dados, que sero mostrados ao usurio. J o delete no retorna nada, apenas executa algo que foi pedido (no nosso caso, o comando delete). Para tanto, quando o objetivo executar uma Query que no retorne dados, usamos o mtodo ExecSQL. 31

Neste exemplo, portanto, no veramos os resultados do comando delete. Mas podemos dar um jeito nisso adicionando um componente Table, um outro Datasource e conect-los tabela Clientes.db. Conecte o DBGrid ao novo Datasource (atravs de sua propriedade Datasource) e, no evento OnCreate do formulrio, digite o seguinte:
Procedure TForm1.FormCreate(Sender: TObject) Begin Table1.Open; End;

Isso far com que a tabela seja aberta logo no incio do seu aplicativo, mostrando os dados no DBGrid. Mas para vermos as alteraes nos dados aps a execuo da Query, voltemos ao boto Deletar para uma pequena alterao:
Procedure TForm1.Button1Click(Sender: TObject) begin Query1.SQL.Clear; Query1.SQL.add(delete from clientes.db where nome LIKE %+Edit1.Text+%); Query1.ExecSQL; Table1.Refresh ; End;

Note o acrscimo da linha Table1.Refresh, que far com que a tabela seja lida novamente e, conseqentemente, as alteraes possam ser vistas.

Figura 20 - Visualizao do aplicativo com comando DELETE

32

Usando o comando INSERT e UPDATE


O comando SQL UPDATE permite modificar dados de um ou mais registros. Imaginemos a mesma tabela Clientes.db numa outra aplicao onde o objetivo seja inserir dados usando INSERT e depois alter-los com UPDATE. Para isso, crie um novo projeto e faa com que fique com a aparncia abaixo:

Figura 21 - Aplicao com cadastro e pesquisa

Neste projeto, h um objeto novo: o PageControl. Sua funo, aqui, separar algumas funcionalidades: numa aba, teremos a parte de cadastro; em outra, a de pesquisa. Para usar o componente PageControl, proceda assim: na paleta de componentes do Delphi, selecione a guia Win32 e clique no componente PageControl. Depois, clique no seu formulrio. Ajuste-o para que ocupe a maior parte da rea de sua Figura 22 - Inserindo um PageControl aplicao. Agora, vamos adicionar as abas Cadastro e Pesquisa. Clique com o boto direito do mouse sobre o componente que voc acabou de adicionar e escolha a opo New Page. Note que uma aba chamada TabSheet1 aparece. Procure sua propriedade Caption no Object Inspector e altere seu texto para Cadastro. Para adicionar outra aba, repita o procedimento e renomeie-a para Pesquisa. Vamos manter, neste exemplo, a propriedade Name de cada aba intactas como, respectivamente, TabSheet1 e TabSheet2. Arraste para a aba Cadastro quatro Edits, quatro Labels, um boto Novo Cadastro, um Gravar Cad. (que ser usado para inserir novos registros) e um Gravar Modif. (para alterar registros existentes). Coloque tambm, em qualquer local do form, 3 componentes Query: Query1, Query2 e Query3. Para facilitar a codificao, altere a propriedade Name de cada boto 33

para que reflita sua real funcionalidade. O boto Novo Cadastro, por exemplo, poderia chamarse BtnNovo, o Gravar Cad. poderia ser BtnGravarCad e o seguinte BtnGravarModif. Vamos, primeiramente, focar na parte de cadastro e depois veremos o que fazer com a aba de pesquisa. Ela funcionar da seguinte maneira: inicialmente, quando no houver nenhum cadastro na tabela, deve-se clicar em Novo Cadastro e utilizar os Edits esquerda para informar os dados do novo registro. Nesta aplicao, o boto Novo Cadastro apenas servir para limpar os Edits caso j haja dados sendo exibidos portanto, antes de cada novo cadastro, devemos clicar neste boto. Uma vez digitado os dados do cadastro, clica-se em Gravar Cad.. Isso far com que a Query1 seja executada - nela, teremos a instruo SQL INSERT. O boto Gravar Modif. Somente ser usado quando, aps localizar um determinado cadastro via pesquisa, fizermos uma alterao e quisermos salvar tais modificaes. Portanto, ele depende dos dados vindos da aba Pesquisa do PageControl. Vamos aos cdigos. Primeiro, o boto Novo Cadastro:
Procedure TForm1.BtnNovoClick(Sender: TObject) begin Edit1.Clear; Edit2.Clear; Edit3.Clear; Edit4.Clear; End;

Veja, agora, o cdigo para o boto Gravar Cad.:


Procedure TForm1.BtnGravarCadClick(Sender: TObject) begin Query1.SQL.Clear; Query1.SQL.add(insert into Clientes.db values(+Edit1.Text +, + Edit2.Text +, + Edit3.Text + , + Edit4.Text +)); Query1.ExecSQL; End;

Note, novamente, o uso do mtodo ExecSQL, j que um INSERT no retorna nenhum dado. Alis, justamente pelo fato de no termos nenhum retorno, seria interessante que nossa aplicao nos informasse se o tal INSERT deu certo ou no. Faamos, ento, uma pequena alterao no cdigo acima:
Procedure TForm1.BtnGravarCadClick(Sender: TObject) begin Query1.SQL.Clear; Query1.SQL.add(insert into Clientes.db values(+Edit1.Text +, + Edit2.Text +, + Edit3.Text + , + Edit4.Text +)); Try Query1.ExecSQL; Except Application.Messagebox(Erro inserindo dados!,Erro,16); End; Application.Messagebox(Dados inseridos com sucesso!,Dados OK,64); End;

34

Note a presena do bloco Try Except End. Aqui estamos realizando um tratamento de exceo. Caso haja algum problema durante a execuo do comando SQL, a aplicao interrompida e direcionada automaticamente para o bloco Except, onde uma mensagem de erro personalizada avisar o usurio de que no foi possvel inserir os dados solicitados. Caso tudo transcorra sem problemas, o bloco Except no executado, o comando SQL finalizado normalmente e a mensagem de sucesso ser apresentada na tela. Assim, sempre que nosso INSERT for bem sucedido, a mensagem Dados inseridos com sucesso ir aparecer; do contrrio, Erro inserindo dados ser apresentada na tela. Antes de codificarmos o prximo boto, vamos preparar a aba Pesquisa. Nela, adicione outro Edit, um Label, um boto e um DBGrid e ajuste-os para que fiquem conforme a figura a seguir:

Figura 23 - Aba para pesquisa

Ligue o DBGrid ao DataSource e este Query3. Usando o Object Inspector, na propriedade SQL da Query3, digite o comando abaixo:
Select * from Clientes.db

Clique em OK. Isso necessrio para que possamos adicionar os campos da tabela Query, tornando-os disponveis em tempo de projeto e acessveis via cdigo. Agora, d dois cliques na Query3 e com o boto direito do mouse, clique em Add Fields. Todos os campos disponveis na tabela aparecero. Clique em OK para inclu-los na Query. No cdigo do boto Buscar, digite o seguinte:
Figura 24 - Disponibilizando os campos na Query

35

Procedure TForm1.BtnBuscarClick(Sender: TObject) begin Query1.Close; Query1.sql.clear; Query1.SQL.add('select * from "clientes.dbf" where nome like "'+Edit5.text+'%"'); Query1.Open ; End;

Dependendo do que for digitado no Edit, a pesquisa pode retornar mais de um registro. Por isso, para edit-lo, preciso antes selecion-lo no DBGrid para indicar que aquele registro em particular que iremos modificar.

Figura 25 - Realizando uma busca

Vamos configurar, ento, o DBGrid para que, ao clicarmos duas vezes numa linha, os dados daquele registro sejam transferidos para a rea de edio da aba Cadastro. Clique no DBGrid e, na guia Events do Object Inspector, procure o evento OnDblClick. Clique duas vezes sobre ele para gerar a procedure correspondente. O evento OnDblClick ocorre sempre que efetuamos um duplo-clique num objeto. Assim, aqui, vamos inserir um cdigo que ser executado sempre que clicarmos duas vezes num registro do DBGrid. Como os dados que esto ali so da Query, ento esta tambm sabe em qual registro voc est clicando. Basta, ento, transferir os dados para os Edits da aba Cadastro:

36

Procedure TForm1.DBGrid1DblClick(Sender: TObject) begin PageControl1.ActivePage := TabSheet1; Edit1.text := Query3NOME.Value; Edit2.text := Query3ENDERECO.Value; Edit3.text := Query3CIDADE.Value; Edit4.text := Query3ESTADO.Value; End;

Note a primeira linha do cdigo:


PageControl1.ActivePage := TabSheet1;

Isto faz com que, de imediato, a aba selecionada seja a do cadastro (cuja propriedade Name TabSheet1). Em seguida, atribumos a cada um dos Edits o valor de cada um dos campos da Query. Aps alterarmos as informaes desejadas, basta enviarmos os dados de volta tabela de clientes. E isso feito com o boto Gravar Modif.. Vamos, ento,
Figura 26 - Exibindo os dados para edio

codific-lo a contento:

Procedure TForm1.BtnGravarModifClick(Sender: TObject) begin Query1.SQL.Clear; Query1.SQL.add(update Clientes.db set Nome = +Edit1.Text +, Endereco = + Edit2.Text + , Cidade = + Edit3.Text + , Estado = + Edit4.Text + where Nome = + Query3NOME.Value+); Query1.ExecSQL; End;

Note um detalhe de extrema importncia em nosso UPDATE: igualamos todos os Edits a seus respectivos campos da tabela, garantindo que qualquer Edit que, porventura, tenha sido alterado seja atualizado no banco. Mas a clusula where precisa ficar de fora disso; como no sabemos se o campo Nome foi alterado ou no, precisamos manter a igualdade originalmente vinda da consulta, comparando Nome com seu valor original, isto , com o obtido em Query3NOME.Value. Isso garantir a integridade dos dados da tabela. 37

Tambm neste cdigo seria interessante apresentarmos uma mensagem ao usurio sempre que as modificaes forem bem sucedidas. Vamos modific-lo, ento:

Procedure TForm1.BtnGravarModifClick(Sender: TObject) begin Query1.SQL.Clear; Query1.SQL.add(update Clientes.db set Nome = +Edit1.Text +, Endereco = + Edit2.Text + , Cidade = + Edit3.Text + , Estado = + Edit4.Text + where Nome = + Query3NOME.Value+); Try Query1.ExecSQL; Except Application.Messagebox(Erro alterando dados!,Erro,16); End ; Application.Messagebox(Dados modificados com sucesso!,Dados OK,64); End;

38

39

Introduo
Uma maneira bastante prtica de transportas suas aplicaes para outros computadores (como mquinas de clientes, por exemplo) usar Instaladores. Os instaladores de software desempenham a tarefa mais rdua da configurao de um aplicativo, que a preparao do sistema operacional para a execuo de um novo programa. O Delphi traz, em suas edies Professional e Enterprise, uma edio especial do instalador InstallShield - o InstallShield Express for Delphi. Nesta edio especial do instalador, possvel, atravs de vrios passos, preparar a aplicao que voc criou para que ele seja instalada em outro computador que no possua o Delphi. Alm disso, possvel personalizar a instalao, atravs de opes especficas. H tambm opes gratuitas na web, como o Inno Setup.

Verses do InstallShield
Este APNDICE mostrar como utilizar duas verses do InstallShield: a verso 2.12 que acompanha o Delphi 5 e oferece suporte para as verses de Windows at o Windows 2000, passando pelo Windows NT 3.51 e NT 4.0; e a verso 3.03, que acompanha o Delphi 6 e oferece suporte para as mesmas verses do Windows j mencionadas (exceto NT 3.51) mais o Windows ME. Como as duas verses so bastante teis, embora possuam layouts bastante diferentes, ficou decidido que este APNDICE abordaria ambas em detalhes. O InstallShield Express que acompanha o Delphi 7 (verso 3.5 com Service Pack 4) bastante semelhante verso 3.03 e ser abordada rapidamente ao final do APNDICE. A grande vantagem que a verso 3.5 passa a oferecer suporte ao Windows XP. Tambm mostrar como usar o software Inno Setup para criar instaladores personalizados e sem custo algum. Nas pginas seguintes, voc ir aprender a utilizar o InstallShield para criar seus prprios instaladores.

40

Usando o InstallShield para Delphi 5.0


Este tpico descreve como criar discos (ou CDs) de instalao utilizando o InstallShield Express para Delphi 5.0. Esta edio do InstallShield permite gerar instaladores para Windows 95, 98, 98 SE, Windows NT 3.51 e 4.0 e tambm para o Windows 2000. Para iniciar o InstallShield, v at o boto INICIAR do Windows, acione PROGRAMAS e, em seguida, clique em InstallShield Express For Delphi 5 e, depois, em Express for Delphi 5. Ao inici-lo, escolha Create a New Setup Project. Caso voc j estivesse trabalhando em um projeto de Setup e desejasse retom-lo, poderia escolher Open a Existing Setup Project isso abriria uma janela para que voc pudesse procurar um arquivo com extenso *.IWZ em seu disco rgido. Como vamos criar um Setup do zero, escolha Create a New Setup Project e clique em OK. Uma tela semelhante a mostrada na Figura 27 dever aparecer. Em Project Name, d um nome ao seu projeto. No se preocupe muito com esse nome: ele no ser mostrado pelo InstallShield quando o usurio executar seu instalador. Project Name ser apenas um arquivo de extenso *.IWZ que permitir voc abrir seu instalador em modo de edio em outras ocasies para realizar qualquer modificao que julgar necessria. Chame-o de Meu Instalador.

Figura 27 - Tela New Project do InstallShield

Em New Subdirectory, voc deve especificar um novo nome de diretrio para salvar seu arquivo *.IWZ. Voc pode usar as letras de drives e diretrios mostrados no canto direito para navegar at um local apropriado para seu subdiretrio. Feito isso, clique em Create. Uma nova tela aparecer. a partir desta nova tela que comearemos a criar efetivamente as opes do nosso instalador.

41

Clique na primeira opo, Application Information. Surge a tela semelhante a mostrada na Figura 28. Agora sim, na guia App Info, em Application Name, voc deve informar o nome definitivo de seu aplicativo. Este o nome que o instalador exibir em suas telas de apresentao. Em seguida, informe o caminho do seu executvel em Application Executable. Para isso, clique em Browse e navegue pela rvore de diretrios at localizar o arquivo *.EXE que voc gerou no Delphi. Localizado o arquivo, clique duas vezes sobre ele. Note que, se voc deixou o prprio Delphi controlar o autoincremento de verses de seu aplicativo, a verso atual aparece no campo Version.
Figura 28 - Opes do Installshield

Se voc tem uma empresa de desenvolvimento e quer que o nome dela faa parte do caminho de instalao, digite o nome dela em Company.

Verifique o caminho onde seu aplicativo ser instalado em Default Destination Directory. Se deseja modificar o caminho manualmente, edite este campo. Recomendamos que deixe o diretrio de instalao semelhante a <ProgramFileDir>\Meu Aplicativo, onde Meu Aplicativo deve ser o nome de seu aplicativo (conforme voc definiu no campo Application Name) e <ProgramFileDir> uma varivel do InstallShield que aponta para C:\Arquivos de Programas (ou C:\Program Files, caso o Windows da mquina de destino esteja em ingls).

Mude agora para a guia Main Window. Em Main Title, voc deve dizer ao Installshield se Figura 29 - Guia Main Window deseja que o nome de seu aplicativo seja exibido em formato texto (Text) ou se deseja, ao invs disso, exibir alguma espcie de design que contenha o nome da aplicao previamente a partir de um arquivo do tipo *.bmp. Caso prefira o arquivo *.bmp, selecione Bitmap e clique em Browse para buscar a imagem desejada. Do contrrio, deixe selecionado o item Text. Tambm possvel exibir um logotipo para sua aplicao ou empresa. Para isso, em Logo Bitmap, clique em Browse e carregue um arquivo *.bmp desejado ou, para no exibir nenhum 42

logo, deixe o respectivo campo em branco. Observe no exemplo abaixo onde ficariam dispostas, respectivamente, o Bitmap escolhido no primeiro campo e o bitmap que seria o logotipo.

Figura 30 Esquema representativo: o logotipo ficaria no canto direito (em amarelo) e a outra imagem ficaria onde est a marcao em azul.

Tanto uma imagem quanto a outra deve conter apenas 16 cores. Imagens com resolues superiores a 16 cores podem no aparecer corretamente no vdeo. Ainda na mesma tela, escolha qual a cor de fundo que voc gostaria de usar. Basta selecionar uma opo em Background Color. A Figura 30 utiliza a cor Solid Teal. Teste as outras cores e veja a que mais lhe agrada. As cores que comeam com a palavra Dithered indicam tonalidades de degrade. E, finalmente, na guia Features, deixe marcada a opo Automatic Uninstaller, se quiser que o usurio tenha a possibilidade de desinstalar seu software atravs da opo Adicionar e Remover Programas do Painel de Controles. V agora para General Options. Na guia General, verifique se seu aplicativo faz uso de algum dos pacotes de software listados. Por exemplo, se seu aplicativo faz acesso a Banco de Dados e utiliza Alias da BDE, recomendvel marcar a opo BDE (Borland Database Engine). medida que se vai marcando itens na guia General, novos arquivos vo aparecendo na guia Advanced. No os modifique. Feitas as devidas selees, clique em OK.

43

Se voc marcou a opo BDE (Borland Database Engine), uma tela nova surgir para que voc configure as opes de seu Banco de dados. Nesta primeira tela, apenas clique em Avanar. Na tela seguinte (Figura 31), clique no boto New e informe o nome do Alias utilizado em seu Banco de dados (se houver um alias). Clique em OK e, depois, em Avanar. Na tela seguinte, se voc deseja ter acesso BDE a partir de alguma mquina executando aplicativos de 16 bits, marque a opo Save .CFG File for Both 16-and 32-bit Applications. Do contrrio, apenas clique em Avanar.

Figura 31 - Adicionando Alias BDE

Na tela seguinte, em Alias Name, selecione o Alias que voc criou e, em Path, digite o caminho para o qual ele dever apontar quando estiver instalado na mquina de destino (na mquina do seu cliente, por exemplo). Voc pode digitar algo como <INSTALLDIR>\DATABA SE para que o Alias aponte para um diretrio Database localizado no diretrio de instalao do aplicativo 6 (<InstallDir> ). Em Type, escolha o tipo de banco de dados utilizado (Paradox, por exemplo).
Figura 32 - Caminho do Alias

Clique em Avanar, depois em Concluir para confirmar as opes e, finalmente, em OK.

<INSTALLDIR> tambm uma varivel do InstallShield

44

Figura 33 - Definindo Groups and Files

V para o item seguinte: Groups and Files. Clicando nele, surgur uma tela conforme ilustrado na Figura 33. Na guia Groups, os arquivos aparecem agrupados de acordo com o local aonde sero instalados. Por exemplo, clique no sinal de + ao lado de Program Files e voc ver o seu executvel ali. Caso queira alterar o local de instalao do mesmo, selecione Program Files, clique em Properties (no canto direito da tela) e, na tela Modify Group, altere a opo Destination Directory. Se desejar, pode renomear tambm o grupo, substituindo Program Files por qualquer outro nome.

Ainda em Modify Group, possvel tambm selecionar para quais verses do Windows deseja-se gerar o instalador. Por padro, todas as verses at o Windows 2000 so aceitas. Mas se voc sabe que a mquina de destino utiliza apenas Windows 98, por exemplo, no h necessidade de tornar seu instalador compatvel com outras verses. Desse modo, voc pode marcar e desmarcar as opes desejadas, conforme mostrado na Figura 34. Tambm possvel especificar para que arquivos existentes no local de instalao nunca sejam sobreescritos (Never Overwrite Files) ou para sempre atualizar os arquivos com as verses mais recentes (Update Files with Newer Version Numbers), etc. Clique em OK para fechar a janela Modify Group.
Figura 34 - Especificando verses do Windows

45

Voc pode, ainda, alm do grupo Program Files, adicionar outros grupos para arquivos especficos conforme sua convenincia, como arquivos de exemplos ou tutoriais. No exemplo da Figura 33, foi adicionado um grupo chamado Exemplos e outro chamado Tutorial. Sozinhos, no entanto, estes grupos no tm sentido. S h razo para eles existirem se ns atribuirmos arquivos a eles. Faamos isso. Selecione Exemplos e clique em Insert Files. Selecione os arquivos desejados para este grupo (pressionando CTRL voc pode selecionar mais de um arquivo por vez) e clique em Abrir. Repita o procedimento para Tutorial. Neste ponto da configurao do instalador, interessante notar que o Installshield pode oferecer ao seu usurio final trs tipos de instalao: Typical (Tpica), Compact (Mnima) e Custom (Personalizada). Se voc criou vrios grupos de arquivos, talvez voc queira permitir que o usurio possa escolher quais itens instalar. Se desejar isso, v at a guia Components. L, observe que, no canto da direita esto presentes todos os grupos que voc criou, cada qual contendo seus respectivos arquivos. Para permitir a seleo dos itens a instalar, necessrio criar o que o InstallShield chama de Componentes para estes grupos para que, ento, os grupos sejam associados aos componentes. Na tela de exemplo (Figura 35), temos em File Groups: Program Files, BDE/IDAPI Files, BDE/IDAPI CNF Files, Exemplos e Tutorial. No canto oposto, em Application Components, crie um componente Exemplo e um componente Tutorial. Para isso, basta clicar no boto Add Component, logo abaixo.

Figura 35 - Guia Components

Uma tela como a da Figura 36 deve aparecer. Informe o nome do componente e, em Description, digite uma breve descrio. O que for digitado nesta descrio ser exatamente o que o usurio ler durante a instalao portanto, preciso clareza. Terminado, clique em OK.

46

Faamos agora a associao entre componentes e os grupos de arquivo. Em Application Exemplos. Components,

os

selecione

No campo File Groups, selecione Exemplos e clique no boto Add To Application Component.
Figura 36 - Adicionando um Componente

Repita o procedimento para o componente Tutorial e seu respectivo grupo.

Agora, na guia Setup Types, poderemos visualizar os tipos de Setup: Custom, Typical e Compact. Por padro, o tipo Custom j assume todos os componentes criados anteriormente - e os mesmos podem ser visualizados em Application Components (canto direito da tela, conforme Figura 37).

Figura 37 - Tipos de Setup

Falta definir o que vai ser instalado quando o usurio selecionar a opo Typical e Compact. Para a Compact, vamos incluir apenas a opo Application Files, sem exemplos ou tutoriais.

Para isso, clique em Compact e, no canto direito, clique em Application Files. Pressione o boto Add To Setup Type, logo abaixo. Pronto: o link est feito. Faamos o mesmo com Typical. A instalao tpica, normalmente, contm todos os itens bsicos do aplicativo mais alguns adendos. Podemos incluir, ento, alm de Application Files, os arquivos de exemplos e no incluir os tutoriais. Para tanto, selecione Typical e, no outro campo, selecione Application Files e clique em Add To Setup Type. Selecione agora Exemplos e clique de novo em Add To Setup Types. Pronto! Clique em OK para sair da tela Specify Componentes and Files e voltar tela principal do InstallShield. Clique agora em Dialog Boxes. Nas opes desta nova janela possvel dizer quais as telas que o usurio ver quando estiver fazendo a instalao. A guia Preview mostra a tela selecionada atualmente no painel do canto esquerdo. Inicialmente, temos a tela de Boas-vindas (Welcome Bitmap) com uma imagem em seu interior. Voc pode querer exibir uma janela como esta para seu usurio. Neste caso, deixe-a selecionada e, na guia Settings (ao lado da guia Preview), clique em Browse para localizar uma figura que 47

seja coerente com seu aplicativo. Se no quiser esta tela com figura de boas-vindas, desmarque no painel da esquerda.

Figura 38 - Dialog Boxes: configurando as telas que o usurio ver na instalao

A tela seguinte, Welcome Message, uma mensagem de boas-vindas. Voc pode optar por mostrar tanto a figura de boas-vindas (Welcome Bitmap) quanto a mensagem (Welcome Message), ou escolher apenas uma delas. Depois vem a tela Software License Agreement. Aqui voc pode indicar um arquivo texto (no formato *.txt) contendo os dizeres da licena que voc criou para seu software. Basta clicar na guia Settings, depois em Browse, e navegar at seu arquivo *.txt. Se no quiser exibir uma licena para o usurio, desmarque esta opo. A tela a seguir - Readme Information - permite exibir um texto descritivo para o usurio. Qualquer informao relevante que o proprietrio do aplicativo gostaria de passar antes da instalao. Para exibir seu prprio texto aqui, basta escolher um outro arquivo texto (*.txt) com as informaes que voc digitou. A tela seguinte, User Information, aquele caixa de dilogo famosa na maioria dos aplicativos Windows, onde o usurio pode digitar seu nome e o nome da empresa (para o caso de se estar instalando numa empresa). Um exemplo desta tela mostrada na Figura 39. Se no desejar exibir uma tela como esta ao seu usurio final, desmarque a caixa de seleo correspondente.

48

Figura 39 - Tela mostrada na opo 'User Information'

Na opo seguinte, Choose Destination Location, voc permite que o usurio altere o local de instalao-padro de seu aplicativo. Caso no deseje que ele tenha essa liberdade, desmarque este item. Ateno especial para a prxima caixa de dilogo: Choose Database Location. Aqui onde ser instalado as tabelas de seu banco de dados (se houver um). Em Settings, voc deve informar o caminho para o qual seu Alias aponta. Se voc seguiu a sugesto dessa apostila, o caminho do alias deve ter ficado semelhante a <INSTALLDIR>\DATABASE. este o caminho que deve constar em Choose Database Location (se voc definiu outro caminho, faa as modificaes necessrias para que ele fique igual ao Alias). Alm disso, se voc utiliza um alias da BDE para acesso s tabelas do Banco, recomendvel desmarcar a opo Choose Database Location para que seu usurio no possa modificar o caminho especificado por voc. Isso particularmente importante quando se utiliza a BDE porque, se seu usurio alterar este caminho, o alias definido por voc no ir funcionar. As telas Setup Type e Custom Setup permitem, respectivamente, que o InstallShield exiba uma caixa de dilogo para que o usurio escolha o tipo de instalao (por exemplo, instalao mnima, instalao tpica, etc) e que o usurio escolha os itens que deseja instalar, caso ele opte por uma instalao personalizada (Custom Installation). Se voc deseja dar estas opes ao seu usurio final, habilite estes itens. Do contrrio, desmarque-os. A opo Select Program Folder permite alterar o nome sob o qual o aplicativo ir aparecer no item PROGRAMAS do boto INICIAR do Windows. Por padro, ele assume o nome dado ao aplicativo. Para alterar isso, v at a guia Settings e digite outro nome que julgue mais adequado. Se voc deixar marcada esta opo, no entanto, o usurio poder alterar este nome. Se isso no for desejvel para voc, desmarque este item. Start Copying Files uma caixa que mostra as opes escolhidas, normalmente para que o usurio possa confirm-las ou retornar a uma etapa anterior e modificar alguma opo. Se desejar pular esta parte, basta desmarc-la no quadro de seleo. Progress Indicator mostra os arquivos 49

que esto sendo instalados e o progresso total da instalao. interessante deixar habilitada esta opo. Depois vem a tela Billboards. Billboards so aqueles chamadas que a maioria dos programas de Setup exibe enquanto um aplicativo est sendo instalado, normalmente fazendo uma rpida propaganda dos recursos disponveis no software. Se desejar telas como estas em seu Instalador, crie um imagem com extenso *.bmp contendo informaes descritivas sobre seu aplicativo, renomeie-a para SETUP1.BMP e, depois, de volta ao InstallShield, em Settings, localize o arquivo recm-criado. Caso no deseje mostrar estas dicas, desmarque o item Billboards. A ltima tela Setup Complete. Se voc quiser que o usurio seja avisado quando a instalao terminar, marque esta opo (recomendvel). Alm disso, em Settings, tambm possvel pedir que o InstallShield mostre a caixa de dilogo solicitando que o micro seja reiniciado aps a instalao. Se quiser isso, marque o item Always Show Reboot Computer Dialog. Feita as devidas selees, podemos sair do tpico referente s Dialog Boxes clicando OK e retornando janela principal do InstallShield Express. Na etapa seguinte, voc pode obrigar o instalador a criar entradas no Registro do Windows para voc. Basta selecionar Keys para localizar a chave correspondente e, depois, Values, para informar o seu valor para aquele chave. Caso voc no tenha muita intimidade com o Registro do Windows, pule esta etapa. Vamos seguir agora para General Settings, onde poderemos personlizar o cone exibido pela nossa aplicao. Na guia General, conveniente substituir o nome do cone, j que ele assume o nome exato do executvel. Dessa maneira, se seu executvel chama-se ctrlestoque.exe, seu cone exibir ctrlestoque. Um cone com um nome assim no muito amigvel; prefervel algo mais descritivo, tal como Controle de Estoque. Para modific-lo, clique no campo Description e altere-o. Clique em Modify Icon para que ele assuma as modificaes.

Na guia Advanced, voc poder escolher onde o cone ser criado. Por padro, a opo Default Folder vem marcada, o que significa que o cone ser criado no local indicado anteriormente, em INICIAR \ PROGRAMAS. Voc pode ajustar isso sua necessidade clicando, por exemplo, em Desktop Folder, para que ele seja criado na rea de Trabalho do Windows. Selecione a opo que melhor lhe convir e clique em Modify Info. Depois, clique em OK. Pronto! O aplicativo instalador est finalizado.
Figura 40 - Onde o cone dever aparecer

Agora, para que os arquivos de instalao sejam gerados, clique em Disk Builder. Em Disk Size (perto do rodap da tela), escolha a mdia na qual deseja armazenar seu instalador por exemplo, se seu objetivo for copiar os arquivos em um CD, escolha CD-ROM. Caso prefira disquetes, o 50

que no mais recomendvel hoje em dia, escolha 1.44 MB. Escolhendo disquetes, o InstallShield gerar arquivos para o nmero necessrio de discos, sendo que cada disco estar em um diretrio, numerados nesta seqncia: DISK1, DISK2, DISK3, etc. Teste a execuo de seu instalador clicando em Test Run. Para copiar os arquivos para disquetes, clique em Copy to Floppy. No existe opo para gravar direto em CD. Para isso, use seu software de gravao preferido.

51

Usando o InstallShield para Delphi 6.0


O Installshield para Delphi 6.0 contm um layout diferente daquele que acompanha o Delphi 5.0. Vamos estud-lo agora. Ao iniciar o InstallShield, uma tela semelhante mostrada na Figura 41 exibida. Note que, na coluna do meio, esto as opes que iremos usar inicialmente, semelhante verso do InstallShield mostrada no tpico anterior. Para criar um projeto de instalao do zero, escolha a opo Create a New Project. Caso j tenha um projeto iniciado e queira modific-lo, escolha Open a Project. Em nosso exemplo, criaremos um projeto zerado, do mesmo modo como fizemos anteriormente. Escolha Create a New Project.

Figura 41 - InstallShield para Delphi 6

52

Na coluna da direita, aparece uma tela conforme a Figura 42. Nela, h um projeto em branco e, abaixo, o caminho onde o mesmo ser salvo. Diferentemente da verso anterior, esta verso do InstallShield salva o projeto com a extenso *.ISM e no mais como *.IWZ. Escolha o local apropriado para armazenar seus arquivos de projeto e clique em Create.

Figura 42 - Criando um projeto novo

Surge ento opes bastante semelhantes ao do instalador encontrado no Delphi 5. O item 1, Organize Your Setup, permite a definio de informaes gerais do aplicativo e tipos de instalao. Vamos a elas. Em General Information, a lista de opes a serem preenchidas extensa, mas no vamos usar todas. Procure, primeiro, a opo Keywords.

Figura 43 - Opes do InstallShield

As informaes digitadas aqui podero ser vistas quando o usurio clicar o arquivo *.MSI (arquivo que contm o pacote de instalao do Setup) com o boto direito do mouse, escolher Propriedades no menu popup e selecionar a guia Sumrio. Keywords devem ser inseridas separadas por ponto-e-vrgula. Em nosso exemplo, no usaremos isto. Depois, em Product Name, digite o nome de seu software. o nome que aparecer nas telas de instalao. Em INSTALLDIR, entre com o caminho de diretrio sob o qual seu aplicativo dever ser instalado na mquina de destino. O padro, como na verso anterior, [ProgramFilesFolder], que aponta para C:\Arquivos de Programas (ou C:\Program Files, para verses em ingls do Windows). Edite o caminho para que fique algo semelhante a [ProgramFilesFolder]\Meu Aplicativo. As opes Publisher / Product URL, Support URL, Support Contact e Product Update URL so vlidas apenas para o Windows 2000. Nestes locais, voc pode digitar endereos web onde o usurio poder ter acesso, respectivamente, ao site do seu produto, pgina de suporte tcnico, a um endereo de contato para suporte e ao local do site onde atualizaes do software so

53

disponibilizadas. Tais opes aparecero em Adicionar / Remover Programas do Win2000. Se no quiser disponibilizar link algum, apague o contedo destes campos. Em DATABASEDIR, entre um local vlido para instalar seu Banco de dados, se sua aplicao utilizar um. O caminho digitado aqui deve ser o mesmo que voc definir mais tarde para criar um alias, se seu software fizer uso deste recurso.

De volta coluna da esquerda, selecione Features. Este tpico exibe itens que serviro de base para os tpicos seguintes: Setup Types e Files. Atravs de Features, o software poder apresentar diferentes opes de instalao. Voc poder criar pequenos grupos, onde cada grupo contm determinados arquivos. Numa instalao personalizada, por exemplo, o usurio

Figura 44 - Features da instalao

poderia selecionar quais destes grupos iria instalar. Um exemplo de como isso funcionaria pode ser visto na Figura 44. Suponha que foram criados quatro grupos: Executvel, Base de Dados, Arquivos de Ajuda e Exemplos. Cada um destes grupos conteria arquivos especficos. Se o usurio no desejasse instalar, por exemplo, os arquivos de Exemplo, bastaria ele desmarcar essa opo. Por padro, ao selecionar Features no InstallShield, pelo menos um grupo j existe: o Always Install. Coloque ali apenas os arquivos que no devem depender da seleo do usurio e devero ser sempre instalados (como, por exemplo, o executvel de seu aplicativo). Para criar outros grupos (como os vistos na Figura 44), clique, na coluna do meio, no item Features, usando o boto direito do mouse e, no menu popup, escolha New Feature (se preferir, clique em Features em pressione INSERT no teclado). Digite um nome para ele tal como Arquivos de Ajuda. Selecione o item recm-criado e, na coluna da direita, em Description, digite a descrio para este item. Esta descrio mostrada quando o usurio a seleciona durante a escolha dos itens a instalar. Passemos ao prximo item: Setup Types. Na coluna do meio, h trs possibilidades de Setup: Minimal (Instalao Mnima), Custom (Personalizada) e Typical (Tpica). Se voc no deseja definir quais arquivos faro partes de cada opo, desabilite Minimal e Custom e deixe marcada apenas o item Typical. Caso voc tenha especificado grupos de arquivos no tpico anterior, voc ter uma tela semelhante a esta:

54

Figura 45 - Associao dos tipos de instalao com os grupos criados em Features

Os grupos criados por voc estariam no canto direito; as opes de instalao, no esquerdo. Bastaria selecionar cada tipo de instao, um a um, e marcar os grupos que seriam instalados para cada uma delas. Vamos para a fase 2, Specifying Application Data. Ao selecionar Files, a coluna da direita exibir uma janela semelhante Figura 46.

Figura 47 - Especificao de grupo por grupo Figura 46 - Dados do aplicativo

Na parte inferior desta janela, crie os diretrios de programas que julgar necessrio; na parte superior, arraste diretrios e/ou arquivos para a parte inferior, para adicionar arquivos ao instalador. Note, contudo, que aqui o local onde faremos uso daqueles grupos de arquivos que criamos em Features. Se voc criou seus prprios grupos, dever agora selecion-los, um a um (Figura 47), e definir o local de instalao de cada um deles e os arquivos que faro parte dos mesmos (Figura 47).

55

Figura 48 - Opes de Grupos de Programas

Se voc sentir-se meio perdido e precisar de ajuda para criar os grupos de programas, selecione Destination Computer (parte inferior da tela) com o boto direito do mouse e escolha Show Predefined Folder. As opes mais comuns para a instalao dos arquivos de um aplicativo esto ali; dentre elas, as famosas [ProgramFilesFolder] e [ProgramMenuFolder] (observe Figura 48). Passemos agora para Objects/Merge Modules. Na coluna do meio, se voc utilizar algum dos pacotes mencionados, recomendvel adicion-lo ao instalador, para que sua aplicao funcione corretamente quando instalada em outra mquina.

Por exemplo, se voc utiliza a BDE, escolha BDE_PRO.Um Assistente ser iniciado para ajudlo a configurar a BDE para instalao em mquinas de terceiros. Na tela do Assistente, clique em Avanar. Escolha agora um local para armazenar o arquivo de configurao da BDE para seu software em Create a New BDE Configuration File (clique em Browse se quiser procurar atravs da rvores de diretrios). Escolha um nome de arquivo com extenso *.INI (por exemplo, MyBDE.ini). Clique em Avanar. Na tela seguinte, clique em Launch. Vamos definir agora o Alias e o tipo de Banco de dados utilizado. Voc ver uma tela semelhante a da Figura 49.

56

Nela, na parte superior, clique em Add. Em Alias Name, escolha um alias existente ou informe um novo nome (ateno: deve ser o mesmo nome usado em sua aplicao). Se voc selecionar um Alias existente, nem necessrio definir a propriedade Drive Name a prpria BDE identificar o tipo de driver. Do contrrio, ser necessrio especific-lo (vide Figura 50).
Figura 49 - Configurando a BDE

Clique em OK, depois em Close. Responsa Yes pergunta Save Changes and Exit?. Clique, ento, em Avanar e, depois, em Concluir. Passemos agora ao Item 3, Configure the Target System. Em Shortcuts / Folders, voc poder criar atalhos em qualquer local do computador de destino que voc desejar. Basta selecionar, por exemplo, Program Menus (se quiser criar um cone no Menu de Programas do Windows) e, com o boto direito do mouse, escolha New Folder. Renomeie seu diretrio recm criado para um

Figura 50 - Definindo o nome do Alias

nome mais amigvel, como Meu Aplicativo. Selecione este diretrio e, agora, vamos criar realmente o atalho desejado. Usando o boto direito do mouse, escolha New Shortcut. Renomeie-o para algo como Meu Aplicativo. Na coluna da direita, ento, especifique para qual arquivo seu atalho ir apontar em Target algo como [ProgramFilesFolder]\Meu Aplicativo\Meu Aplicativo.exe

Figura 51 -Criando atalhos

57

Em Icon File, escolha um arquivo que contenha um cone a ser exibido para este atalho pode ser at mesmo o arquivo executvel especificado no tpico anterior. E, mais uma vez, em Features (duas linhas acima de Target), diga de qual grupo o cone atual far parte. O padro o grupo Always Install. Em Registry, voc poder especificar chaves novas a serem criadas no Registro do Windows durante a instalao de seu software ou mesmo atribuir valores chaves existentes. Se voc no tiver intimidade com o Registro do Windows, pule esta etapa. Em ODBC Resources, possvel especificar a instalao de drivers ODBC para acesso Banco de dados. Normalmente, se voc est usando a BDE para acessar suas tabelas, no ir usar ODBC. O tpico File Extensions permite associar extenses de arquivos determinados aplicativos (assim como os arquivos *.doc esto associados ao Microsoft Word, por exemplo). Se desejar associar alguma extenso ao seu aplicativo, utilize esta opo. Na coluna do meio, basta clicar em Files Extensions com o boto direito do mouse e escolher New Extension. Renomeie a extenso sugerida pelo InstallShield (algo como ext1) para a extenso desejada. Na coluna da direita, passe as informaes necessrias para esta associao. Em File, por exemplo, informe o nome do arquivo executvel que ir abrir arquivos com a extenso que voc informou em New Extension. Em Command, informe um texto que ser exibido nos menus de contextos quando o usurio clicar num arquivo com a extenso que voc est registrando usando o boto direito do mouse, algo como Abrir com Meu Aplicativo (sem as aspas). Informe um arquivo de cone para sua extenso em Icon File. Vamos ao tpico 4, Customize the Setup Appearance. Em Dialogs, temos as mesmas opes da verso do InstallShield vista anteriormente. Splash Bitmap permite mostrar uma tela de boasvindas contendo uma imagem *.bmp; Install Welcome mostra a tela de boas-vindas em texto, alm do texto WARNING: This program is protected by copyright law and international treaties. Isso, no entanto, pode ser desabilitado. Basta, no canto superior direito, clicar em Copyright Text e apagar o texto existente; tambm possvel passar a opo Show Copyright para No (o padro Yes). Depois vem a opo Billboards. Para a edio do Installshield que acompanha o Delphi 6, as telas de Billboards esto desabilitadas e no iro funcionar. Portanto, no h o que fazer. Passemos ao tpico 5, Define Setup Requirements and Actions. Aqui, a maioria das opes s tornam-se funcionais se voc adiquirir a verso completa do InstallShield. S nos resta a opo Requirements, onde voc pode especificar quais plataformas deseja que seu instalador esteja apto a reconhecer. Por padro, Any OS vem selecionado. Se quiser, mude para Specific e selecione os itens que voc quiser. E, finalmente, chegamos ap tpico final, Prepare For Release. Aqui, selecione Build Your Release e, na coluna central, escolha a mdia que ir armazenar seu produto. Clique, por exemplo, em CD-ROM com o boto direito do mouse e escolha Build. O item Test Your Release permite simular uma instalao para verificar se tudo o que foi configurado est realmente de acordo com o que se deseja.

58

Usando o InstallShield para Delphi 7.0


O Installshield Express For Delphi 7 tem aparncia e funcionalidade praticamente igual ao que acompanha o Delphi 6. Observe:

Figura 52 - Installshield do Delphi 7

A vantagem de se utilizar esta verso ao invs da outra que, alm de suportar instalaes para Windows XP, a disposio de alguns itens ficou mais intuitivo. Um exemplo disso a opo General Information (tpico 1). Aqui, no canto da direita, os itens que fazem referncia ao grupo Adicionar / Remover Programas do Windows esto agrupados em Add / Remove Programs e as informaes referentes ao seu aplicativo podem ser inseridas todas em Product Properties (tais como Name, Version, INSTALLDIR, etc).

59

O layout da tela Setup Types modificou-se ligeiramente: os itens que estavam dispostos lado-a-lado, agora encontram-se na vertical, conforme Figura 53.

No tpico 2, Object / Merge Modules exibe novos pacotes, de acordo com as novas funcionalidades includas no Delphi 7.

Alm disso, as caixas de dilogo apresentadas no tpico 4, em Dialogs, ganharam um visual mais moderno, semelhante a aplicativos comerciais disponveis no mercado.
Figura 53 - Setup Types do InstallShield 3.5

60

Usando o Inno Setup


O Inno Setup um gerador de programas de instalao para Windows, gratuito e de cdigo aberto. um dos instaladores mais bem feitos e usados, concorre diretamente com muitos softwares comerciais do tipo. Voltado a desenvolvedores diversos, ele facilita a criao de um programa de instalao para suas aplicaes, com um visual moderno e clssico de instalador, se mantendo prtico e cheio de recursos. Ter um instalador prprio mal feito ou feito na correria pode ser ruim para seus programas, bom preparar uma instalao bem feita - afinal, o primeiro contato dos usurios com seu programa geralmente se d durante a instalao. Entre vrias outras coisas, o Inno Setup permite criar chaves no registro e em arquivos INI, alm do bsico de um instalador: copiar arquivos para alguma pasta e a criao de atalhos. Ele tem vrias propriedades que podem ser configuradas, como limitar a instalao a somente administradores, registrar DLL/OCX, instalar fontes, e muito mais. Ainda cria um desinstalador, que pode remover completamente seu programa. Uma grande possibilidade que ele tem suporte a uma espcie de "programao" interna, onde voc pode personalizar o instalador usando algumas funes como se estivesse num ambiente de programao. possvel tambm chamar funes de DLLs, ou seja: as possibilidades so imensas. Ele pode ser baixado em http://www.jrsoftware.org/. A gerao dos instaladores com o Inno Setup se d por meio de um script. O compilador dele l o script e gera um executvel, unindo seus arquivos, as configuraes e o mdulo do instalador (um executvel pronto, que realizar a instalao baseando-se nas configuraes definidas). O resultado um nico arquivo .exe, que pode ser facilmente distribudo. O instalador dos seus programas ter a aparncia mostrada na Figura 54.
Figura 54 - Aparncia final do seu instalador

61

A criao do script, que basicamente um arquivo de texto salvo com a extenso .iss, pode ser feita digitando-se os comandos manualmente ou ento usando o assistente de criao do Inno - que gera um projeto bsico. A forma mais fcil usar o assistente, e depois modificar o arquivo do projeto manualmente. O assistente j faz o bsico, acompanhe. Inicialmente, voc deve escoilher a opo Create a New Script File Using The Script Wizard. Clique em OK.
Figura 55 - Optando pelo o Assistente do Inno

O assistente do Inno exibir, em seguida, algumas telas para preenchimento das informaes bsicas do seu projeto. Na primeira delas, ele pede o nome do seu programa, a verso, o nome da sua empresa (se houver uma) e o seu Website. Estes dois ltimos podem ficar em branco, caso no queira preench-los. Clique em Next.

Figura 56 - Informaes sobre o aplicativo

62

Em seguida, selecione qual ser a pasta de destino da instalao do seu aplicativo. O padro Program Files Folder (isto , a pasta Arquivos de Programas), mas voc pode mud-la, se quiser. Indique tambm um nome para a pasta do seu software, conforme o exemplo da figura ao lado: substitua My Program pelo nome do seu aplicativo. Note que a opo Allow Users to Change The Application Folder est marcada. Isso permite que seu aplicativo d a liberdade de os usurios alterarem, no ato da

Figura 57 - Local de destino

instalao, o local onde ficar instalado o software. Se voc no quiser isso, remova esta marca. Clique em Next.

Figura 58 - Escolhendo o executvel

63

Esta etapa imprescindvel: nela, voc deve indicar qual o caminho at o seu executvel do seu software em seu disco rgido. Clique em Browse para localiz-lo. Alguns programas de instalao, ao finaliz-la, j perguntam se o usurio deseja iniciar a execuo do software imediatamente. Se quiser que seu programa permita isso, deixe marcada a opo Allow User to
Figura 59 - cones e pastas

Start Application After Setup Has Finished. Clique em Next.

Na prxima tela, substitua My Program pelo nome da pasta que dever aparecer no menu Iniciar do Windows e mantenha as opes que j esto marcadas assim. Marque tambm o item Create a Uninstall icon in The Start Menu Folder. Isso far com que seu aplicativo crie, no mesmo menu Iniciar, um cone para a desinstalao de seu software. Clique em Next.

As telas seguintes permitem que voc escolha o arquivo que contm a descrio da licena de uso de seu software, um arquivo contendo um texto informativo que ser apresentado antes da instalao e outro texto para aps a instalao, todos opcionais, claro. Na etapa seguinte, escolha os idiomas que devero ficar disponveis para o instalador. Em nosso exemplo, marcamos English e Brazilian Portuguese, permitindo que o usurio escolha em qual idioma ele deseja ver as Figura 60 - Idiomas disponveis telas de instalao, mas voc 64

pode optar por apenas um deles, se quiser. Nas etapas seguintes, no necessrio fazer nenhuma modificao. Clique em Next e, na ltima tela, em Finish. A tela a seguir exibida:

Figura 61 - Aparncia do script padro do projeto

Esta a codificao padro do script que voc acabou de gerar. Trata-se de um script bsico, que voc poder modificar sem grandes dificuldades. Antes de comear, bom ter organizado e separado os arquivos do seu programa, de preferncia deixando tudo o que dever existir no sistema do usurio em uma pasta, com suas respectivas subpastas, se necessrio. Desse modo, toda a estrutura ser copiada. Separe tambm o texto da licena da aplicao, se houver um, num arquivo TXT. A estrutura bsica do script do Inno Setup esta:

[Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications.

65

; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{4BD6DFD3-105A-4921-B253-3F15E6022B5C} AppName=My Program AppVerName=My Program 1.5 AppPublisher=My Company, Inc. AppPublisherURL=http://www.example.com/ AppSupportURL=http://www.example.com/ AppUpdatesURL=http://www.example.com/ DefaultDirName={pf}My Program DefaultGroupName=My Program OutputBaseFilename=setup Compression=lzma SolidCompression=yes [Languages] Name: "brazilianportuguese"; MessagesFile: "compiler:LanguagesBrazilianPortuguese.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "C:Program Files (x86)Inno Setup 5ExamplesMyProg.exe"; DestDir: "{app}"; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}My Program"; Filename: "{app}MyProg.exe" Name: "{commondesktop}My Program"; Filename: "{app}MyProg.exe"; Tasks: desktopicon [Run] Filename: "{app}MyProg.exe"; Description: "{cm:LaunchProgram,My Program}"; Flags: nowait postinstall skipifsilent

Veja que o arquivo tem o estilo dos arquivos INI do Windows, sendo relativamente fcil de editar. O arquivo de projeto formado por sees, grupos de opes e configuraes. Os nomes das sees so identificados entre colchetes, e aparecem em negrito na tela do compilador. Os itens referentes a uma determinada seo devem estar "dentro" dela ou seja, logo abaixo. Algumas sees permitem vrios parmetros. Neste caso, eles devero ser separados por ponto-evrgula, alm de terem seu contedo declarado entre aspas, sempre que este contedo contiver espaos.

A seo [Setup] define informaes bsicas do programa de instalao, como o nome da aplicao, URL do produtor, pasta padro para instalao, etc. Note que tudo o que est nesta seo foi definido usando-se o assistente do programa, tais como AppPublisherURL, 66

AppPublisher, AppVerName, AppName, AppSupportURL e AppUpdatesURL. Note tambm a presena de DefaultDirName, que indica o local onde seu aplicativo ser instalado. Observando o valor dessa varivel, vemos algo como {pf}My Program. My Program seria a pasta do seu executvel, mas e {pf}? Esta uma constante do Inno Setup e significa Program Files (ou Arquivos de Programas).

O Inno Setup usa diversas constantes para referenciar pastas do sistema:

{app} Pasta do aplicativo que o usurio seleciona em Select Destination Location na pgina do assistente. Por exemplo: se voc usar {app}\MYPROG.EXE ento provavelmente "C:\MYPROG" ser o diretrio do seu aplicativo e o arquivo executvel do seu programa ficar em "C:\MYPROG\MYPROG.EXE". Usando o diretrio do programa como {pf} My Program, ento {app} apontar para algo como C:\Arquivos de Programas\My Program. {win} A pasta do Window, normalmente algo como C:\WINDOWS. Exemplo: se voc usar
{win}\MYPROG.INI como destino de um arquivo instalado na pasta do Sistema Operacional . MYPROG.INI, ele ser

{sys} Corresponde a pasta System32 nos Windows 2000, XP, Vista e 7, e System nas verses 95/98/Me. Exemplo: usando {sys}\CTL3D32.DLL como local para uma biblioteca, ela ser automaticamente colocada em "C:\WINDOWS\SYSTEM32". {src} O diretrio onde seus arquivos de instalao esto armazenados. Ou seja, se voc usar numa entrada do script e o usurio estiver fazendo uma instalao a partir de uma unidade "F:\", por exemplo, o Setup entender isso como "F:\MYPROG.EXE".
{src}\MYPROG.EXE

{pf} Referencia a pasta Program Files ou Arquivos de Programas, dependendo do idioma do seu Windows. {pf} o mesmo que {pf32} exceto se voc estiver executando uma instalao sob um sistema de 64 bits que, neste caso, ser equivalente a {pf64}. {cf} Referencia a pasta Common Files ou Arquivos Comuns, dependendo do idioma do seu Windows. {cf} equivalente a {cf32} exceto se o seu instalador estiver sendo executado sob um sistema de 64 bits, o que, neste caso, seria igual a {cf64}.

67

{tmp} Diretrio temporrio usado pelo Setup ou pelo desinstalador. No valor da varivel de ambiente TEMP; trata-se do diretrio temporrio do usurio criado pelo programa de instalao ou desinstalador, normalmente algo como "C:\WINDOWS\TEMP\ISxxxxx.tmp"). Todos os arquivos e subdiretrios nesta pasta so removidos quando a instalao ou desinstalao finaliza.. {fonts} A pasta das Fontes do Windows, usadas por editores de textos, etc.

{uninstallexe} O caminho completo para o programa de desinstalao, algo como "C:\Program Files\My Program\unins000.exe". Esta constante comumente usada seo [Icons] para criar no menu Iniciar o cone de desinstalao. Vlido apenas se a varivel Uninstallable for yes (que o padro).

H mais constantes; voc pode ver uma relao completa acessando o sistema de ajuda do Inno Setup. Observe tambm a diretiva OutputBaseFilename=setup presente no script de exemplo. Ela indica qual ser o nome do nosso arquivo de setup quando ele for compilado e criado. O padro setup.exe, mas se voc preferir pode alter-lo a seu critrio. Um exemplo:
OutputBaseFilename=MyProgramInstaller

Ao fazer isso, o executvel do seu instalador ser criado como MyProgramInstaller.exe. Ainda nesta seo, podemos adicionar estas diretivas:
AlwaysRestart=0 UninstallRestartComputer=0

A primeira pede ao usurio para reiniciar o computador aps a instalao e a segunda pede para reinci-lo aps a desinstalao do programa. Outras diretivas permitem alterar a aparncia do instalador. Por exemplo, para exibir uma janela gradiente como plano de fundo do instalador, podemos acrescentar:

WindowVisible=1 BackColor=clGreen BackSolid = 0

68

Estas instrues permitiro que o Inno Setup crie um instalador com a aparncia mostrada na Figura 62. Entenda estas opes: WindowVisible, se igualado a 1, torna visvel a janela de fundo; se for 0 (zero), torna-a invisvel. Backcolor define a cor desejada, de acordo com as constantes definidas pelo Delphi: clGreen para verde, clBlue para azul, clYellow para amarelo, etc. BackSolid instrui o Inno a realizar um degrad (quando zero) ou no (quando seu valor for 1). O degrad, por padro, feito a partir da cor escolhida para o preto, Figura 62 - Janela degrad de fundo mas voc pode especificar uma segunda cor e, ento, ter um degrad com as duas cores de sua preferncia:

WindowVisible=1 BackColor=clBlue BackColor2=clRed BackSolid = 0

As diretivas acima, com a incluso de BackColor2, produziriam o efeito mostrado na Figura 63. Tambm h a possibilidade de usarmos cores que no esto mapeadas para constantes, como a cor de laranja. Podemos usar, neste caso, o seu valor hexadecimal:
WindowVisible=1 BackColor= $0020CAFB BackColor2=clRed BackSolid=0 Figura 63 - Novo tom de degrad

Neste caso, teramos como resultado o mostrado na Figura 64. Na seo [Setup], vrias diretivas podem ser ativadas ou desativadas, como a compresso, a exibio de uma licena de uso, a possibilidade de proteger a instalao com uma senha, entre muitas outras. As entradas nesta seo so simples, sendo basicamente no estilo Diretiva=Opo. Veremos outras diretivas para esta seo mais adiante. A seo [Languages], como o nome sugere, permite definir os idiomas da instalao. No assistente voc pode escolher vrios idiomas, mas

Figura 64 - Degrad com cor definida em hexadecimal

69

tambm pode modificar as entradas aqui, adicionando novas linhas para os idiomas desejados ou removendo outros idiomas previamente definidos. Por exemplo, para manter o instalador em ingls e portugus, voc colocaria:

[Languages] Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" Name: "english"; MessagesFile: "compiler:Default.isl"

O "Default.isl" o arquivo texto com as mensagens em ingls, presente na pasta-raiz do Inno Setup. Justamente por isso pudemos usar a instruo "compiler:", que nos retorna o caminho completo da pasta do compilador do Inno. O Inno Setup gera instaladores multi-linguagem, e caso tenha mais de um idioma definido, aparecer uma caixa de dilogo para seleo da linguagem no comeo da instalao. Alis, interessante que voc abra o arquivo BrazilianPortuguese.isl no Bloco de Notas e observe que, por tambm ser um arquivo texto, ali voc pode alterar por conta prpria algumas das mensagens em portugus prexistentes, de acordo com sua necessidade. E, se preferir que o idioma padro do instalador seja o portugus, basta renomear o arquivo BrazilianPortuguese.isl para Default.isl. comum em aplicativos comerciais que se queria dar a opo ao usurio de instalar alguns componentes e no outros. O Inno Setup permite que voc organize sua instalao em componentes, onde cada um pode ser associado com um ou mais tipos diferentes de setup. As mais comuns so Completo, Mnima e Personalizada, mas voc pode criar sua prpria opo. Observe o exemplo a seguir:
[Types] Name: full; Description: Instalao completa Name: compact; Description: Instalao mnima Name: database; Description: Instalao de Banco de Dados Name: custom; Description: Custom installation; Flags: iscustom [Components] Name: compact; Description: Arquivos necessrios; Types: full compact Name: database; Description: Arquivos de BD; Types: full database

Observando as entradas da seo Components, podemos notar que o componente compact est associado tanto Instalao Completa (full) quanto Mnima (compact), o que indica que, qualquer uma delas instalar, ao menos, os arquivos bsicos para o funcionamento do aplicativo, J o componente database est associado s instalaes Completa e de Banco de Dados o que significa que, na instalao mnima, os arquivos do BD sero descartados. Durante o setup, o usurio poder escolher qualquer um dos quatro tipos de instalao e uma lista mostrando os componentes de cada uma ser exibida. Arquivos individuais tambm podem ser associados a componentes, bastando adicionar o parmetro Components s entradas da seo Files, seguido do nome de um ou mais componentes: 70

[Files] Source: MyApp.exe; DestDir: {app}; Components: compact Source: Leiame.txt; DestDir: {app}; Components: compact; Flags: isreadme

E, por falar na seo [Files], esta uma das mais importantes. Ela define as pastas e arquivos que sero instalados no sistema. Outras sees podem possuir mais parmetros, geralmente separados por ponto-e-vrgula:

[Files] Source: "C:\MinhaPasta\MeuPrograma.exe"; DestDir: "{app}"

Neste caso, Source indica que o valor que temos logo frente o local e o arquivo de origem, e DestDir a pasta onde ele ser instalado neste caso, na pasta escolhida para ser a do seu aplicativo (pois este o significado da constante {app}). Veja outro exemplo:

[Files] Source: "C:\MinhaPasta\MEUPROGRAMA.EXE"; DestDir: "{app}" Source: " C:\MinhaAjuda\AJUDA.HLP"; DestDir: "{app}" Source: " C:\MinhaPasta\LEIAME.TXT"; DestDir: "{app}"; Flags: isreadme

Note que, neste exemplo, vrios arquivos esto sendo copiados para a pasta do aplicativo ({app}). Observe o parmetro Flags: aqui ele indica que o arquivo LEIAME.TXT dever ser identificado como sendo o arquivo Leiame da aplicao (por isso a existncia do valor isreadme frente). Voc pode colocar comentrios dentro do script. Comentrios so textos que no so compilados, eles apenas trazem informaes adicionais sobre o projeto, em especial para quem ir ler ou trabalhar com o script. Basta iniciar uma linha com o ponto-e-vrgula:
; Isto um comentrio e no ser compilado

Se voc possui um arquivo de projeto com informaes que devero se repetir em vrias instalaes, pode utilizar a diretiva #include. O contedo do arquivo indicado ser inserido no local especificado, e aps ele as informaes que estiverem presentes continuaro a ser processadas, como se ambos fossem um s arquivo. A sintaxe :
#include "meuarquivo.iss"

O arquivo informado dever estar na mesma pasta do arquivo de projeto. Do contrrio, necessrio especificar o caminho completo (por exemplo, "C:\Minha pasta\Meu arquivo.iss"). Se o arquivo estiver na mesma pasta do compilador, voc pode ento utilizar a diretiva compiler::
#include compiler:teste.iss.

71

A seo [UninstallDelete] opcional e define qualquer arquivo ou diretrio que voc deseja que seja deletado pelo desinstalador, alm das entradas criadas pelas sees [Files] ou [Dirs]. Um exemplo comum seria apagar um arquivo INI instalado fora da pasta da aplicao:
[UninstallDelete] Type: files; Name: "{win}\MYPROG.INI"

Aqui, estamos dizendo que o tipo de dado a ser apagado um arquivo ("files") e que ele est instalado {win}\MYPROG.INI (provavelmente algo como C:\WINDOWS\MYPROG.INI). O parmetro Type aceita os valores files, para excluir arquivos, e filesandordirs para excluir arquivos ou pastas, incluindo subpastas e tudo que houver sob sua hierarquia. A seo [Icons] permite a criao de atalhos. Observe este exemplo:
[Icons] Name: "{group}\My Program"; Filename: "{app}\myprogram.exe"; "{app}"; Comment: "Software para fazer alguma coisa" WorkingDir:

Name: "{group}\Desinstalar"; Filename: "{uninstallexe}" ; Comment: "Desinstala o software que faz alguma coisa" Name: {userdesktop}\My desktopicon Program; Filename: {app}\myprogram.exe; Tasks:

Name: {userappdata}\Microsoft\Internet Explorer\Quick Filename: {app}\myprogram.exe; Tasks: quicklaunchicon

Launch\My

Program;

Nesta seo estamos usando a constante {group} para referenciar a pasta do menu Iniciar do Windows. Ali, estamos dizendo que um atalho My Program ser criado, apontando para o executvel do aplicativo, conforme mostra a primeira linha desta seo. Ainda na mesma linha, h um comentrio: Comment: "Software para fazer alguma coisa". Esta a descrio que aparecer quando o usurio parar o mouse sobre o atalho do programa. Na segunda linha, vem o atalho para o desinstalador. As duas ltimas linhas so interessantes: Name: {userdesktop}\My Program aponta para um atalho na rea de Trabalho (Desktop) do usurio. Mas este um atalho que o usurio pode querer criar ou no; por isso, h uma referncia a outra seo chamada Tasks. L, configuraremos o que fazer para permitir ao usurio criar ou no este atalho. O mesmo serve para a linha seguinte, que diz Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program. Esta uma referncia a rea de Incio Rpido do Windows, que fica na Barra de Tarefas, ao lado do boto Iniciar. Vamos seo [Tasks]. Ela s necessria se voc especificou o identificador "Tasks" em alguma entrada da seo [Icons]. Neste caso, o que foi especificado l precisa ter uma correspondncia aqui. Seguindo o exemplo dado sobre a seo [Icons], aqui precisaramos indicar quais so as tarefas opcionais s quais nos referamos. Todas as tarefas aqui sero apresentadas na forma de caixas de checagem ("checkboxes") ou botes de rdio ("radio buttons") na pgina Select Additional Tasks (Selecionar Tarefas Adicionais) do assistente. 72

[Tasks] Name: desktopicon; Description: "Criar cone na rea de Trabalho"; GroupDescription: "cones adicionais" Name: quicklaunchicon; Description: "Criar cone na Barra de Inicializao Rpida"; GroupDescription:"cones adicionais"; Flags: unchecked

Figura 65 - cones adicionais na Instalao

Na seo [Icons] especificamos que queramos uma opo para um cone na rea de Trabalho, usando desktopicon. Aqui, agora, desktopicon vira um parmetro cuja descrio "Criar cone na rea de Trabalho" (que o texto que ser mostrado na tela, conforme mostra a Figura 65). O parmetro GroupDescription serve para criar um grupo especfico sob o qual as tarefas mencionadas devero ser agrupadas. Tarefas do mesmo grupo sero agrupadas sob um mesmo "rtulo" - que, neste caso, chama-se "cones adicionais". A flag unchecked indica que, inicialmente, aquela opo deve aparecer desmarcada. Se voc no especificar flag alguma, o Inno Setup

ir supor que aquele item deve aparecer j marcado.

A seo [Run] a execuo de comandos logo aps a concluso da instalao:


[Run] Filename: "{app}\myprogram.exe"; agora"; Flags: postinstall nowait Description: "Executar aplicativo

No exemplo acima, configuramos o Setup para que a opo "Executar aplicativo agora", muito comum em softwares comerciais, seja mostrada, permitindo que, ao trmino da instalao, o programa instalado comece a funcionar. Observe as flags utilizadas: postinstall e nowait. Postinstall diz ao Inno Setup que mostre uma caixa de checagem com o texto especificado em Description. Nowait instrui o setup a no esperar pelo processo terminar para que a prxima instruo presente em [Run] seja executada, ou a no esperar pelo fim do setup.

73

Dicas Para um Bom Software de Instalao


J que o instalador o programa que vai instalar os arquivos e configuraes do seu programa no sistema do usurio, importante que ele seja bem feito, limpando todos os restos numa possvel desinstalao. Algumas recomendaes que devemos seguir: recomendvel que o programa seja instalado apenas por um administrador. Usurios limitados no podem gravar coisas em chaves globais do registro, nem em pastas do sistema (como a Arquivos de Programas). Apesar de ser possvel o usurio gravar coisas nas suas pastas pessoais (podendo at instalar o programa nela, se as caractersticas da instalao permitir), com o padro NTFS de sistema de arquivos bom restringir a instalao aos administradores. No Windows XP com o HD formatado em FAT32, um usurio limitado at pode instalar arquivos no diretrio Arquivos de Programas, mesmo que no possa gravar dados em algumas chaves do registro. J com o sistema de arquivos NTFS, padro no Vista e no 7, no h como fazer isso. Nas verses recentes do Inno Setup, por padro, a instalao s pode ser feita por um administrador. Se quiser permitir que usurios limitados executem seu instalador, ento adicione na seo [Setup] esta linha: PrivilegesRequired=none. Na desinstalao, limpe tudo o que o seu programa instalar, mas tome o cuidado de no apagar arquivos do usurio. O Inno Setup remove uma boa parte do que ele faz na instalao automaticamente. Mas em algumas situaes, alguns arquivos podem permanecer no HD. Tome o cuidado de remover estes arquivos. Em objetos exclusivos do seu programa (tais como pastas, chaves do registro e atalhos), use um nome que provavelmente s o seu programa ir utilizar, para evitar conflitos com outros programas que possam existir no computador do usurio.

Instalao de arquivos: dicas teis


O assistente de criao de script do Inno cria uma entrada para cada arquivo que voc adicionar, na seo [Files]:

[Files] Source: "C:\programa\Programa.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\programa\Leiame.txt"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\programa\Funes.dll"; DestDir: "{app}"; Flags: ignoreversion

Conforme voc for acrescentando muitos arquivos, pastas e subpastas ao seu projeto, essa idia pode ficar confusa. interessante, ento, criar apenas uma pasta e deixar nela todos os arquivos do seu programa, incluindo suas subpastas, exatamente como voc quer que sejam instalados no computador do usurio. Assim, a seo [Files] passaria a ter uma s entrada: 74

[Files] Source: "C:\programa\*"; DestDir: "{app}"; Flags:ignoreversion recursesubdirs

No exemplo acima, tudo o que estiver em "C:\programa" ser copiado para a pasta da sua aplicao. Note a utilizao do parmetro adicional recursesubdirs: ele garante que as subpastas e tudo o que existir dentro delas tambm seja copiado para o computador de destino. Se voc precisar copiar arquivos para outros lugares, como a pasta do Windows, por exemplo, pode deix-los numa pasta separada (fora de "C:\programa") e incluir uma nova entrada na seo [Files] para o novo arquivo:
Source: "C:\bib\teste.dll"; DestDir: "{win}"; Flags: ignoreversion

Criando chaves no registro


A criao de chaves no registro durante a instalao pode ser feita com a funo [Registry]. Algumas flags especiais devem ser usadas nas chaves que voc criar, para que elas possam ser removidas automaticamente na desinstalao. J nas chaves pblicas ou do Windows, onde o seu software apenas altera alguns valores, tenha cuidado: nunca use a flag para remoo na desinstalao. As entradas da seo [Registry] tm basicamente esta sintaxe:

[Registry] Root: HKCU; SubKey: ChaveSubchave; ValueType: TipoDoValor; ValueName: NomeDoValor; ValueData: DadoDoValor;

O parmetro Root define a chave-raiz do registro que deve ser alterada. Voc deve colocar HKCU para a HKEY_CURRENT_USER, ou HKLM, para a HKEY_LOCAL_MACHINE (entre outras). No SubKey, defina o caminho desejado. Ele no precisa existir no sistema. Se no existir, ser criado automaticamente. Por exemplo, "Software\Minha Empresa\Meu Programa". Lembre-se de colocar textos que contenham espaos entre aspas. Em ValueType, defina o tipo do valor, que pode ser dword (inteiro), string (que o mais usado), entre alguns outros. Para valores booleanos, use dword, e atribua o valor 1 para True ou 0 para False. Em ValueData, como era de se esperar, coloque o dado do valor. Se for uma string, prefira colocar entre aspas. Um exemplo:
Root: HKCU; SubKey: "\Software\Minha Empresa\Meu programa"; ValueType: dword; ValueName: UsarCoresPersonalizadas; ValueData: 1;

interessante tambm criar as chaves definindo que elas devero ser removidas durante uma possvel desinstalao: 75

Root: HKLM; SubKey: \Software\Empresa; Flags: uninsdeletekeyifempty Root: HKCU; SubKey: \Software\Empresa; Flags: uninsdeletekeyifempty Root: HKLM; SubKey: \Software\Empresa\Programa; Flags: uninsdeletekey Root: HKCU; SubKey: \Software\Empresa\Programa; Flags: uninsdeletekey

Seguindo a forma exemplificada nas linhas acima, voc obtm um instalador mais "profissional". Ele cria a chave para a empresa, se ainda no existir, e configura para remov-la na desinstalao apenas se estiver vazia (com o uso da flag uninsdeletekeyifempty). Aps isso, cria a chave do programa, dentro da chave da empresa, e configura para remoo na desinstalao, mesmo se no estiver vazia (j que est removendo o programa, no teria porque manter suas chaves do registro). A flag uninsdeletekey faz com que a chave e todas as suas subchaves sejam removidas na desinstalao. Caso voc tenha vrios programas, um no remover as configuraes do outro, pois cada um ter sua prpria chave, sob a chave da empresa. Mas, ateno: nunca use o uninsdeletekey em chaves usadas por outros programas ou pelo Windows. Apenas ao desinstalar o ltimo programa desta empresa que a chave da empresa ser removida. Na desinstalao, o Inno Setup executa as funes correspondentes de baixo para cima no script; as primeiras entradas sero as ltimas a serem tratadas na desinstalao. Caso voc no queira usar uma chave para a empresa (que pode ser o seu nome, o produtor do programa, etc), pode ento usar diretamente uma para o programa:

Root: HKLM; SubKey: Software\Programa; Flags: uninsdeletekey Root: HKCU; SubKey: Software\Programa; Flags: uninsdeletekey

Embora o exemplo mostre o uso do mesmo caminho de chave sob HKEY_LOCAL_MACHINE e HKEY_CURRENT_USER, prefira usar HKEY_CURRENT_USER para guardar as configuraes do usurio e a HKEY_LOCAL_MACHINE para guardar dados que devero estar acessveis por todos os usurios.

Associando extenses de arquivos ao seu programa


Um uso comum da seo [Registry] a associao de arquivos ao seu programa. Isso pode ser feito pela chave HKEY_CLASSES_ROOT, e a sintaxe seria:

[Registry] Root: HKCR; Subkey: ".myp"; ValueType: string; ValueName: ""; ValueData: "MyProgramFile"; Flags: uninsdeletevalue Root: HKCR; Subkey: "MyProgramFile"; ValueType: string; ValueName: "";

76

ValueData: "My Program File description"; Flags: uninsdeletekey Root: HKCR; Subkey: "MyProgramFileDefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}MYPROG.EXE,0" Root: HKCR; Subkey: "MyProgramFileshellopencommand"; ValueType: string; ValueName: ""; ValueData: """{app}MYPROG.EXE"" ""%1"""

Onde: .myp a extenso desejada; MyProgramFile o nome interno do tipo de arquivo; use um diferente para cada extenso; My Program File description a descrio dos arquivos desse tipo conforme dever aparecer no Windows Explorer; {app}MYPROG.EXE,0, da chave MyProgramFileDefaultIcon, define o cone dos arquivos, que poder estar em um executvel ou uma biblioteca DLL (devendo ser seguido do ndice) ou atravs da indicao direta de um arquivo .ico; ""{app}MYPROG.EXE"" ""%1"", da chave MyProgramFileshellopencommand, indica que o software MYPROG.EXE deve ser aberto e carregar o arquivo que foi passado como parmetro em %1. assim, atravs de %1, que os nomes de arquivos que recebem duplo clique so passados para o Windows, de modo que o sistema operacional entenda que, alm do programa correspondente ser chamado, ele dever ser carregado com o arquivo solicitado. Sem o %1, o seu software at ser aberto, mas sem nenhum arquivo. Agora, note a confuso de aspas. Use as aspas duplas duplicadas, e cuidado com o espao antes do ""%1"". A string final dever ficar assim:
"C:\Arquivos de programasMYPROG.EXE" "%1"

Como as aspas so usadas internamente pelo Inno, necessrio us-las duas vezes seguidas para que seja gravada no registro uma nica aspa. Ao modificar as associaes de arquivos na instalao, inclua a diretiva

ChangesAssociations=yes na seo [Setup]. Com ela, o instalador notifica o Windows para

que recarregue as configuraes de associaes de arquivos no Windows Explorer ao final da instalao.

77

78

Referncia Bibliogrfica

Livros
(ALVES, 1997) ALVES, Willian Pereira, "Delphi 3 - Curso Prtico", Editora rica, So PauloSP, 1997.

(MUNARI, 1997) MUNARI, Antonio Cesar de Barros, SQL em Ambiente Oracle 7, FATEC/SO-Faculdade de Tecnologia de Sorocaba, Sorocaba-SP, Maro/1997.

(SONINNO, 2000) SONINNO, Bruno, "Desenvolvendo Aplicaes com Delphi 5", Makron Books, So Paulo-SP, 2000.

Na Internet
BORUP, Rick, Inno Setup Part Two, disponvel em <http://www.itasoftware.com/papers/FT410_Borup_InnoSetup2.pdf>, acesso em 15 de outubro de 2010.

GAJIC, Zarko, About Delphi Programming, Disponvel em <http://delphi.about.com/od/blob/BLOBs_in_Delphi_DB_programming.htm >, acesso em 27 de setembro de 2010. PICO, Marcos Elias, Guia do Hardware, Disponvel em <http://www.guiadohardware.net/tutoriais/inno-setup>, acesso em 20 de setembro de 2010.

SANTANA, Gladiston, Ramos da Informtica Delphi e Banco de Dados, disponvel em <http://www.ramosdainformatica.com.br/art_recentes01.php?CDA=465>, acesso em 29 de setembro de 2010.

79

S-ar putea să vă placă și