Usando o LINQ

10/17/2007 2:51:00 PM By Felipe Pessoto

O .Net 3.5 traz uma novidade chamada LINQ(Language Integrated Query), que pretende integrar em uma linguagem de query uma forma de fazer pesquisas em fontes de dados.

Vou mostrar aqui como fica mais simples de gerar XML, e muito mais fácil de ler também:

//Inclua esse namespace
using System.Xml.Linq;

//Dentro do método Main
XDocument DocXml = new XDocument(
                               new XElement("Clientes",
                                      new XElement("Cliente",
                                           new XAttribute ("Nr", 1),
                                           new XElement("Nome", "Maria")
                                           )
                                      )
                                );

Console.WriteLine(DocXml);
Console.Read();



É bem mais intuitivo criar o elemento Pai e no construtor criar os filhos, do que fazer como no .Net2.0 em que você tinha que criar o elemento Filho, então criar o Pai, e adicionar o Filho no elemento Pai.

Uma diferença interessante entre o novo C#3.0 e o Visual Basic 9.0 é que o VB aceita literais XML, exemplo:

Dim ElementoXml As XElement =
     <clientes>
        <cliente nr="1">
            <nome>Maria</nome>
        </cliente>
     <clientes>


Sendo um literal, será interpretado em tempo de compilação e não uma string que vai ser convertida em runtime, assim evita-se erros inesperados. Por enquanto o C# não tem essa implementação e talvez seja assim na versão final também.

Você também pode criar elementos XML da seguinte maneira, usando uma Query Expression:

  List<int> MegaSena = new List<int>();

  MegaSena.Add(13);
  MegaSena.Add(21);
  MegaSena.Add(27);
  MegaSena.Add(33);
  MegaSena.Add(39);
  MegaSena.Add(43);

  XElement elementoNumeros =
     new XElement("Numeros",
        from Numero in MegaSena
        select new XElement("Numero", Numero)
     );

Criando uma aplicação de instância única

10/16/2007 8:51:00 PM By Felipe Pessoto

Para evitar que o usuário abra duas ou mais instâncias do seu programa, você pode usar a seguinte técnica

//Referencie o namespace System.Threading
using System.Threading;

//Classe Mutex, ela que identificará se seu programa já está aberto
Mutex m = null;
//String que usaremos para identificar o programa
const string NomeMutex =  "MEUPROGRAMA";

try
{
   //Tenta abrir o Mutex
    m = Mutex.OpenExisting(NomeMutex);
}
catch(WaitHandleCannotBeOpenedException)
{
   //Nao existe
}
if(m == null)
{
  //Caso nao exista, ele cria um novo
    m = new Mutex(true,NomeMutex);
}
else
{
  //Se existir é porque seu programa já está aberto
   m.Close();
   Application.Exit();

}

Você só precisa ter cuidado ao escolher a string de identificação, pois se houver outro programa com a mesma identificação, você não vai conseguir abrir seu programa.

Diminuindo fotos automaticamente

10/13/2007 8:54:00 PM By Felipe Pessoto

Criei esse programa pra diminuir algumas fotos de forma automatica. As vezes deixamos a câmera digital no modo com mais alta resolução e isso vai consumindo o HD. No exemplo iremos diminuir a foto pra largura ou altura(o que for maior) de 640px.

Vamos precisar de um Button, um CheckBox e uma ProgressBar:



Vamos criar o método que irá gerar a foto menor:

private void GravarThumb (FileInfo Arquivo)
{
   Bitmap bm;
   Bitmap thumb;
   int altura;
   int largura;

   bm = (Bitmap)Bitmap.FromFile(Arquivo.FullName);

   if(bm.Width > 640 || bm.Height > 640)
   {
      altura = (int)(640f/ bm.Width * bm.Height);
      if(altura > 640)
      {
         largura = (int)(640f/ bm.Height * bm.Width);
         thumb = new Bitmap(bm, new Size(largura, 640));
      }
      else
      {
         thumb = new Bitmap(bm, new Size(640, altura));
      }
   }
   else
   {
      thumb = new Bitmap(bm);
   } 
   thumb.Save(Arquivo.DirectoryName + "/tn_" + Arquivo.Name, System.Drawing.Imaging.ImageFormat.Jpeg);
}

E dentro do evento Click do Button:

