30

Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

Embed Size (px)

Citation preview

Page 1: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós
Page 2: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

Revista The Club Megazine - 08/2003A utilização, reprodução, apropriação, armazenamento em banco de dados,sob qualquer forma ou meio, de textos, fotos e outras criações intelectuaisem cada publicação da revista “The Club” são terminantemente proibidos

sem autorização escrita dos titulares dos direitos autorais.Copyright© The Club® 2003

Page 3: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 33333

EDITORIALEDITORIALEDITORIALEDITORIALEDITORIAL

Editorial

Celso Jefferson PaganelliPresidente - The Club

Editorial ............................................................................ 03C#Builder - A primeira IDE da Borland para .NET ............... 04Como instalar e utilizar o IBObjects ................................... 06DBEXPRESS - Criando um relacionamento Master/Detalhe 11Criando Instalações personalizadas com o Inno Setup ....... 16TimeOut - Controlando a ociosidade da aplicação ............. 22Criando aplicativos Auto-Atualizáveis ............................... 25Dicas & Truques ................................................................. 28

THE CLUBAv. Celso Ferreira da Silva, 190

Jd. Europa - Avaré - SP - CEP 18.707-150Informações: (0xx14) 3732-3689

Suporte: (0xx14) 3733-1588 - Fax: (0xx14) 3732-0987

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected]ções: [email protected]

DúvidasCorrespondência ou fax com dúvidas devem serenviados ao - THE CLUB, indicando "Suporte".

OpiniãoSe você quer dar a sua opinião sobre o clube em

geral, mande a sua correspondência para a seção"Tire sua dúvida".

ReproduçãoA utilização, reprodução, apropriação,

armazenamento em banco de dados, sob qualquerforma ou meio, de textos, fotos e outras criações

intelectuais em cada publicação da Revista“The Club” são terminantemente proibidos sem

autorização escrita dos titulares dos direitosautorais.

Copyright© The Club® 2003

Impressão e acabamento:Impressos Gril - Gril Gráfica e Repr. Ind. Ltda.

Tel.: (0xx14) 3762.1345 - Fax: (0xx14) 3762.1259Rua São Paulo, 447 - Cep 18.740-000

Taquarituba - SPTiragem: 5.000 exemplares

Diretor - Presidente

Celso Jefferson M. Paganelli

Diretor Técnico

Mauro Sant’Anna

Olá amigos, aqui estamos com mais uma edição da The Club Megazine, trazendo atévocê informações que com certeza tornam o dia-a-dia do programador Delphi um poucomais fácil!

Começamos apresentando o mais recente lançamento da Borland, o C#Builder, que éa primeira IDE da Borland para desenvolvimento de aplicações para a plataforma Microsoft.Net e fizemos uma pequena análise da ferramenta, a qual nos deixou ainda mais anciosospara a nova versão do Delphi que está por vir, vamos aguardar.

No mês passado, publicamos uma entrevista exclusiva com Jason Wharton, o criadordo IBObjects e neste mês estamos dando continuidade ao assunto, demonstrando comoinstalar esta ótima suíte de componentes.

Um assunto que tem sido bastante solicitado ao suporte técnico, é referente arelacionamentos master/detalhe no dbExpress, e mediante isso, estamos publicamos umartigo completo a respeito deste assunto, procurando assim sanar todas ou pelo menos asprincipais dúvidas que têm chegado até nós.

Nosso artigo de capa deste mês, com certeza irá resolver um problema comum entremuitos programadores! Você acha complicado gerar instalações para distribuir suaaplicação? Bem, neste artigo estamos apresentando a ferramenta Inno Setup, a qual émuito poderosa, gratuíta e simples de utilizar. Através dela você poderá gerar instalações,inclusive embutindo seu banco de dados, vale a pena conferir!

Como mencionei no início, temos muita coisa interessante este mês! Confira ainda umartigo que mostra como controlar a ociosidade da aplicação, permitindo chamar uma telade login após o aplicativo ficar inativo por um certo tempo. Outro assunto que estamosabordando, é a atualização de versão de aplicativos em rede, sendo este tema, tambémmuito solicitado aos nossos técnicos. E finalizando, não poderia faltar nossa consagradasessão Dicas & Truques, que dispensa comentários.

Bom leitura e até a próxima,

Delphi é marca registrada da Borland International, asdemais marcas citadas são registradas pelos seus

respectivos proprietários.

Page 4: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE44444

Recentemete a Borland lançou o C#Builder, sendo esta a suaprimeira IDE de desenvolvimento para a plataforma Microsoft.Net.

Nós do The Club já estamos trabalhando com a plataformaMicrosoft .Net há um bom tempo, mais precisamente a partir dofinal do ano 2000, utilizando o Microsoft Visual Studio .Net, comenfoque na linguagem C#.

Estivemos analisando o C#Builder e achamos a IDE bastante

atrativa (não poderia ser diferente, visto essa característica sermarca registrada das ferramentas Borland), o compiladorbastante rápido e sem contar nas semelhanças com a IDE doDelphi, o que nos fez sentir-se em casa.

O C#Builder pode ser encontrado em quatro versões, sendo aPersonal, a Professional, a Enterprise e a Architect.

Nas versões Enterprise e Architect existem drivers nativospara acesso aos principais bancos de dados do mercado, sendoOracle, SQLServer, DB2 e Interbase.

Um detalhe importante é que a versão Personal estádisponível gratuitamente para download no site da Borland,desde que utilizada para fins não comerciais e é uma boaalternativa para que está querendo apenas conhecer ou começara estudar C#/.Net. Para maiores informações acesse http://www.borland.com/csharpbuilder/.

No C#Builder temos suporte ao desenvolvimento deaplicações baseadas em WinForms (formulários windows,semelhantes aos que trabalhamos atualmente no Delphi) eWebForms/ASP.Net (na realidade, são páginas web, tratadascomo formulários), WebServices e criação de classes e controles

Conclusão

Podemos apenas ter certeza de que temos mais uma ótimaferramenta para desenvolvimento .Net no mercado e ficamosainda mais anciosos aguardando a nova versão do Delphi comIDE para .Net, o qual promete bastante!

C# BuilderC# BuilderC# BuilderC# BuilderC# BuilderA primeira IDE da Borland para desenvolvimento .NETA primeira IDE da Borland para desenvolvimento .NETA primeira IDE da Borland para desenvolvimento .NETA primeira IDE da Borland para desenvolvimento .NETA primeira IDE da Borland para desenvolvimento .NET

Equipe de suporte do The Club - Equipe de suporte do The Club - Equipe de suporte do The Club - Equipe de suporte do The Club - Equipe de suporte do The Club - [email protected]@[email protected]@[email protected]

Figura 1 – Menu do C#Builder

NEWSNEWSNEWSNEWSNEWS

Page 5: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 55555

Figura 2 – IDE C#Builder –projeto WinForms.

Figura 3 – IDEC#Builder –projetoWebForm/Asp.Net

NEWSNEWSNEWSNEWSNEWS

Page 6: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE66666

DELPHIDELPHIDELPHIDELPHIDELPHI

No mês passado eu publiquei a entrevista com o nosso amigoJason Wharton, falando um pouco sobre o IBObjects. Neste mêsvou continuar a falar deste componente e a melhor maneira émostrar a vocês como se instalar o componente. Não que suainstalação seja complicada, mas nada melhor do que começar aconhecer um componente, como fazendo a sua instalação. Eu seique isto pode ser maçante para alguns programadores maisexperientes, mas também existem programadores que estãoconhecendo o Delphi agora. Antes, porém, você pode fazer odownload deste componente a partir da página do The Club. Parafazer o download é muito simples, acesse a nossa home page,www.theclub.com.br, clique no ícone Área de download e depois noícone Pesquisar arquivos. No campo Digite a informação a ser pesquisadainforme IBObjects e depois no campo Selecione o filtro desejadoinforme a versão do Delphi que você está utilizando. Agora cliqueno botão Pesquisar, fazendo isto você terá acesso ao arquivo e bastaclicar sobre o seu nome e fazer o download. Caso você não queirabaixar o arquivo através da nossa página, você poderá acessardiretamente a página do fabricante no endereçowww.IBObjects.com.

Como já foi dito na edição anterior desta revista, a licençapara utilização do IBObjects é Trustware. Isso significa que vocêpode utilizar o componente sem precisar a principio pagar por ele.Eu digo a principio porque o autor do componente diz que vocêpoderá pagar pelo componente a partir do momento que vocêcomeçar a ganhar algum dinheiro com o software que vocêdesenvolveu utilizando o IBObjects.

Instalando o IBObjectsO arquivo IBO4.zip contém quase uma instalação completa

do IBObjects versão 4, incluindo muitos componentes com códigofonte, pacotes com todas as versões e vários exemplos e tambémcódigos com boas contribuições que foram enviadas por membrosda comunidade IBO.

Além deste arquivo você tem um outro arquivo para cadaversão do Delphi, que lhe dará uma instalação completa semlimite de tempo. Os arquivo estão nomeados como Dn_DCU.zip,onde n é a versão do Delphi. Por exemplo, para o Delphi 7 oarquivo é D7_DCU.zip.

Antes de instalar o componente você deve seguir algunspassos:

1 – Desinstale qualquer versão do IBObjects anterior a estaversão.

2 – Delete todos os arquivos .BPL do IBObjects desta versãomais antiga.

3 – Delete o diretório onde você descompactou a versão maisantiga do IBObjects.

Pronto, agora você já pode descompactar o arquivo .ZIP danova versão do IBObjects. Para facilitar a instalação érecomendado que você crie um diretório chamado IBO4 a partirda raiz do seu drive desejado. Aqui nós vamos criar no drive C.Então ficará assim, C:\IBO4. Você deve também descompactar o

Como instalar e utilizar oComo instalar e utilizar oComo instalar e utilizar oComo instalar e utilizar oComo instalar e utilizar o

IBObjectsIBObjectsIBObjectsIBObjectsIBObjectsPor Claudinei Rodrigues – [email protected]

Page 7: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 77777

DelphiDelphiDelphiDelphiDelphi

