Archive for '.NET'

VS 2010 e Framework 4.0 versão beta para download

Olá já esta disponível o VS 2010 e Framework 4.0 versão beta para download, e o bom é que agora não é mais uma máquina virtual :)

Disponibilizei todos os links para download no blog -> http://nelsonborgesjr.spaces.live.com/blog/cns!A1C7FFFCFB9D3EE5!284.entry?sa=604032480


Abraço,

Indexadores C#

Olá,

Hoje irei falar de um recurso bem interessante, trata-se dos indexadores, o indexador é um array inteligente, ele pode ser usado tanto em classes como estrutura. Iremos criar um pequeno form que irá atuar como uma agenda, iremos gravar Nome e Telefone e posteriormente iremos pesquisar tanto o Nome quanto o Telefone que inserimos, utilizando os indexadores.

Requisitos para o Exemplo: Neste nosso exemplo iremos usar o Visual Studio 2008 com Framework 3.5, caso não tenha instalado, efetue o download gratuitamente no seguinte site :  http://www.microsoft.com/Express/

1- No Visual Studio, crie um novo projeto do tipo WPF Application, o nome da solução pode deixar como Indexer, o nome do projeto escolha AgendaTelefonica conforme imagem abaixo:

1- Novo Projeto

2- Dentro do Projeto Crie 3 arquivos do tipo Class, com os seguintes nomes :

-Agenda (Agenda.cs)
-Nome (Nome.cs)
-NumeroTelefone (NumeroTelefone.cs)

2- Estrutura do Projeto

3-) Abra o arquivo Nome.cs, a primeira alteração que iremos fazer é no construtor da classe, no construtor iremos definir um parâmetro de entrada, este valor irá preencher um campo da classe, conforme o código abaixo:

   1:  private string nome;
   2:  public Nome(string text)
   3:  {
   4:      this.nome = text;
   5:  }

Agora, vamos criar dentro desta classe a propriedade que terá seu modificador publico para que possamos acessar de fora mesma, vale ressaltar que esta propriedade será apenas leitura, por isso não iremos implementar o método set.

public string Texto
{
    get { return this.nome; }
}

 

Para finalizar a implementação desta classe, iremos inserir mais 3 métodos sendo eles GetHashCode() e Equals() , conforme o código abaixo

   1:  public override int GetHashCode()
   2:  {
   3:      return this.nome.GetHashCode();
   4:  }
   5:  public override bool Equals(object outro)
   6:  {
   7:      return (outro is Nome) && Equals((Nome)outro);
   8:  }
   9:  public bool Equals(Nome outro)
  10:  {
  11:      return this.nome == outro.nome;
  12:  }

A função desta classe Nome será armazenar e buscar os nomes, o nome é fornecido para o construtor, a implementação dos métodos Equals e GetHashCode é devido a necessidade de comparar os nomes durante a pesquisa em um array de valores.

Mais informações sobre Equals e GetHashCode acesse :

Equals -> http://msdn.microsoft.com/pt-br/library/ms173147.aspx

GetHashCode -> http://msdn.microsoft.com/pt-br/library/system.object.gethashcode.aspx

Faça a mesma implementação da classe Nome para a Classe NumeroTelefones, conforme código abaixo:

   1:  class NumeroTelefones
   2:  {
   3:  public NumeroTelefones(string texto)
   4:  {
   5:      this.numero = texto;
   6:  }
   7:  public NumeroTelefones()
   8:  {
   9:   
  10:  }
  11:  public string Text
  12:  {
  13:      get { return this.numero; }
  14:  }
  15:   
  16:  public override int GetHashCode()
  17:  {
  18:      return this.numero.GetHashCode();
  19:  }
  20:   
  21:  public override bool Equals(object other)
  22:  {
  23:      return (other is NumeroTelefones) && Equals((NumeroTelefones)other);
  24:  }
  25:   
  26:  public bool Equals(NumeroTelefones other)
  27:  {
  28:      return this.numero == other.numero;
  29:  }
  30:   
  31:  private string numero;
  32:  }

Vamos abrir o arquivo Agenda.cs, dentro da classe agenda iremos implementar dois arrays privados: um array de valores para Nome e um array de valore para NumeroTelefones, conforme código abaixo:

   1:  private int tamanhoAtualIndice;
   2:  private Nome[] nomes;
   3:  private NumeroTelefones[] telefones;

No construtor da classe iremos instanciar e inicializar as variáveis declaradas acima:

   1:  //Definindo o Construtor da Classe Agenda
   2:  public Agenda()
   3:  {
   4:      this.tamanhoAtualIndice = 0;
   5:      this.nomes = new Nome[0];
   6:      this.telefones = new NumeroTelefones[0];
   7:  }

Criaremos um método que irá inserir os valores dentro de um Index das classes Nome e NumeroTelefones, veja o exemplo abaixo, repare que estamos acessando o índex do nome pela notação de colchetes. A sintaxe que utilizamos em um indexador é bem parecida com a de um array, no entando, existem algumas diferença, tais como:

- Os indexadores sofrem sobrecarga (overload) já os arrays não.

- Os indexadores podem utilizar subscritos não numéricos, como string, object e etc, enquanto os arrays só podem utilizar subscritos inteiros.

   1:  public void Add(Nome nome, NumeroTelefones numero)
   2:  {
   3:      aumentarArrays();
   4:      this.nomes[tamanhoAtualIndice] = nome;
   5:      this.telefones[tamanhoAtualIndice] = numero;
   6:      this.tamanhoAtualIndice++;
   7:  }

No código acima, estamos chamando o método aumentarArrays(em breve iremos falar deste), e estamos usando a variável tamanhoAtualIndice dentro dos índices dos campos nomes e telefones.

Criando o método aumentarArrays; Este método será chamado por Add para verificar se os arrays estão cheios quando o usuário adiciona um outro valor, ele cria dois novos arrays maiores copia o valor para eles e então descarta os antigos, uma vez que para redimensionar um array precisamos copiar os elementos para um novo array, copiar os elementos (omitir alguns se o novo array for menor) e então atualizar qualquer referência ao array original para que ela se refira ao novo array, isso poderia ser resolvido com outras estruturas de coleções como ArrayList e etc., porém não é o intuito deste artigo falar sobre.

   1:  private void aumentarArrays()
   2:  {
   3:      if (this.tamanhoAtualIndice == this.nomes.Length)
   4:        {
   5:        int aumentarIndice = tamanhoAtualIndice + 16;
   6:          Nome[] maisNomes = new Nome[aumentarIndice];
   7:          this.nomes.CopyTo(maisNomes, 0);
   8:        NumeroTelefones[] maisTelefones = new NumeroTelefones[aumentarIndice];
   9:        this.telefones.CopyTo(maisTelefones, 0);
  10:        this.nomes = maisNomes;
  11:        this.telefones = maisTelefones;
  12:      }
  13:  }

Agora vamos à implementação dos indexadores, lembrando que um indexador não é um método por isso não há parênteses contendo parâmetros, mas há colchetes que especificam um índice. Esse índice é utilizado para especificar que elemento está sendo acessado. Todos os indexadores utilizam a palavra-chave this no lugar do nome e vale a pena falar que em uma classe ou estrutura podemos definir no máximo um indexador.

Com base nas informações acima, vamos declarar o indexador da classe Nome, veja o código abaixo:

   1:  public Nome this[NumeroTelefones numero]
   2:  {
   3:    get
   4:    {
   5:       int i = Array.IndexOf(this.telefones, numero);
   6:       if (i != -1)
   7:           return this.nomes[i];
   8:       else
   9:           return new Nome();
  10:     }
  11:  }

O método de acesso get do Indexador da Classe Nome possui a finalidade de localizar o nome que corresponde ao número de telefone especificado na consulta. Para fazer isso estamos usando o método IndexOf da classe Array. O método IndexOf executa uma pesquisa em um array, retornando o índice do primeiro item no array correspondente a pesquisa. O primeiro argumento para IndexOf é o array a ser pesquisado (telefones),já o segundo argumento é o item que estou pesquisando, o IndexOf retorna o índice inteiro do elemento se ele o encontrar; caso contrário, IndexOf retorna -1. Se o indexador encontrar o número de telefone, ele deve retorná-lo; caso contrário ele deve retornar um nome vazio.