if
   (folderBrowser.ShowDialog() == DialogResult.OK)
   {
   DirectoryInfo d = new DirectoryInfo(folderBrowser.SelectedPath);
   FileInfo[] Arquivos;

   if(chkIncluirSubPastas.Checked)
       Arquivos = d.GetFiles("*.jpg",SearchOption.AllDirectories);
   else
       Arquivos = d.GetFiles("*.jpg",SearchOption.TopDirectoryOnly);

   progressBar1.Maximum = Arquivos.Length;

   foreach(FileInfo Arquivo in Arquivos)
   {
      GravarThumb(Arquivo);
      progressBar1.Value++;
      Application.DoEvents();
   }
   progressBar1.Value = 0;
}

 

Inserindo strings em Imagens

10/11/2007 3:25:00 PM By Felipe Pessoto

Este é um pequeno artigo, ou melhor uma dica de como inserir uma string nas suas fotos.

Um exemplo prático seria para um texto de Copyright

Vamos ao código:

//Carregamos o arquivo da imagem pra uma classe Image
//(poderia ser Bitmap também, que é uma classe derivada da Image)
Image i = Image.FromFile(@"C:\WINDOWS\Web\Wallpaper\Alegria.bmp");

//Instanciamos um objeto Graphics,
//que contém métodos para editarmos nossa Image
Graphics g = Graphics.FromImage(i);

//Instanciamos o objeto Font,
//escolhemos o nome da Font, tamanho e estilos
//(para usar dois ou mais estilos use o operador Bitwise
//ex.: FontStyle.Bold | FontStyle.Italic)
Font f = new Font("Verdana", 40, FontStyle.Bold);

//O objeto StringFormat é opcional,
//você pode usa-lo para configurar alinhamento e direção do texto(entre outras opções)
StringFormat s = new StringFormat();
s.Alignment = StringAlignment.Center;

//Agora simplesmente chamamos o método DrawString,
//passando a string que queremos escrever na imagem, a fonte,
//um Brush(você pode usar algum das propriedades da classe Brushes,
//ou criar um Brush personalizado),
//o local que você quer a string e opcionalmente um StringFormat.
g.DrawString("Felipe", f, Brushes.Blue, 100f, 100f, s);

//Finalmente salvamos o arquivo
i.Save(@"C:\WINDOWS\Web\Wallpaper\Alegria2.bmp");

É muito simples! Espero postar outros artigos em breve, assim que tiver mais tempo.

Microsoft quer códigos mais seguros e de qualidade

10/8/2007 9:51:00 PM By Felipe Pessoto

A Microsoft continua a ajudar os desenvolvedores à escrever código de melhor qualidade e mais seguro.
Ela está adicionando características novas para análise de código na próxima versão da sua suite de desenvolvimento, o Visual Studio 2008.

No Visual Studio 2005, a companhia integrou um par de ferramentas: FxCop e PREfast, sob os nomes de Managed Code Analysis e C/C++ Code Analysis, disse S. “Soma” Somasegar, vice-presidente da divisão de desenvolvimento da Microsoft.

Agora para o Visual Studio 2008, a equipe de análise de código da Microsoft está adicionando algumas características novas, incluindo o Code Metrics, uma nova janela de ferramentas "que permitirá que você não somente tenha uma visão geral da qualidade do código, mas também a possibilidade de se aprofundar nos pontos de difícil manutenção e mais complexos,” disse Somasegar.

Para o Visual Studio 2008, o Code Metrics virá com 5 modos: Cyclomatic Complexity, Depth of Inheritance, Class Coupling, Lines of Code e Maintainability Index.


Outras características novas incluem as melhorias no Code Analysis Policy, que permitem se assegurar de que a análise do código esteja funcionando antes de cada registro. A equipe da Microsoft fez também algumas melhorias na usabilidade, incluindo uma orientação melhor e fornecendo mais controle sobre os ajustes que são aplicados na política dos projetos.

De acordo com o blog de Somasegar, a análise de código do Visual Studio 2008 será caracterizada também por melhorias como: sustentação para analisar métodos anônimos e expressões lambda; análise nova, incluindo regras adicionais de segurança, de globalização, da manutenção e da sintetização de voz (incluindo suporte à dicionário customizado); melhor suporte para C++/CLI e o Compact Framework; e as melhorias de desempenho que diminuíram o tempo de análise sobre código gerenciado em duas vezes, e consumindo metade da memória do Visual Studio 2005.

A Microsoft anunciou o lançamento oficial do Visual Studio 2008 junto com Windows Server 2008 e SQL Server 2008 para o dia 27 de Fevereiro 2008 em Los Angeles. Entretanto, o código final do Visual Studio 2008 é esperado para o fim deste ano.