outro arquivo baixado de acordo com a versão do seu Delphi ecopiar o seu conteúdo para o diretório C:\IBO4.

Ordem dos pacotesUma observação para os usuários do Delphi 7. Os arquivos

.DPK do Delphi 7 estão sem o sufixo _D7, por ser a versão maisrecente do Delphi. Os pacotes do Delphi 7 estão nomeados como“IBO40*RT.dpk” e “IBO40*DT.dpk”.

Veja abaixo a lista de pacotes na ordem que eles foramconstruídos. O “n” representa o numero da versão do seu Delphi,exceto nos pacotes do Delphi 7.

Runtime packages:

* IBO40CRT_Dn.dpk (Delphi 7 IBO40CRT.dpk)* IBO40TRT_Dn.dpk* IBO40VRT_Dn.dpk* IBO40FRT_Dn.dpk* IBO40XRT_Dn.dpk* IBO40WRT_Dn.dpk* IBO40WXRT_Dn.dpk

Design-time packages:

* IBO40CDT_Dn.dpk (Delphi 7 IBO40CDT.dpk)* IBO40ADT_Dn.dpk* IBO40TDT_Dn.dpk* IBO40VDT_Dn.dpk* IBO40FDT_Dn.dpk* IBO40XDT_Dn.dpk* IBO40WDT_Dn.dpk* IBO40WXDT_Dn.dpk* IBO40EDT_Dn.dpk

Runtime and Design time packages:

* IBO40RPL_Dn.dpk* IBO40FTS_Dn.dpk

Não tente instalar nenhum pacote que não faça parte daversão do seu Delphi.

Instalando os pacotesNo diretório onde você descompactou os arquivos você

encontrará alguns arquivos .BPG ( Grupo de projetos ) queinstalarão os pacotes compilados no diretório$(DELPHI)\Projects\BPL\ a menos que você tenha definidooutro caminho de saída para os arquivos compilados. Se você

definiu outro caminho, então os arquivos compilados serãogerados neste caminho que você definiu.

Você deve informar ao Delphi onde estão localizados osarquivos fontes e as bibliotecas do IBObjects. Para isto então, váaté o menu do Delphi na opção Tools | Environment Options,clique na pasta Library. Informe o diretório nos campos LibraryPath e Browsing Path. Caso contrário você não conseguirácompilar as suas aplicações utilizando o IBObjects.

Instalando no Delphi 31 – Feche todos os arquivos que estejam abertos na IDE do

Delphi.2 – Abra cada arquivo .DPK. Para isto vá até o menu do

Delphi, clique em File | Open. Clique sobre o primeiro arquivomencionado na lista anterior e clique no botão Compile paracompilar o pacote e depois clique no botão Install para instalar ocomponente.

Usando o arquivo .BPGA partir da versão do Delphi 4 surgiram os arquivos .BPG

(Grupo de projeto) que são os arquivos IBO40_Dn.bpg ouIBO40_Cn.bpg. O arquivo .BPG lhe auxilia a compilar todos ospacotes de uma só vez.

1 - Vá até o menu do Delphi e clique em File | Open.Selecione o arquivo IBO40_Dn.bpg. Lembrando sempre que vocêdeve substituir o n pela versão do seu Delphi, exceto para o Delphi7.

2 – Volte ao menu do Delphi e clique em View | ProjectManager.

3 – Clique com o botão direito do mouse sobre qualquerarquivo .BPL e selecione a opção Open.

4 – Agora volte ao menu do Delphi clique em Project | BuildAll Projects. Isto fará com que todos os pacotes sejamrecompilados.

5 – Agora clique com botão direito do mouse em cada pacoteque termine com as letras DT e clique em Install.

6 – Agora faça o mesmo passo anterior para os arquivos queterminam com as letras FTS e RPL. Não há necessidade de fazeristo com os arquivos terminados com RT, pois estes arquivosdevem ser apenas compilados e isto nós já fizemos no passo 4.

Aviso importante aos usuários do Delphi 4.Um erro pode ocorrer na etapa de instalação. Os arquivos

Page 8: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE88888

DelphiDelphiDelphiDelphiDelphi

.BPL podem não serem encontrados a menos que você informe ocaminho. Caso isto aconteça faça o seguinte:

1 – Vá até o menu do Delphi em Components | InstallPackages.

2 – Para cada pacote faça o seguinte:

2.a – Clique no botão Add2.b – Vá até o arquivo onde estão os arquivos .BPL. (o

padrão é$(DELPHI)\Projects\bpl) e selecione cada pacote

individualmente, (IBO4_*DT_D4.bpl).

Estes passos deverão instalar o componente para você.

Mais uma dica para os usuários do Delphi 4.Se você ainda estiver com problemas na instalação deste

componente no Delphi 4, tente copiar os arquivos .BPL para odiretório de sistema do Windows, por exemploC:\Windows\System32.

Você pode instalar o Service Application Framework(ibs_base.pas) no repositório do Delphi.

Para fazer isto, siga os passos:

1 – No diretório onde foi instalado o seu Delphi vocêencontrará o subdiretório ..\Bin. Neste diretório você encontraráo arquivo delphi32.dro. Abra este arquivo utilizando o NotePad.

2 – Vá até o final do arquivo e acrescente o seguinte:

[C:\IBO4\IBS_BASE] <- ou onde você instalou o arquivoibs_base.pas

Type=FormTemplateName=IB Service Base ModulePage=IB ObjectsIcon=C:\IBO4\IB_SVCAPP.ICO // ou onde você instalou o

IBODescription=Base module for IB/Firebird Service appsAuthor=Jason WhartonDefaultMainForm=0DefaultNewForm=0Ancestor=

3 – Agora volte ao inicio do arquivo e adicione uma entradapara [Repository Pages]:

IB Objects=

4 – Salve o arquivo. Agora você deverá encontrar o ServiceApplication Framework pronto para ser utilizado em suasaplicações.

5 – Use como qualquer outro objeto que você cria no Delphiusando File | New ....

Pronto, agora o seu componente já está instalado.

Alguns conceitos básicos do IBObjectsAgora nós vamos ver algumas informações básicas sobre os

vários componentes incluídos no IBObjects. O objetivo agora é daruma introdução em algumas propriedades comuns e asconfigurações necessárias para se utilizar este componente.

Componentes de Acesso a DadosOs componentes de acesso a dados do IBO trabalham mais ou

menos da mesma forma que os componentes básicos de acesso adados do Delphi. Tradicionalmente utilizasse um banco de dados,um dataset e um datasource. No IBO é a mesma coisa. Porém,com bancos SQL, como Interbase/FireBird existe também umfator adicional que devemos considerar que são as Transações.Antes toda a referência a transações ficava dentro docomponente TDatabase do BDE. Ele usa uma conexão e umatransação envolvidas em uma única relação. Mas o InterBase/FireBird não está limitado a apenas uma única transação porconexão. Por causa do Interbase/Firebird ter a capacidade de termúltiplas transações simultâneas em cada conexão, o IBO foidesenhado para implementar transações em um componenteseparado. Desta forma, ele é capaz de ter um componente deconexão e vários componentes de transação ligados a ele aomesmo tempo. Outra característica significante do Interbase/Firebird é que ele suporta que uma única transação utilize maisde um banco de dados. Portanto foi necessário projetar o IBOpara controlar o caso onde uma transação se referencia amúltiplas conexões simultaneamente. Com o IBO você tiraproveito disto de uma maneira muito fácil, basta utilizar aspropriedades IB_Connection1 e IB_Connection2 do componenteTIB_Transaction. Se você tiver mais de três transações, seránecessário então utilizar o método AddConnection() paraadicionar quantas conexões forem necessárias.

Portanto, um dataset não referencia a apenas um databasecom o IBO. Ele deve também fazer referência a uma transação.Isto é que determina o contexto de dados que são lidos e escritos.Tanto uma instrução quanto um dataset no IBO possuem aspropriedades Database e Transaction. Elas são IB_Connection eIB_Transaction. O objetivo é tornar as coisas mais flexíveis.

Conexão PadrãoSe uma referência da conexão não for fornecida em uma

Page 9: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 99999

DelphiDelphiDelphiDelphiDelphi

instrução ou em um dataset então ele verificará com a sessãodefault e verá se existe uma conexão default presente. Se existirentão alinha automaticamente a essa conexão. Isto é tipicamenteo primeiro componente da conexão criado na aplicação. Se existirapenas uma única conexão para a aplicação inteira não énecessário prestar muita atenção nisto visto que o IBOautomaticamente configura isto para você.

Transação PadrãoSe uma referência da transação não for fornecida em uma

instrução ou em um dataset então uma transação interna serágerada automaticamente. Isto dá uma isolação que permite quevocê veja o estado “Committed” da base de dados em todas asvezes e o auto-commit será executado em todas as mudanças queforem postadas. Desta forma, se você projetar uma aplicação semusar a camada de transação ela irá funcionar da mesma forma.Os datasets se comportam como se não existisse o conceito detransações.

Modo NormalUma instrução ou Query normalmente aponta suas

propriedades IB_Connection e IB_Transaction para oscomponentes correspondentes. A propriedade IB_Connection podeconectar a um componente TIB_Connection, TIB_Database,TIBODatabase ou qualquer outra subclasse derivada deles. Apropriedade IB_Transaction conecta ao componenteTIB_Transaction ou qualquer outro de sua subclasse.

Emulando o BDEO componente TIBODatabase foi projetado para fazer o que o

componente TDatabase do BDE faz. Ele combina a conexão comuma transação interna e por default faz com que todas asinstruções e datasets a ele ligados compartilhem da mesmatransação. Ele ainda permite que você arraste para o seu formum componente TIBOTransaction e configure-o se desejado. Istofaz a emulação e ao mesmo tempo as transações adicionaispodem explicitamente ser introduzidas.

Obs: Os componentes TIB_Database e TIBODatabasetrabalham muito bem quando cached update é o seu principalmodo de operação.

Conectando controles Data-AwareO IBO permite o mesmo tipo de conectividade a seus controles

