32
abril 2009

The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

Embed Size (px)

Citation preview

Page 1: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009

Page 2: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009

Page 3: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 03

LegendaIniciante

Intermediário

Avançado

Índice

Editorial

04

Delphi

Controle de versão de software utilizando o JEDI VCS

.NET

C# 4.0

Dicas Delphi

30

Acertar a data e a hora através do sistema

28

06O Visual Studio 2010 e .NET Framework 4,0 em breve estará em fase beta, e Juntamente com este lançamento, veremos o lan-çamento da versão 4.0 da linguagem de programação C #. Assim nesta edição Fabiano Belmont no seu artigo C3 4.0 irá olhar um pouco a trás de onde começou a linguagem...

26

Desafio The CLub

Teste seus conhe-cimentos.

Delphi no Windows Vista 09Ut i l i zando arqu ivo de

configuração UDF com ADO 12

DataSnap2009 - Parte II

15

Evitar a proteção de tela durante seu programa

Verificar o estado de NumLock e CapsLock

Ocultar/exibir a barra de tarefas do windows

Verificar se uma string contém um valor numérico válido

Limitar e região de movimento do mouse

22Simulando Inumeric com o dynamic do C# 4.0

Obter o espaço total e livre de um disco

Vitor Manuel Rodrigues

05

O backup é mesmo impor-tante?

A resposta é unânime entre os profissio-nais da área de informática.

“SIM! O backup é muito importante, e bla bla bla...!”

Então faço outra pergunta.- Porque “raios” esses mesmos profis-

sionais que rezam a ladainha do backup não fazem backup de seus preciosos dados?

Será que eles pensam se-rem imunes a vírus, falhas ...

Page 4: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200904

Bem-vindo

Delphi é marca registrada da Borland International, as demais marcas citadas são registradas

pelos seus respectivos proprietários.

Marcos César Silva - Editor [email protected]

O Visual Studio 2010 e .NET Framework 4,0 em breve estará em fase beta, e Juntamente com este lançamento, veremos o lançamento da ver-são 4.0 da linguagem de programação C #. Assim nesta edição Fabiano Belmont no seu artigo C3 4.0 irá olhar um pouco a trás de onde começou a linguagem de programação C # e olhar para onde Anders Hejlsberg do C # e sua equipe querem chegar.

Neste mês dou continuidade para meu artigo de Datasnap 2009 Parte II – Acesso a dados, onde mostro como é simples retornar dados através de um objeto TDataset da uma aplicação Servidora para uma aplicação cliente.

Temos também Victory Fernandes que após alguns meses sem escrever para nossa revista esta de volta com o artigo Delphi no Windows Vista, onde ele mostra dicas importantes e esclarece duvidas comuns de nossos sócios para o bom funcionamento do Delphi neste sistema operacional tão controverso.

O consultor do The Club Luiz Alexandre escreve sobre a ferramenta de controle de versões JEDI Version Control System, sendo o controle de versões um dos processos no desenvolvimento de software em equipe, umas das grandes dificuldades encontradas em empresas e equipes de-senvolvedoras de software.

Marco Antonio Armando vem com o artigo “Utilizando arquivo de con-figuração UDL com ADO”, embora o uso de arquivo de configuração de conexão a dados UDL, seja relativamente simples, ainda é um recurso pouco conhecido e utilizado pelos desenvolvedores que fazem uso dos componentes de acesso a dados ADO.

Desejo mais uma vez uma boa leitura a todos e que tirem o maior pro-veito possível de nossa revista. Vale lembrar que estamos sempre abertos a sugestões e criticas, caso tenham algo a nos dizer não percam tempo, me envie um e-mail com suas reclamações e sugestões, isto irá com certeza contribuir para a melhoria de nosso trabalho e conseqüentemente maior satisfação de nossos sócios.

Um grande abraço a todos.

Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150

Informações: (14) 3732-1529 Suporte: (14) 3733-1588

Internethttp://www.theclub.com.br

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

Skype Suporte: theclub_linha1 theclub_linha2

Copyright The Club Megazine 2008

Diretor TécnicoMarcos César Silva

Diagramação e ArteVitor M. Rodrigues

RevisãoMarcos César Silva

ColunistasAntonio Spitaleri Neto

Fabiano BelmonteLuís Alexandre de OliveiraMarco Antonio Armando

Marcos César SilvaVictory FernandesVitor M. Rodrigues

Impressão e acabamento:GRIL - Gráfica e EditoraRua São Paulo, nº 447

Cep: 18740-00 - Taquarituba-SPTel. (14) 3762-1345

ReproduçãoA utilização, reprodução, apropriação, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criações intelectuais em cada publicação da revista “The Club Megazine” são terminantemente proibidos sem autorização escrita dos titulares dos direitos autorais.

Page 5: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 05

Vitor M. Rodrigues

A resposta é unânime entre os profissio-nais da área de informática.

“SIM! O backup é muito importante, e bla bla bla...!”

Então faço outra pergunta.- Porque “raios” esses mesmos profis-

sionais que rezam a ladainha do backup não fazem backup de seus preciosos dados?

Será que eles pensam serem imunes a vírus, falhas de arquivos, pessoas que apagam arquivos sem querer, etc.?

Recebemos todos os meses pedidos de sócios para tentar recuperar um banco de dados que está com “pau”, ou se co-nhecemos um programa para recuperar arquivo deletado, e coisas do gênero.

A primeira coisa que os técnicos perguntam. “Já restaurou o backup?”A resposta é sempre a mesma.“Hum, Backup! Não temos backup!”

Ainda tem aqueles que dizem:- Mas como? Estava funcionando agora pouco!

Como foi estragar?Pra esses eu digo:“- Só estragou porque estava funcionando, se

não estivesse não estragaria.”

Já tivemos casos de pessoas que perderam o banco de dados (provavelmente alguém apagou por engano ou não! Vai saber...) e renomearam um arquivo qualquer com extensão de banco de dados e mandaram para a gente tentar “recupe-rar” os dados.

Outra coisa que sempre falo:- Trabalhamos com “tecnologia”, não com

“magia”.

Se alguém fizer esse tipo de milagre, por favor, envie seu currículo ao The Club. Contrato imediato!

Para os demais mortais só existe uma maneira

O backup é mesmo importante?de proteger seus dados...

BACKUP!Existem várias formas de efetuar backup, tem

pra todo gosto.Não venham com desculpas de que dá trabalho

fazer backup, o custo de um servidor de backup é alto, não lembro de fazer backup, etc.

Vamos derrubar as desculpas mais esfarrapa-das para não fazer backup com soluções práticas.

Desculpa 1 => Não faço backup por que o custo de um servidor é muito alto para os padrões de minha empresa.

Desculpa 2 => Não faço backup por que perde-se muito tempo fazendo backup, meus funcionários não podem perder esse tempo. Afinal eu pago eles para trabalhar.

Desculpa 3 => Não faço backup por que na correria acabo esquecendo.

SoluçõesSe o problema é custo, pode particionar o

HD de uma de suas máquinas e usá-lo para fazer o Backup.

Agora se o problema é tempo ou esquecimen-to, você pode usar um dos infinitos softwares que realizam backup automaticamente.

Por outro lado seu o seu problema é falta de conhecimento de como fazer um backup vai aí à sugestão.

Compre um HD externo, normal-mente eles já vêm com softwares de controle de backup.

Caso o HD que você comprou não

veio com software ou você não gostou dele compre um que se adapte ao seu modo de trabalhar ou baixe um gratuito.

Esses softwares fazem backup programado, sincronismo entre pastas, e são muito simples de utilizar.

HD externo de 1TB => R$650,00

Software de Backup => R$90,00

Tempo para instalar e configurar o programa de backup => 05 minutos

A expressão de “bocó” quando se perde um banco de dados sem backup => NÃO TEM PREÇO!

Se você é desses que tem seus backups em dia. Parabéns!

Agora se você é daqueles que recomenda, mas não faz backup. Boa sorte!

Caso tenha alguma dúvida sobre qual progra-ma utilizar ou como adaptar um sistema de backup a necessidade de sua empresa entre em contato, terei o maior prazer em ajudar.

Espero ter ajudado ou pelos menos alertado sobre o assunto.

Em breve nesse mesmo horário e nesse mesmo canal!

Aquele abraço e beijo nas crianças!

Page 6: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200906

Delphi

1. Introdução

Na primeira parte de nosso artigo sobre DataSnap 2009 mostrei como criar um servidor de métodos DataSnap, e uma aplicação cliente que consumia os métodos disponíveis no servi-dor. Nesta segunda parte irei demonstrar como criar um método para retornar um conjunto de dados, ou seja, um objeto TDataset resultante de uma consulta de dados feita na classe servidora. Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é muito importante que o leitor leia a primeira parte deste artigo e faça o download de seu exemplo no seguinte link:

http://www.theclub.com.br/revista/rev0309/Datasnap2009.rar

2. Criando conexão

Nesta primeira etapa vamos registrar o banco de dados na “Data Explorer” para facilitar o pro-cesso de criação da conexão e consulta de dados, para isto na janela Data Explorer adicione uma nova conexão no driver INTERBASE para dbExpress como pode ver na Figura 1, na janela Add New Connection (Figura 2) que será exibida, informe o nome EMPLOYEE para a conexão.

Figura 1 – Conexões existentes

Figura 2 – Nomeando nova conexão

Agora configure a conexão clicando com o botão direito do mouse sobre a conexão EMPLOYEE criada (figura 3), e informe em Database Name o caminho e nome do banco, onde como estamos usando o banco de dados Firebird o usuário será SYSDBA e a senha masterkey (figura 4). Lembrando que esta configuração pode ser feita também para outros bancos de dados como, Oracle, SQLServer,

MySQL entre outros.

Figura 3 – Conexão EMPLOYEE criada

Veja a Figura 4.

3. Módulo Servidor

Para facilitar o desenvolvimento deste exem-plo iremos dar continuidade no projeto iniciado no artigo anterior, assim abra o grupo de projeto DatasnapProjectGroup.groupporj, e em Project Manager abra o Servermodule unServerModule.pas (figura 5), feito isto vá à janela do Data Explorer e selecione a tabela CUSTOMER da conexão (figura 6) que criamos na etapa anterior, e “arraste” com o mouse e solte sobre o DSServerModule1, observe que será criado automaticamente (Figura 7) o componente EMPLOYEE: TSQLConnection; devi-damente configurado com a conexão de dados, e componente CUSTOMER: TSQLDataSet; com

Page 7: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 07

Figura 4 – Configurando a nova conexão

a propriedade CommandType selecionada em ctTable e CommandText com a tabela CUSTOMER selecionada.

Figura 5 – Selecionando o ServerModule

Figura 6– Selecionando a tabela desejada

Figura 7 – Visualização do ServerModule

Para efeito de teste altere a propriedade Active do componente TSQLDataSet CUSTOMER para true, assim automaticamente a mesma propriedade do componente TSQLConnection EMPLOYEE deverá ficar true, assim estaremos testando se a conexão e ligações foram criadas corretamente.

Criaremos agora o método de retorno de dados, digite então na seção public da classe TDSServerModule1, o cabeçalho da função Get-Customers, observando que a tipo do retorno da função será uma classe de dados TDataset, ficando da seguinte forma:

function GetCustomers:TDataset;

Dica da IDE: Com o curso de digitação sobre o nome da função pressione as teclas Shift+Ctrl+C para executar “Complete class at cursor”, que irá criar na seção implementation dos fontes o corpo do método de forma automática. Adicione então neste método os códigos para abertura da tabela CUSTOMER e o Result da function. Veja abaixo como será o código desta Unit:

unit unServerModule;

interfaceuses SysUtils, Classes, DSServer, WideStrings, DBXInterbase, FMTBcd, DB, SqlExpr;

type

TDSServerModule1 = class(TDSServerModule) EMPLOYEE: TSQLConnection; CUSTOMER: TSQLDataSet; private { Private declarations } public function PegaVersao:string; function GetCustomers:TDataset; end;

var DSServerModule1: TDSServerModule1;

implementation

{$R *.dfm}

{ TDSServerModule1 }

function TDSServerModule1.GetCustomers: TDataset;begin CUSTOMER.Open; Result := CUSTOMER;end;

function TDSServerModule1.PegaVersao: string;begin Result := ‘Versão 1.0’;end;

end.

Execute o projeto Server com a opção Run Without Debugging Shift+Ctrl+F9, para que a aplicação Servidora fique executando (figura 8) independente da execução do Delphi.

Figura 8 – Opção de execução

Page 8: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200908

Sobre o autor

Marcos César Silva, Consultor de Sistemas na consultoria de sistemas DataSmart e Consultor Técnico do The Club, Bacharel em Ciência da Computação, MBA em Gestão Empre-sarial, Certificações MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET)

4. Módulo Cliente

Nesta etapa vamos consumir o método de acesso a dado criado na aplicação servidora, pri-meiramente vamos atualizar a classe cliente DataS-nap, para isto remova a classe já criada no artigo anterior que agora está desatualizada com relação os novos métodos criados na aplicação servidora. Para remover esta classe vá à janela Project Mana-ger selecione a unit unClientClass.pas e remova do projeto como pode observar na figura 9.

Agora clique com o botão direito do mouse sobre o componente SQLConnection1 e selecione a opção “Generate Datasnap cliente class” (figura 10), e salve a classe cliente com o nome já usando anteriormente unClientClass.pas, sobrescrevendo o arquivo criado anteriormente.

Figura 9 – Removendo classe do projeto

Figura 10 – Gerando nova classe

Adicionaremos no form o componente Sql-ServerMethod2: TSqlServerMethod na sua pro-priedade SQLConnection selecione componente SQLConnection1 e na propriedade ServerMethod-Name selecione TDSServerModule1.GetCustomers (figura 11) criado na aplicação servidora. Agora adicione um:

• DataSetProvider1: TDataSetProvider e ligue sua propriedade Dataset ao SqlServerMe-thod2;

• ClientDataSet1: TClientDataSet e ligue sua propriedade ProviderName ao DataSetProvi-

der1;• DataSource1: TDataSource e ligue sua

propriedade Dataset ao ClientDataSet1;• DBGrid1: TDBGrid e ligue sua proprie-

dade DataSource ao DataSource1;

Finalmente adicione um Button3: TButton e no seu evento onclick abra a conexão do Clientdataset como pode ver no código abaixo:

procedure TfrmClient.Button3Click(Sender: TObject);begin ClientDataSet1.Open;end;

Figura 11 – Configurando SqlServerMethod

Verja Figura 12

5. Conclusão

