abril 2009 abril 2009 Índice Vitor Manuel Rodrigues Editorial 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 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... 04 C# 4.0 Simulando Inumeric com o dynamic do C# 4.0 O backup é mesmo importante? DataSnap2009 - Parte II A resposta é unânime entre os profissionais da área de informática. “SIM! O backup é muito importante, e bla bla bla...!” Então faço outra pergunta. - Porque “raios” esses mesmos profissionais que rezam a ladainha do backup não fazem backup de seus preciosos dados? Será que eles pensam serem imunes a vírus, falhas ... Delphi no Windows Vista 05 .NET Delphi Utilizando arquivo de configuração UDF com ADO Controle de versão de software utilizando o JEDI VCS Dicas Delphi 22 Acertar a data e a hora através do sistema 26 Ocultar/exibir a barra de tarefas do windows Evitar a proteção de tela durante seu programa Verificar o estado de NumLock e CapsLock Verificar se uma string contém um valor numérico válido 28 Limitar e região de movimento do mouse Obter o espaço total e livre de um disco Desafio The CLub Legenda Iniciante Intermediário 06 09 12 15 Teste seus conhecimentos. Avançado abril 2009 30 03 Bem-vindo 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 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 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 desenvolvedoras de software. Marco Antonio Armando vem com o artigo “Utilizando arquivo de configuraçã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 proveito 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. Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150 Informações: (14) 3732-1529 Suporte: (14) 3733-1588 Internet http://www.theclub.com.br Cadastro: [email protected] Suporte: [email protected] Informações: [email protected] Skype Cadastro: theclub_cadastro Skype Suporte: theclub_linha1 theclub_linha2 Copyright The Club Megazine 2008 Diretor Técnico Marcos César Silva Diagramação e Arte Vitor M. Rodrigues Revisão Marcos César Silva Colunistas Antonio Spitaleri Neto Fabiano Belmonte Luís Alexandre de Oliveira Marco Antonio Armando Marcos César Silva Victory Fernandes Vitor M. Rodrigues Impressão e acabamento: GRIL - Gráfica e Editora Rua São Paulo, nº 447 Cep: 18740-00 - Taquarituba-SP Tel. (14) 3762-1345 Reprodução A 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. Um grande abraço a todos. Marcos César Silva - Editor Chefe [email protected] 04 abril 2009 Delphi é marca registrada da Borland International, as demais marcas citadas são registradas pelos seus respectivos proprietários. Vitor M. Rodrigues O backup é mesmo importante? de proteger seus dados... A resposta é unânime entre os profissionais da área de informática. “SIM! O backup é muito importante, e bla bla bla...!” Então faço outra pergunta. - Porque “raios” esses mesmos profissionais 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.? R ecebemos todos os meses pedidos de sócios para tentar recuperar um banco de dados que está com “pau”, ou se conhecemos 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 “recuperar” os 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 esfarrapadas para não fazer backup com soluções práticas. Desculp a 1 => Não faço backup por que o custo de um servidor é muito alto para os padrões de minha empresa. Desculp a 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. Desculp a 3 => Não faço backup por que na correria acabo esquecendo. Soluções Se 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 esquecimento, você pode usar um dos infinitos softwares que realizam backup automaticamente. Outra coisa que sempre falo: - Trabalhamos com “tecnologia”, não com “magia”. Por outro lado seu o seu problema é falta de conhecimento de como fazer um backup vai aí à sugestão. 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 Compre um HD externo, normalmente 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 programa 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! abril 2009 05 Delphi MySQL entre outros. 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 servidor. 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: Figura 1 – Conexões existentes Figura 3 – Conexão EMPLOYEE criada Veja a Figura 4. 3. 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 processo 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. 06 abril 2009 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, Módulo Servidor Para facilitar o desenvolvimento deste exemplo 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; devidamente configurado com a conexão de dados, e componente CUSTOMER: TSQLDataSet; com type TDSServerModule1 = class(TDSServerModule) EMPLOYEE: TSQLConnection; CUSTOMER: TSQLDataSet; private { Private declarations } public function PegaVersao:string; function GetCustomers:TDataset; end; Figura 4 – Configurando a nova conexão a propriedade CommandType selecionada em ctTable e CommandText com a tabela CUSTOMER selecionada. 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 GetCustomers, observando que a tipo do retorno da função será uma classe de dados TDataset, ficando da seguinte forma: function GetCustomers:TDataset; Figura 5 – Selecionando o ServerModule Figura 6– Selecionando a tabela desejada 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: 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. unit unServerModule; interface uses SysUtils, Classes, DSServer, WideStrings, DBXInterbase, FMTBcd, DB, SqlExpr; Figura 8 – Opção de execução Figura 7 – Visualização do ServerModule abril 2009 07 4. Módulo Cliente Nesta etapa vamos consumir o método de acesso a dado criado na aplicação servidora, primeiramente vamos atualizar a classe cliente DataSnap, 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 Manager 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 12 – Form cliente em tempo de design der1; • DataSource1: TDataSource e ligue sua propriedade Dataset ao ClientDataSet1; • DBGrid1: TDBGrid e ligue sua propriedade 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; 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 tecnologia, 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/Datasnap2009.rar Figura 9 – Removendo classe do projeto Referência: http://blogs.embarcadero.com/ andreanolanusse/2008/10/16/exemplos-datasnapdbexpress-e-outros-recursos-do-delphi-2009/ Figura 10 – Gerando nova classe Adicionaremos no form o componente SqlServerMethod2: TSqlServerMethod na sua propriedade SQLConnection selecione componente SQLConnection1 e na propriedade ServerMethodName selecione TDSServerModule1.GetCustomers (figura 11) criado na aplicação servidora. Agora adicione um: • DataSetProvider1: TDataSetProvider e ligue sua propriedade Dataset ao SqlServerMethod2; • ClientDataSet1: TClientDataSet e ligue sua propriedade ProviderName ao DataSetProvi08 abril 2009 Sobre o autor Figura 11 – Configurando SqlServerMethod Verja Figura 12 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 Empresarial, Certificações MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET) Delphi no Windows Vista Você já instalou qualquer versão do Delphi, 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 incompatibilidades e “bla, bla, bla” Para executar o programa corretamente, clique com o botão direito do mouse sobre o ícone do Delphi, selecione a opção “Propriedades” e, na paleta Figura 01: Configurações de compatibilidade nas propriedades do aplicativo. abril 2009 09 “Compatibilidade”, marque as opções de “Executar em modo de compatibilidade para o Windows XP”, bem como a opção de “Executar como Administrador”, 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. Figura 02: Página de download da atualização do WinHlp32.exe para 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ê descobre 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 adotar este novo padrão e não garantir que os novos arquivos “”.chm” estivesse à altura dos arquivos de ajuda “.hlp” existentes anteriormente! Figura 03: Atualização do WinHlp32.exe para Windows Vista Eu não sei o que passou pela cabeça de Bill Gates 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 autenticidade do seu sistema operacional, é possível realizar o download da atualização que corrige o problema. Figura 04: Executando arquivo “.hlp” no Windows Vista 10 abril 2009 http://www.microsoft.com/downloads/details. aspx?displaylang=pt-br&FamilyID=6ebcfad9-d3f5-4365 -8070-334cd175d4bb Uma vez executados todos os passos da atualizaçã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 simples que surgiam a todo instante e atrapalhavam o andamento das minhas atividades cotidianas. Sobre os autores Victory Fernandes é Engenheiro Mestrando em Redes de Computadores, e desenvolvedor 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 abril 2009 11 Utilizando arquivo de configuração UDL com ADO Introdução Neste artigo buscaremos mostrar como acessar 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 no próprio ambiente de produção do cliente, sendo 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. 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 12 abril 2009 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 Figura 4 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 5 Poderemos efetuar o teste de conexão, clicando 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. Figura 3 na propriedade “Connection”, selecione ADOConnection1, e na propriedade “SQL”, insira a seguinte instrução: SELECT * FROM EMPLOYEE. Abra o Delphi, clique em “New” – “Application”, insira neste form um componente ADOConnection, da palheta ADO, um componete ADOQuery, também da palheta ADO, um componente DataSource, da palheta DataAccess, e por fim adicione um DBGrid e um DBNavigator, da Palheta DataControls, conforme a figura Figura 5: Veja Figura 5. Na propriedade “login prompt”, do componente 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, 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 conexã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 abril 2009 13 Figura 6 {$R *.dfm} procedure TForm1. AbreConexao; begin ADOConnection1.Close; ADOConnection1. ConnectionString := ‘FILE NAME=’+ExtractFilePath(App lication.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. 14 abril 2009 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 necessitarmos 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 configuração estática na aplicação. Até uma próxima! Sobre o autor Marco Antonio Armando Consultor Técnico The club 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- temente de u m sistema para controle de versã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 alternativa gratuita para realizar esta tarefa. É bastante utilizado no mundo de desenvolvimento de softwares para desktop. O JediVCS opera com arquitetura cliente/servidor, sendo que o servidor de aplicação pode rodar sobre Fireb i rd , 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 simples, 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 arquivos abril 2009 15 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 StandAlone). 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) 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 Figura2 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 16 abril 2009 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>JE DIVCS>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 hierarquicamente; Figura3 Figura5 • Modules list : Todos os arquivos pertencentes ao projeto selecionados aparecem aqui; • Bottom panel : várias listas com diferentes 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>New 2. Na caixa new Project, informe um nome para o projeto, que é sempre em letras minúsculas; 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 abril 2009 17 para criar o projeto no banco de dados do aplicativo 5. Será pedido uma descriçã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) Figura7 Figura8 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 arquivos 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 18 abril 2009 Figura9 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á solicitada 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 exatamente 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 modificado por nenhum outro usuário até a realização do próximo Check in. Figura10 Figura11 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 arquivo 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 anterior 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. abril 2009 19 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. Figura12 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 versionamento 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 arquivo com alguma versão salva no banco de dados ou então comparar as versões armazenadas. Figura13 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). 20 Figura(14). Comparando dois arquivos. abril 2009 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 problemas 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. Sobre o autor Fontes http://www.pronus.eng.br/artigos_ tutoriais/gerencia_configuracao/controle_versao.php?pagNum=0 http://pt.wikipedia.org/wiki/Sistema_de_controle_de_vers%C3%A3o Luís Alexandre de Oliveira é Técnologo 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é abril 2009 21 4.0 hoje. Foi lançado então o C# 1.0 O Visual Studio 2010 e .NET Framework 4,0 em breve estará em fase beta, e existem 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 equipequerem chegar. E m 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 meados 2000 e desde então, C # tornou-se uma das mais populares linguagens de programação em uso 22 abril 2009 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 objeto 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 # adquiriu 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 estaticamente e dinamicamente. Outro paradigma alem do design e inovação é concorrente que é um paradigma que tem certamente influenciaram o desenvolvimento do Visual Studio 2010 e do. NET Framework 4.0. 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 estaticamente . 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”, 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 estaticamente 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 doloroso 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á sobrecarregado, 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. Sobrecargas 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) { } BindingFlags.InvokeMethod, null, new object[] { 10, 20 }); int sum = Convert. ToInt32(result); Se a calculadora classe foi escrito em JavaScript, então nosso código ficaria algo como a seguinte. ScriptObect calc = GetCalculator(); object result = calc. InvokeMember(“Add”, 10, abril 2009 23 No C # 4.0 O método primário pode ser refactored para usar parâmetros opcionais como mostra o seguinte exemplo: missing, missing, 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. missing, missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); ref ref ref ref 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: gerenciado. Isso não é necessário quando se utiliza 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 encontrados 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”, doc.SaveAs(“foo.txt”); “Mads Torgersen”, “Scott 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, 24 abril 2009 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 Wiltamuth”, “Peter Golde” }; Write(names); Desde versão 1.0 em um array o. NET Framework foi co-variante significando que uma 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 coseguro 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 ArrayTypeMismatchException é 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. código: 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 elementos 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: 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 gostaria de encorajá-lo a também fazer download e instalar a versão beta. Bons Códigos... 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 contravariante podemos agora escrever o seguinte Sobre o autor Fabiano Belmonte Senior Architect da InfoMoney.com, especialista 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 trabalho 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 Codificando. NET 2008 e outros eventos sobre Tecnologia .NET. abril 2009 25 Simulando Inumeric com o dynamic do C# 4.0 Quando eu escrevi a minha biblioteca financeiro tive que pensar muito sobre a decisã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. T eoricamente, 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;} 26 abril 2009 Nós muitas vezes 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 implementar. 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 caminho para escrever o código apenas uma vez. Com certeza, esta solução não tem as mesmas caracterí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, consequentemente, 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ódigo genérico de modo que uma pessoa não vê uma 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; } mado ‘compilar: 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))); 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))); Ainda outra maneira de escrever o código é o seguinte: Também notar que em VB você poderia ter feito isto há muito tempo :-) 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 argumentos 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 poderá acumular até ao ponto onde o DLR decida se desfazer dele. Aqui é como chamar o código parece agora: 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- 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... Sobre o autor Fabiano Belmonte Senior Architect da InfoMoney.com, especialista 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 trabalho 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 Codificando. NET 2008 e outros eventos sobre Tecnologia .NET. abril 2009 27 Dicas DELPHI Acertar 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; 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 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; 28 abril 2009 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; Verificar se uma string contém um valor numérico válido { Libera a movimentação } ClipCursor(nil); end; 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’); 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, ... } abril 2009 29 30 abril 2009 abril 2009 abril 2009