Vamos fazer a mesma coisa com Telefone:

   1:  public NumeroTelefones this[Nome nome]
   2:  {
   3:     get
   4:     {
   5:        int i = Array.IndexOf(this.nomes, nome);
   6:        if (i != -1)
   7:            return this.telefones[i];
   8:        else
   9:            return new NumeroTelefones();
  10:      }
  11:  }

Agora já terminamos de fazer nosso código, a classe Agenda deverá ficar da seguinte maneira:

   1:  class Agenda
   2:  {
   3:    private int tamanhoAtualIndice;
   4:    private Nome[] nomes;
   5:    private NumeroTelefones[] telefones;
   6:   
   7:    //Definindo o Construtor da Classe Agenda
   8:    public Agenda()
   9:    {
  10:      this.tamanhoAtualIndice = 0;
  11:      this.nomes = new Nome[0];
  12:      this.telefones = new NumeroTelefones[0];
  13:      }
  14:          
  15:      public void Add(Nome nome, NumeroTelefones numero)
  16:      {
  17:          aumentarArrays();
  18:          this.nomes[tamanhoAtualIndice] = nome;
  19:          this.telefones[tamanhoAtualIndice] = numero;
  20:          this.tamanhoAtualIndice++;
  21:      }
  22:          public Nome this[NumeroTelefones numero]
  23:          {
  24:              get
  25:              {
  26:                  int i = Array.IndexOf(this.telefones, numero);
  27:                  if (i != -1)
  28:                      return this.nomes[i];
  29:                  else
  30:                      return new Nome();
  31:              }
  32:          }
  33:   
  34:          public NumeroTelefones this[Nome nome]
  35:          {
  36:              get
  37:              {
  38:                  int i = Array.IndexOf(this.nomes, nome);
  39:                  if (i != -1)
  40:                      return this.telefones[i];
  41:                  else
  42:                      return new NumeroTelefones();
  43:              }
  44:          }
  45:   
  46:          private void aumentarArrays()
  47:          {
  48:              if (this.tamanhoAtualIndice == this.nomes.Length)
  49:              {
  50:                  int aumentarIndice = tamanhoAtualIndice + 16;
  51:                  
  52:                  Nome[] maisNomes = new Nome[aumentarIndice];
  53:                  this.nomes.CopyTo(maisNomes, 0);
  54:                  
  55:                  NumeroTelefones[] maisTelefones = new NumeroTelefones[aumentarIndice];
  56:                  this.telefones.CopyTo(maisTelefones, 0);
  57:                          
  58:                  this.nomes = maisNomes;
  59:                  this.telefones = maisTelefones;
  60:              }
  61:          }
  62:   
  63:   
  64:      }

Finalizamos nosso código iremos criar um pequeno formulário para efetuar os testes.

1-) Abra o arquivo Windows1.xaml e insira os controles abaixo:

Controle

Propriedades

Observação

TextBox

- Altere a propriedade ID do controle para “nomeTextBox”;

É importante sempre que inserir um controle na pagina um nome simples e objetivo para que o mesmo possa ser localizado facilmente no código.

TextBox

- Altere a propriedade ID do controle para “telefoneTextBox”;

 

Button

- Altere a propriedade ID do controle para “addButton”;

Este será o botão responsável por disparar o evento que irá adicionar os valores das texbox dentro da array.

Button

- Altere a propriedade ID do controle para “pesqTelefoneTextBox”;

Este será o botão responsável por disparar o evento que irá efetuar as pesquisas por telefone.

Button

- Altere a propriedade ID do controle para “pesqNomeTextBox”;

Este será o botão responsável por disparar o evento que irá efetuar as pesquisas por nome.

Alinhe os controles conforme a imagem abaixo:

Dê um duplo clique em cima do botão Add, o Visual Studio irá criar o evento Click do botão automaticamente, dentro deste evento insira o código abaixo:

   1:  private Agenda agenda = new Agenda();
   2:  private void addClick(object sender, RoutedEventArgs e)
   3:  {
   4:     if (!String.IsNullOrEmpty(name.Text) && !String.IsNullOrEmpty(phoneNumber.Text))
   5:     {
   6:         agenda.Add(new Nome(nomeTextBox.Text),
   7:                                new NumeroTelefones(telefoneTextBox.Text));
   8:                  nomeTextBox.Text = "";
   9:                  telefoneTextBox.Text = "";
  10:       }
  11:  }

Faça o mesmo processo com pesqTelefoneButton;

   1:  private void pesqTelefoneButtonClick(object sender, RoutedEventArgs e)
   2:  {
   3:     string text = telefoneTextBox.Text;
   4:     if (!String.IsNullOrEmpty(text))
   5:     {
   6:         nomeTextBox.Text = agenda[new NumeroTelefones(text)].Texto;
   7:     }
   8:  }

Dê um clique duplo em cima do botão pesqNomeButton, e insira o código abaixo:

   1:  private void pesqNomeButtonClick(object sender, RoutedEventArgs e)
   2:  {
   3:     string text = nomeTextBox.Text;
   4:     if (!String.IsNullOrEmpty(text))
   5:     {
   6:        telefoneTextBox.Text = agenda[new Nome(text)].Text;
   7:     }
   8:  }

Já podemos efetuar os testes, compile a aplicação e veja se a mesma irá ocorrer erros, caso não ocorra nenhum erro, execute a aplicação e efetue os seguintes testes:

1-) Digite um nome e um telefone e clique em adicionar;

2-) Vá na textBox do Nome e digite o nome que você acabou de adicionar e clique em pesquisar Nome, você verá que o textBox do telefone irá preencher automaticamente.

Por enquanto é isso, nos vemos na próxima, abraço.

Mais informações sobre indexadores:

- http://msdn.microsoft.com/pt-br/library/6×16t2tx.aspx

- http://www.csharphelp.com/archives/archive140.html

Aplicações OBA

Pessoal,
Em uma das caminhas por esse mundão a fora, resolvi dar umas estudada sobre aplicações OBA (Office Business Application), rapaz o negócio é chique..rs, bem maior do que imaginava, estive comentando algumas idéias com um pessoal especialista da Microsoft, então vou postando(compatilhando) aqui no blog algumas das minhas experiências, para que se um dia se alguém tiver interesse, ter um caminho mais facil para estudar.

1-) Meu primeiro passo foi conhecer um pouco sobre o Open Xml e  as diferenças entre as versões do Office.
Descobri muita coisa legal neste item, uma delas foi a estrutura de um arquivo docx, eu não sabia que ele era um arquivo comprimido (Content Types), e também não conhecia a estrutura organizacional destes arquivos (q programador eu sou neh.. rs). Esse link me ajudou, http://msdn.microsoft.com/pt-br/library/aa338205.aspx, também descobri que o projeto de Open XML já existia desde 1994.. e que é possivel abrir um arquivo 2007 no 2003 ou no Office 2000 apenas baixando um conector de acordo com a KB 924074 (Eu ficava sofrendo convertendo por sites, ou por aplicativos terceiros..rs).
Necessário para trabalhar com Package do Open XML no .NET :
- System.IO.Packaging;
- System.XML;
- Microsoft.Office.DocumentFormat.OpenXML.Packaging;

2-) Na etapa 2 criei meu primeiro Add-In no Excel.. rs, http://msdn.microsoft.com/en-us/library/3295w01c(VS.80).aspx
Eu vi tambem a questão de infra das aplicações .NET com Office, sobre o RunTime do VSTO (Visual Studio Tools for Office..rs), também entendi um pouco o conceito de Default Domain e Application Domain.
Nesta etapa achei interessante:
-Criação de Ribbons (Tanto pela interface do VS ou pelo arquivo XML).
-Conceito de ActionPane (Associado a um Documento);
-Conceito de TaskPane (Associado a um add-in na aplicação);
-Classe Microsoft.Office.Tools (que possui o Actions Pane, TaskPane e demais), achei bem legal quando estudei ela.
Para o próximo final de semana pretendo estudar sobre o Analisys Service do SQL, ver as conexões ADOMD e integrar este cara com os Add-In do Office, pois minha idéia é ter vários sistemas totalmente integrados com todas as areas de uma empresa, desde a criação de um sistema de ERP, MRP, CRM, as operações do Office e etc,  até o gerenciamento de dados estratégicos (BI, Data Mining) sei que parece uma idéia meio maluca, mas eu não tenho nada para fazer .. rs

 

Bom assim que fazer meu primeiro demo de aplicação OBA irei disponibilizar no blog.

 

Abraço

Pegando a Janela que esta em execução no Windows com C#

Olá,

Estarei demonstrando nestes post como pegar uma janela de um programa que esteja em execução no Windows. Neste exemplo para demostrar a janela eu irei usar o Caption da Janela ( Texto da Barra Superior). Crie um Form com os seguintes campos, 5 labels e 1 button e 1 Timer, deixe o formulário desta forma:

clip_image002
Imagem 01 – Form Principal

Para que nossa demo funcione precisamos importar o namespace System.Runtime.InteropServices conforme a tabela abaixo:

usingSystem.Runtime.InteropServices;

Agora precisamos chamar dois métodos estáticos externos da DLL User32

[ DllImport("user32.dll") ]
static extern int GetForegroundWindow();

[ DllImport("user32.dll") ]
static extern int GetWindowText(int hWnd,
StringBuilder text,int count);

O GetForegroundWindows retorna um handle para a janela com o qual o usuário está trabalhando atualmente.

O GetWindowText copia o texto da barra de titudo da janela especificada para um buffer.

Uma vez feito isso iremos implementar os métodos para pegar a Janela especificada, ficando assim:

private void BuscarJanelaAtiva()
        {

            const int nChars = 256;
            int handle = 0;
            StringBuilder Buff = new StringBuilder(nChars);

            handle = GetForegroundWindow();

            if ( GetWindowText(handle, Buff, nChars) > 0 )
            {
                this.captionWindowLabel.Text = Buff.ToString();
                this.IDWindowLabel.Text = handle.ToString();
            }

        }

Agora no Timer que vc inseriu na pagina faça a chamada para o método BuscarJanelaAtiva

private void timer1_Tick(object sender, System.EventArgs e)
 {
     BuscaJanelaAtiva();
 }

Nota: Eu deixe o Timer com a configuração no Intervalo de 100 m/s.

Agora implemente no Botão Sair o código abaixo para fechar o formulário

private void sair_Click(object sender, System.EventArgs e)
{
    this.Close();
}

Pronto, já pode rodar seu programa e efetuar os testes, parece bem simples mas acredite este pequeno exemplo é muito perguntado nos fóruns de desenvolvimento em .NET.

Resharper 4.1 - Uma dica interessante

Com o crescente aumento do desenvolvimento de software, cada vez mais as empresas exigem software com qualidade e rapidez. No mercado é comum escutar os termos de Scrum e Agile que são metodologias de desenvolvimento especificas a Software.

Por isso deixo aqui uma ótima dica, trata-se de um software de refactoring com um excelente itellisense e outras N funcionalidades. Ele possui um módulo de inteligência que identifica sua sintaxe e dependendo das configurações do seu projeto ele faz sugestões do seu código seguindo o Design Patterns de desevolvimento. Muito bom, ainda mais para iniciantes, tenho certeza que ele irá te ajudar a diminuir o tempo de desenvolvimento de código,  ele não é pago mais compensa comprar a licença.

O mais interessante de tudo é que ele é totalmente integrado com a IDE do Visual Studio :)

Obs: Infelizmente como nada é perfeito, o Resharper é um pouco pesado e se caso sua máquina conter 512mb ou inferior não é recomendado pois ele consome muita memória, no entanto se este não for seu cenário, faça um teste.. vale a pena.