Nestas duas partes do artigo foi possível demonstrar novos recursos e funcionalidades do DataSnap 2009, além é claro de como usar estes recursos, onde o leitor pode perceber como ficou muito mais simples trabalhar com esta tecnolo-gia, o que no artigo não foi possível demonstrar é como uma aplicação remota pode ficar muito mais rápida, ou seja, não podemos demonstrar sua performance. De qualquer forma acredito que o leitor irá ficar muito satisfeito com o resultado obtido desenvolvendo aplicações de acesso remoto usando esta tecnologia.

Download:http://www.theclub.com.br/revista/rev0309/Datas-nap2009.rar

Referência:h t t p : / / b l o g s . e m b a r c a d e r o . c o m /andreanolanusse/2008/10/16/exemplos-datasnap-dbexpress-e-outros-recursos-do-delphi-2009/

Figura 12 – Form cliente em tempo de design

Page 9: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 09

Você já instalou qualquer versão do Del-phi, abaixo da versão BDS2009, no Windows Vista? Então você sabe que os problemas começam logo após o fim da instalação!

Este artigo traz algumas dicas simples de como usar o Delphi no Windows Vista.

Executando o Delphi no Windows Vista

Após instalar o Delphi no Windows Vista, a primeira coisa que descobrimos é que o Vista acusa que o programa em questão possui algum tipo de incompati-bilidades e “bla, bla, bla”

Para executar o programa corretamente, clique com o botão direito do mouse sobre o ícone do Del-phi, selecione a opção “Propriedades” e, na paleta

Delphi no Windows Vista

Figura 01: Configurações de compatibilidade nas propriedades do aplicativo.

Page 10: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200910

“Compatibilidade”, marque as opções de “Executar em modo de compatibilidade para o Windows XP”, bem como a opção de “Executar como Administra-dor”, conforme mostrado na Figura 01.

Depois disso, sempre que você executar o

Delphi, surgirá uma janela de aviso onde você deve clicar na opção “Permitir”, para executar o Delphi normalmente. O procedimento descrito anteriormente pode ser executado para qualquer aplicativo que informe incompatibilidade com o Vista, e tipicamente, após executado, o aplicativo funcionará normalmente!

Abrindo arquivos de ajuda do Delphi (.hlp) no Windows Vista.

Bom, agora que você conseguiu executar o Delphi normalmente, você começa a trabalhar e, de repente, surge uma dúvida sobre algum comando ou função específica. O que você faz? Pressiona F1 ara abrir a ajuda, claro! Neste momento você des-cobre que o Windows Vista não executa arquivos de ajuda do tipo “.hlp”, pois o aplicativo WinHlp32.exe foi removido do sistema operacional!

Acontece que todos os arquivos de ajuda do Delphi até a versão 7 estão em formato “.hlp” e as versões “.chm” que acompanham o Delphi a partir da versão do BDS2007 não chegam nem aos pés das versões anteriores, são muito incompletas e confusas! Eu diria inclusive que a Borland, hoje CodeGear, retrocedeu consideravelmente ao ado-tar este novo padrão e não garantir que os novos arquivos “”.chm” estivesse à altura dos arquivos de ajuda “.hlp” existentes anteriormente!

Eu não sei o que passou pela cabeça de Bill Ga-tes e do pessoal da Microsoft quando removeram o suporte a arquivos “.hlp” do Windows Vista, pois é fato que muitos aplicativos ainda adotam este padrão de arquivos de ajuda. Felizmente existe uma solução simples para o problema.

Acesse o endereço a seguir da página de Windows Update mostrada na Figura 02 e Figura 03 onde, após o processo de validação da auten-ticidade do seu sistema operacional, é possível realizar o download da atualização que corrige o problema.

Figura 02: Página de download da atualização do WinHlp32.exe para Windows Vista

Figura 03: Atualização do WinHlp32.exe para Windows Vista

Figura 04: Executando arquivo “.hlp” no Windows Vista

Page 11: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 11

Sobre os autores

Victory Fernandes é Engenheiro Mestrando em Redes de Computadores, e de-senvolvedor sócio da TKS Software - Soluções de Automação e Softwares Dedicados. Pode ser contatado em [email protected], ou através dos sites www.igara.com.br – www.igara.com.br/victory

http://www.microsoft.com/downloads/details.

aspx?displaylang=pt-br&FamilyID=6ebcfad9-d3f5-4365

-8070-334cd175d4bb

Uma vez executados todos os passos da atu-alização, você poderá retornar à sua vida normal e executar arquivos “.hlp” normalmente no Windows Vista, para qualquer aplicativo, incluindo o Delphi, conforme mostrado na Figura 04.

Parece óbvio, mas ao trocar de notebook e

começar a trabalhar com Windows Vista eu passei alguns dias inconformado com problemas tão sim-ples que surgiam a todo instante e atrapalhavam o andamento das minhas atividades cotidianas.

Page 12: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200912

Introdução

Neste artigo buscaremos mostrar como aces-sar uma base dados do Microsoft Access, utilizando um arquivo de configuração UDL (Universal Data Link), utilizando para isto, os componentes ADO do Delphi.

O arquivo UDL é um arquivo de configuração externa do sistema, equivale a um arquivo do tipo DSN, para um provedor OLE DB. O UDL trata-se de um arquivo que armazena uma string de conexão, pois conterá informações referentes à conexão com um banco de dados, tais como:

• Nome do Servidor• Provedor Utilizado• Método de Segurança• Login a ser utilizado

Criação do arquivo

Uma das vantagens em se utilizar um arquivo UDL está na facilidade em se distribuir a aplicação, pois pode-se configurar as informações da conexão

Utilizando arquivo de configuração UDL com ADO

no próprio ambiente de produção do cliente, sen-do também que o arquivo UDL não necessita ser registrado pelo sistema operacional.

Para se criar um arquivo UDL seguiremos as seguintes etapas:

Abra o Windows Explorer, e abra o diretório de sua aplicação, clique em “Arquivo” no menu do Windows Explorer, e na opção “Novo”, selecione “Documento Texto”, nomeie o arquivo como “Dados.udl”.

Neste momento, iremos iniciar o processo de configuração da string de Conexão do Arquivo UDL. Assim dê um duplo clique no arquivo “Dados.udl”, onde será disponibilizada a seguinte tela (Figura 1):

Veja Figura 1. Clique na aba (alça) “Provedor”, e selecione

“Microsoft Jet 4.0 OLE DB Provider”, conforme na tela da Figura 2:

Veja Figura 2.

Figura 1

Page 13: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 13

Figura 2

Posteriormente, vamos para a aba “Conexão”,

e no item 1 insira o Path onde se encontra a base de dados, como por exemplo ”C:\Arquivos de programas\Arquivos comuns\Borland Shared\Data\dbdemos.mdb”, no item 2 informe o usuário que no caso do nosso banco Access será “Admin” e marque a opção de senha em branco conforme a tela abaixo (Figura 3):

Figura 3

Poderemos efetuar o teste de conexão, clican-do em “Testar conexão”.

Clique em OK, para salvar o arquivo.

Clicando com o botão direito do mouse sobre o arquivo “Dados.udl”, selecione abrir com, selecione Bloco de Notas. Observe como ficou nossa String de Conexão (Figura 4):

Veja Figura 4.

Exemplo

Neste momento, já tendo criado nossa string de conexão, partiremos para um exemplo de conexão via ADO, utilizando o nosso arquivo UDL criado.