visuais que a encontrada nos controles padrões do Delphi. Cadacontrole terá uma propriedade DataSource e uma DataField, sefor o caso.

Por causa dos controles IBO não serem compatíveis aoscontroles padrões do Delphi, foi necessário criar um componente

TIB_DataSource que funcionasse quase igual ao TDataSource.Ele se referencia a um TIB_Dataset que poderia ser umcomponente TIB_Cursor ou TIB_Query.

Se você quer saber o porque disto, é porque o IBO foi iniciadomuito tempo antes do Delphi 3 e da classe virtual TDatasetintroduzida por ele. Portanto a única forma foi construir afuncionalidade necessária para tirar todo o proveito do InterBase/FireBird. Sendo assim foi escrita uma camada de acesso a dadosprópria e também controles baseados nas APIs do InterBase enas classes TComponent, TWinControl, TCustomEdit, etc.

Classes TIBO* para compatibilidade com a VCLDesde que o Delphi 3 introduziu a classe virtual TDataset, foi

necessário escrever os componentes TIBODatabase, TIBOTable,TIBOQuery e TIBOStoredProc para se igualarem aoscomponentes de acesso a dados padrões do Delphi e assim tercompatibilidade para todos os controles padrões da VCL. Isso foipossível escrevendo uma camada derivada de TDataset que faz aligação com uma instância interna do TIB_Query. Isto dáhabilidade ao IBO para ser usado com geradores de relatórioscomo Report Printer Pro, Quick Report e outros.

Os controle que acompanham o IBO não são compatíveis comos controles padrões da VCL. Para continuar a usar os controlesda VCL e controles de terceiros que são compatíveis com a VCL,escolha os componentes de acesso a dados iniciados com TIBO* eo TDataSource padrão do Delphi.

As Classes TIB_*Os controles nativos do IBO podem ser usados apenas com

componentes de acesso a dados também nativos do IBO, como porexemplo: TIB_DataSource, TIB_Cursor, TIB_Query eTIB_StoredProc.

As Classes TIB_xxxxxSourceOs componentes StatementSource, ConnectionSource e

TransactionSource foram desenvolvidos com o propósito de fazeros formulários ou outros controles cientes de instruções, conexõesou transações específicadas, respectivamente. Você pode observaresses componentes em funcionamento olhando os controlesTIB_StatementBar, TIB_ConnectionBar ouTIB_TransactionBar.

Você pode desenvolver formulários sem dependência deconexões ou transações. Em run-time você pode fazer umalinkagem rápida a um contexto de transação e conexãosimplesmente se referenciando aos componentesConnectionSource e TransactionSource no formulário. Noseventos AfterAssignment você tem uma rotina que replica essareferência a todos os datasets no formulário.

Page 10: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 01 01 01 01 0

DelphiDelphiDelphiDelphiDelphi

Focando o Controle GlobalTodos os controles de acesso a dados nativos do IBO são

coordenados com um outro componente de sessão, ao qualpertencem. Uma rede de eventos fica monitorandoconstantemente quem tem o foco atual, juntamente com qualdeclaração SQL, Dataset, Datasource, Transação e Conexão queestão ligados a ele. Isso permite os controles como as barras debotões possam ficar escutando essa rede de eventos e esperandopor eventos que decidam qual o Dataset tem o foco no momento.O mesmo acontece para Transações e Conexões.

Isso é possível configurando as propriedades AnnounceFocuse AllowFocus do componente TIB_DataSource e a propriedadeReceiveFocus de vários controles que podem ter foco. Os exemplosdisto são as várias barras com controles, como por exemplo, oTIB_Navigator e a TIB_SearchBar.

ResumindoSintam-se a vontade para fazer uma mistura de

componentes como por exemplo utilizar o TIBO* mais os controlesVCL e os TIB_* mais controles nativos do IBO na mesma

aplicação. Por acessar os objetos IB_Connection e IB_Transactionatravés das propriedades encontradas no TIBODataset, é possívelutilizar a mesma conexão e transação em aplicações híbridas.Isso se torna especialmente útil quando você está fazendo umamigração de um aplicativo baseado na BDE para um baseado emcontroles nativos do IBO.

FinalizandoVocê poderá encontrar diversos exemplos documentados no

subdiretório ..\Samples onde você instalou o seu componente quemostram como utilizar os diversos componentes do IBObjetcs.

Todo o texto desta matéria foi traduzido e adaptado a partirdas informações disponíveis no site do fabricante,www.ibobjects.com.

Sobre o autorClaudinei Rodrigues, Consultor Técnico do TheClub - [email protected]

Page 11: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 1 11 11 11 11 1

DelphiDelphiDelphiDelphiDelphi

Nesta matéria iremos indicar os passos para criar umrelacionamento Master/Detail com DBExpress usando o banco dedados FireBird/Interbase.

Para montar o relacionamento Master/Detail primeiramenteiremos verificar a estrutura de nossas tabelas, criadas dentro dobanco GDB.

A tabela pai chamaremos de MASTER e será composta pelaseguinte estrutura:

CREATE TABLE MASTER (

CODMASTER INTEGER NOT NULL,

NOME VARCHAR (20) CHARACTER SET WIN1252 COLLATE

PXW_INTL850);

ALTER TABLE MASTER ADD CONSTRAINT PK_MASTER PRIMARY

KEY (CODMASTER);

CREATE TRIGGER AI_MASTER_CODMASTER FOR MASTER ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

IF (NEW.CODMASTER IS NULL) THEN

NEW.CODMASTER = GEN_ID(MASTER_CODMASTER_GEN, 1);

END

A tabela filha chamaremos de DETALHE e será compostapela seguinte estrutura:

CREATE TABLE DETALHE (

CODDETALHE INTEGER NOT NULL,

CODMASTER INTEGER,

DESCRICAO VARCHAR (20) CHARACTER SET WIN1252 COLLATE

PXW_INTL850, VALOR NUMERIC (18, 2));

ALTER TABLE DETALHE ADD CONSTRAINT PK_DETALHE

PRIMARY KEY (CODDETALHE);

ALTER TABLE DETALHE ADD CONSTRAINT FK_DETALHE

FOREIGN KEY (CODMASTER) REFERENCES MASTER

(CODMASTER) ON DELETE CASCADE;

CREATE TRIGGER AI_DETALHE_CODDETALHE FOR DETALHE

ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

IF (NEW.CODDETALHE IS NULL) THEN

NEW.CODDETALHE =

GEN_ID(DETALHE_CODDETALHE_GEN, 1);

END

Conhecendo a estrutura das tabelas podemos começar a criaro projeto com orelacionamento, e para issocomeçaremos pelavisualização da tabelaMaster.

Visualizando osregistros da tabelaMaster

Primeiramente vamoscriar um novo projeto,contendo um form e um

A definição do nome dos camposidênticos nas duas tabelas foifeito para que possamos utilizarum recurso do DBExpress ao qualno momento da inclusão doregistro Detalhe o código databela Master será enviadoautomaticamente para o campo databela Detalhe, e o DBExpressenvia para o campo que tenha omesmo nome.

Dica importante:

por André Colavite – Suporte THE [email protected]

Page 12: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 21 21 21 21 2

DelphiDelphiDelphiDelphiDelphi

datamodule e neste datamodule colocaremos o componenteSQLConnection. Neste componente faça a conexão normal aobanco de dados FireBird/Interbase.

Coloque um novo componente do tipoSQLDataSet e na sua propriedade Nameespecifique o nome SQLMaster, logo emseguida ligue-o com o componenteSQLConnection através da sua propriedadeSQLConnection.

Na propriedade CommandText destecomponente SQLMaster iremos especificara instrução de SELECT que permitirávisualizar os dados da tabela Master. Veja ainstrução de SELECT que usaremos:

SELECT * FROM MASTER

O próximo componente que iremoscolocar é o DataSetProvider, aba Data Access, com o nomeDataSetProvider1 ao qual será ligado ao componente SQLMasteratravés de sua propriedade DataSet.

E para finalizar a visualização dos dados da tabela Masteriremos colocar o componente ClientDataSet, aba Data Access, aoqual ligaremos ao DataSetProvider1 através da sua propriedadeProviderName. A esse ClientDataSet daremos o nome deCDSMaster.

Pronto, até aqui criamos umavisualização de dados simples usando oDBExpress, a partir desse momentocomeçaremos a criar o relacionamentoMaster/Detail e agora mudará um pouco aforma de trabalhar.

Visualizando os registros databela Detalhe

Para visualizar os dados do Detalheusaremos um novo componenteSQLDataSet e daremos o nome deSQLDetalhe, A esse componente ligaremos ocomponente SQLConnection1 através dasua propriedade SQLConnection. Em sua propriedadeCommandText coloque a instrução de Select para visualizar osdados da tabela Detalhe, ficando a instrução da seguinte forma:

SELECT * FROM DETALHE WHERE DETALHE.CODMASTER =

:CODMASTER

Veja que na instrução de SELECT coloquei uma cláusula deWHERE com um parâmetro ao qual será utilizada para fazer orelacionamento com a tabela Master, sendo assim esse parâmetro

deve ter o mesmo nome do campo da tabelaMaster.

Em seguida temos que ligar esseSQLDetalhe ao SQLMaster e faremos issoatravés da propriedade DataSource docomponente SQLDetalhe, portanto temos quecolocar no datamodule um componenteDataSource, ao qual daremos o nome deDSMaster, e em sua propriedade DataSetligaremos o componente SQLMaster. Agorapodemos indicar na propriedade DataSourcedo componente SQLDetalhe o componenteDSMaster que acabamos de configurar.

Um fato importante na visualização dosdados da tabela Detalhe é que não usaremos

um novo componente DataSetProvider, pois os dados serãocontrolados diretamente pelo provider da tabela Master. Sendoassim voltaremos o foco para os componentes SQLMaster eCDSMaster para preparar essa visualização dos dados daDetalhe.

Mais adiante explicaremos com detalhes a utilização dapropriedade ProviderFlags.

Neste componente SQLMaster iremos criar a lista de tFields,para isso dê duplo click sobre o componente, onde será aberta

