Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a...

32

Transcript of Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a...

Page 1: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é
Page 2: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é
Page 3: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

3

THE CLUBAv. Profº Celso Ferreira da Silva, 190

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

Suporte: (14) 3733-1588 - Fax: (14) 3732-0987

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected]

Informações: [email protected]

DúvidasCorrespondência ou fax com dúvidas devem

ser enviados 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 aseção "Tire sua dúvida".

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

armazenamento em banco de dados, sobqualquer forma ou meio, de textos, fotos e

outras criações intelectuais em cada publicaçãoda revista “The Club Megazine” são

terminantemente proibidos sem autorizaçãoescrita dos titulares dos direitos autorais.

Impressão e acabamento:GRAFILAR

Tel.: (14) 3841-2587 - Fax: (14) 3841-3346Rua Cel. Amando Simôes, 779

Cep 18.650-000 - São Manuel - SPTiragem: 5.000 exemplares

Copyright The Club Megazine 2006

Diretor TécnicoMauro Sant’Anna

ColaboradoresFábio Camara, Aguinaldo P Silva

EDITORIAL

Editorial

Editorial .................................................................................. 03Conhecendo o Visual Studio Team System Source Control .. 04Criando uma aplicação ASP.NET noDelphi 2006 com DataModule ................................................ 12Os Turbos chegaram ............................................................. 19Perguntas & Respostas ......................................................... 20Novos rumos - A evolução não pára ....................................... 29Delphi é marca registrada da Borland International,

as demais marcas citadas são registradaspelos seus respectivos proprietários.

Olá amigos

Está é mais uma edição da revista The Club Megazine. Nesta ediçãoos nossos colaboradores Fábio Câmara e Igor Abade V. Leite nosapresentam a ferramenta Visual SourceSafe. Esta ferramenta é a maiscompleta solução integrada para controle e armazenamento de códigosfontes e documentos.

Na matéria seguinte o nosso consultor técnico Claudinei Rodriguesmostra em sua matéria como podemos criar uma aplicação ASP.NET noDelphi 2006 utilizando uma técnica muito interessante. Outrainformação que este mesmo consultor traz é sobre as versões Turbo. Valea pena conferir. Estamos trazendo também a nossa seção de perguntas erespostas com algumas das solicitações feitas ao suporte técnico noultimo mês.

E finalizando esta edição temos uma matéria com o titulo “Novosrumos” onde Celso Jefferson traz novidades em relação ao The Club.

Uma boa leitura a todos e até a próxima.

Page 4: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

4

Visual Studio

Conhecendo o Visual Studio TeamConhecendo o Visual Studio TeamConhecendo o Visual Studio TeamConhecendo o Visual Studio TeamConhecendo o Visual Studio TeamSystem Source ControlSystem Source ControlSystem Source ControlSystem Source ControlSystem Source Control

por Fábio Câmara e Igor Abade V. Leite

Se você é feliz com o Visual SourceSafe, ficará radiante dealegria com esta nova ferramenta. Se você não é feliz com oVisual SourceSafe, conheça a definitiva e mais completa soluçãointegrada para controle e armazenamento de códigos fontes edocumentos. Primando por uma apresentação simples e direta,abordaremos neste artigo a evolução das ferramentas deSoftware Configuration Management - SCM.

Software Configuration ManagementSCM tem um fundamental papel no SDLC – Software

Development Life Cycle, mesmo para times pequenos dedesenvolvimento. Todas as metodologias, algumassuperficialmente, outras profundamente, tratam sobre esteimportante quesito crucial: a organização de um projeto dedesenvolvimento de software. Para exemplificar com maiorênfase a importância, o CMMI (Capability Maturity ModelIntegration) possui uma área de processo chamada CM –Configuration Management para regulamentar especificamenteeste item.

Podemos explicar SCM como um conjunto de práticas, regrase processos que uma organização usa para:

· Controlar acesso a arquivos· Gerador de compilação de arquivos· Gerenciador de versões de arquivos

Tradicionalmente as organizações são obrigadas a optar poruma das duas abordagens de SCM: a “ad hoc” e a baseada emalguma ferramenta como, por exemplo, o Subversion, o VisualSourceSafe ou o CVS.

Na abordagem ad hoc é definida uma série de regras eprocessos, contudo não existem ferramentas que automatizem

estas regras e processos. As vantagens desta abordagem é o baixocusto inicial e a flexibilidade, pois os participantes do projeto nãose sentem vigiados a fazer os procedimentos somente de umaforma rígida e podem ajustar os processos a suas preferências erequisitos. As desvantagens, na minha leitura, é exatamente otexto que escrevi como vantagem, por mais contraditório quepossa parecer. Na minha visão, essa flexibilidade é perigosa epode colocar a perder o resultado de meses de trabalho.

Na outra abordagem, temos uma ferramenta de ponta-a-ponta que se propõe a gerenciar todos os produtos resultantes deseu SDLC previamente estabelecido. Um incalculável resultadopositivo, muitas vezes até difícil de mensurar, é a comunicaçãoque uma ferramenta desta promove entre todos os integrantes deum projeto, permitindo o desenvolvedor “A” saber que não podealterar um determinado artefato devido ao desenvolvedor “B” estácom ele em uso no mesmo momento.

Comentando ainda sobre vantagens, destacamos aprevisibilidade que este tipo de ferramenta gera conforme asregras e “milestones” definidos na ferramenta. Em outraspalavras, perguntar ao desenvolvedor se determinada tarefa estapronta é subjetivo. Fazer a mesma pergunta a ferramenta decontrole de código fonte é binário. Como disse uma vez o poeta, osnúmeros não têm sentimentos.

Para atender as necessidades cada vez maiores deprodutividade e qualidade dos projetos de software, a Microsoftcriou o Visual Studio Team System (Figura 1), uma família deprodutos que oferece o que há de mais moderno em ambientesintegrados de desenvolvimento (IDEs) e gerência de configuraçãode software.

Page 5: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

5

Visual Studio

Figura 1 - Visual Studio Team System

Como começar?Para podermos experimentar tudo que o Visual Studio Team

System tem a oferecer, precisamos do Visual Studio TeamFoundation Server (veja a nota “O Team Foundation Server nãoé um servidor tradicional”). O TFS tem por finalidade servir comorepositório do sistema de controle de versão, bem comoarmazenar e gerenciar os items de trabalho - work items - queintegram o time e permitem o controle do projeto.

Para nosso trabalho, além do servidor, precisamos tambémconfigurar nossos clientes. Para que possamos extrair o máximodo produto, deveremos usar alguma das edições de trabalho emequipe (conhecidas como Team Editions) do Visual Studio 2005,que são os clientes por excelência do TFS. As edições foramcriadas pensando nos papéis mais comuns desempenhados pelopessoal de desenvolvimento nas equipes de projeto de software. Ospapéis e suas edições correspondentes são:

Page 6: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

6

Visual Studio

Todas as edições do Visual Studio 2005 acessam o TFS apartir de uma ferramenta de integração conhecida como TeamExplorer (Figura 2). Distribuído como parte do TFS, ele estendeo IDE do Visual Studio de maneira a oferecer os novos recursosdo Team System.

O TFS deve ser instalado em uma máquina exclusiva parasua finalidade e obrigatoriamente o sistema operacional deve sero Windows 2003. Para seus testes iniciais, recomendamos vocêusar uma máquina virtual - o TFS se “comporta” muito bemdentro do Microsoft Virtual PC, desde que você tenha ao menos 1GB de RAM em seu computador.

O Team Foundation Server não é um servidortradicional

Normalmente quando falamos em servidores pensamos emsistemas desenvolvidos como uma caixa preta, ou seja, produtoscompletamente fechados e desenvolvidos a partir do zero a fim dedesempenhar o papel para que foram projetados. Pensando nessa

Figura 2 - Team Explorer (dir.) com Source Control Explorer (centro)

classe de servidores, é inevitável imaginá-los como um conjuntode um ou mais serviços, que podem ser iniciados e parados aqualquer momento usando o snap-in de Serviços do Windows.Produtos como o Internet Information Services (IIS) e o SQLServer encaixam-se perfeitamente nessa descrição.

O Team Foundation Server é uma classe completamentediferente de servidores. Ao invés de reinventar a roda, aMicrosoft inteligentemente aproveitou o que havia de melhor emalguns de seus principais produtos de servidor - Windows 2003,IIS 6.0, SQL Server 2005, SharePoint 2.0 - e usou-os como aplataforma ideal para uma aplicação baseada em Web Servicesque é extremamente eficiente, escalável e que pode ser acessadapela Internet, desde que esteja devidamente configurado para tal.

Em outras palavras você não encontrará um serviço quecorresponda ao TFS em seu servidor. Na prática há uma sériedeles trabalhando em uníssono para lhe oferecer subsídios quepermitam retomar o controle de seus projetos de software.

Page 7: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

7

Visual Studio

Principais recursos do TFVCO serviço de controle de versão do Team Foundation Server,

também conhecido como Team Foundation VersionControl, é a parte central dos seus esforços de gerência deconfiguração. Utilizando um repositório baseado em SQL Server2005, oferece uma plataforma robusta de controle de versão,capaz de suportar projetos com milhares de arquivos, váriosmilhões de linhas e inúmeros usuários simultâneos. Listamosalguns dos pontos-chave que fazem com que este produto se

destaque no mercado de ferramentas de controle de versão:

Segurança: O Team Foundation Server utiliza osmecanismos de autenticação integrada do Internet InformationServices com uma granularidade de permissões muito maior emais eficiente que a encontrada em produtos como o VisualSourceSafe, por exemplo. Você pode dar permissões a seususuários usando a mesma conta de usuário e senha que elesusam para acessar a rede (Active Directory).

Figura 3 - Caixa de diálogo de configuração de permissões do TFS

Page 8: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

8

Visual Studio

Escalabilidade: Times pequenosprecisam de apenas um computador paradesempenhar o papel de servidor TFS.Entretanto, conforme as necessidades desua empresa crescem, é possível distribuir oTFS em dois servidores diferentes, umresponsável pelos dados e o outro pelaaplicação. Usando um hardware de preçorelativamente acessível é possível atender atimes de mais aproximadamente quinhentaspessoas trabalhando simultaneamente.

Confiabilidade: A partir do SQLServer 2005 como back-end, o TFVC oferecesuporte total a transações. Se houverqualquer problema no meio de uma operaçãode check-in, como uma queda de conexão, atransação é desfeita automaticamente e orepositório continua perfeitamente íntegro.Finalmente podemos dizer “adeus” aos repositórios corrompidos!

Changesets: As operações de check-in são, comoexplicamos anteriormente, protegidas por uma transação. Isso é omesmo que afirmarmos que os check-ins do TFVC são atômicos,ou seja, ou um check-in é confirmado como um todo ou nada éinserido no repositório. Ao afirmarmos que essas operações sãoatômicas, significa dizer que todos os arquivos são agrupadosnuma mesma transação. A essa transação denominamos dechangeset (conjunto de mudanças). Um changeset é a unidadebásica de controle de versão do TFVC. A cada novo check-in égerado um changeset e a ele é dado um número de versão(Figura 4). Esse número de versão é aplicado a todos os arquivosdo changeset (Figura 5).

Figura 4 - Histórico do controle de versão de um projeto, mostrando lista de changesets

Figura 5 - Changeset com vários arquivos

Shelveset: O recurso de shelveset é muito mais facilmentecompreendido se imaginarmos primeiro os cenários que eleatende. Se você nunca passou por uma das situações abaixoenquanto usava o Visual SourceSafe, provavelmente deveconhecer alguém que já viveu isso:

• Depois de um dia inteiro de trabalho, as alterações aindanão foram concluídas. O dilema aqui é “faço check-in para nãocorrer o risco de perder o que fiz mas atrapalho os outros” ou “nãofaço check-in para não atrapalhar os outros mas corro o risco deperder tudo”? A estação de trabalho do desenvolvedor não é umlugar seguro para se manter o trabalho de um dia inteiro.Normalmente as estações de uma rede não estão incluídas no

Page 9: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

9

Visual Studio

backup automático da empresa, que costuma contemplar apenas os servidores. Omais seguro é sempre fazer o check-in e colocar o código num servidor com backup.Por outro lado, fazer check-in de um código incompleto significa que qualquer umque fizer um “Get Latest Version” depois deste ato não conseguirá compilar maisnada!

Para esta e outras situações semelhantes é que foi criado o shelveset (Figura 6).

Pense nesse recurso como uma espécie de“check-in particular”. Você pode fazer ocommit das suas alterações (ou seja, seuchangeset) que, ao invés de ir para orepositório principal do projeto, vai para umaárea distinta com um nome definido por você.Desta forma é possível manter as alteraçõesem curso, voltar para qualquer versãoanterior (Figura 7), fazer a correção e depoiscombinar tudo para o check-in definitivo.

Check-in policy: Muitas vezes édesejável assegurar-se que o desenvolvedorque está prestes a fazer um check-in tomoucertos cuidados para garantir a qualidade oumesmo a rastreabilidade do código. Seriamuito bom ter uma forma automática delembrar os desenvolvedores que é precisocolocar comentários no changeset, associar asalterações a um determinado work item, ouainda exigir que os testes unitários tenhamsido executados para evitar que o check-ininviabilize o build? Melhor ainda seria sepudéssemos ser alertados caso umdesenvolvedor esquecido tivesse ignoradoestas regras, mesmo que tivéssemos tido ocuidado de lembrá-lo. É justamente para issomesmo que foi criada a política de check-in(check-in policy, Figura 8).

No TFVC é possível configurar um projetode forma que o desenvolvedor será semprelembrado de:

• Rodar a análise de código, para garantirque o código atende a padrões mínimos dequalidade - além de assegurar que a soluçãocompila corretamente;

• Executar os testes unitários e prevenir ocheck-in caso haja algum erro;

• Associar o check-in a algum work item,de forma a obter uma excelenterastreabilidade das alterações.

No momento em que o usuário tenta umcheck-in, será avisado se alguma política nãofor satisfeita (Figura 9).

Figura 6 - Caixa de diálog de criação de shelveset

Figura 7 - Caixa de diálog de Unshelve

Page 10: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

10

Visual Studio

Figura 8 - Caixa de diálogo de configurações de Check-in Policy

Figura 9 - Aviso de check-in policy não atendida

Além dessas políticas que vêm disponíveis no produto, você pode criar de formabastante simples políticas personalizadas que atendem a seu processo.

Copy-modify-merge: O modelo padrão de trabalho do Visual SourceSafe é olock-modify-unlock, ou seja, a cada check-out é colocado um bloqueio exclusivo noarquivo que impede que outras pessoas o alterem simultaneamente. Depois deeditarmos o arquivo, a operação de check-in irá desbloqueá-lo para que outros possam

usá-lo. Esse modelo tem um grandeinconveniente, que é o de reduzir acapacidade de trabalho em paralelo da suaequipe, especialmente para times e/ouprojetos grandes.

Já com o TFS, a idéia é que cadadesenvolvedor tenha uma cópia do arquivoem seu computador. Se necessário, mais deuma pessoa pode trabalhar no mesmoarquivo ao mesmo tempo.

Se duas pessoas alterarem o mesmoarquivo, no instante em que o segundo fizerseu check-in o TFS tentará mesclar (merge)as duas versões automaticamente. Se nãofor possível será exibida a tela de solução deconflitos (Figura 10 e Figura 11). Por maisque possa parecer assustador no primeiromomento, asseguramos que este é o modeloideal de trabalho do ponto de vista daprodutividade, pois permite efetivamente oescalonamento e o paralelismo dodesenvolvimento.

ConclusãoÉ impossível classificar o TFVC

simplesmente como uma evolução do VisualSourceSafe. Suas funcionalidadesultrapassam esta fronteira imaginária quepoderíamos estabelecer. Apesar de o custoinicial de configuração de regras e controlesser alto e considerarmos também umrazoável investimento em capacitação do seutime de desenvolvimento na ferramenta,continuamos acreditando que o esforço seráplenamente recompensado. A frase de JoeHummel, PHD e importante evangelista daMicrosoft baseado nos Estados Unidos, emum webcast sobre o tema é sabiamente umresumo conclusivo digno de nossa análisequando avaliamos implantar o TFVC: _“Sofrimento a curto prazo, ganhos reais alongo prazo”.

Sucesso em seus projetos.

Page 11: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

11

Visual Studio

Figura 10 - Caixa de diálogo de aviso de conflitos

Figura 11 - Solução manual de conflitos

Fabio Camara ([email protected]) possuio título Microsoft MVP em VSTS e as certificaçõesMCAD Charter, MCDBA, MCSE 2003, MCSD.NET,MSF Practitioner e ITIL Foundations - é ConsultingManager da FórumAccess Consultoria e membrofundador do VSTS Rocks Brasil Core Team(http://www.vstsrocks.com.br). Entre suas missões naFA implantou uma área de arquitetura e pesquisa,implantou uma área de testes e ajudou em várias áreasde processo na implantação do CMMI nível 3,especialmente CM.Igor Leite ([email protected]) possui as certificaçõesMCAD, MCDBA e MCSD.NET - é arquiteto de soluçõesda FórumAccess Consultoria e membro fundador doVSTS Rocks Brasil Core Team(http://www.vstsrocks.com.br).

Page 12: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

12

Delphi

Criando uma aplicação ASP.NET noCriando uma aplicação ASP.NET noCriando uma aplicação ASP.NET noCriando uma aplicação ASP.NET noCriando uma aplicação ASP.NET noDelphi 2006 com DataModuleDelphi 2006 com DataModuleDelphi 2006 com DataModuleDelphi 2006 com DataModuleDelphi 2006 com DataModule

Por Claudinei Rodrigues – [email protected]

Nesta matéria vou criar uma aplicação bem simples, ondeteremos apenas um WebForm mostrando um componenteDataGrid com algumas informações.

O interessante nesta matéria são as duas informações quevocê poderá utilizar em várias aplicações .NET. Uma delas ésobre o acesso a dados.

A Borland tem trabalhado para manter o seu componenteBDP cada vez mais compatível com o Interbase. Nada maisnatural. Mas grande parte dos programadores hoje estáutilizando o Firebird. Daí vem a pergunta. Qual componenteposso utilizar neste caso?

No site www.firebirdsql.org existe um componente chamadoFirebird .NET Data Provider. Um driver que foi escrito em C# efornece um acesso rápido e seguro com implementações nativas aAPI do Firebird. É um componente muito bom que várias pessoasestão utilizando tanto no Delphi quanto no Visual Studio.

Nesta matéria como estamos trabalhando com o Delphi 2006,você deve acessar o site www.firebirdsql.org e fazer o download do

Figura 1: Download do Provider Figura 2: Selecionando a opção do Menu

item Data Provider for .NET Framework 1.1 da versão 1.7.1,como mostrado na figura 1.

Você irá notar que nesta página existem versões mais novas,mas como estamos trabalhando com Delphi 2006 e ele sótrabalha com o Framework 1.1, a única opção que nos resta éfazer o download desta versão mais antiga. As outras versõesmais novas disponíveis neste site não funcionarão com o Delphi2006 .NET.

Fazendo o download e instalando o componenteDepois de fazer o download, basta executar o arquivo baixado

e responder as questões simples que ele vai te perguntar. Ainstalação segue o clássico padrão “Next... Next... Finish”, semsegredo algum.

Agora, abra o Delphi 2006 for .NET, vá ao menu Component| Installed .NET Components. Como mostrado na figura 2.Depois disto você terá acesso a uma tela semelhante à mostradana figura 3.

Page 13: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

13

Delphi

Figura 3: Selecionando os componentes

Na aba .NET Components localize os nomes: FbCommand,FbCommandBuilder, FbConnection e FbDataAdapter. Caso estesitens não apareçam na lista, clique em “Select an Assembly...” evá até a pasta onde o Firebird .NET Data Provider foi instalado.Se você não alterou o diretório ele estará em <Arquivos deProgramas>\ FirebirdNETProvider1.7 e selecione o assemblyFirebirdSql.Data.Firebird.dll, o qual contém os componentes àserem instalados no Delphi 2006 .NET e clique em OK parafinalizar.

Após a instalação, você encontrará os novos componentes noTool Palette, conforme demonstra a figura 4.

Figura 4: ToolPaletteonde está instalado ocomponente

O correto agora seria nós conhecermos estes componentes,mas antes porém vamos aprender algo novo.

Criando um DataModule no .NETMuitos programadores acostumaram a trabalhar com o

DataModule em aplicações Win32 e quando chegaram noambiente .NET não encontraram esta funcionalidade. Então eranecessário em cada WebForm incluir um componente de conexãoe os componentes de acesso a dados.

Nada contra, pois isto pode ser feito normalmente e semnenhum prejuízo para a aplicação. Mas se podemos melhorar,vamos por em prática. Vamos simular um DataModule, quenada mais será um container onde incluiremos as nossas regrasde negócios em nossa aplicação ASP.NET.

Para isto como já estamos com o Delphi 2006 .NET aberto,clique no menu File | New | ASP.NET Web Application – Delphifor .NET.

Page 14: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

14

Delphi

Fazendo isto você terá acesso a uma tela semelhante afigura 5

Figura 5. Criando a nova aplicação

Agora nós vamos criar uma classe e nela fazer algumasalterações para que possamos simular o nosso DataModule. Paraisto clique em File | New | Order... Na tela a seguir clique emNew Files e depois em Class. Como está sendo mostrado nafigura 6.

Após clicar no botão OK você terá acesso ao código destaclasse como está sendo mostrado na listagem 1.

unit Class1;

interface

type TClass1 = class

Figura 6: Criando a nova classe

private { Private Declarations } public constructor Create; end;

implementation

constructor TClass1.Create;begin inherited Create; // TODO: Add any constructor code hereend;

end.

Listagem 1: Código fonte da classe.

Neste código fonte nós teremos que fazer algumas alteraçõespara que possamos simular o nosso DataModule. Isso é bemsimples de ser feito. Primeiro logo abaixo da palavra interfaceinclua o comando:

Uses System. ComponentModel

Depois altere as palavras TClass1 para TDataModule. Depoisdisso temos que dizer que a nossa classe será derivada deSystem.ComponentModel. Para isto inclua logo após a palavraclass a seguinte instrução(System.ComponentModel.Component). Agora salve a sua unitcom o nome DMu. Depois disto o código que foi mostrado nalistagem 1 ficará igual ao código mostrado na listagem 2.

unit DMu;

interface

Uses System.ComponentModel;

type TDataModule =class(System.ComponentModel.Component) private { Private Declarations } public constructor Create;

Page 15: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

15

Delphi

end;

implementation

constructor TDataModule.Create;begin inherited Create; // TODO: Add any constructor code hereend;

end.

Listagem 2: O código fonte da classe já alterado.

Agora faça o seguinte, feche apenas a tela da nossa classe.Para isto clique em File | Close e depois abra novamente a unit.Note que a tela mudou.

Figura 7. Tela do Delphi 2006 com a nova classe.

Ele deve estar igual à mostrada na figura 7.

Agora nós temos um container onde podemos colocar nossoscomponentes.

Quando arrastamos os componentes de acesso como oFbConnection, FbCommand para este container, o próprio Delphiirá criar um método no código fonte chamadoInitializeComponent que é onde ficarão armazenadas asinformações dos componentes. Isto é semelhante ao que era feitonos arquivos .DFM.

Uma outra alteração que devemos fazer agora é chamar estenovo método.

Para isto clique na aba Code e vá até a procedure Create echame o novo método, como está sendo mostrado na listagem 3.

Page 16: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

16

Delphi

Vamos descrever alguns dos principais métodos disponíveisno componente FbConnection, acompanhe a tabela 1.

Figura 8 – Configurações da conexão com um banco Firebird

implementation

constructor TDataModule.Create;begin inherited Create; // TODO: Add any constructor code here InitializeComponent;end;

Listagem 3: Chamando o método Initialize

Pronto. Agora podemos trabalhar com o nosso DataModule.

Agora sim vamos conhecer melhor os nossos componentes deacesso a dados.

Conhecendo os componentesSão quatro componentes através dos quais iremos fazer todos

os processos necessários para realizar a conexão, seleção emanutenção dos dados no Firebird.

FbConnection O componente FbConnection, é responsável em fazer a

conexão com o banco de dados, ou seja, é nele que iremosinformar a string de conexão com o banco de dados, o nome dousuário, a senha e as demais configurações necessárias. Estecomponente possui um editor de propriedades através do qualpodemos configurar a conexão com o banco de dados, veja afigura 8.

Tabela 1 – Alguns métodos do FbConnection

FbDataAdapter É através deste componente que podemos efetuar a

atualização e seleção de dados. Este componente pode sercomparado aos componentes DataSetProvider+SQLDataSet..

Veja na tabela 2 as principais propriedades e métodos destecomponente.

noitcennoCbF

noitcasnarTnigeB edelortnocoleplevásnopseRodnes,seõçasnart

odnitimrepodagerracerbosseõçazirtemarapranibmocmuéonroterues,setnerefid

,noitcasnarTbFopitotejbosomeredoplauqodsévarta

...cte,kcaBlloR,timmoCrautefe

dnammoCetaerC edoãçatnemelpmiarevorPmuodnanroterLQSseõçurtsni

,dnammoCbFopitotejboarezafsomerilauqodsévarta

sodirefersodoãçucexe.sodnamoc

etaerC arebeceredop,roturtsnoComocoãxenocedgnirts

.ortemârap

gnirtSnoitcennoC oãxenocedgnirtsaebeceRedocnaboaossecaarap

sodad

esolC etnerrocoãxenocarahceF

nepO oãxenocarirbA

retpadAataDbF

dnammoCtceleS dnammoCbFopitodedadeirporParanezamramelevásnopser

.adatucexeresà"tceleS"oãçurtsni

dnammoCeteleD dnammoCbFopitodedadeirporParanezamramelevásnopser

resà"eteleD"edoãçurtsni.adatucexe

dnammoCtresnI dnammoCbFopitodedadeirporParanezamramelevásnopser

.adatucexeresà"tresnI"edoãçurtsni

Page 17: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

17

Delphi

Tabela 2 – Alguns métodos do FbDataAdapter

FbCommand Através deste componente podemos executar instruções

Insert, Update, Delete e Select de forma bem simples e prática.Podemos compará-lo a uma Query unidirecional. Conformemencionei anteriormente na descrição do componenteFbDataAdapter, as propriedades SelectCommand,DeleteCommand, InsertCommand e UpdateCommand são dotipo FbCommand e dessa forma, todas as propriedades e métodosapresentados poderão ser aplicados no FbDataAdapter.

Vamos ver na tabela 3 as principais propriedades e métodosdo FbCommand.

Tabela 3 – Alguns métodos do FbCommand

FbCommandBuilder Este componente tem por finalidade ajustar as instruções

SQL existentes no componente FbDataAdapter quandoefetuamos a chamada do método Update passando um DataSetcomo parâmetro.

Em uma analogia com o Delphi (Win32), este componentefaria a mesma função do evento OnGetTableName e apropriedade UpdateMode do componente DataSetProvider.

Agora que já conhecemos os componentes, vamos trabalharmais com eles.

Montando o exemploVá até ao DataModule que acabamos de criar e arraste dois

componentes. Um componente FbConnection e um componenteFbCommand.

Vá até a propriedade ConnectionString do FbConnection. Aoclicar nesta propriedade você terá acesso a uma tela igual àmostrada na figura 8.

Basta configurá-la exatamente como está sendo mostradanesta figura, é claro alterando a opção Database para o path ondeestá sendo colocado o seu exemplo.

Depois disto vamos utilizar um componente FbCommand.Ligue este componente ao componente FbConnection através dapropriedade Connection.

Agora clique na propriedade CommandText. Feito isto vocêterá uma tela igual a que está sendo mostrada na figura 9.

retpadAataDbF

dnammoCtceleS dnammoCbFopitodedadeirporParanezamramelevásnopser

.adatucexeresà"tceleS"oãçurtsni

dnammoCeteleD dnammoCbFopitodedadeirporParanezamramelevásnopser

resà"eteleD"edoãçurtsni.adatucexe

dnammoCtresnI dnammoCbFopitodedadeirporParanezamramelevásnopser

.adatucexeresà"tresnI"edoãçurtsni

dnammoCetadpU dnammoCbFopitodedadeirporParanezamramelevásnopser

resà"etadpU"edoãçurtsni.adatucexe

lliF melevásnopserodotéMsodanrotersodadso"ragerracsed"

éodotémetsE."tceleS"muroprebecerodnedopodagerrac-erbos

,teSataD:sortemârapomoc,sdroceRxaM,droceRtratS,elbaTataD

soertneoãçanibmocodnevahsortemârapsodirefer

etadpU saracilpamelevásnopserodotéMmumesadanezamraseõçazilauta

éodotémetsE.teSataDetnenopmocrebecerodnedopodagerrac-erboseemaNelbaT,teSataD:sortemârap

woRataD

dnammoCbF

lecnaC amuedoãçucexearalecnacatneToãçurtsni

nalPdnammoC uoziliturodivresoeuqnalpoacifireV

txeTdnammoC adatucexeresàoãçurtsniaebeceRdnammoCbFolep

tuOemiTdnammoC edoãçarugifnocaracifirevuorateSosoicoopmet

epyTdnammoC esáridnammoCbFoomocrinifeD:resodnedop,ratropmoc

uoerudecorPderotS,tceriDelbaTtxeT

dnammoCbF

lecnaC amuedoãçucexearalecnacatneToãçurtsni

nalPdnammoC uoziliturodivresoeuqnalpoacifireV

txeTdnammoC adatucexeresàoãçurtsniaebeceRdnammoCbFolep

tuOemiTdnammoC edoãçarugifnocaracifirevuorateSosoicoopmet

epyTdnammoC esáridnammoCbFoomocrinifeD:resodnedop,ratropmoc

uoerudecorPderotS,tceriDelbaTtxeT

noitcennoC etnenopmocmuaraicossAnoitcennoCbF

yreuQnoNetucexE oremúnoanrotereyreuqaatucexEsodatefasortsigered

redaeRetucexE muanrotereyreuqaatucexEarapodnazilitusodadedotnujnoc

.redaeRataDbFotejbomuossi

ralacSetucexE ariemirpaanrotereyreuqaatucexEetnatluserahnilariemirpadanuloc

.yreuqad

Page 18: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

18

Delphi

Digite na caixa de texto o comando SELECT * FROMGRUPOS, conforme você já pode ver na figura 9. Depois clique nobotão Execute. Se tudo estiver correto, você verá o resultado dainstrução na aba Result. Depois clique no botão Accept. Alémdisto, temos que fazer mais uma configuração em nossoscomponentes. Tanto no componente FbConnection quanto nocomponente FbCommand você terá que alterar a propriedadeModifiers para Public.

Agora vamos voltar ao WebForm1. Neste WebForm incluaum componente DataGrid. Depois de incluir o componenteDataGrid que está na aba WebControls nós vamos montar ocódigo que vai atribuir os dados ao nosso componente DataGrid.

Para isto vá até ao evento OnLoad do WebForm. Se você nãosabe como fazer isto, basta simplesmente dar um duplo cliquesobre o WebForm.

Fazendo isto ele irá direto para este evento. Antes porém, váaté o menu do Delphi e clique em File | Use Unit.e na tela quelhe será mostrado clique sobre o item DMu e depois em Ok. Agorainclua a seguinte instrução no evento On Load.

procedure TWebForm1.Page_Load(sender:System.Object; e: System.EventArgs);var // Variável do tipo DataModule DM : TDataModule;begin // Verifica se é a primeira vez // que estamos chamando a página. if not Page.IsPostBack then begin // Instanciamos o nosso DM DM := TDataModule.Create; // Abrimos a conexão. DM.FbConnection1.Open; try //Ligamos o nosso componente

// Datagrid ao componente // FbCommand

DataGrid1.DataSource := DM.FbCommand1.ExecuteReader;

// Preenchemos o DataGrid DataGrid1.DataBind; finally

// Fechamos a conexão. DM.FbConnection1.Close; end; end;end;

Listagem 4: Evento OnLoad do WebForm.

Agora basta compilar e executar a aplicação. O Delphi 2006.NET automaticamente irá abrir o seu navegador mostrando oDataGrid com os dados da tabela do Firebird.

ConclusãoConforme eu disse no início da matéria, a aplicação é bem

simples. Mas além do componente de acesso eu também mostreicomo podemos criar uma regra de negócio como fazíamos emaplicações Win32. São informações básicas que utilizaremos emaplicações tanto ASP.NET como também em aplicaçõesWinForms.

Download:http://www.theclub.com.br/revista/download/AspNetComDM.zip

Figura 9: CommandTextEditor – Editor de códigos SQL

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

Page 19: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

19

Delphi

As versões Turbo Explorer do Delphi, Delphi .NET, C# e C++já estão disponíveis para download no sitewww.turboexplorer.com.

A versão Explorer é 100% gratuita e se destina a estudantese programadores não profissionais que desejam começarrapidamente a desenvolver aplicações Win32 e .NET, mesmo queainda esteja utilizando o .NET Framerwork 1.0. Eu comenteisobre a versão do .NET Framework, porque a Microsoft já liberoua versão 2.0 a algum tempo e está para lançar em breve a versão3.0 com inúmeros recursos adicionais. Mas isto não seria umassunto para nos aprofundarmos neste momento.

A versão Explorer inclui um pacote fixo de mais de 200componentes e a versão Professional inclui alguns componentesadicionais. Além disso, a versão Professional permite que vocêcrie seus próprios componentes do zero e ainda adicione qualquercomponente fabricado por terceiros ou ainda plug-ins paraaumentar a capacidade de desenvolvimento da IDE.

Apesar de a versão Explorer ser destinadas a estudantes eprogramadores não profissionais, a própria Borland diz que épermitido que você utilize a versão Explorer para desenvolveraplicações comerciais.

Ao contrário da versão Professional a versão Explorer nãopermite que você instale componentes adicionais na IDE. Casovocê queira instalar componentes de terceiros, como por exemploo RXLib, ZipMaster entre outros, você terá que adquirir a versãoProfessional que segundo a Borland contém mais recursos e

facilidades de uso.

As versões Turbo Professional, segundo a Borland, formamuma nova linha de produtos com preços especialmente pensadospara desenvolvedores autônomos e novos programadores. Nomomento em que eu estava escrevendo esta matéria estesprodutos custavam R$ 1.200,00. Em relação às outras versõesdo Delphi, ela realmente está mais em conta.

Vale a pena lembrar que a edição Turbo Professional é umasolução que contém apenas uma linguagem, já o “BorlandDeveloper Studio” (BDS) é um ambiente de programação multi-linguagem e multi-plataforma que suporta as linguagens C++,C# e Delphi para desenvolvimento tanto de aplicações Win32quanto .NET.

Uma outra restrição do Turbo é que não é possível instalarmais de um produto Turbo em uma máquina ou máquinavirtual e também não podem ser instalados em máquinas que játenham o Borland Developer Studio instalado.

Por enquanto são estas as informações que tenho a passarsobre os Turbos. Conforme as novidades forem surgindo, iremosdisponibilizar para você e caso você queira fazer algumcomentário a respeito, pode enviar um e-mail [email protected] ou ainda [email protected]. Além éclaro do nosso telefone (14) 3733-1588.

Um grande abraço a todos e até a próxima.

Os Turbos Chegaram!Os Turbos Chegaram!Os Turbos Chegaram!Os Turbos Chegaram!Os Turbos Chegaram!Por Claudinei Rodrigues – [email protected]

Page 20: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

20

Perguntas & Respostas

Pergunta: Ao tentar inserir um valor em branco em umacoluna VARCHAR do DB2, estou tendo problemas. No DB2,branco é um valor diferente de nulo e é aceitável. Estou usandoClientDataSet com DBExpress.

Quando uso FieldByName (‘NOME’).AsString := ‘ ‘, ocorreum erro relatando que estou tentando inserir um valor nulo emuma coluna not null, o que não é verdade.

Se uso FieldByName(‘NOME’). AsString = quotedStr(‘ ‘), acoluna DB2 fica com conteúdo igual a ‘ ‘, que também não é valorbranco. A única forma que funcionou foi fazer INSERT direto natabela ( INSERT INTO TABELA VALUES (SPACE(1)), porémesta forma é mais onerosa ao banco do que com o FieldByName,que já está posicionado no registro a ser inserido.

Como fazer isso utilizando o FieldByName ?

Resposta: Pela mensagem de erro, eu acho que vocêdeveria verificar o seguinte.

Supondo que você esteja utilizando o componente SQLQueryou SQLDataSet verifique se os campos foram adicionados a umdestes componentes. Se foram, verifique o campo em questão se apropriedade Required está igual a True. Se estiver, altere-a paraFalse. Agora para gravar nulo, utilize o seguinte comando:

ClientDataSet1.FieldByName(‘campo’).Clear;

Dúvida enviada por Erick, São Paulo – SP

Pergunta: Como posso remover as barras de rolagemvertical e horizontal em um componente DBGrid?

Resposta: Existem duas formas de se fazer isto. Naprimeira podemos desligar a barra de rolagem do DBGrid atravésdo evento onDrawColumnCell, mas pode ser que não fiqueperfeito. Pode ser que fique piscando a barra de rolagem noDBGrid. Se não quiser assim crie um novo componente eredefina a procedure Paint.

// Aqui é a primeira solução onde desligamos// no evento OnDrawColumnCellprocedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;DataCol: Integer; Column: TColumn; State:TGridDrawState);begin SetScrollRange(TDBGrid(Sender).Handle, SB_VERT, 0, 0, False);end;

Agora a segunda solução é deve criando um método Paint

exatamente igual ao do componente pai (o DBGrid), ou seja ummétodo paint com a clausula override. Este método paint, vaichamar um outro método SetScrollRange da API para pegar ovalor máximo e o valor mínimo do scroll e passar ele para zero,desabilitando o scrollbar, e depois, chamar o método paintascendente. O código abaixo faz isso para você.

unit NovaGrid;

Page 21: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

21

Perguntas & Respostas

interfaceuses WinTypes, WinProcs, Classes, DBGrids;type TDBGridSemRolagem = class(TDBGrid) protected procedure Paint; override; end;procedure Register;implementationprocedure TDBGridSemRolagem.Paint;begin SetScrollRange(Self.Handle, SB_VERT, 0,

0, False); inherited Paint;end;procedure Register;begin RegisterComponents(‘Data Controls’,

[DBGridSemRolagem]);end;

end.

Dúvida enviada por Evilásio, Lages – SC.

Pergunta: Estou tentando fazer um projeto que utilizeenvio de arquivos via FTP. Para isso consegui um programaexemplo. Quando fui abrir no Delphi recebi um erro na tela.Mandei ignorar e o projeto abriu. Mas quando fui tentar compilarrecebi outro erro que é o seguinte:

[Fatal Error] Unit2.pas(8): File not found:‘IdExplicitTLSClientServerBase.dcu’.

Como posso resolver este problema?

Resposta: O seu exemplo não está funcionando, porque aversão do componente Indy utilizada é a versão 10 e no Delphi 7 aversão é 9. Você pode resolver de duas formas. A primeira éutilizando o exemplo da versão 9 que está disponível no site dofabricante no link:

http://www.indyproject.org/Sockets/Demos/index.en.aspx ouainda baixando a versão 10 que está disponível no mesmo site nolink http://www.indyproject.org/Sockets/Download/

Borland.en.aspx.

Duvida enviada por Luiz Carlos, Vitória-ES

Pergunta: Estou tentando enviar um e-mail via código,utilizando o componente TNMSMTP, e configurei-o a princípiocorretamente, mas no momento do “send” aparece um erro deautenticação! Não tenho nem idéia do que fazer, não entendoabsolutamente nada sobre e-mail. Gostaria de saber se vocêsteriam um projeto modelo para enviar pra mim.

Resposta: O problema mencionado ocorre porque você nãoestá informando o nome do usuário e senha para que seja feita aautenticação. Infelizmente este componente não tem este recurso.Como você está utilizando o Delphi 6, neste caso te aconselho autilizar o componente Indy que também acompanha o Delphi.Veja um exemplo bem simples e completo deste componente nodiretório C:\Arquivos de

programas\Borland\Delphi6\Demos\Indy\MailClient.

Dúvida enviada por Murilo, Belo Horizonte - MG

Pergunta: Tenho o seguinte campo, na minha base dedados FireBird.

DATA -> TIMESTAMP Como devo fazer a passagem de parâmetros, para que eu

possa gravar na base de dados a data+hora, pois no meu caso sóestou conseguindo gravar a data.

Resposta: Pelo que pude entender no seu e-mail eusuponho que você esteja utilizando uma stored procedure e ocomponente TSQLStoredproc, sendo assim você pode trabalharda seguinte forma:

SQLStoredProc1.ParamByName(‘nomedocampo’).

AsSQLTimeStamp := dataehora;

Dúvida enviada por Miari, Três Pontas - MG

Pergunta: Caros colegas, estou usando a instrução SQLabaixo para filtrar clientes por estado, porém quando executo o

Page 22: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

22

Perguntas & Respostas

comando open acusa um erro dizendo ‘PE’ column unknown.Gostaria de saber como resolver esse problema.

procedure TfMnuPriSel.Button1Click(Sender:TObject);VAR sListest : STRING;begin sListest := ‘PE’ ; With IBQuery1,SQL do begin Close; Clear; Add(‘SELECT * FROM IB_CLIENTES ‘); If sListest <> ‘’ then Add(‘WHERE ESTCFT IN

(‘+sListest+’) ‘); open; end;end;

Resposta: O problema neste caso é que a informação quevai para dentro do parenteses deve estar entre aspas. Pararesolvermos isto podemos utilizar a função QuotedStr, porexemplo:

var sListest : STRING;begin sListest := ‘PE’ ; With IBQuery1,SQL do begin Close; Clear; Add(‘SELECT * FROM IB_CLIENTES ‘); If sListest <> ‘’ then Add(‘WHERE ESTCFT IN

(‘+QuotedStr(sListest)+’) ‘); open; end;end;

Dúvida enviada por Sandro, Recife – PE

Pergunta: Como proceder, para substituir o valor de um

GENERATOR no banco de dados FireBird, em tempo deexecução, e que o código seja executado dentro de uma storedprocedure por exemplo:

numero = 1010; SET GENERATOR nome_do_generator TO :numero;

Como posso utilizar esse comando dentro de uma

STORE_PROCEDURE ?

Resposta: Em uma stored procedure você não pode utilizaro comando SET GENERATOR....TO... A única forma é você ler ovalor atual do generator e ajustar o valor através de outrachamada. Mas tenha muita atenção de fazer isto em um sistemamulti-usuário, pois não é garantido que as duas chamadas dafunção GEN_ID serão chamadas em uma única operação. Vejaabaixo a seguir um exemplo simples.

CREATE PROCEDURE SetGen (val INTEGER) ASBEGIN val = GEN_ID (MyGen, val - GEN_ID

(MyGen,0) );END

Dúvida enviada por Antonio, Olinda - PE

Pergunta: Gostaria de saber como devo fazer para inibiruma coluna em um DBGrid em

tempo de execução.

Resposta: Pelo que pude entender no seu e-mail eu achoque você quer remover e incluir

uma determinada coluna no DBGrid. Sendo assim faça daseguinte forma:

Para remover:

procedure TForm1.Button2Click(Sender:TObject);begin DBGrid1.Columns.Delete(0);end;

Onde 0 é o número da coluna desejada.E para adicionar utilize:

Page 23: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

23

Perguntas & Respostas

procedure TForm1.Button1Click(Sender:TObject);var C: TColumn;begin C := DBGrid1.Columns.Add; C.FieldName := ‘Name’;end;

Dúvida enviada por Armando, Guarulhos - SP

Pergunta: Como faço para verificar se já existe um ODBCcriado e senão existir criar via programa este ODBC para bancoMYSQL.

Resposta: Veja abaixo a rotina de criação da conexão ODBCpara MySQL:

implementation

{$R *.dfm}

procedure CreateODBCDriver(ConstcDSNName,cUser, cPassword,cExclusive,cDescription,cDataBase,cDefaultPath,cConfigSql,cDriver: string);type TSQLConfigDataSource = function( hwndParent:HWND; fRequest: WORD;lpszDriver: LPCSTR; lpszAttributes: LPCSTR ):BOOL; stdcall;const // Adiciona uma fonte de dados (data source) ODBC_ADD_DSN = 1; // Configura a fonte de dados (data source) ODBC_CONFIG_DSN = 2;// Remove a fonte de dados (data source) ODBC_REMOVE_DSN = 3;// Adiciona um DSN no sistema ODBC_ADD_SYS_DSN = 4;// Configura o DSN do sistema ODBC_CONFIG_SYS_DSN = 5;// Remove o DSN do sistema ODBC_REMOVE_SYS_DSN = 6;

var pFn: TSQLConfigDataSource; hLib: LongWord; strDriver: string; strAttr: string; fResult: BOOL; ModName: array[0..MAX_PATH] of Char;begin Windows.GetModuleFileName ( HInstance, ModName, SizeOf(ModName) ); hLib := LoadLibrary( pChar(cDefaultPath) );// carregando para o diretório padrão if( hLib <> NULL ) then begin @pFn := GetProcAddress

( hLib, pChar(cConfigSql) ); if( @pFn <> nil ) then begin strDriver := cDriver; strAttr := Format(

‘DSN=%s’+#0+’USER=%s’+#0+’PASSWORD=%s’+#0+‘Database=%s’+#0+’Exclusive=%s’+#0+’Description=%s’+#0+#0,

[cDSNName,cUser, cPassword,cDataBase, cExclusive,cDescription] );

fResult := pFn( 0, ODBC_ADD_SYS_DSN,@strDriver[1], @strAttr[1] );

if( fResult = false ) then ShowMessage( ‘Falha ao tentar criar

o DSN (Data source).’ ); end; FreeLibrary( hLib ); if fResult then ShowMessage( ‘Banco de dados

criado.’ ); end else begin ShowMessage( ‘o sistema não pode

carregar a biblioteca ODBCCP32.DLL’ ); end;end;

procedure TForm1.Button1Click

Page 24: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

24

Perguntas & Respostas

(Sender: TObject);begin CreateOdbcDriver( ‘theclubDB’,’root’,’masterkey’,’1',’teste deconexao’,’mysql’,’ODBCCP32',‘SQLConfigDataSource’,’MySQL ODBC 3.51Driver’);end;end.

Dúvida enviada por Silvio, São José do Rio Preto - SP

Pergunta: Como criar uma ordem em um campo do tipodate dentro do clientdataset depois de ser executado o métodoOPEN ? É importante informar que o clientdataset é o resultadode uma query com ordenação por data decrescente. Depois defazermos alguns cálculos e inclusões no dataset preciso mudar aordem para ascendente. Mas sem que tenha que fechar o datasete fazer uma nova Query. Tem como fazer tudo isso em run-time?

Resposta: Com o ClientDataset já aberto você não poderáadicionar um novo campo, mas de qualquer forma poderá criaríndices na propriedade indexdefs e atribuir o nome do campoonde foi criado o índice a qualquer a momento para a propriedadeIndexFieldNames do clientdataset, veja abaixo:

IndexDefs = < item Name = ‘ClientDataSet1Index1’ Fields = ‘DATA_CADASTRO’ end> procedure TForm1.FormCreate(Sender: TObject);begin ClientDataSet1.Open; ClientDataSet1.IndexFieldNames :=‘DATA_CADASTRO’;end;

Dúvida enviada por Marcelo, São Paulo - SP

Pergunta: Gostaria de saber se existe alguma forma decriar e alterar um arquivo de uma estação para um servidorusando o AssignFile. Como por exemplo: Estou numa estação e

executo tal função onde geraria um determinado arquivo paraoutra máquina servidor. Estou usando o Sistema operacionalXP e Delphi 6.

Resposta: Caso deseje apenas mover ou copiar o arquivo deuma máquina para outra, seria mais fácil utilizar a funçãoCopyFile ou MoveFile, ou mesmo a API do Windows para copiararquivos, veja abaixo os dois exemplos:

// Copiando vários arquivos usando CopyFileprocedure TForm1.BitBtn1Click(Sender: TObject);var SearchRec:TSearchRec; Result:Integer; Origem:array[00..255] of char; Destino:array[00..255] of char;begin Result:=FindFirst(‘c:\Dir_1\*.*’,faAnyFile, SearchRec); while Result=0 do begin StrPCopy(Origem,’C:\Dir_1\’+SearchRec.Name); StrPCopy(Destino,’C:\Dir_2\’+SearchRec.Name); CopyFile(Origem,Destino, True); Result:=FindNext(SearchRec); end;

// Copiando arquivos via API do Windowsimplementation Uses ShellAPI;{$R *.DFM}procedure TForm1.Button1Click(Sender:TObject); var F : TShFileOpStruct; Origem, Destino : string; vTo, vFrom : PCHAR; begin Origem:=FileListBox1.FileName; IF FileExists(Origem) then begin Destino:=Edit2.Text; F.Wnd := Handle; F.wFunc := FO_COPY;

Page 25: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

25

Perguntas & Respostas

Destino := Destino+’\’+ExtractFileName(Origem);

F.pFrom := PChar(Origem+#0); F.pTo := PChar(Destino); F.fFlags := FOF_ALLOWUNDO OR

FOF_RENAMEONCOLLISION; if ShFileOperation(F) <> 0 then ShowMessage(‘Arquivo não foi copiadocom sucesso!’); end else ShowMessage

(‘Arquivo Origem não encontrado’);end;

Dúvida enviada por Tatiane, Recife – PE

Pergunta: Gostaria de saber se vocês tem algum exemploem Delphi para travar o Teclado e o Mouse? Preciso travar oteclado para usar no TEF, pois já tenho Homologado, mas atéagora esta usando a função que vem na DLL da Bematech eagora preciso implementar para outra impressora Fiscal.

Resposta: Veja abaixo exemplo de rotina para desabilitar omouse/teclado por N segundos:

function FunctionDetect(LibName, FuncName: String; varLibPointer: Pointer): boolean;var LibHandle: tHandle;begin Result := false; LibPointer := NIL; if LoadLibrary(PChar(LibName)) =

0 then exit; LibHandle :=GetModuleHandle(PChar(LibName)); if LibHandle <> 0 then begin LibPointer := GetProcAddress

(LibHandle, PChar(FuncName)); if LibPointer <> NIL then Result := true; end;end;procedure TForm1.SpeedButton1Click

(Sender: TObject);var xBlockInput : function (Block: BOOL): BOOL;stdcall;begin if FunctionDetect (‘USER32.DLL’,‘BlockInput’, @xBlockInput)then begin xBlockInput (True); // Disable Keyboard

// & mouse Sleep(10000); // Wait for for 10 Secounds xBlockInput (False); // Enable Keyboard // & mouse end;end;

Dúvida enviada por Office System, Lajeado – RS.

Pergunta: Gostaria de saber como posso controlar alargura da coluna em um componente StringGrid, por exemplo: aprimeira coluna ser mais larga que as demais.

Resposta: O componente StringGrid tem duaspropriedades: ColWidths e RowHeights com as quais você poderátrabalhar. Veja abaixo um exemplo bem simples. Para adaptá-loas suas necessidades basta que você troque o numero zero pelonúmero da coluna ou linha desejada.

// Muda a largura da coluna StringGrid1.ColWidths[0] := 123; // Muda a largura da linha StringGrid1.RowHeights[0] := 123

Dúvida enviada por Sebastião, Salvador - BA

Pergunta: Tem jeito de saber se um registro já esta emedição em outro computador utilizando o Firebird?

Resposta: Jeito tem, utilizando o que chamamos de LockExplicito. Com a utilização da cláusula adicional WITH LOCKvocê permite a capacidade limitada de lock pessimista explícito.

Mas tenha muita, muita cautela. Utilize em condições que os

Page 26: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

26

Perguntas & Respostas

registros afetados sejam: . Extremamente pequenos (ideal para apenas um registro). Precisamente controladas pelo código da aplicação.Observação: A necessidade de um lock pessimista no Firebird

é realmente muito raro e deve ser bem entendido antes de seconsiderar o uso desta extensão.

A seguir veja um exemplo de sua utilização:

SELECT * FROM CUSTOMERWHERE CUST_NO = 1001WITH LOCK

Se a cláusula WITH LOCK for bem sucedida, irá estabelecerum lock nos registros selecionados impedindo que outrastransações possam ler qualquer um desses registros oudependentes, até que esta transação seja finalizada.

Se a cláusula FOR UPDATE for usada, o lock será aplicadopara cada registro, um a um, a medida que é descarregado parao cache do lado servidor. Isso possibilita que um lock que pareçaser bem sucedido quando requerido, falhe subsequentemente,quando existir uma tentativa de trazer um registro sobre o qualtenha sido feito um lock por uma outra transação.

É essencial que se compreenda os efeitos do isolamento deuma transação, assim como os seus outros atributos, antes de seimplementar um mecanismo de lock explícito numa aplicação.

O SELECT... WITH LOCK está disponível em DSQL e PSQLe será bem sucedido apenas em SELECT de uma única tabela.Não estando disponível para instruções de subquery, nem parajoins. Não podem ser utilizados com o operador DISTINCT, nemcom cláusula GROUP BY ou qualquer outra operação agregada.Não pode ser utilizado dentro de uma view nem com uma view,nem com tabelas externas e nem com stored procedureselecionáveis.

Pergunta: Estou iniciando com o Firebird e estou com umaduvida. Creio que simples.

Tenho um tabela de clientes com diversos campos de UF:

UFFAT // UF FATURAMENTO UFCOB // UF COBRANCA UFENT // UF ENTREGA.

Acrescentei Foreign keys. O UFFAT na tabela UFPAIS.Quando vou acrescentar UFCOB não permitiu. Como proceder ?

Resposta: Este erro está ocorrendo devido a violação dachave estrangeira. No momento da criação da FK, é feito averificação da integridade referencial do banco. Caso não existaesta integridade, não será permitida a criação da constraint.Neste caso acredito que existam registros com dados onde nãoexista referência na tabela “PAIS”, não

validando assim a integridade referencial. Sendo assim,preencha os campos apenas

com valores existentes na tabela de relacionamento.

Dúvida enviada por Ramos, São Paulo – SP

Pergunta: Estou codificando um sistema onde usamos oDelphi 7 e o banco de dados Oracle, e está ocorrendo o seguinteerro:

“ORA-01000: maximum open cursos exceeded”.Vocês tem alguma solução para esse erro?

Resposta: Nós não trabalhamos com o Oracle, mas temos ainformação que toda vez que o banco de dados é inicializado, ele lêum arquivo de configuração chamado initorcl.ora (onde orcl é onome da instância, criada na instalação do banco). Esse arquivose localiza no subdiretorio \database do diretório definido como“oracle home”, por default \orant em ambientes windows ntserver. Deve ser incluída nesse arquivo uma linha como abaixo

open_cursors = 150

Onde 150 é apenas um exemplo. Cada base de dados exigeum parâmetro diferente, que deve ser identificado pelo dba. Nãodeve ser colocado aleatoriamente um numero alto, pois isso iráconsumir desnecessariamente recursos do ambiente operacional.Por default o banco é criado para operar com 50 cursores.

Também podem ser colocados outros parâmetros de trabalhonesse arquivo, como por exemplo:

nls_date_format = “dd-mm-yyyy”

Apenas isso resolve o problema, que é tipicamente deconfiguração. Depois de alterado esse arquivo, basta restartar oWindows que o banco será restartado também, com as novasconfigurações.

Page 27: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

27

Perguntas & Respostas

Pergunta: Como eu fico sabendo se o usuário resolveucancelar a execução de um componente um savedialog. Ou seja,ao invés de salvar ele opte em cancelar?

Resposta: O retorno da função execute do SaveDialog quechama a janela de “salvamento” é do tipo booleano, assim caso apessoa clique em “Salvar” o retorno da função será True, casoclique em cancelar o retorno será False, veja abaixo o exemplo:

procedure TForm1.BitBtn1Click(Sender: TObject);begin if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.FileName)else ShowMessage(‘Cancelado’);end;

Dúvida enviada por João, São José do Rio Preto - SP

Pergunta: Trabalho com projetos em pacotes run-time. Maspercebi que quando a aplicação roda em pacotes, as mensagensde dentro dos pacotes que fazem o uso do [mbyes,mbno] nãosaem em português. Como quando trabalho em um projeto nãorun-time. Quais procedimentos devem fazer para que o meupacote também saia com as mensagens em português [Sim,Não], que já estão declaradas na Unit Dialogs?

Resposta: Com certeza as units que estão sendo compiladasem ambos os casos são diferentes, assim deve ter duas .dcus comas constantes traduzidas e outra ainda original, sugiro queadicione a dcu traduzida no seu pacote ou encontre a dcu originale substitua pela traduzida. Outra alternativa que acaba com esteproblema, é utilizar uma função de mensagens personalizadas,veja abaixo a função Mensagem:

//(*****************************************// Function : Mensagem// Finalidade : Caixa de mensagem padrão do//sistema.// Parametros : Titulo ->// Tipo ->// TituloBotoes ->//Exemplo: if Mensagem(‘Titulo’, ‘Mensagem da

//tela’, mtConfirmation,[‘Sim’,//‘Não’]) = ‘Sim’ then//*****************************************)function Mensagem(Titulo, Texto: String;Tipo: TMsgDlgType; TituloBotoes :Array of String): String;var i, nBotoes: integer; Botoes: TMsgDlgButtons;const TitulosInt: Array[0..9] of string =(‘Ok’,’Cancel’,’Abort’,’Retry’,’Ignore’,’Yes’,’No’,’All’,’NoToAll’,’YesToAll’);begin nBotoes := High(TituloBotoes); if nBotoes > 10 then nBotoes := 10; For i:=0 to nBotoes do Case i+1 of 1: Botoes := [mbOk]; 2:Botoes := Botoes + [mbCancel]; 3: Botoes := Botoes + [mbAbort]; 4:Botoes := Botoes + [mbRetry]; 5: Botoes := Botoes + [mbIgnore]; 6:Botoes := Botoes + [mbYes]; 7: Botoes := Botoes + [mbNo]; 8:Botoes := Botoes + [mbAll]; 9: Botoes := Botoes + [mbNoToAll];10:Botoes := Botoes + [mbYesToAll]; end; with CreateMessageDialog(Texto, Tipo,Botoes) do begin try Caption := Titulo; For i:=0 to nBotoes do ( FindComponent(TitulosInt[i]) asTButton ).Caption :=TituloBotoes[i]; finally Result := TituloBotoes[ShowModal-1]; free; end; end;

end;

Dúvida enviada por Carlos, Belo Horizonte - MG

Page 28: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

28

Perguntas & Respostas

Compreendendo a cláusula WITH LOCK Como o engine considera, por sua vez, cada registro contido

numa instrução de lock explícito, então ou ele retorna a versão doregistro que foi mais recente comitada, independentemente doestado da base de dados quando a declaração foi submetida, ouretorna uma exceção. O comportamento de espera e os conflitosreportados dependerão dos parâmetros da transação especificadosno bloco TPB.

não serão bloqueados pela instrução. Porém, não pode garantirque não existam registros que, embora satisfaçam as condiçõesde pesquisa do WHERE, não estejam bloqueados.

Esta situação pode acontecer se alguma outra transaçãoparalela comitar suas alterações durante a execução dasinstruções de lock.

O engine trava os registros no momento que sãodescarregados ( fetch ). Isto tem conseqüências importantes sevocê travar vários registros de uma só vez. Muitos métodos deacesso ao Firebird utilizam pacotes para descarregar algunsregistros de cada vez (“buffered fetches”). Grande parte doscomponentes de acesso aos dados não poderão devolver osregistros contidos no último pacote descarregado, onde o erroocorreu.

A cláusula FOR UPDATE estabelece um método paraprevenir a utilização de “buffered fetches”, opcionalmente com oOF <nome-das-colunas> para ativar updates posicionados. Comoalternativa, isto pode ser possível nos seus componentes de acessoconfigurados com o tamanho do buffer de “fetch” para 1. Isto lhepermitirá o processamento do registro corrente que está travadoantes que o próximo registro seja descarregado e travado, ou paracontrolar erros sem a necessidade de executar o rollback datransação.

O Rollback de um savepoint implícito ou explícito libera osregistros travados que tenham sido adquiridos nesse savepoint,mas isto não notifica outras transações que estejam aguardando.A aplicação não deve tirar uso deste comportamento, pois éprovável que seja modificado no futuro.

Embora os locks explícitos possam ser utilizados paraprevenir e/ou controlar erros pouco comuns de conflitos deupdates, o volume de erros de deadlock irá aumentar a menosque se tenha uma estratégia cuidadosa e que a controlerigorosamente.

A maioria das aplicações não necessitará de locks explícitos. Oobjetivo principal dos locks explícitos é:

. Prevenir o controle de erros de conflito de update emaplicações pesadas

. Manter a integridade de objetos mapeados para uma base dedados relacional em ambientes de clusters.

Se usar o lock explícito fora destas duas categorias, então é aforma errada de executar esse serviço no Firebird.

O lock explícito é uma funcionalidade avançada, não a useinconscientemente! Embora estes casos sejam preciosos para websites que controlam milhares de escritas concorrentes, ou paraaplicações ERP/CRM utilizadas em grandes empresas, a maiorparte das aplicações não necessitam de trabalhar nestascondições.

Dúvida enviada por Maria Alice, Cascavel - PR

Quando uma declaração de UPDATE passar por um registroque esteja bloqueado por outra transação, ou uma exceção deconflito de update é apresentada ou ela espera que a transaçãoque possui o bloqueio seja finalizada, dependendo do modo TPB. OComportamento do engine é o mesmo como se este registro játivesse sido modificado pela transação que estabeleceu o bloqueio.

O engine garante que todos os registros visíveis por umainstrução de lock explícito estão realmente bloqueados esatisfazem as condições de pesquisa especificadas na clausula deWHERE, desde que a condição de pesquisa não dependa deoutras tabelas, via joins, subqueries, etc. Ainda garante que osregistros que não satisfazem a condição de pesquisa do WHERE

BPTodoM otnematropmoC

ycnetsisnoc_bpt_csi levínaskcolropsodanimileoãssoticílpxeskcoLoãsesoticílpxeuosoticílpmialebated

sodarongi

+ycnerrucnoc_bpt_csitiawon_bpt_csi

reuqlauqropodacifidomrofortsigermueSaeuqsiopedadatimociofeuqoãçasnart

uoodaçemocahnetoticílpxekcoledoãçasnartamuodatucexeahnetavitaoãçasnartamu

edoãçecxeamu,ortsigeretsedoãçacifidom.etnemataidemiadatneserpaéetadpuedotilfnoc

+ycnerrucnoc_bpt_csitiaw_bpt_csi

reuqlauqropodacifidomrofortsigermueSaeuqsiopedadatimociofeuqoãçasnart

uoodaçemocahnetoticílpxekcoledoãçasnartamuodatucexeahnetavitaoãçasnartamu

edoãçecxeamu,ortsigeretsedoãçacifidom.etnemataidemiadatneserpaéetadpuedotilfnoc

erboselortnocmetnamavitaoãçasnartamueSmuropuooticilpxekcolmuaiv(ortsigeretse

oatneteuqoãçasnarta,)atsimitpolamronkcol,eatsedonroteroleparepseoticílpxekcol

kcoloretboovonedatnet,animretaleodnauqoãçasnartaeseuqacifingisotsI.ortsigerodetsedoãçacifidomamuratimocarodaeuqolbéetadpuedotilfnocedoãçecxeamu,ortsiger

.adatneserpa

dettimmoc_daer_bpt_csitiawon_bpt_csi+

erboselortnocmetnamavitaoãçasnartamueSkcolmuropuooticílpxekcolmuaiv(ortsigeretse

edotilfnocedoãçecxeamu,)atsimitpolamron.etnemataidemiadatneserpaéetadpu

dettimmoc_daer_bpt_csitiaw_bpt_csi+

erboselortnocmetnamavitaoãçasnartamueSkcolmuropuooticílpxekcolmuaiv(ortsigeretse

kcoloatneteuqoãçasnarta,)atsimitpolamronaleodnauq,eatsedonroteroleparepseoticílpxe

.ortsigerodkcoloretboovonedatnet,animretáresacnunotilfnocedoãçecxeamU

oticílpxekcoledoãçurtsniamuropadatneserpaBPTedodometsen

Page 29: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

29

Novos Rumos

Novos rumosNovos rumosNovos rumosNovos rumosNovos rumosA Evolução não páraA Evolução não páraA Evolução não páraA Evolução não páraA Evolução não pára

O The Club, em seus 12 anos de existência, passou por umaevolução traumática, entre 1995 e 1996, quando fui obrigado aanunciar para toda a comunidade que não continuaríamos com osuporte técnico para o Clipper 5.3 e o Visual Objects. Como todossabem, essa foi uma decisão acertada, pois infelizmente, aComputer Associates simplesmente “matou” o Clipper e o VisualObjects simplesmente não deveria ter existido. A versão 1.0 doVisual Objects era horrível e sofrível, e incrivelmente a ComputerAssociates conseguiu deixar a versão 2.0 ainda pior. Assim, nãotive saída a não ser adotar o Delphi, para que todos osprogramadores tivessem uma alternativa para programar para oambiente Windows. Essa decisão mostrou-se acertada, pois oDelphi rapidamente evoluiu na versão 2.0 para o ambiente de 32bits, e suas atualizações não cessaram mais.

A Borland mostrando-se atenta ao mercado, começou nasnovas versões do Delphi, a mostrar a preocupação que a empresatinha em atender os desejos dos programadores de estarem navanguarda do desenvolvimento, principalmente com a Internet,assim, no Delphi 5 os programadores tinham à sua disposição oWebBroker para construção de CGI. Depois tivemos o IntraWeb,e finalmente a construção de aplicativos ASPX.

Interessante que foi justamente agora, com odesenvolvimento do ASPX que a Borland perdeu o rumo com oDelphi, e consequentemente está deixando os programadorespreocupados, sem saberem o que fazer. A maioria das pessoasresponsáveis pelo projeto Delphi dentro da Borland foi para aMicrosoft ou para outras empresas. Já a algumas versões que oDelphi não apresenta algo concreto no sentido evolutivo, aBorland só vem adicionando componentes de terceiros para daralgum fôlego ao Delphi, mas nada que radicalize ou que

justifique o imenso investimento necessário para se fazer asatualizações de troca de versão. Sem contar as idas e vindas dopessoal administrativo da Borland, como troca de nome daempresa, divisão, depois a volta às origens, retomada do uso donome Borland, reunião das empresas novamente e enfim, aúltima cartada, a separação das ferramentas de desenvolvimentoem uma nova empresa que imediatamente foi posta à venda.

Lembre-se que entre as ferramentas de desenvolvimento queestão sendo vendidas está o Delphi.

O interessante mesmo foi que não apareceu nenhuminteressado em comprar estes produtos. Sinais dos tempos. Sónão enxerga quem não quer. Já está mais do que claro aomercado que a Borland não vem atualizando o Delphi comodeveria, só está “tapando o sol com a peneira”. O Delphi 2006 éum exemplo disso. Foi lançado um mês antes da Microsoft lançaro Framework 2.0. E pasmem, não há uma atualização para oDelphi utilizar o Framework 2.0 até hoje! Em anúncio recente, aBorland disse que a nova versão do Delphi, provisoriamentechamada de Highlander, usará a versão mais recente doFramework. Fica aqui a dúvida, a mais recente hoje é a versão2.0, mas é muito provável que junto com o lançamento doWindows Vista a Microsoft também lance a versão final doFramework 3.0, que já está com o desenvolvimento muitoadiantado. Será que a próxima versão do Delphi suportará oFramework 3.0? Difícil saber no momento.

Pois bem, por essas e outras que venho anunciar a todosvocês, que o The Club a partir de Dezembro está oferecendosuporte técnico ao Visual Studio.NET de forma oficial. É notórioque o mercado está cada vez mais necessitado de aplicações para

por Celso Jefferson M. Paganelli

Page 30: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é

30

Novos Rumos

web, e o ASPX é o que há de mais robusto no momento, com umafacilidade e praticidade de desenvolvimento superior a qualquerferramenta existente no momento.

Isso não significa que o The Club está deixando de utilizar oDelphi ou de prestar suporte técnico. Pelo contrário. Até hoje oThe Club presta suporte técnico a programadores Clipper, e nãose enganem, ainda são muitas as pessoas que continuam usandoClipper, e certamente não vamos parar com o trabalho feito como Delphi.

O suporte técnico e tudo o que fazemos continuará sendo feitonormalmente com o Delphi, porém, a partir de Dezembro vocêterá também a oportunidade de obter suporte técnico doFramework e do Visual Studio.

Nesta nova empreitada o The Club contará com o apoio daMicrosoft e também fiz uma parceria com o Mauro Sant’Anna,sem dúvida o maior expoente de .Net no Brasil, sendo que além

de todas as certificações que possui, também é Regional Director,palestrante de praticamente todos os eventos da Microsoft aquino Brasil e também no exterior.

O The Club está empenhado em fornecer o melhoratendimento e as melhores condições para que você possa estarconcentrado no que realmente interessa: desenvolvimento. Nósresolvemos os problemas para você. Isso não será diferente agoracom o Visual Studio.

Reforçando: você a partir de Dezembro, contará com suportetécnico para Clipper, Delphi e Visual Studio. Lembre-se que oThe Club não deixará de prestar serviços e suporte técnico aoDelphi, tudo continua como está, você apenas contará com umaferramenta a mais no suporte técnico.

Espero que tenha gostado da notícia. Sinta-se a vontade paraentrar em contato comigo para dar sua sugestão. Meu e-mail é[email protected].

Page 31: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é
Page 32: Editorial - O maior clube de programadores do Brasil! · PDF fileênfase a importância, o CMMI ... pois os participantes do projeto não ... As desvantagens, na minha leitura, é