C# - Um álbum de fotos com Drag and Drop e banco de dados XML


Hoje vou apresentar uma aplicação feita em C# que encontrei na web com a qual podemos aprender a usar os seguintes recursos :

Estou chamando a aplicação de Álbum de fotos e você pode usá-la para visualizar suas fotos; para isso basta arrastar a foto desejada do seu sistema de arquivos para a aplicação para vê-la ou imprimi-la.

Você verá que ao contrário do que muitos pensam, a funcionalidade Drag and Drop (Arrastar e soltar) a partir do Explorer é muito fácil de implementar.

Ao arrastar (drag) um arquivo para o formulário temos que tratar quando o arquivo é solto (drop) no formulário pois o Windows Explorer já trata a operação de arrastar.
Para arrastar um arquivo para o formulário primeiro configuramos a propriedade AllowDrop do formulário para true de forma que o formulário possa aceitar objetos que sejam arrastados.

A seguir tratamos o evento DragEnter para mudar o cursor para 'copy drop' de forma que quando o mouse entrar no formulário para realizar a operação de soltar (drop) o ícone do mesmo será alterado. Veja o código abaixo que faz isso:

private void Form1_DragEnter(object sender,System.Windows.Forms.DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy; // define o cursor para exibr o ícone 'drop copy'
}

A seguir tratamos o manipulador de evento DragDrop para lidar com as atividades ocorridas depois que o mouse solta um objeto no formulário.

O manipulador de eventos verifica se ao soltar o objeto (drop) temos um item do tipo DataFormat.FileDrop, ou seja, permitimos que somente arquivos sejam arrastados,  em seguida ele extrai o nome do DataObject no argumento DragEvent e usa o nome do arquivo para carregar a imagem e colocá-la no controle PictureBox correspondente onde o arquivo esta sendo descarregado.

O campo DataFormat.FileDrop define o formato de arquivos do sistema de arquivos do Windows para a operação drop. Abaixo temos o código deste evento:

private void Form1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
 string _Arquivo;
 try
 {
 
 // verifica se o item solto é do tipo FileDrop
   if (e.Data.GetDataPresent(DataFormats.FileDrop))
   {
     object nomeArquivo = e.Data.GetData(DataFormats.FileDrop);
     _Arquivo = (string)((System.Array)nomeArquivo).GetValue(0);
     CarregaPictureBox(theFile, e.X, e.Y);
// carrega a imagem usando o nome e caminho no formulário
   }
 }
 catch (Exception ex)
 {
 MessageBox.Show(ex.Message.ToString());
 }
}

O  XML trabalha muito bem em conjunto com o DataSet, que nada mais é do que um banco de dados em memória. Com esta parceria podemos tratar de forma conveniente, e com bom desempenho, as principais funcionalidades de banco de dados através do DataSet tal como persistir as informações dos arquivos em um arquivo XML o qual fará o papel do nosso banco de dados.

A seguir temos o código que lê os dados XML para o Álbum de fotos onde primeiro lemos os dados a partir do arquivo XML - AlbumFotos.xml - usando a função ReadXml.

void LePagina()
{
ds.Clear();
if (File.Exists("AlbumFotos.xml"))
    {
ds.ReadXml("AlbumFotos.xml");
LePaginaDoDataSet();
}

    NumeroPaginaLabel.Text = (PaginaAtual + 1).ToString();
    LabelAtual = null;
    LabelAtualIndex = -1;
    textBox1.Visible = false;
}

Como temos 4 controles PictureBox no formulário usamos a rotina LePaginaDoDataSet para percorrer os controles, e, usando a classe DataView, filtramos cada imagem usando Page e Position como critério de seleção:

void LePaginaDoDataSet()
{
DataTable dt = ds.Tables["Album"];
DataView dv = new DataView(dt);
for (int i = 0; i < 4; i++)
{
dv.RowFilter = "Page = " + PaginaAtual.ToString() + " AND Position = " + i.ToString();
if (dv.Count > 0)
// verifica se existem linhas
{
DataRowView drv = dv[0];
pictures[i].Image = Image.FromFile(drv["ImageName"].ToString());
labels[i].Text = drv["Caption"].ToString();
}
else
{
// limpa a imagem
pictures[i].Image = null;
labels[i].Text = "";
}
}
}

O código para incluir uma imagem no arquivo XML é exibido a seguir. Ele verifica se já existe uma imagem no dataset na posição e linha que desejamos incluir uma nova imagem. Se a imagem existe ela será atualizada caso contrário uma nova imagem será incluída no arquivo XML usando o método WriteXml.

void InserirAImagem(string OArquivo)
{
DataTable dt = ds.Tables["Album"];
DataView dv = new DataView(dt);
dv.RowFilter = "Page = " + PaginaAtual.ToString() + " AND Position = " + PosicaoAtual.ToString();
if (dv.Count > 0)
{
DataRowView drv = dv[0];
object primarykey = drv["ID"];

// atualiza o dataset
DataRow drFound = dt.Rows.Find(new object[]{primarykey});
drFound["ImageName"] = OArquivo;
drFound["Caption"] = labels[PosicaoAtual].Text;
}
else
{
 // inclui no dataset
DataRow dr = dt.NewRow();
dr["ID"]  = dt.Rows.Count;
dr["ImageName"] = OArquivo;
dr["Position"] = PosicaoAtual;
dr["Page"] = PaginaAtual;
dr["Caption"] = labels[PosicaoAtual].Text;
dt.Rows.Add(dr);
}
ds.WriteXml("AlbumFotos.xml");
}

Executando a aplicação e arrastando alguns arquivos de imagem para o formulário teremos o seguinte resultado:

Clicando no controle TextBox você pode alterar o nome das imagens.

A seguir temos a opção para visualizar a impressão e também navegar pelas imagens:

O conteúdo do arquivo AlbumFotos.xml para as quatro primeiras imagens pode ser visto a seguir:

<?xml version="1.0" standalone="yes"?>
<Dataset1 xmlns="http://tempuri.org/Dataset1.xsd">
  <Album>
    <ID>0</ID>
    <ImageName>C:\Users\macoratti\Pictures\LedZeppllin.jpg</ImageName>
    <Caption>LedZeppllin</Caption>
    <Page>0</Page>
    <Position>0</Position>
  </Album>
  <Album>
    <ID>1</ID>
    <ImageName>C:\Users\macoratti\Pictures\johnLenon.jpg</ImageName>
    <Caption>johnLenon</Caption>
    <Page>0</Page>
    <Position>1</Position>
  </Album>
  <Album>
    <ID>2</ID>
    <ImageName>C:\Users\macoratti\Pictures\JimmiHendrix.jpg</ImageName>
    <Caption>JimmiHendrix</Caption>
    <Page>0</Page>
    <Position>2</Position>
  </Album>
  <Album>
    <ID>3</ID>
    <ImageName>C:\Users\macoratti\Pictures\JanisJoplin.jpg</ImageName>
    <Caption>JanisJoplin</Caption>
    <Page>0</Page>
    <Position>3</Position>
  </Album>
</Dataset1>

Temos assim uma aplicação muito simples que usa recursos básicos da linguagem C# mas que pode ser incrementada e que mostra como usar os recursos do Drag and Drop , arquivos XML e impressão com PrintDocument.

Simples , simples assim...

Pegue o projeto completo para estudo aqui: AlbumFotos.zip

Aguarde em breve um artigo tratamento somente do recurso Drag and Drop.

Eu sei é apenas C#, mas eu gosto...

Referências:


José Carlos Macoratti