uma lista em branco, pressione o botão direitodo mouse sobre essa lista e selecione a opçãoAdd All fields. Faça o mesmo para ocomponente CDSMaster

Ao adicionar os TFields no CDSMasterpodemos verificar que foi criado o campo dotipo DataSetField, com o nome SQLDetalhe.Esse campo irá trazer as informações databela Detalhe, por esse motivo que nãoutilizaremos um componenteDataSetProvider para a tabela DETALHE.

Em seguida colocaremos um componentedo tipo ClientDataSet para visualizar os dados do Detalhe e emsua propriedade Name coloque o nome CDSDetalhe.

Como não utilizaremos um DataSetProvider para a Detalheentão a ligação do CDSDetalhe será feita através da suapropriedade DataSetField, ao qual selecionaremos o tFieldSQLDetalhe, criado no CDSMaster. O nome apresentado na

Evite usar um Select trazendo todos osregistros, pois quanto mais registrosvocê trouxer na visualização mais lentoficará a abertura da tabela. Portantorecomendamos que sempre utilize umaclausula de Where para filtrar os dadosa serem visualizados, podendo até naabertura do form fazer uma clausula dewhere com o campo código IS NULL,pois assim não irá visualizar registros,deixando o processo bastante rápido.O Select da tabela Master com essaclausula de Where ficará da seguinteforma:SELECT * FROM MASTERWHERE CODMASTER IS NULL

Dica importante:

Dica importante:Adicionamos os TFields no SQLMasterpois quando o Provider montar ainstrução de Insert, Update ou Delete,a ser enviada ao banco de dados, elepega as configurações dos TFields doSQLDataSet para saber quais camposserão usados na instrução. E assimpodemos controlar a criação dessasinstruções através da propriedadeProviderFlags de cada tField.Mais adiante explicaremos comdetalhes a utilização da propriedadeProviderFlags.

Page 13: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 1 31 31 31 31 3

DelphiDelphiDelphiDelphiDelphi

ligação da propriedade DataSetField deve ser parecido comCDSMasterSQLDetalhe.

No próximo passo devemos adicionar os Tfields noscomponentes SQLDetalhe e CDSDetalhe, sendo assim dê duploclick sobre o componente SQLDetalhe, pressione o botão direito domouse sobre a lista e selecione a opção Add All fields. Faça omesmo para o componente CDSDetalhe.

Para finalizar as instruções do DataModule, criaremos oevento onReconcilieError do CDSMaster pois através desteevento iremos tratar os erros gerados no banco de dados durantea atualização dos dados. Para tratarmos este erro iremos utilizarum form padrão do Delphi e para criá-lo faça os seguintes passos:

No menu do Delphi selecione a opção File / New depois a opçãoOther, onde será aberto o form New Items do Delphi. Neste formselecione a aba Dialogs e dentro dessa aba selecione a opção

Figura 2: Criando o form ReconcileErrorForm no projeto

Reconcile Error Dialog, conforme figura 2, e em seguidapressione Ok.

Agora, dentro do evento onReconcileError do CDSMasterescreva a instrução, conforme o exemplo a seguir:

procedure TDM.CDSMasterReconcileError(DataSet:

TCustomClientDataSet;

E: EReconcileError; UpdateKind: TUpdateKind;

var Action: TReconcileAction);

begin

Action := HandleReconcileError(DataSet,

UpdateKind, E);

end;

Em outra ocasião explicaremos com detalhes o tratamento deerro utilizado com o ClientDataSet.

Figura 1: DataModule

Pronto, neste momento já estamos com orelacionamento Master/Detail concluido, basta agoravisualizar os registros no form, e para issocolocaremos dois componentes Datasources,DataSource1 e DataSource2 e ligaremos esses doiscomponentes aos ClientDataSets, CDSMaster eCDSDetalhe respectivamente.

O DataModule ao final das configurações doscomponentes ficará conforme a figura 1.

Criando o Form para apresentação dos dados

Esta parte do projeto é bastante simples, bastacriarmos o forms para visualizar os dados e para issocolocaremos os DBEdits para visualizar os campos databela Master e um DBGrid para visualizar osregistros da tabela Detalhe. Não se esqueça de colocaro DBNavigator para controlar os registros tanto databela Master quando da Detalhe.

Como último detalhe do form, colocaremos umcomponente Button ao qual será utilizado paraexecutar a instrução de ApllyUpdates doClientDataSet, pois como já sabemos toda atualizaçãode dados realizada no ClientDataSet ficam em suamemória e somente será enviada ao banco de dadosapós executarmos o método ApplyUpdates. No eventoonclick do Button colocaremos a instrução doApplyUpdates com o parametro 0, pois assimqualquer erro ocorrido todo o processo será canceladoe nenhum registro será gravado no banco. Veja o

Page 14: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 41 41 41 41 4

DelphiDelphiDelphiDelphiDelphi

exemplo a seguir:

procedure TForm1.Btn_GravaClick(Sender: TObject);

begin

DM.CDSMaster.ApplyUpdates(0);

end;

Em outra oportunidade explicaremos melhor a utilização doApplyUpdates.

Figura 3: Form de visualização dos dados da tabela Master e databela Detalhe

Controlando a atualização dos dados noDBExpress

Essas configurações que iremos realizar agora são muitoimportantes, pois serão utilizadas em qualquer situação com oDBExpress, tanto numa conexão a uma simples tabela quantopara a utilização num relacionamento Master/Detail.

Através dessas configurações iremos controlar quais camposserão atualizados dentro do Delphi e quais campos serãoindicados na cláusula Where das instruções de Update e Deleteenviadas para o banco de dados.

A nossa configuração será feita na propriedade ProviderFlagsde cada tField do SQLDataSet e na propriedade UpdateMode do

DataSetProvider. Pois essas duas propriedades em conjuntofornecem informações ao Provider para a geração das instruçõesde Insert, Update e Delete a serem enviadas para o banco dedados.

Essas instruções são geradas automaticamente no momentoque executarmos a instrução de ApplyUpdates no ClientDataSet.

A propriedade ProviderFlags contém os valores pfInUpdate,pfInWhere, pfInKey e pfHidden.

A propriedade UpdateMode indica a formacomo serão pesquisados os registros no momentoda atualização dos dados e contêm os valoresupWhereAll, upWhereChanged eupWhereKeyOnly.

A seguir iremos verificar como utilizar osvalores dessas duas propriedades, ProviderFlagse UpdateMode:

pfInUpdate : Indica se o campo poderáenviar valores para o banco de dados, através doInsert e Update;

pfInWhere : Indica se o campo será utilizadona cláusula Where para encontrar o registroque está sendo atualizado, isso quando oUpdateMode estiver com o valor upWhereAll ouupWhereChanged.

pfInKey : Indica que o campo é um campochave primária e será utilizado para encontrar o registro queestá sendo atualizado, isso quando o UpdateMode estiver com ovalor upWhereKeyOnly.

pfHidden : Indica que a coluna será utilizada somente para alocalização dos registros.

A configuração que normalmente utilizo é com a propriedadeUpdateMode igual a upWhereKeyOnly, e como o ProviderFlags éconfigurado em cada tField a seguir vou especificar como ficarãotodos os campos do projeto de exemplo.

Componente SQLMaster:Campo CODMASTER - deixe como True somente o pfInKeyCampo NOME - deixe como True somente o pfInUpdate

Componente SQLDetalhe:Campo CODDETALHE - deixe como True somente o valor

Page 15: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 1 51 51 51 51 5

DelphiDelphiDelphiDelphiDelphi

pfInKeyCampo CODMASTER - deixe como True somente o valor

pfInUpdateCampo DESCRICAO - deixe como True somente o valor

pfInUpdateCampo VALOR - deixe como True somente o valor

pfInUpdate

Veja na Figura 4 a configuração do ProviderFlags doSQLMaster.

Sobre o autorAndré Colavite, Consultor Técnico do The Club [email protected]

O ProviderFlags dos tFields serãoconfigurados somente no componenteSQLDataSet (SQLMaster eSQLDetalhe), pois o Provider buscainformações somente desses tFields.O ProviderFlags existente nos tFieldsdo ClientDataSet não são utilizadospelo Provider.

Dica importante:

Com essas configurações as instruções de Update e Deletegeradas pelo Provider conterão em sua cláusula WHEREsomente o campo indicado como chave primária, isso é, o campoCODMASTER para a tabela Master e CODDETALHE para atabela Detalhe. E os demais campos somente mandarão osvalores para o banco de dados.

Uma última configuração nos tFields do projeto

Se executarmos o projeto agora ele irá funcionarcorretamente, mas ao incluir um registro apresentará umamensagem de que o campo CODMASTER é obrigatório e não

pode ser gravado em branco, mas esse campo é incremental e seuvalor é gerado pelo Generator através de uma Trigger.

Sendo assim não permitiremos que o usuário digite qualquervalor neste campo CODMASTER.

Portanto a solução para resolver este pequeno detalhe é abrira lista de Tfields dos componentes SQLMaster e CDSMaster,selecionar o campo CODMASTER e configurar a sua propriedadeRequired com o valor FALSE, para que assim não sejaobrigatório o seu preenchimento.

Esse mesmo detalhe deverá ser observado para o campoCODDETALHE da tabela Detalhe e sua solução também é amesma, mas deverá ser feita nos componentes SQLDetalhe eCDSDetalhe.

Conclusão

Neste artigo podemos observar os passos para montar umrelacionamente Master/Detail com o DBExpress bem comoconfigurar a propriedade ProviderFlags de cada campo.

Espero ter lhes ajudado e caso tenham alguma dúvida sobrea matéria ou sugestão sobre outras matérias a serem publicadasfavor enviá-las ao suporte THE CLUB. Um grande abraço atodos.

O projeto de exemplo referente a essa matéria está disponívelem nosso site:

http://www.theclub.com.br/revista/download/DBXMasterDetail.zip

Figura 4: Configurando ProviderFlags do SQLMaster

Page 16: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 61 61 61 61 6

DelphiDelphiDelphiDelphiDelphi

Introdução

