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.