Abra o Delphi, clique em “New” – “Application”, insira neste form um componente ADOConnection, da palheta ADO, um componete ADOQuery, tam-bém da palheta ADO, um componente DataSource, da palheta DataAccess, e por fim adicione um DB-Grid e um DBNavigator, da Palheta DataControls, conforme a figura Figura 5:

Veja Figura 5.

Na propriedade “login prompt”, do compo-nente ADOConnection1, altere para “false”, para que quando executarmos nosso exemplo, não seja solicitada login e senha de acesso. Agora selecione o componente ADOQuery1, e no Object Inspector,

Figura 4

Figura 5

na propriedade “Connection”, selecione ADOCon-nection1, e na propriedade “SQL”, insira a seguinte instrução: SELECT * FROM EMPLOYEE.

Selecione o componente DataSource1, e na propriedade “DataSet”, no Object Inspector, selecione “ADOQuery1”. Na propriedade “DataSource” do Object Inspector do DBGrid1, selecione “DataSource1”.

Também na propriedade “DataSource” do componente DBNavigator, selecione o componente “DataSource1”.

E por fim, vamos inserir uma rotina que será executada no evento OnCreate do Form1, que atribuirá dinamicamente as configurações de co-nexão no componente ADOConnection1, através dos parâmetros da string de conexão criada no arquivo UDL, como no código abaixo:

procedure AbreConexao;procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation

Page 14: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200914