A distribuição de aplicações é uma tarefa as vezes não muitosimples devido a complexidade e falta de versatilidade de muitasferramentas existentes no mercado. Porém, estamos aqui paraapresentar-lhes uma ferramenta muito legal para criarinstalações personalizadas e contanto ainda com uma grandevantagem entre as demais: “É gratuíta!”.

Estou falando do Inno Setup, que foi desenvolvido por JordanRussel e está disponível para download em www.innosetup.com,onde atualmente está na versão 4.0.5 beta, porém, neste artigoutilizamos a versão 3.0.6.

Como funciona?

O Inno Setup é baseado em scripts com uma estrutura quelembra arquivos INI, possuindo sessões e dentro das sessõeschaves que irão receber e fornecer valores para gerar a instação.Veja um pequeno exemplo na Listagem 1:

[Files]

Source: C:\Projetos\SisMed.exe; DestDir: {app}\Exec;

Flags: confirmoverwrite

Source: C:\Projetos\DADOS\DEFAULT.DAT; DestDir:

{app}\Dados

Listagem 1

Tudo é feito com base em scripts como mostrado na Listagem 1.Não pense que pela forma simples de trabalhar, o Inno Setupdeixe algo a desejar em relação aos demais instaladores, e sim,muito pelo contrário! Você pode criar instalações parapraticamente qualquer aplicativo que desejar, como poderá ver

no decorrer deste aplicativo, onde iremos demonstrar a instalaçãode uma aplicação desenvolvida em Delphi, acessando banco dedados Firebird via dbExpress.

Criando nossa primeira instalação

Bom, estando com o Inno Setup previamente instalado,vamos criar nossa primeira instalação.

Abra o Inno Setup e será apresentada uma tela semelhante aFigura 1, na qual poderá selecionar um wizard para criar nossainstalação.

Criando InstalaçõesCriando InstalaçõesCriando InstalaçõesCriando InstalaçõesCriando InstalaçõesPersonalizadas com Inno SetupPersonalizadas com Inno SetupPersonalizadas com Inno SetupPersonalizadas com Inno SetupPersonalizadas com Inno SetupInstalando sua aplicação com o banco de dados embutidoInstalando sua aplicação com o banco de dados embutidoInstalando sua aplicação com o banco de dados embutidoInstalando sua aplicação com o banco de dados embutidoInstalando sua aplicação com o banco de dados embutido

Figura 1 – Tela inicial do Inno Setup.

por Alessandro Ferreira, [email protected]

Page 17: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 1 71 71 71 71 7

DelphiDelphiDelphiDelphiDelphi

Dando continuidade, você irádeparar-se com uma telasemelhante a Figura 2, na qualdeverá preencher as opçõesapresentadas.

Neste primeiro exemplo,estamos configurando as opçõespara o NotePad, mas você poderáadicionar informações do seuaplicativo.

O próximo passo é informaronde nosso aplicativo deverá serinstalado, bastando aceitar a opçãosugerida “Program Files directory”,que corresponde a pasta “Arquivosde Programas”.

Em “Application directoryname” você poderá definir o nomeda pasta (dentro de Arquivos deProgramas) que será criada paradisponibilizar os arquivos de suaaplicação e ainda permitir ou nãoao usuário alterar estasconfigurações, através da opção“Allow user to change the applica-tion directory”, veja a Figura 3.

Após definido onde os arquivosde nossa aplicação serãodisponibilizados, iremos selecionaros arquivos que deverão serembutidos em nossa instalação,como exemplo o EXE de nossoaplicativo, as DLLs necessáriaspara a distribuição do dbExpress,nosso banco de dados, enfim, tudoque for necessário para nossoaplicativo rodar na máquina docliente, conforme mostrado naFigura 4. (página seguinte)

Figura 2 – Opções requisitadas pelo wizard.

Figura 3 – Configuração da pasta para instalação.

Page 18: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 81 81 81 81 8

DelphiDelphiDelphiDelphiDelphi

Figura 4 – Arquivos necessáriosDica: Você pode definir os locais onde os arquivos deverão ser instalados,

bastando para isso clicar no botão “Edit” e configurar, como mostra aFigura 5:

Figura 5 –Configuraçãode localizaçãode arquivos.

O próximo passo será a definição das configurações do atalhopara nosso aplicativo, onde podemos configurar algumas açõesque o usuário terá acesso, como exemplo, permitir criar ícone nodesktop, veja a Figura 6:

E finalizando, temos ainda a opção de adicionar arquivos delicença (arquivos texto) contendo o texto que será apresentado aousuário no momento da instalação, bastando para isso selecionaro arquivo no disco que o mesmo será embutido na instalação,Figura 7.

Bem, agora bastará finalizar e salvar nosso projeto deinstalação e o resultado final deverá ser parecido com o exibido naListagem 2:

; Script generated by the Inno Setup Script Wizard.

; SEE THE DOCUMENTATION FOR DETAILS ON CREATING

; INNO SETUP SCRIPT FILES!

[Setup]

AppName=NotePad

AppVerName=NotePad XP

AppPublisher=Microsoft

AppPublisherURL=http://www.microsoft.com

AppSupportURL=http://www.microsoft.com

AppUpdatesURL=http://www.microsoft.com

DefaultDirName={pf}\NotePad

DefaultGroupName=NotePad

LicenseFile=C:\leiame.txt

InfoBeforeFile=C:\leiame.txt

InfoAfterFile=C:\leiame.txt

[Tasks]Figura 6 – Configurações de atalho.

Figura 7 – Configuração dos textos de licença.

Page 19: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 1 91 91 91 91 9

DelphiDelphiDelphiDelphiDelphi

Name: “desktopicon”; Description: “Create a

&desktop icon”; GroupDescription:

“Additional icons:”

[Files]

Source: “C:\WINDOWS\system32\notepad.exe”;

DestDir: “{app}”; Flags: ignoreversion

Source: “C:\Program Files\Borland\

Delphi7\Bin\dbexpint.dll”;

DestDir: “{app}”; Flags: ignoreversion

Source: “C:\WINDOWS\system32\midas.dll”;

DestDir: “{sys}”; Flags: ignoreversion

; NOTE: Don’t use “Flags: ignoreversion”

; on any shared system files

[Icons]

Name: “{group}\NotePad”; Filename:

“{app}\notepad.exe”

Name: “{userdesktop}\NotePad”; Filename:

“{app}\notepad.exe”; Tasks: desktopicon

[Run]

Filename: “{app}\notepad.exe”; Description: “Launch

NotePad”; Flags: nowait postinstall skipifsilent

Listagem 2 – Script gerado em nossa primeira instalação.

Para concluir a instalação, você deverá agora compilar oscript afim de gerar o arquivo de instalação “Setup.exe”, quegeralmente é gerado em uma sub-pasta \Output, dentro dapasta onde você salvou o script. Pronto, agora você já poderátestar a instalação, bastando executar o setup gerado.

Ferramentas adicionais

Como você pode observar, utilizando o wizard do Inno Setup,é bastante simples criar uma instalação, porém, algumasmanutenções futuras talvez exijam que você altere diretamente oscript, o que para alguns usuários pode ser incômodo, além de sermenos produtivo e intuitivo. Felizmente, alguém já pensou nissoe criou uma ferramenta chamada IsTool, a qual tem a finalidadede gerar scripts para o Inno Setup, porém, através de umainterface gráfica bastante simples e intuitiva, o irá permiteaproveitar melhor todos os recursos que o Inno Setup oferece. AIsTool, assim como o Inno Setup também é uma ferramentagratuíta e poderá ser encontrada em http://www.istool.org/ e umdetalhe interessante é que esta ferramenta permite a escolha doidioma no momento da instalação, tendo suporte ao português.Para testar a IsTool, você poderá abrir o script (.iss) que geramosanteriormente via Inno Setup, e verá uma interface semelhante

a apresentada na Figura 8:

Figura 8 – script aberto via IsTool

Traduzindo a instalação

Como você pode ver, a instalação gerada é em inglês, porém,isso é um incoveniente, visto a maioria dos usuários finais nãoestarem habituados a trabalhar neste idioma. Contudo, vocêpoderá baixar um script traduzido para português no seguinteendereço: http://www.jrsoftware.org/files/istrans/. Certifique-se debaixar a versão correspondente a versão do Inno Setup que vocêpossui instalado em sua máquina. Após baixar o arquivo, paratraduzir o Inno Setup para português, coloque o arquivo baixadona pasta do programa e renomeie-o para Default.isl (tomando ocuidado de fazer um backup do original), e pronto, as instalaçõesserão geradas em português.

Embutindo o Firebird na instalação

Um grande problema quando trabalhamos como bancos dedados Client/Server, é que necessitamos fazer a instalação econfiguração dos mesmos, o que em muitos casos exige deslocarum profissional apenas para isso. Neste exemplo, vamosdemonstrar como embutir o Firebird 1.0.3 (www.ibphoenix.com)juntamente com nosso aplicativo, fazendo a instalação, o registroe a inicialização do mesmo na máquina do cliente... Abra o IsToole mãos a obra.

Primeiramente, crie um novo projeto de instalação esalve o mesmo. Após isso, clique na opção “Options” no IsTool efaça as configurações de nosso aplicativo exemplo, preenchendo

Page 20: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 02 02 02 02 0

DelphiDelphiDelphiDelphiDelphi

as solicitações, semelhante ao quejá fizemos no início deste artigo.Após isso, vamos para asdefinições de pastas e arquivosnecessários para nosso aplicativo eo Firebird serem instaladoscorretamente, veja na Figura 9:

Figura 9 – Pastas paraa instalação da aplicação

e do Firebird.

Dica: Para criar pastas, apenas clique com o botão direito eselecione “Criar Diretório”, veja a Figura 10:

Figura 10 – Opções.

Crie as seguintes pastas (Listagem 3):

[Dirs]

Name: {app}\Exec

Name: {app}\Dados

Name: {pf}\Firebird\bin

Name: {pf}\Firebird\intl

Name: {pf}\Firebird\udf

Listagem 3 – Pastas.

Observe que existem constantes que identificam as pastaspadrões, tanto para a aplicação, quanto para as pastas doWindows, sendo:

{app} = pasta padrão onde a aplicação será instalada{pf} = program files ou arquivos de programas

Agora vamos selecionar os arquivos à serem instalados,bastando para isso clicar com o botão direito e selecionar a opção“Inserir Arquivos”. Confira os arquivos na Figura 11:

Figura 11 - Arquivos

Observe que na coluna DestDir está configurado “onde” osarquivos deverão ser instalados. No caso do Firebird, éimportante manter estes paths, visto existirem chaves noregistro do Windows que irá buscar estes arquivos.

Bem, após selecionar os arquivos, vamos criar o grupo e oícone de nosso aplicativo exemplo, para isso estando na sessão“Ícones”, com o botão direito selecione “Novo ‘Item” e configure,como mostra a Listagem 4:

Name: {group}\TheClub\Exemplo;

Filename: {app}\Exec\Exemplo.exe;

WorkingDir: {app};

Page 21: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 12 12 12 12 1

DelphiDelphiDelphiDelphiDelphi

IconFilename: {app}\Exec\Exemplo.exe;

Comment: Exemplo de Instalação.;

Flags: createonlyiffileexists runmaximized;

IconIndex: 0

Listagem 4 – Configuração do grupo e ícone.

Agora vamos para as configurações no registro do Windows,sendo esta, uma configuração muito importante para que oFirebird possa rodar após nossa instalação.

Teremos as seguintes entradas no registro do Windows,Figura 12.

Com sabem, o Interbase/Firebird utiliza como porta padrãode comunicação, a porta 3050 e após finalizamos a instalaçãotemos que setar esta configuração no arquivo SERVICES (doWindows), registrar a instalação e inicializar o Firebird. Paraisso, na sessão “Executar na instalação” defina as configuraçõesapresentadas na Figura 13

Nossa instalação está pronta! Agora, apenas clique no botão“Compilar” e se tudo estiver configurado corretamente, seu“Setup”sera gerado e bastará você testar nossa instalação.

Escolha da mídia para distribuição

Você pode observar nos dois exemplos acima, que não nospreocupamos com o tamanho final da instalação, visto hoje sermuito comum a distribuição de aplicativos em CDs, pelo seubaixo custo, tamanho e facilidade de distribuição.

Contudo, caso seja necessário distribuir o aplicativo emdisquetes de 1.44MB, acesse o botão “Options” e na aba “Com-

piler” ative a opção “Ativar Divisão”, com isso, serão geradosarquivos de até 1.44MB, os quais poderão ser copiados paradisquetes.

Conclusão

Existem outras configurações que podem ser feitas, como porexemplo, criar grupos de instalação “Completa”, “Personalizada”,“Mínima”, etc, contudo não iremos nos aprofundar nestes tópicos,pois nosso intuito neste artigo é apenas o de apresentar aferramenta e mostrar do que ela é capaz, mas volto afirmar,apesar de sua aparência simples, é uma poderosa aliada nadistribuição e atualização de aplicativos, bastando explorar suacriatividade e necessidades.

Até a próxima...

Downloads

Os exemplos utilizados neste artigo estão disponíveis paradownload no endereço:

http://www.theclub.com.br/revista/download/innoexemplos.zip

Figura 12 – Chaves no registro do Windows.

Figura 13 – Executar após instalação

Para saber mais

No site do fabricante você poderá encontrarinformações e ferramentas adicionais para o InnoSetup, http://www.jrsoftware.org/is3rdparty.php.

No endereço http://ibinstall.defined.net poderãoser encontrados scripts e informações sobre ainstalação do Interbase e Firebird.

Sobre o autorAlessandro Ferreira, ConsultorTécnico do The Club [email protected]

Page 22: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 22 22 22 22 2

DelphiDelphiDelphiDelphiDelphi

Introdução

Uma funcionalidade bastante interessante no Windows emesmo em alguns aplicativos que conheço, é a possibilidade detratar a ociosidade do sistema, ou seja, verificar se o aplicativonão está sendo utilizando e assim, fechá-lo ou solicitar ao usuárioque efetue o login novamente, questão esta até mesmo desegurança, pois um usuário pode logar-se na aplicação, sair paratomar um café ou visitar um cliente e por esquecimento nãoefetuar um logoff na aplicação, deixando-o assim aberto paraqualquer pessoa ter acesso ao sistema através do usuário logadoatualmente. Mediante isso, neste pequeno artigo iremosdemonstrar como implementar um controle simples e eficaz,mãos a obra.

Como identificar ociosidade?

Como sabem, praticamente tudo no Windows geramensagens que podemos facilmente capturar e tratar de acordocom nossas necessidades. Um simples movimento ou clique domouse, uma tecla pressionada, enfim, qualquer execução disparadiversas mensagens indicando o evento realizado, o que pode sertratado de forma bastante simples em nossa aplicação. Casotenha curiosidade, abra a unit Windows, e encontrará diversasconstantes declaradas com o prefixo “WM_” que significa“Windows Message”, que nada mais são do que uma nomeaçãopara facilitar nosso trabalhado, como exemplo a constante“WM_MOUSEMOVE”, que indica uma mensagem de movimentodo mouse.

Em nossa aplicação, iremos estar verificando as seguintesmensagens:

TimeOutTimeOutTimeOutTimeOutTimeOutControlando a ociosidade da aplicação.Controlando a ociosidade da aplicação.Controlando a ociosidade da aplicação.Controlando a ociosidade da aplicação.Controlando a ociosidade da aplicação.

por Alessandro Ferreira, [email protected]

Mensagem do Windows Finalidade

WM_MOUSEMOVE Qualquer movimentação domouse na aplicação.

WM_KEYDOWN Qualquer tecla pressionadaem nossa aplicação.

WM_LBUTTONDOWN Click do botão esquerdo domouse em nossa aplicação.

WM_RBUTTONDOWN Click do botão direito domouse em nossa aplicação.

WM_SYSKEYDOWN Qualquer tecla de sistema(Windows) pressionada emnossa aplicação.

Figura 1 – Mensagens do Windows.

No objeto TApplication temos um evento chamado OnMessage oqual iremos utilizar para fazer o tratamento das mensagensapresentadas na Figura 1. Vamos iniciar nossa implementação.Na sessão private do formulário, faça as seguintes declarações:

type

TMainForm = class(TForm)

private

Page 23: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 32 32 32 32 3

DelphiDelphiDelphiDelphiDelphi

{ Private declarations }

T: integer;

procedure Mensagem(var Msg: TMsg;

var Handled: Boolean);

public

{ Public declarations }

End;

const

cTimeOut = 5000;

// Tempo para acionar a tela de senha. cChamaSenha: Boolean = True;

// ativação do Form de senha.

Listagem 1 – Declaração da procedure, constantes e variáveisde controle.

Declaramos uma váriavel chamada T que irá ser utilizandopara guardar o tempo de execução da aplicação. Após declarar aprocedure Mensagem, tecle Ctrl+Shift+C, com isso aDelphi irá criar a procedure, onde iremos fazeras implementações mostradas na Listagem 2:

procedure TMainForm.Mensagem

(var Msg: TMsg; var Handled:

Boolean);

begin

if (Msg.message = WM_MOUSEMOVE) or

(Msg.message = WM_KEYDOWN) or

(Msg.message = WM_LBUTTONDOWN) or

(Msg.message = WM_RBUTTONDOWN) or

(Msg.message = WM_SYSKEYDOWN)

then

begin

T := GetTickCount;

end;

if ((GetTickCount - T) > cTimeOut) and

(PasswordDlg=Nil) then

begin

cChamaSenha := True;

Activate;

end;

end;

procedure TMainForm.FormCreate(Sender: TObject);

begin

Application.OnMessage := Mensagem;

end;

Listagem 2 – Implementação da procedure Mensagem e

ligação da mesma ao evento OnMessage.

Observe que o código da procedure Mensagem é bastantesimples, onde basicamente, enquanto houver “operação” nosistema, vamos atualizando a variável T com o tempo de execuçãoque o aplicativo está sendo “operado” pelo usuário. Se por algummotivo, o sistema ficar inativo, esta variável ficará desatualizada,e se o valor da variável, subtraído do tempo atual de “operação”for maior que o tempo definido como TimeOut (na constantecTimeOut, declarada na Listagem 1), iremos chamar o formuláriode login, para que o usuário entre novamente com sua senha,isso caso o formulário de login não esteja em evidência. Emseguida, ligamos nossa procedure ao evento OnMessage do objetoTApplication no evento OnCreate de nosso formulário.

Bem, antes de continuar nossas implementações noformulário principal, vamos criar um simples form para solicitara senha ao usuário. Para isso, vá o menu File | New | Other |Dialogs e selecione “Password Dialog”, como mostra a Figura 2:

Figura 2 – Criação do formulário de senha.

Com isso, será criado um formulário semelhante ao quepode ser visto na Figura 3:

Figura 3 – Formulário de senha

Page 24: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 42 42 42 42 4

DelphiDelphiDelphiDelphiDelphi

Neste exemplo, não estamos nos preocupando em fazertratamento da senha digitada, pois neste artigo nosso focoprincipal é o controle de ociosidade da aplicação.

Caso deseje mais detalhes sobre implementação de controle deacesso de usuários na aplicação, poderá consultar o artigo “Acesso:Identificando e controlando usuários no sistema” em nossa revista deJunho/2003.

Bem, vamos voltar às nossas implementações no formulárioprincipal, partindo agora para o evento OnActivate do mesmo,inserindo o código demonstrado na Listagem 3:

procedure TMainForm.FormActivate(Sender: TObject);

begin

T := GetTickCount;

if cChamaSenha then

begin

PasswordDlg := tPasswordDlg.Create(Self);

PasswordDlg.ShowModal;

FreeAndNil(PasswordDlg);

cChamaSenha := False;

end;

end;

Listagem 3 – Implementação do evento OnActivate doformulário principal.

Neste evento, estamos utilizando a API GetTickCount queretorna o tempo decorrido de execução do Windows, o qualguardamos na variável T.

Após isso, se a constante cChamaSenha estiver com valorigual a True, iremos fazer a chamada do formulário de login, eatribuir False para a constante.

Estamos trabalhando com esta constante, devido ao fato doevento OnActivate ser acionado toda vez que o referido formuláriorecebe foco (A partir do Delphi 6, para que seja possível atribuir valores à umaconstante, será necessário habilitar esta opção declarando a seguinte constante{$J+}).

Lembre-se de declarar a unit referente ao formulário desenha na lista de uses do formulário principal.

Um detalhe bastante importante, é que iremos necessitar de

um componente TTimer (palheta System), no qualobrigatoriamente teremos que ativar seu evento OnTimer, mesmoque sem nenhuma programação, veja a Listagem 4:

procedure TMainForm.tmrControleTimer(Sender:

TObject);

begin

// Evento OnTimer do nosso componente Timer.

end;

Listagem 4 – Evento OnTimer do componente Timer.

Neste exemplo, configuramos a constante cTimeOutcom 5000, que correspondem a cinco segundos.

Compile e execute esta aplicação de exemplo, digite um valorqualquer no formulário de login, tecle OK e deixe a aplicaçãoociosa (sem mexer no mouse e teclado) que dentro de cincosegundos o login será solicitado novamente!

Conclusão

Vimos neste pequeno artigo um artifício bastanteinteressante que será mais um diferencial em sua aplicação.

Pequenas implementações como estas, vão dando um toqueainda mais profissional ao seu produto e com sua criatividadepoderão ser utilizadas para outras finalidade, como exemplo,fechar a aplicação após algum tempo de ociosidade.

Caso tenha alguma sugestão ou comentário, sinta-se avontade em nos enviar.

Forte abraço, e até a próxima.

Download

O projeto de exemplo referente este artigo está disponível em:

www.theclub.com.br/revista/download/TimeOutLogin.zip

Sobre o autorAlessandro Ferreira, Consultor Técnico do TheClub - [email protected]

Page 25: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 52 52 52 52 5

DelphiDelphiDelphiDelphiDelphi

IntroduçãoÉ muito comum os desenvolvedores

disponibilizarem uma cópia de seu aplicativo(EXE) em cada estação da rede para váriosmotivos, como por exemplo, evitar a elevação dotráfego em rede no momento da carga daaplicação. Isso é interessante, contudo, podetrazer alguns efeitos colaterais, sendo o maisgrave, ter versões diferentes do mesmoaplicativo rodando na rede.

Temos recebido diversas solicitações de nossos associadosbuscando uma solução para este problema, e, pensando nissoestamos publicando este artigo, o qual esperamos que venha aatender ou pelo servir como parâmetro para resolver esteproblema!

A LógicaEm nosso exemplo, iremos criar duas aplicações, sendo a

primeira, um aplicativo que iremos chamar de “Atualiza” querecebe dois parâmetros, sendo o caminho da atualização(geralmente no Servidor) e o caminho local do aplicativo (EXE naestação). A segundo projeto, será a aplicação propriamente dita, aqual em sua inicialização irá comparar sua data com a data doarquivo no servidor e caso seja inferior, irá executar aatualização.

O projeto “Atualiza”Este projeto é bastante simples, porém muito importante e

poderá ser utilizado para atualizar um ou várias aplicações,devido ao fato dele não fazer referência direta as EXEs quedeverão ser autualizados. Bom, chega de papo e mãos a obra.Abra o Delphi, e crie um novo projeto e salve-o como “Atualiza”.Poderá ajustar o Form principal como mostra a Figura1:

Criando AplicativosCriando AplicativosCriando AplicativosCriando AplicativosCriando AplicativosAuto-AtualizáveisAuto-AtualizáveisAuto-AtualizáveisAuto-AtualizáveisAuto-Atualizáveis

Aprenda a criar um EXE para verificação de versão na redeAprenda a criar um EXE para verificação de versão na redeAprenda a criar um EXE para verificação de versão na redeAprenda a criar um EXE para verificação de versão na redeAprenda a criar um EXE para verificação de versão na rede

por Alessandro Ferreira ([email protected])

Figura 1 – Formulário Principal do Projeto Atualiza.

Agora, crie o evento OnShow para este Form, pois é nesteevento que iremos concentrar nossa programação, conformepoderá conferir na Listagem 1:

procedure TMainForm.FormShow(Sender: TObject);

var

Origem, Destino: string;

begin

(* Verifica passagem de parâmetros... *)

if ParamCount < 2 then

Exception.Create

(‘Erro na passagem de parâmetros, verifique!’);

(* Pega valores dos parâmetros *)

Origem := ParamStr(1);

Destino := ParamStr(2);

(* Check dos arquivos *)

if not FileExists(Origem) then

Exception.Create

(‘Arquivo de origem não existe!’);

if not FileExists(Destino) then

Page 26: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 62 62 62 62 6

DelphiDelphiDelphiDelphiDelphi

Exception.Create(‘Arquivo de destino não

existe!’);

(* Copia novo EXE para a pasta do aplicativo *)

CopyFile(PChar(Origem), PChar(Destino), False);

(* Chama aplicativo já com o novo EXE *)

WinExec(PChar(Destino), sw_ShowNormal);

(* Fecha este aplicativo *)

PostMessage(Handle, wm_Quit, 0, 0);

end;

Listagem 2 – Evento OnShow do projeto Atualiza.

Bem, este é todo o código que iremos necessitar neste projeto.Como pode observar, primeiramente verificamos a quantidadede parâmetros recebidos pela aplicação e se estiverem dentro donúmero esperado, capturamos os parâmetros para duasvariáveis, como apresentado no Quadro 1

Ori

De

Quadro 1 – Parâmetros do aplicativo Atualiza.

Depois verificamos se ambos os arquivos informadosexistem e caso positivo, iremos efetuar a atualização (cópia doarquivo do Servidor para a Estação). Após efetuada a cópia,

efetuamos a chamada do novo EXE (aplicativo já atualizado) epara finalizar, iremos fechar o “Atualiza”.

Aplicação ExemploAgora, vamos criar uma aplicação de exemplo que iremos

chamar de “auto-atualizável”, bastante simples, porém funcional,onde você poderá entender como a verificação e atualização irãoacontecer. Mãos a obra! Crie um novo projeto, e como sugestão detela, veja a Figura 2.

Salve o projeto e acesse o código fonte do projeto (para isso, váao menu Project | View Source), pois é diretamente nestearquivo de projeto que iremos codificar nossa lógica deatualização. Primeiramente, declare as seguintes Units na sessãoUses, como poderá visualizar na Listagem 3.

program TheClub;uses Dialogs, Windows, SysUtils, IniFiles, Forms, unPrincipal in ‘unPrincipal.pas’ {Form1};{$R *.res}(* Variáveis para Controle da Atualização *)var PathUpdate, Command: String; TSI: TStartupInfo; TPI: TProcessInformation; Ini: TIniFile;

Listagem 3 – Units e variáveis noprojeto.

Continuando, você iráperceber que verificamos ocaminho da atualização emum arquivo INI (quechamamos de version.ini) quedeverá estar junto como oEXE (na estação), o qual tema seguinte estrutura:

[ATUALIZACAO]PATH=\\Servidor\Atualizacoes\

THECLUB.EXE

Na Listagem 4 estamosapresentando o código restante de nosso projeto.Figura 2 – Formulário principal do projeto Auto-Atualizável

Page 27: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 72 72 72 72 7

begin

Application.Initialize;

(* Verifica path da atualização *)

Ini := TIniFile.Create(ExtractFilePath

(ParamStr(0))+’version.ini’);

try

PathUpdate := Ini.ReadString

(‘ATUALIZACAO’, ‘PATH’, ‘’);

finally

Ini.Free;

end;

(* Verifica se a atualização existe *)

if FileExists(PathUpdate) then

begin

(* Compara pela Data do Arquivo. Se a data do

EXE existente na pasta de atualização for > do que

este EXE... *)

if FileAge(PathUpdate) > FileAge(ParamStr(0))

then

begin

(* Caminho do atualizador *)

Command := ExtractFilePath(PathUpdate) +

‘Atualiza.Exe ‘ + PathUpdate

+ ‘ ‘ + ParamStr(0);

FillChar(TSI, SizeOf(TSI), 0);

TSI.CB := SizeOf(TSI);

(* Cria processo para atualização *)

if not CreateProcess(nil, PChar(Command),

nil, nil, False, CREATE_SHARED_WOW_VDM,

nil, nil, TSI, TPI) then

begin

MessageBeep(0);

Exception.Create(‘Problemas

na atualização da versão!’);

end;

(* Não deixa mostrar o MainForm *)

Application.ShowMainForm := False;

(* Encerra aplicação para chamar nova versão

do Executável *)

Application.Terminate;

(* Não executa daqui para baixo... *)

Exit;

end;

end;

(* Segue carga da aplicação *)

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

Listagem 4 – Código restante do projeto.

Vamos analisar o código da Listagem 4. Começamos criandoum objeto TIniFile o qual irá ler as configurações do arquivo INIcitado anteriormente. Após isso, verificamos se existe arquivo deatualização referente ao caminho contido no arquivo INI e casoexista, comparamos se a data do arquivo de atualização (noservidor) é maior que a data do aplicativo corrente e caso seja,executamos o aplicativo “Atualiza” passando como parâmetros ocaminho e arquivo de origem (servidor) e o caminho e arquivo dedestino (aplicativo corrente na estação), fazendo a execuçãoatravés da criação de um processo no Windows.

Após efetuar a cópia e se esta for bem sucedida, inibimos aapresentação do MainForm da aplicação corrente (apenas paraevitar o efeito de “piscar” o Form) e finalizamos a aplicaçãocorrente, isso porque a aplicação “Atualiza” irá fazer a chamada(conforme explicado anteriormente) através da API WinExec ecom isso, colocar a nova versão para rodar.

ConclusãoComo mencionei no início deste artigo, a idéia é bastante