Mais informações:
http://www.codeproject.com/KB/showcase/ReSharper_4.aspx

Abraço,

NB

Iniciando com .NET

Console.WriteLine(“Hello World”), estarei iniciando meus post´s aqui no blog. Sou especialista em tecnologia .NET e possuo experiência no desenvolvimento de aplicações distribuídas usando o Visual Studio Team System.

Por ser meu primeiro post no site, não irei “pegar pesado”, então para os iniciantes em desenvolvimento irei deixar alguns conceitos, estarei me esforçando para colocar semanalmente post´s para a turma de iniciantes e post´s para a turma mais advanced, por isso você que possui mais experiência continue acompanhando as publicações.

Nelson, o que é .NET ?
O pessoal que está iniciando na área e em alguns casos desenvolvedores experientes, costumam confundir .NET com Web, acabam achando que .NET são tecnologias para web, em outros casos confundem o termo .NET a uma linguagem de desenvolvimento como C#.NET e VB.NET. Nestes dois casos, o pensamento esta incorreto, pois .NET não é uma linguagem e apesar de dar amplo suporte a tecnologias web, ele não é dependente da mesma, ou seja posso ter aplicações Winform (que rodam no Windows) e aplicações WEB desenvolvidas para rodar em um Browser.
O .NET nada mais é que uma plataforma única para desenvolvimento e execução de sistemas e aplicações, ou seja o código feito para .NET deverá rodar na plataforma .NET, pois o modelo de programação de código gerenciado permite criar aplicativos em clientes, servidores e dispositivos móveis e etc. Os desenvolvedores podem usar o .Net para criar aplicativos a vários tipos: Aplicativos Web, Aplicativos para servidores, aplicativos de cliente inteligente (smart-client), aplicativos de console, aplicativos de banco de dados e muito mais.

Bom, agora que você é um especialista .NET, irei passar alguns termos que serão bastante usados nos próximos post´s para você já ir se acostumando com eles.

IDE ou Integrated Development Enrironment é o ambiente integrado de desenvolvimento, esta ferramente é bastante utilizada no desenvolvimento de software (quando não é notepad…rs), e o intuito dela é facilitar a técnica RAD (Rapid Application Development - Desenvolvimento rápido de Aplicativos), um exemplo é o Visual Studio, NETBeans e etc.

CLR - Common Language Runtime, é o coração da plataforma .NET, é uma aplicação similar a uma máquina virtual que se encarrega de providenciar a execução das aplicações para ela escrita. São oferecidos a estas aplicações numerosos serviços que facilitam seu desenvolvimento e manutenção que favorece sua confiança e segurança. O CLR é o verdadeiro responsável pela interoperabilidade entre as linguagens suportadas pela plataforma .Net. O compilador de cada linguagem segue uma série de padrões (Common Language Specification) para compilar seus códigos, por isso as outras linguagens conseguem “entender” as classes e métodos (veremos isso mais adiante) dentre outras informações, que essa linguagem definiu.

C# é uma linguadem de programação desenvolvida pela Microsoft. A sua sintaxe é orientada a objetos e foi baseada no C++ mas inclui muitas influencias de outras como o Delphi e Java (qualquer semelhança é mera coincidência). O coordenador do desenvolvimento da linguagem foi Anders Hejlsberg que passou alguns anos trabalhando para a Borland :).

Para finalizar, você já deve esta quase morrendo para ver algumas linhas de programação por isso deixo um pequeno trecho de código da linguagem C#.

public class ClasseExemplo
{
    public static void Main()
    {
        System.Console.WriteLine("Olá mundo!");
    }
}

Nesta classe exemplo estamos apenas exibindo no console uma mensagem de texto, mais fique tranquilo iremos falar mais deste cara.

Importante para continuar acompanhando os post´s: A partir de agora estaremos começando a desenvolver por isso é requisito que tenha a IDE do Visual Studio instalado na máquina, caso não tenha pode baixar a versão express no seguinte endereço: http://www.microsoft.com/express/

Bom final de semana e te vejo na próxima…