{$R *.dfm}procedure TForm1.AbreConexao;beginADOConnection1.Close;ADOConnection1.ConnectionString := ‘FILE NAME=’+ExtractFilePath(Application.ExeName)+’Dados.udl’; try AdoConnection1.Open; except on E: Exception do begin MessageDlg(‘Atenção: Erro ao Abrir a conexão.’#13#10 + ‘Erro:’ + E.Message, mtWarning, [mbOk], 0); end; end;end;procedure TForm1.FormCreate(Sender: TObject);begin AbreConexao; ADOQuery1.Open;end;

end.

Figura 6

Quando executarmos nosso exemplo, será retornada a seguinte tela:

Veja Figura 6

Conclusão

Como vimos neste breve artigo, a utilização de arquivo de configuração do tipo UDL´s, facilita em muito quando ne-cessitarmos de distribuirmos aplicações, onde haja a necessidade configuramos uma string de conexão no próprio cliente, não tendo deixando este tipo de configu-ração estática na aplicação.

Até uma próxima!

Sobre o autor

Marco Antonio ArmandoConsultor Técnico The club

Page 15: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 15

Nesse artigo irei abordar o controle de versão com a ferramenta JEDI VCS, que vem de encontro com as solicitações dos nossos associados.

Muitos problemas que ocorrem durante o desenvolvimento de software são causados por falta de controle sobre os arquivos do projeto. Faça uma avaliação rápida da situação da sua equipe de desenvolvimento:

1. Já perdeu alguma versão anterior do código do projeto?

2. Tem problemas em manter diferentes versões do sistema ao mesmo tempo?

3. Alguém da equipe já sobrescreveu o código de outra pessoa por acidente e acabou perdendo as alterações?

4. Tem dificuldades em saber quais as alterações efetuadas em um programa, quando foram feitas e quem fez?

Se alguma das perguntas acima teve um ‘sim’ como resposta, então sua equipe necessita urgen-

t e -men-te de u m s istema para con-trole de ver-são.

É sabido que a grande maioria dos desenvolvedores, tanto de softwares para desktop quanto para a web, conhecem o conceito de controle de versões. Existem no mercado várias soluções prontas, que ajudam os programadores a organizar e gerenciar melhor seus desenvolvimentos. Porém a maioria destas soluções são proprietárias, e possuem uma operacionalidade bastante complexa.

Em meio a estas exite o JediVCS, uma alterna-tiva gratuita para realizar esta tarefa. É bastante utilizado no mundo de desenvolvimento de sof-twares para desktop.

O JediVCS opera com arquitetura cliente/servi-dor, sendo que o servidor de aplicação pode rodar

so-bre

Fire-b i r d ,

MySql, SqlServer

ou Oracle, podendo estes

vir, opcionalmente, embutidos no mesmo

instalador do servidor de controle de versões.

Sua instalação e implantação inicial é bem sim-ples, não necessitando de amplos conhecimentos em controle de versões para iniciar sua operação.

Vantagens proporcionadas pelo JEDI

• Backup automático dos arquivos• Snapshots de arquivos(versão anterior

do arquivo é preservada)• Acompanhamento da evolução do

projeto• Comparação entre versões de arqui-

vos

Page 16: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200916

Download dos arquivos O JediVCS pode ser obtido gratuitamente no

endereço :

http://sourceforge.net/project/downloading.php?group_id=75615&filename=JVCSv2.43SalFib.exe&a=62044491.

Faça o download da versão 2.43 dos arquivos Client e Server respectivamente (versão StandA-lone).

Instalação do Servidor

Como utilizarei o Firebird no artigo, escolhi a versão correspondente ao mesmo JVCSv2.43SrvFib.exe.

Para instalar o servidor, basta seguir as instru-ções apresentadas pelo programa de instalação (figura1)

Veja Figura1.

Estamos utilizando uma versão embarcada do servidor firebird.

Se seu Windows for em português, o script contendo todos os comandos SQL para geração das tabelas, triggers, generators etc se encontra na pasta:

C:\Arquivos de programas\JEDI\JVCS\server\archive\db_fib

Observe que na pasta há dois arquivos: fib_ib_create.sql e fib_ib_defvalues.sql. O primeiro cria os objetos de banco de dados e o segundo insere valores nas tabelas

Clique OK e o servidor JEDI VCS já estará rodando (figura 2).

Veja Figura 2

Instalação do Cliente

A instalação do Cliente é mais tranqüila que a instalação do servidor. Basta executar o script . Vale a pena ressaltar uma opção: A instalação de um plug-in para a IDE do Delphi que permite acessar as funções do versionamento sem precisar acessar

Figura1

Figura2

Page 17: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 17

o aplicativo clente externo. Figura 3

Veja Figura 3

Criando Usuários

O JEDI VCS permite que sejam criados usuários para acessar o controle de versão e definir a forma de acesso. Após rodar o script fib_ib_defvalues.sql durante a configuração do Servidor, um usuário chamado SYSDBA, com senha admin é criado, com direitos plenos de acesso. É através dele que outros usuários serão criados.

Abra o JEDI VCS Client (Iniciar>Programas>JEDIVCS>StandAlone GUI client), e na tela de login informe as credencias mencionadas anteriormente, juntamente com o endereço IP da máquina onde o servidor está rodando.

Caso o servidor esteja na mesma máquina do cliente, não use localhost ou 127.0.0.1 . Especifique o endereço IP exato de sua máquina ou selecione a aba Options na tela de login e marque a caixa Use always current local IP as host name.

Figura 4 . definindo os usuários do controle de versão

Interface do Cliente

A figura 5 mostra a interface principal do aplicativo cliente

Veja Figura 5

Nela podemos destacar• Project tree: ficam listados todos os

projetos arquivados pelo controle de versão. Pastas podem ser criadas para agrupá-las hierarquicamen-te;

Figura3

Figura5

• Modules list : Todos os arquivos perten-centes ao projeto selecionados aparecem aqui;

• Bottom panel : várias listas com dife-rentes informações são exibidas, na forma de abas, nesse painel inferior.

Projeto

Vamos criar um projeto . O JEDI VCS agrupa os arquivos inerentes a uma solução.

Para criar um projeto, siga os seguintes passos:

1. Selecione o menu Project>New2. Na caixa new Project, informe um nome

para o projeto, que é sempre em letras minúscu-las;

3. Será perguntado se você deseja que o JEDI VCS verifique se o nome informado é válido. Clique em yes.

4. Na mensagem seguinte, clique em Sim

Page 18: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200918

para criar o projeto no banco de dados do aplica-tivo

5. Será pedido uma descr ição do projeto(figura 6). Descreva de modo sucinto a descrição do projeto

Figura 6

6. Será informado que o projeto foi criado com sucesso e se você deseja criar um grupo para o projeto recém-criado. Clique em Yes.

7. Na tela Project Hierachy todos os grupos existentes serão exibidos, juntamente com seus projetos. Para criar um novo, clique com botão direito do mouse sobre o treeview e selecione Create new Root Group, para criar um grupo no topo da hierarquia ou Create New Sub Group , para cirar um grupo dentro de outro;

8. Para inserir um projeto em grupo, clique com o botão direito sobre o grupo desejado e selecione Add Project. Selecione o item e clique em Done .

Ao termino desses passos, o projeto aparecerá no Project tree View (figura7)

Veja Figura 7

Incluindo arquivos

Há duas formas de incluir arquivos em um projeto: individual ou em grupo. Para inserir um arquivo específico, vá ao menu Module e clique em add. Na caixa de dialogo que aparecer localize o arquivo no disco e clique em Ok.

Se for necessários muitos inserir muitos arqui-vos de uma vez, por exemplo, todos os documentos TXT de uma pasta que contém subpastas, escolha Add by folder no menu Module. Especifique o diretório inicial da pesquisa, a máscara desejada,se irá buscar nas subpastas etc.

O JEDI trabalha com extensões associadas. Dessa forma, quando um arquivo .pas é incluído, todos os outros que tenham o mesmo nome e possuem extensões do mesmo grupo também serão. Isso implica que você não precisa adicionar

Figura7

Figura8

Figura9

Page 19: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 19

o arquivos .dfm, somente os .pas.Os grupos de arquivos podem ser editados

no menu Tools->File Families Manager. Nas duas formas, individualmente ou em grupo, será solici-tada uma descrição para o módulo. É recomendável informar a descrição do arquivo(Figura 8)

Veja Figura 8

Após informar a descrição, será apresentada a caixa de check in(figura 9).

Veja Figura 9

Nela você poderá informar o que foi feito no arquivo. Dessa forma você poderá saber exatamen-te o que foi alterado na versão.

Compartilhando arquivos

No JEDI VCS um ou mais arquivos podem fazer parte de mais de um projeto. Apenas uma versão deles será salva no banco de dados. As alterações feitas sobre algum arquivo compartilhado serão refletidas automaticamente nos projetos ao quais eles pertence.

Para compartilhar um arquivo entre projetos, abre primeiramente o projeto que você deseja que receba o módulo, clique no menu share>add Module Shared. Na caixa que será exibida, indique o projeto onde o arquivo esta incluso, clique em Next e a seguir marque os arquivos desejados. Clique em Ok para terminar.

Editando arquivos versionados

Uma vez adicionado ao controle de versão do JEDI VCS, um arquivo teoricamente só deveria ser modificado após a ferramenta de versionamento autorizar a edição. Esse processo chama-se check out.

Para realizar o check out de um módulo, clique com o botão direito do mouse sobre a Module list e selecione Check out. Observe a caixa de dialogo (Figura 10) .

Veja Figura 10.

Lembrando que você pode fazer o Check out de vários arquivos simultaneamente. Uma vez marcado o check-out , o arquivo não pode ser mo-dificado por nenhum outro usuário até a realização do próximo Check in.

Figura10

Desfazendo o check out.

Pode ocorrer que seja necessário desfazer as modificações realizadas em um arquivo. Para isso, basta selecionar o módulo em questão e , clicando com o botão direito do mouse, escolher a opção Undo Ckeck out.

Salvando as alterações em um ar-quivo

Para enviar a nova versão ao banco de dados, após realizar o Check out e trabalhar em um ou mais arquivos, clique com o botão direito do mouse e selecione Check in/put. A mesma caixa da figura 8

será exibida.Note que o número da versão de cada arquivo, será automaticamente incrementado.

Ao realizar o check in, o arquivo volta a ser somente de leitura e outros usuários podem trabalhar com ele.

Restaurando uma versão anterior

O JEDI VCS permite voltar a uma versão ante-rior do arquivo. Para isso, clique com o botão direito do mouse sobre o arquivo desejado, e selecione Get/Version History(Figura 11)

Veja Figura 11.

Figura11

Page 20: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200920

O JEDI VCS copiará os arquivos para um pasta temporária e depois executará o programa associado no Windows á sua extensão. Clicando em get você irá copiar o arquivo para sua pasta de trabalho local.

Atualizando arquivos locais

Quando se trabalha em equipe, é comum precisarmos ter em nossos computadores a ultima versão de cada arquivo de um projeto. Esse processo, de assegurar que a cópia local é idêntica à armazenada no servidor é chamada de Synchronize.

Para executá-lo, clique no menu Projetct-> Synchronize/Restore (Figura 12)

Veja Figura 12.

Na primeira aba serão listados todos os arquivos do projeto selecionado. O JEDI VCS irá compará-los com suas respectivas cópias para saber se algo mudou. Os módulos mais novos no servidor estarão marcados.

Para sincronizar clique em Sysnc para que o aplicativo inicie a sincronização.

Comparando arquivos

Ao trabalhar com uma ferramenta de versiona-mento de arquivos, freqüentemente é necessário realizar comparações entre arquivos. Isso é útil , por exemplo, quando ocorre um bug em uma versão do código fonte que não existia na versão anterior. Comparando as versões do arquivo fica fácil achar o código que provocou o problema.

Para comparar arquivos, selecione o modulo desejado, clique com o botão direito do mouse e selecione Diff/Merge. No formulário (Figura 13), você tem a opção de comparar a versão local do ar-quivo com alguma versão salva no banco de dados ou então comparar as versões armazenadas.

VejaFigura 13.

Para iniciar a comparação, clique no botão Compare. O JEDI VCS Diff/merge será aberto(figura 14), exibindo as duas versões do arquivo, lado a lado.

Veja Figura(14).

Figura13

Figura12

Figura(14). Comparando dois arquivos.

Page 21: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 21

A esquerda será mostrada a versão mais nova do módulo, e à direita, a mais antiga. As indicações são mostradas na barra à esquerda da tela.

Conclusão

Controle de Versão resolve diversos proble-mas básicos de desenvolvimento tais como uso de diferentes versões de código, sincronização do trabalho paralelo de desenvolvedores no mesmo projeto, recuperação de versões anteriores e registro do histórico de alterações. Portanto é imprescindível adotar essa prática numa empresa de desenvolvimento.

Fontes

http://www.pronus.eng.br/artigos_tutoriais/gerencia_configuracao/contro-le_versao.php?pagNum=0

http://pt.wikipedia.org/wiki/Siste-ma_de_controle_de_vers%C3%A3o

Sobre o autor

Luís Alexandre de Oliveira é Téc-nologo em Processamento de Dados ,graduado pela Faculdade de Técnologia de Sorocaba, Consultor técnico do The Club.

Docente do curso técnico informática - Etec de Avaré e do curso Tecnologia em Redes de Computadores - Fatec Eduvale – Avaré

Page 22: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200922

O Visual Studio 2010 e .NET Framework 4,0 em breve estará em fase beta, e exis-tem alguns novos recursos excelentes que todos nós podemos esperar animados com este novo lançamento. Juntamente com o Visual Studio 2010 e do. NET Framework 4,0 veremos a versão 4.0 da linguagem de programação C #. Neste artigo eu gostaria de olhar um pouco a trás de onde começou a linguagem de programação C # e olhar para onde Anders Hejlsberg do C # e sua equipe-querem chegar.

Em 1998, o projeto C # começou com o objetivo de criar uma simples, moderna e orientada a objeto, linguagem de programação que se

tornou conhecido como o. NET. A Microsoft lançou o. NET e a linguagem de programação C #, em me-ados 2000 e desde então, C # tornou-se uma das mais populares linguagens de programação em uso

4.0

hoje. Foi lançado então o C# 1.0

A versão 2.0 da linguagem evoluiu de mais, particularmente acho que e umas das maiores evoluções em tão pouco tempo de uma linguagem e passou a dar suporte aos genéricos, métodos anô-nimos, iterators, tipos parciais e tipos anuláveis.

Ao conceber a versão 3.0 da linguagem a ênfase foi para permitir a LINQ (Language Integrated Query), que exigia a adição das seguintes funcionalidades:

• Implictly Typed Local Variables. • Extension Methods. • Lambda Expressions. • Object and Collection Initializers. • Annonymous types. • Implicitly Typed Arrays. • Query Expressions and Expression

Trees.

No passado linguagens de programação foram projetadas com um determinado paradigma em mente, e como tal, temos linguagens que foram, como exemplo, destinadas a serem orientadas a ob-jeto ou funcionais. Hoje, porém, as linguagens que a ser concebidas com vários paradigmas em mente. Na versão 3.0 da linguagem de programação C # ad-quiriu várias capacidades funcionais normalmente associados a programação para permitir Language Integrated Query (LINQ).

Na versão 4.0 do C # continua a evoluir, embora desta vez, a equipe do C # foram inspiradas por linguagens dinâmica como Perl, Python e Ruby. A realidade é que existem vantagens e desvantagens para ambas as linguagens seja ela escrita estatica-mente e dinamicamente.

Outro paradigma alem do design e inovação é concorrente que é um paradigma que tem certa-mente influenciaram o desenvolvimento do Visual Studio 2010 e do. NET Framework 4.0.

Page 23: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 23

Agora o que o C# traz de novo:• Dynamically Typed Objects. • Optional and Named Parameters. • Improved COM Interoperability. • Safe Co- and Contra-variance.Chega de papo e vamos olhar para algum

exemplos em C # 4.0 utilizando essas inova-ções língua ...

Em C # Hoje você pode ter, o seguinte código que é uma instância de uma clase escrita estatica-mente . NET então chama o método Add em que a classe para obter a soma de dois inteiros:

Calculator calc = GetCalculator();int sum = calc.Add(10, 20);

Nosso código fica ainda mais interessante se a classe Calculadora não é escrita estaticamente, mas está escrito em COM, Ruby, Python, ou mesmo JavaScript. Mesmo se soubéssemos que a classe é uma calculadora. objeto NET, mas não sabemos qual o tipo específico que é, então, teria de utilizar reflection para descobrir atributos e o tipo em tempo de execução e, em seguida, dinamicamente invocar o método Add.

object calc = GetCalculator();Type type = calc.GetType();object result = type.InvokeMember(“Add”, BindingFlags.InvokeMethod, null, new object[] { 10, 20 });int sum = Convert.ToInt32(result);

Se a calculadora classe foi escrito em JavaS-cript, então nosso código ficaria algo como a seguinte.

ScriptObect calc = GetCalculator();object result = calc.InvokeMember(“Add”, 10,

20);int sum = Convert.ToInt32(result);

Com C # 4,0 teríamos simplesmente escrever o seguinte código:

dynamic calc = GetCalculator();int result = calc.Add(10, 20);

No exemplo acima declaramos uma variável calc, cujo tipo estático é dinâmico. Sim, você leu corretamente que nós escrevemos estaticamen-te nosso objeto a ser dinâmico. Teremos então dinâmico usando método invocação para chamar o método Add e em seguida, dinâmico conversão para converter o resultado da dinâmica de uma invocação digitado estaticamente inteiro.

Você está ainda encorajado a usar tipagem estática sempre que possível, porque os benefícios que oferecem línguas escrita estaticamente nós. Usando C # 4,0 no entanto, deve ser menos dolo-roso nessas ocasiões em que você tem de interagir com objetos dinamicamente digitado.

Outro grande benefício do uso de C # 4.0 é que a linguagem suporta agora facultativa e parâmetros nomeados e por isso vamos agora dar uma olhada em como esta característica irá mudar a maneira de conceber e escrever o seu código.

Um desenho padrão você ver como muitas

vezes que um determinado método está sobrecar-regado, porque o método deve ser chamado com um número variável de parâmetros.

Vamos assumir que temos o seguinte método OpenTextFile juntamente com três sobrecargas do método com diferentes assinaturas. Sobre-cargas do método primário em seguida chame o método primário de passar os valores padrão no lugar desses parâmetros para os quais um valor não foi especificado na chamada para o método sobrecarregado.

public StreamReader OpenTextFile( string path, Encoding encoding, bool detectEncoding, int bufferSize) { }

public StreamReader OpenTextFile( string path, Encoding encoding, bool detectEncoding) { }

public StreamReader OpenTextFile( string path, Encoding encoding) { }

public StreamReader OpenTextFile(string path) { }

Page 24: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200924

No C # 4.0 O método primário pode ser refac-tored para usar parâmetros opcionais como mostra o seguinte exemplo:

public StreamReader OpenTextFile( string path, Encoding encoding = null, bool detectEncoding = false, int bufferSize = 1024) { }

Perante esta declaração, é agora possível chamar o método OpenTextFile omitindo um ou mais dos parâmetros opcionais.

OpenTextFile(“foo.txt”, Encoding.UTF8);

Também é possível usar o C # 4,0 suporte para parâmetros nomeados e, como tal, o método pode ser chamado OpenTextFile omitindo um ou mais dos parâmetros opcionais, enquanto especificando também outro parâmetro pelo nome.

OpenTextFile(“foo.txt”, Encoding.UTF8, bufferSize: 4098);

O nome dos argumentos deve ser fornecido somente estância última embora desde quando eles podem ser fornecidas em qualquer ordem.

Se você alguma vez escrito qualquer código que executa um certo grau de interoperabilidade COM você provavelmente visto como o código seguinte.

object filename = “test.docx”;object missing = System.Reflection.Missing.Value;doc.SaveAs(ref filename, ref missing, ref missing, ref missing,

ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

Com os parâmetros opcionais e nomeado linguagem C # 4,0 prevê melhorias significativas na interoperabilidade COM e, portanto, o código acima pode agora ser refactored tal que o convite é apenas:

doc.SaveAs(“foo.txt”);

Ao realizar a interoperabilidade COM você perceber que você é capaz de omitir a ref modifer embora o uso do modificador ref ainda é necessá-rio quando não exerçam COM interoperabilidade.

Com as versões anteriores das tecnologias era necessário também um navio Primary Interop Assembly (PIA), juntamente com o seu aplicativo

gerenciado. Isso não é necessário quando se uti-liza C # 4.0, porque o compilador irá injetar vez o interop tipos diretamente para as Assembly de seu aplicativo gerenciado e só vai injetar os tipos que você está usando e não de todos os tipos encon-trados no interior da PIA.

O último aperfeiçoamento lingüístico que vamos explorar é co-variância e contra-variância e vamos começar por explorar com a co-variância. NET matrizes.

string[] names = new string[] { “Anders Hejlsberg”, “Mads Torgersen”, “Scott Wiltamuth”, “Peter Golde” };

Write(names);

Desde versão 1.0 em um array o. NET Fra-mework foi co-variante significando que uma

Page 25: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 25

Sobre o autorFabiano BelmonteSenior Architect da InfoMoney.com, es-

pecialista em aplicações e-Business com larga experiência em B2B (Submarino.Com e Saraiva.Com). Trabalha há 5 anos com a tecnologia .Net, aplicando conhecimentos nas diversas áreas: instituições financeiras (sistema SPB), e-Commerce, gerenciamento logístico entre outras. Trabalhando com Visual Studio desde suas primeiras versões, responsável pela implementação de uma Metodologia de tra-balho e melhoras significativas no resultados e na qualidade do time de Desenvolvimento de muitas empresas por onde passou como (Saraiva.Com) e ferramentas como TFS (Team Foundation Server).

Foi palestrante em eventos como Codi-ficando. NET 2008 e outros eventos sobre Tecnologia .NET.

matriz de strings, por exemplo, pode ser passada para um método que espera um array de objetos. Como tal, a matriz acima pode ser transmitida para o seguinte Escreve método que espera um array de objetos.

private void Write(object[] objects){}

Infelizmente, em matrizes. NET não são co-seguro variante como podemos ver na seguinte código. Partindo do pressuposto de que os objetos variável é uma matriz de strings da seguinte terá êxito.

objects[0] = “Hello World”;

Embora se uma tentativa é feita para atribuir um inteiro à matriz de strings uma ArrayTypeMis-matchException é jogado.

objects[0] = 1024;

Em ambos os C # 2.0 e C # 3,0 invariantes são genéricos e, portanto, um erro compilador iria resultar o seguinte código:

List<string> names = new List<string>();

Write(names);

Quando o Escreve método é definido como:

public void Write(IEnumerable<object> objects) { }

Generics com C # 4,0 apoiar agora segura co-variância e contra-variância através do uso das palavras-chave dentro e fora contextuais. Vamos dar uma olhada em como isso muda a definição do <T> IEnumerable e IEnumerator <T> interfaces.

public interface IEnumerable<out T>{ IEnumerator<T> GetEnumerator();}

public interface IEnumerator<out T>{ T Current { get; } bool MoveNext();}

Você perceberá que o tipo de parâmetro T da interface IEnumerable foi prefixado com o fora contextuais palavra-chave. Dado que a interface IEnumerable é somente leitura, não há capacidade especificada na interface para inserir novos ele-mentos com a lista, ela é segura para o tratamento de algo mais derivados como algo menos derivados. Com a palavra-chave fora contextuais estamos afirmando que contratualmente IEnumerable <out T> segurança é co-variante. Dado que IEnumerable <out T> segurança é co-variante podemos agora escrever o seguinte código:

IEnumerable<string> names = GetTeamNames();IEnumerable<object> objects = names;

Porque a interface IEnumerable <out T> utiliza a palavra-chave no contexto do compilador podem motivo que a atribuição acima é seguro.

Utilizando a palavra-chave no contexto podemos alcançar seguro contra-variância, ou seja, tratar algo menos derivados como algo mais derivados.

public interface IComparer<in T>{ int Compare(T x, T y);}

Dado que IComparer <in T> é segura contra-variante podemos agora escrever o seguinte

código:

IComparer<object> objectComparer = GetComparer();IComparer<string> stringComparer = objectComparer;

Embora o actual build CTP do Visual Studio 2010 e do. NET Framework 4,0 tem suporte limitado para a variância melhorias em C # 4,0 a próxima versão beta permite que você use o novo para dentro e para fora contextuais tais como palavras-chave em tipos IComparer <in T>. O. NET Framework equipa está a atualizar os tipos, no âmbito de ser co-seguro e contra-variante.

Eu mostrei aqui alguns recursos que você pode achar útil para explorar as capacidades da linguagem de programação C # 4,0 e gos-taria de encorajá-lo a também fazer download e instalar a versão beta.

Bons Códigos...

Page 26: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200926

Quando eu escrevi a minha biblioteca financeiro tive que pensar muito sobre a de-cisão de qual tipo numéricos deveria utilizar para representar dinheiro. Pensei logo nas casas decimal, e ai pensei vou usar o decimal mas acabei optando pelo uso do double.

Teoricamente, eu gostaria que as minhas funções numéricas servissem para trabalhar para qualquer coisa que suporta os operadores aritméticos

básicos (isto é, +, -, * ...). Infelizmente isso não é possível em. NET neste momento. Em essência você tem que escrever o seu código de duas vezes para aceitar os dois tipos ou utilizar generics mais isso e uma outra abordagem.

static double SumDouble(double a, double b) { return a + b; }static decimal SumDecimal(decimal a, decimal b) {return a + b;}

Simulando Inumeric

com o dynamic do

C# 4.0

Nós muitas ve-zes discutida a forma de fazê-la funcionar, mas não foi possível encontrar uma solução que tanto foi rápido e barato para ser executado para que nós im-plementar. Mais freqüentemente do que não estamos a ter especulado sobre numéricos tipos específicos INumeric implementar uma interface genérica e adicionar um constrangimento para o C # / VB línguas para que ele funcione. Daí o título deste post.

Como nós implementamos dinâmico em C # 4,0, ocorreu-me que você pode fingir o seu cami-nho para escrever o código apenas uma vez. Com certeza, esta solução não tem as mesmas carac-terísticas de desempenho ‘escrever o seu código duas vezes “, mas pelo menos ele não duplicar o seu código.

Esta é a forma como ele se parece com:

static dynamic

Sum1(dynamic a, dynamic b) { return

a + b; }

A chamada para o ‘+’ operador seja resolvido em tempo de execução, pelo C # subcapa, conse-quentemente, um desempenho pena é incorrido. A pena é menor do que você possa pensar, uma vez que a DLR caches coisas sob a capa de modo que não v-quadro pesquisa é realizada pela segunda vez ao redor. A coisa toda é explicado em mais detalhes aqui. Mas mesmo assim, não é tão rápido como uma normal ‘+’ operador, ao longo de um tipo primitivo. Vou deixar que você aproveite este micro desempenho testando um :-)

Um ligeiro refinamento é fazer com que o códi-go genérico de modo que uma pessoa não vê uma

Page 27: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 27

Simulando Inumeric

com o dynamic do

C# 4.0

assinatura dinâmica com tipos como argumentos.

static dynamic Sum2<T1, T2>(T1 a, T2 b) { dynamic ad = a; dynamic bd = b; return ad + bd; }

Eu poderia fazer o retorno tipo genérico, mas que possam obrigar a pessoa a ser explícito sobre os tipos, fazendo com que o código chamando muito menos legível. A outra coisa boa sobre essa assinatura é que você recebe uma chamada local diferente a cada combinação de tipo de argumen-tos e, uma vez que eles são separados, os caches vinculativo deve ficar pequena. Com a assinatura antiga, só há uma chamada local e da cache po-derá acumular até ao ponto onde o DLR decida se desfazer dele.

Aqui é como chamar o código parece agora:

Console.WriteLine(Sum2(2m, 4m));Console.WriteLine(Sum2(2.0, 4.0));Console.WriteLine(Sum2(new DateTime(2000,12,1), new TimeSpan(24,0,0)));

Ainda outra maneira de escrever o código é o seguinte:

public static T Sum3<T>(T a, T b) {

dynamic ad = a; dynamic bd = b; return ad + bd; }

Isto fica em torno do problema de mostrar uma dinâmica retorno e dar-lhe mais algum tempo compilar tipo verificação. Mas isso não impede a soma coercível tipos. O compilador não permite que você chegar lá. A última linha abaixo acostu-

Sobre o autorFabiano BelmonteSenior Architect da InfoMoney.com, es-

pecialista em aplicações e-Business com larga experiência em B2B (Submarino.Com e Saraiva.Com). Trabalha há 5 anos com a tecnologia .Net, aplicando conhecimentos nas diversas áreas: instituições financeiras (sistema SPB), e-Commerce, gerenciamento logístico entre outras. Trabalhando com Visual Studio desde suas primeiras versões, responsável pela implementação de uma Metodologia de tra-balho e melhoras significativas no resultados e na qualidade do time de Desenvolvimento de muitas empresas por onde passou como (Saraiva.Com) e ferramentas como TFS (Team Foundation Server).

Foi palestrante em eventos como Codi-ficando. NET 2008 e outros eventos sobre Tecnologia .NET.

mado ‘compilar:

Console.WriteLine(Sum3(2m, 4m));Console.WriteLine(Sum3(2.0, 4.0));//Console.WriteLine(Sum3(new DateTime(2000,12,1), new TimeSpan(24,0,0)));

Também notar que em VB você poderia ter feito isto há muito tempo :-)

Function Sum(Of T1, T2)(ByVal a As T1, ByVal b As T2) Dim aa As Object = a Dim bb As Object = b Return aa + bb End Function

Em resumo, usando dinâmico você pode escrever o seu código numérico apenas uma vez, mas você paga um preço desempenho.

Espero que tenham gostado.

Bons Códigos...

Page 28: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200928

Dicas DELPHIAcertar a data e hora do sistema através do programa

procedure TForm1.Button1Click(Sender: TObject);var DataHora: TSystemTime; Data, Hora: TDateTime; Ano, Mes, Dia, H, M, S, Mil: word;begin Data := StrToDate(Edit1.Text); Hora := StrToTime(Edit2.Text); DecodeDate(Data, Ano, Mes, Dia); DecodeTime(Hora, H, M, S, Mil); with DataHora do begin wYear := Ano; wMonth := Mes; wDay := Dia; wHour := H; wMinute := M; wSecond := S; wMilliseconds := Mil; end; SetLocalTime(DataHora);end;

Evitar a proteção de tela durante seu programa

{ Na seção “private” do Form principal acrescente: }procedure AppMsg(var Msg: TMsg; var Handled: Boolean);

{ Na seção “implementation” acrescente (troque TForm1 para o nome do seu form principal): }procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean);begin if (Msg.Message = wm_SysCommand) and (Msg.wParam = sc_ScreenSave) then Handled := true;end;

{ No evento “OnCreate” do form principal, coloque: }Application.OnMessage := AppMsg;

Verificar o estado de NumLock e CapsLock

{ Esta função retorna true se a tecla informada estiver ligada. False em caso contrário }

function tbKeyIsOn(const Key: integer): boolean;begin Result := GetKeyState(Key) and 1 > 0;end;

{ Exemplo de uso: }

if tbKeyIsOn(VK_NUMLOCK) then { ... NumLock está ligada }else { ... NumLock está desligada }

Ocultar/exibir a barra de tarefas do Windows

procedure TForm1.BotaoOcultarClick(Sender: TObject);var Janela: HWND;begin Janela := FindWindow(‘Shell_TrayWnd’, nil); if Janela > 0 then ShowWindow(Janela, SW_HIDE);end;

{ No evento OnClick do BotaoExibir escreva: }

procedure TForm1.BotaoExibirClick(Sender: TObject);var Janela: HWND;begin Janela := FindWindow(‘Shell_TrayWnd’, nil); if Janela > 0 then ShowWindow(Janela, SW_SHOW);end;

Page 29: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009 29

Verificar se uma string contém um valor numérico válido

Use uma das funções abaixo, conforme o tipo de dado que se quer testar:

function StrIsInteger(const S: string): boolean;begin try StrToInt(S); Result := true; except Result := false; end;end;

function StrIsFloat(const S: string): boolean;begin try StrToFloat(S); Result := true; except Result := false; end;end;

Limitar a região de movimentação do mouse

procedure TForm1.Button1Click(Sender: TObject);var R: TRect;begin { Pega o retângulo da área cliente do form } R := GetClientRect; { Converte as coordenadas do form em coordenadas da tela } R.TopLeft := ClientToScreen(R.TopLeft); R.BottomRight := ClientToScreen(R.BottomRight); { Limita a região de movimentação do mouse } ClipCursor(@R); ShowMessage(‘Tente mover o mouse para fora da área cliente do Form’);

{ Libera a movimentação } ClipCursor(nil);end;

Obter o espaço total e livre de um disco

procedure TForm1.Button1Click(Sender: TObject);var SetoresPorAgrup, BytesPorSetor, AgrupLivres, TotalAgrup: DWord;begin Memo1.Clear; if GetDiskFreeSpace(‘C:\’, SetoresPorAgrup, BytesPorSetor, AgrupLivres, TotalAgrup) then with Memo1.Lines do begin Add(‘Setores por agrupamento: ‘ + IntToStr(SetoresPorAgrup)); Add(‘Bytes por setor: ‘ + IntToStr(BytesPorSetor)); Add(‘Agrupamentos livres: ‘ + IntToStr(AgrupLivres)); Add(‘Total de agrupamentos: ‘ + IntToStr(TotalAgrup)); Add(‘----- Resumo -----’); Add(‘Total de bytes: ‘ + IntToStr(TotalAgrup * SetoresPorAgrup * BytesPorSetor)); Add(‘Bytes livres: ‘ + IntToStr(AgrupLivres * SetoresPorAgrup * BytesPorSetor)); end;end;

{ O exemplo acima retorna as medidas em Bytes, Setores e Agrupamentos. Se preferir algo mais simples, use funções do Delphi. Veja: }

Memo1.Lines.Add(‘Total de bytes: ‘ + IntToStr(DiskSize(3)));Memo1.Lines.Add(‘Bytes livres: ‘ + IntToStr(DiskFree(3)));

{ Onde o parâmetro (3) é o número da unidade, sendo 1=A, 2=B, 3=C, ... }

Page 30: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 200930

Page 31: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009

Page 32: The Club - megazine · de controle de versões JEDI Version Control System, ... Para este projeto de exemplo irei usar o projeto iniciado na primeira parte deste artigo, assim é

abril 2009