simples, porém, nos vários testes que efetuamos em nossolaboratório obtivemos ótimos resultados com esta abordagem,reduzindo bastante os problemas de atualização e diferença deversão. Esperamos estar contribuindo para tornar seusaplicativos cada vez mais profissionais e caso tenha algumasugestão ou comentário, sinta-se a vontade para entrar emcontato conosco, até a próxima.

DownloadO projeto de exemplo referente este artigo está disponível para

download em:

http://www.theclub.com.br/revista/download/atualizador.zip

Sobre o autorAlessandro Ferreira, Consultor Técnico do TheClub - [email protected]

DelphiDelphiDelphiDelphiDelphi

Page 28: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 82 82 82 82 8

Rave Reports – Como fazer cálculo (Campo1*Campo2/100) linha a linha

Para fazer esse cálculo dentro do Rave Report iremos utilizaras seguintes configurações:

Selecione o componente chamado CalcOp da aba REPORT edepois clique sobre a banda onde estão sendo impressos os dados;(Esse componente não ficará visível na banda somente é utilizadopara fazer os cálculos entre os campos.

Para trabalhar com esse componente selecione-o através dotreeview existente ao lado do design do relatório.)

Neste componente CalcOp, chamado CalcOp1 iremosconfigurar as seguintes propriedades:

Operator : coMul (Indica que será feita

multiplicação)

Src1DataView : indique o dataview que contém o

primeiro campo do cálculo

Src1DataField : indique o primeiro campo do cálculo

Src2DataView : indique o dataview que contém o

segundo campo do cálculo

Src2DataField : indique o segundo campo do cálculo

DisplayFormat : indique a mascara, pode ser

###,##0.00

Somente essas propriedades serão ligadas, e neste momentomontamos a fórmula para fazer Campo1 * Campo2.

Agora coloque um segundo componente CalcOp, chamadoCalcOp2, onde completaremos a fórmula dividindo o resulto doCalcOp1 anterior por 100.

No CalcOp2 configure as seguintes propriedades:

Operator : coDiv

Src1CalcVar : CalcOp1

Src2Value : 100,000

DestPIVar : vCalculo (nome da variável criada no

relatório)

Essa variável vCalculo deve ser criada da seguinte maneira:

Selecione o relatório no Treeview, logo abaixo da opção ReportLibrary, agora na propriedade PIVars escreva o nome da variáveldesejada, no caso vCalculo, e pronto está criada a variável quereceberá o resultado do cálculo.

Para finalizar este cálculo, precisamos somente mostrar ovalor que está na variável, no relatório e para isso iremos colocarum componente chamado DataText da aba Report. Nestecomponente na propriedade DataField pressione o botão comreticências (...). Agora na tela Data Text Editor selecione no

Dicas & TDicas & TDicas & TDicas & TDicas & Truquesruquesruquesruquesruques

Page 29: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 92 92 92 92 9

combo “Post Initialize Variables” a variável que guardamos oresultado do cálculo, pressione o botão “Insert_PIVar” e depoispressione o botão Ok. Pronto o resultado do cálculo armazenadona variável será impresso no relatório.

Rave Report – Passando parâmetros para orelatório

Para criar um parâmetro dentro do Rave faça o seguinte:

Selecione a página do relatório e acesse a propriedadeParameters, dentro desta propriedade escreva o nome do seuparâmetro, exemplo PAnoMes.

Depois coloque um componente DataText e na propriedadeDataField clique no botão (...). Agora no combo Project Param-eters selecione o parâmetro que foi criado e pressione o botão“Insert Parameter”. Pronto o parâmetro será impresso nestecomponente DataText.

Para passar o valor do Delphi para o Rave utilize o seguintecomando:

Rpt_Projeto.Open;

{

Passa parametro para o relatório para imprimir no

DataText do cabeçalho

}

Rpt_Projeto.SetParam(‘PAnoMes’, Mes.Text+’/

’+Ano.Text);

Rpt_Projeto.ExecuteReport(‘RelFat’);

Rpt_Projeto.Close;

MySQL – Conectando MySQL via dbExpress

O acesso ao MySQL via dbExpress é bastante simples,contudo, primeiro recomendamos atualizar seu Delphi (casoesteja utilizando Delphi 6) com o “Update Pack#2” que pode serencontrado no site da Borland:

http://www.borland.com/delphi

Após isso, faça a seguinte alteração:

1.Abra o arquivo dbxdrivers.ini, pasta: “/Program Files/Common Files/Borland Shared/DBExpress”

2.Onde está escrito “dbexpmys.dll”, altere para“dbexpmysql.dll”

3.Certifique-se de que a DLL “libmysql.dll” esteja em umpath acessível (como exemplo, \Windows\System)

Continuando,

1.insira um componente sqlConnection2.dê um duplo clique sobre o mesmo3.Adicione uma conexão do tipo MySQL4.Configure host com o IP ou se for local = localhost5.Configure usuário e senha, como exemplo root e 1234566.Configure DataBase com o nome de seu banco de dados;

Feito isso, bastará ligar um sqlDataSet ao sqlConnection, umDataSetProvider ao sqlDataSet, um ClientDataSet e fazer asedições via ClientDataSet.

Veja como criar atalhos no menu iniciar doWindows

Neste exemplo, iremos demonstrar uma forma bastantesimples para criar:

- Grupos de programas- Items de programas- Atalhos para programas

Em nossa abordagem, não iremos utilizar a criação viainterface DDE por alguns questões de parametrização e sim,demonstraremos a partir da criação direta de “folders” na pasta“Programs” do Windows.

Primeiramente, vamos criar uma procedure para criação deatalhos:

implementation

uses ShlObj, ActiveX, ComObj;

{$R *.dfm}

procedure CriaShortCut(aNome, aFileName, aPathGroup:

string; aLocation: integer);

var

IObject : IUnknown;

ISLink : IShellLink;

IPFile : IPersistFile;

PIDL : PItemIDList;

InFolder : array[0..MAX_PATH] of Char;

TargetName : String;

LinkName,s : WideString;

Dicas & TDicas & TDicas & TDicas & TDicas & Truquesruquesruquesruquesruques

Page 30: Revista The Club Megazine - 08/2003 · 4 MeGAZINE Recentemete a Borland lançou o C#Builder, sendo esta a sua primeira IDE de desenvolvimento para a plataforma Microsoft.Net. Nós

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE3 03 03 03 03 0

Perguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & Respostas

begin

TargetName := aFileName;

IObject := CreateComObject(CLSID_ShellLink);

ISLink := IObject as IShellLink;

IPFile := IObject as IPersistFile;

with ISLink do

begin

SetPath(pChar(TargetName));

SetWorkingDirectory(pChar(ExtractFilePath(TargetName)));

end;

SHGetSpecialFolderLocation(0, aLocation, PIDL);

SHGetPathFromIDList(PIDL, InFolder);

s := InFolder;

LinkName := s + ‘\’ + aPathGroup + ‘\’ +

aNome + ‘.LNK’;

IPFile.Save(PWChar(LinkName), false);

end;

Esta procedure recebe como parâmetro o Nome do atalho aser apresentado, o caminho e nome do aplicativo a ser executado,e por último o grupo ao qual ele irá pertencer no menu Iniciar doWindows.

Agora vamos para a procedure responsável em criar o Grupoe o Ítem de Programa:

function CreateFolder(Foldername: string; aLocation:

integer): boolean;

var

pIdl: PItemIDList;

hPath: PChar;

begin

Result := False;

if SUCCEEDED(SHGetSpecialFolderLocation(0,

aLocation, pidl)) then

begin

hPath := StrAlloc(max_path);

SHGetPathFromIDList(pIdl, hPath);

SetLastError(0);

if ForceDirectories(PChar(hPath + ‘\\’ +

Foldername)) then

Result := true;

StrDispose(hPath);

end;

end;

Observe que esta procedure recebe como parâmetro o nomedo grupo (que na realidade será o nome de um “Folder” e alocalização, ou seja, onde ele deverá ser criado.

Exemplo de utilização:

procedure TForm1.Button1Click(Sender: TObject);

begin

// cria Grupo principal.

CreateFolder(‘The Club’, CSIDL_PROGRAMS);

// cria sub-grupo dentro do “The Club”

CreateFolder(‘The Club\Grupo 1’, CSIDL_PROGRAMS);

// cria sub-grupo dentro do “The Club”

CreateFolder(‘The Club\Grupo 2’, CSIDL_PROGRAMS);

// cria sub-grupo dentro do “The Club”

CreateFolder(‘The Club\Grupo 3’, CSIDL_PROGRAMS);

// cria sub-grupo dentro do “The Club\Grupo 1”

CreateFolder(‘The Club\Grupo 1\Sub Grupo 1’,

CSIDL_PROGRAMS);

// cria sub-grupo dentro do “The Club\Grupo 2”

CreateFolder(‘The Club\Grupo 2\Sub Grupo 1’,

CSIDL_PROGRAMS);

// cria sub-grupo dentro do “The Club\Grupo 3”

CreateFolder(‘The Club\Grupo 3\Sub Grupo 4’,

CSIDL_PROGRAMS);

// cria atalho para os programas

CriaShortCut(‘Calculadora’,

‘c:\windows\system32\calc.exe’ , ‘The Club\Grupo

1’, CSIDL_PROGRAMS);

CriaShortCut(‘Bloco de Notas’,

‘c:\windows\system32\notepad.exe’, ‘The Club\Grupo

2’, CSIDL_PROGRAMS);

CriaShortCut(‘WordPad’, ‘C:\Program Files\Windows

NT\Accessories\wordpad.exe’, ‘The Club\Grupo 3’,

CSIDL_PROGRAMS);

end;

Dica: A constante CSIDL_PROGRAMS indica a pasta padrãoonde os ítens do menu iniciar do Windows ficam armazenados.Trabalhando com esta constante, independente da versão elinguagem do Windows, a pasta irá ser criada no local correto.

Observe que primeiramente criamos um grupo principal,chamado “The Club”. Seguindo, dentro de “The Club” criamossub-grupos e dentro dos sub-grupos os atalhos que irão chamaros aplicativos em questão.

Este exemplo está disponível para download em nosso site noendereço:

http://www.theclub.com.br/revista/download/CriaGrupoAtalho.zip