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: