Easy-Net 009 Asdfghjp
Easy-Net 009 Asdfghjp
ADO.NET
Este componente do framework .NET (encontrado em System.Data)
disponibiliza uma série de classes que fazem o trabalho de acesso e
manipulação aos dados de formas bem distintas. O acesso e edição dos dados
estão bem separados permitindo e facilitando principalmente o método de
trabalho “desconectado”.
Neste modelo a conexão com a fonte de dados, que pode ser um servidor
SQL, arquivos do Access ou qualquer outra fonte de dados suportada é
realizada para recuperar os arquivos e enviar as atualizações. Uma vez
carregados os dados, estes são manipulados localmente, sem a necessidade de
manter a conexão aberta, sendo esta, requisitada somente quando houver
necessidade de nova consulta ou de se enviar os dados de volta para a sua
fonte. Os principais componentes para o trabalho com os dados de forma
hierárquica e que serão vistos neste artigo são as classes DataTable e DataSet.
A classe DataTable
Consiste de um conjunto de colunas – ligadas às colunas de uma tabela do
banco de dados – e linhas representando cada uma, um registro. As colunas
são definidas pela classe DataColumn sendo que suas propriedades
armazenam características tais como:
• Tipo do dado a ser armazenado: texto, números inteiros e decimais, data etc.;
DataTable.WriteXml(<nome do arquivo>);
Desta forma somente os dados são enviados com as tags sendo geradas a
partir do nome das colunas da tabela de origem. A estrutura do arquivo criada
é a mínima necessária apenas para possibilitar a sua interpretação pelos
programas que fazem a leitura deste tipo de arquivo.
Nota: Como toda operação com arquivos é necessário que o usuário que esteja
conectado com o Windows e executando o programa possua as devidas permi
ssões para ler e para gravar os arquivos no disco local ou nas unidades de rede
, caso contrário, o programa irá causar uma exceção relacionada com a falta d
e permissão.
Nota do DevMan
DataTable.ReadXml(<nome do arquivo>);
Esta é mais indicada para a maior parte dos casos em que se deseja carregar
dados destes arquivos. É possível, assim como no método WriteXml ler de
diversas origens como streams de arquivos ou ainda de um documento XML
carregado na memória passando-se um elemento do tipo XmlReader. Caso o
schema esteja gravado no arquivo, as colunas do DataTable usarão os tipos de
dados existentes no schema, caso contrário, os dados serão assumidos todos
como do tipo string mesmo que sejam de tipos distintos como números ou
datas.
A classe DataSet
DataTables são objetos e, assim como a maior parte dos objetos do .NET
podem ser trabalhados em coleções. A classe DataSet é feita para este fim.
Consiste de uma coleção de DataTables que podem ser acessados via
indexadores de vetores usando os colchetes “[]”. Através desta classe que todo
o trabalho desconectado do ADO.NET é feito e permite manipular dados
independentemente do banco de dados ou a fonte onde estejam armazenados.
Toda a arquitetura do DataSet é baseada em XML o que explica a facilidade
de se gerar e ler dados deste tipo de arquivos. Assim como a classe DataTable
os principais métodos usados para gravar e ler arquivos XML são
respectivamente, WriteXml e ReadXml. O diferencial é que estes executarão o
comando gravando ou lendo todas as tabelas existentes na coleção do DataSet
carregado na memória ou gravadas no arquivo XML. Por exemplo, considere
um DataSet contendo três tabelas (Figura 2).
Figura 2. Estrutura do DataSet
Nota do DevMan
<nome>
<nome>José Antonio</nome>
<salario>2000</salario>
<admissao>2000-12-01T00:00:00-02:00</admissao>
</nome>
Este documento possui três tags e cada uma sendo de um tipo de dado
diferente. A tag “nome” deve ser do tipo string enquanto “salario” armazena
valores decimais e “admissao" representa uma data. Observe ainda que para a
data poder ser compatível com sistemas de outros idiomas, é enviada a data, a
hora e também um indicador GMT do horário. O schema para este XML
corresponde ao da Listagem 2.
Nota do DevMan
O projeto de exemplo
Para demonstrar como salvar e importar dados no formato XML usando
ADO.NET com as classes DataTable e DataSet será usado um projeto
Windows Forms.
Nota: este banco de dados é muito usado pelos programadores das tecnologias
da Microsoft para demonstrações porque é muito completo e bem feito. Além
disto, suas tabelas, stored procedures, views e dados que estão armazenados re
presentam bem dados e a estrutura de um banco de dados do mundo real. No f
inal deste artigo serão disponibilizados links para o download tanto do SQL S
erver como do banco de dados de exemplo.
Criando o projeto
Para iniciar o trabalho, deve ser criado um projeto novo no Visual Studio
através do menu File > New Project, a Figura 5 mostra os detalhes. É preciso
tomar cuidado com a escolha da linguagem Visual C# para o modelo do
projeto. Embora seja possível também usar a linguagem Visual Basic .Net
para executar o projeto, os códigos escritos no artigo usam o C#. O projeto
cria automaticamente um formulário padrão que para o exemplo deve ser
renomeado para “frmPrincipal”. Faça isto clicando com o botão direito do
mouse na janela Solution Explorer sobre o arquivo “Form1.cs” e escolha
“Rename”.
Nota do DevMan
LINQ é a abreviação de Language Integrated Query. É uma linguagem para c
onsulta de dados integrada com a linguagem usada no framework para desenv
olver o projeto (C#, VB.Net etc.). Pode ser usada para consultar bancos de dad
os, coleções de objetos na memória e também arquivos XML. Não será tratada
neste artigo por fugir do assunto principal.
Ajustando a configuração de
conexão com o banco de dados
Uma característica importante das aplicações Windows é armazenar as
configurações, como a string de conexão com o banco de dados em um
arquivo chamado “app.config” em tempo de projeto e “<nome do
projeto.exe.config>” em tempo de execução. Faremos um ajuste neste arquivo
para poder recuperar a string de conexão quando for fazer consulta ao banco
de dados. Dê um duplo clique no arquivo “app.config” na janela “Solution
Explorer” e altere o conteúdo do arquivo conforme a Listagem 3.
A alteração precisa ser feita no item “name” mudando o seu conteúdo para
“Northwind” conforme pode ser conferido na linha 6. As demais linhas devem
ser mantidas inalteradas.
Nota do DevMan
Acessando as tabelas
Anteriormente foi explicado que para carregar os dados do banco de dados
localmente como o ADO.Net precisamos definir objetos do tipo
DataAdapter/TableAdapter que fazem a conexão com o banco de dados e
executam as consultas que recuperam os registros. Abra o DataSet que foi
criado no projeto. Na janela, clique com o botão direito do mouse sobre o
mesmo e escolha a opção do menu “Add > TableAdapter...” para iniciar o
assistente que configura este componente (Figura 12).
Figura 12. Adicionando um componente TableAdapter no DataSet
Nota: uma das boas práticas do uso das instruções SQL recomenda declarar os
nomes dos campos na consulta para otimizar o tráfego dos dados na rede. Entr
etanto, como este exemplo foca em outros pontos, podemos usar a consulta co
nforme está no exemplo sem problemas.
Figura 15. Inserindo a instrução SQL
Repita o processo para a tabela Orders. A primeira consulta que está sendo
configurada (Figura 19) retorna um registro específico através do parâmetro
“@OrderID)”. A instrução SQL possui uma particularidade que é retornar o
nome do cliente juntamente com os dados da tabela Orders de uma maneira
que, se for necessário criar as instruções para alterar os dados, o mesmo objeto
TableAdapter possa ser usado. Note o bloco:
(
SELECT CompanyName FROM Customers
WHERE CustomerID = Orders.CustomerID
) AS CompanyName
Este método pode ser nomeado como “FillByOrderID” para ser fácil de
compreender (Figura 20).
Figura 20. Nomeando a consulta
Propriedade Valor
Font Segoe UI; 8,25pt
Size 640; 480
Text Easy 9 - DataTable para XML
Dentro deste controle adicione dois controles Label e coloque o texto como
na Figura 26. No componente de título, defina a fonte como “Segoe UI;
11,25pt; style=Bold”. O formulário possui ainda um controle TabControl.
Adicione três controles TabPages (use a figura do formulário para tirar as
dúvidas sobre as configurações básicas). A primeira página será usada para
exportar os dados da tabela Customers. Foram acrescentados os seguintes
componentes:
01. Panel: para definir o título. Este controle teve a propriedade Dock também
configurada como Top para alinhar na parte de cima do controle e servir como
título adicional para a aba. Além disto, a propriedade Color está definida
como “WhiteSmoke”.
Figura 26. Layout da tela principal com destaque para a primeira aba
A página Orders vai importar os dados desta tabela que estão gravados no
arquivo XML. Possui um controle Panel usado como título e para instruções,
um botão nomeado como “btnImportarOrders” e dois controles DataGridView
sendo um para a tabela Orders e outro para Order Details.
Figura 30. Layout da aba de importação da tabela Orders e Order Details
Em seguida, no inspetor de eventos (visualizado pela tecla F4) você deve dar
um duplo clique no evento Load e escrever o código da Listagem 5.
A linha 34 lê o conteúdo da célula que contém o campo ID. Está sendo usado
um indexador numérico mas poderia ser usado o nome da coluna. No caso
desta janela, isto não pode ser feito porque o preenchimento das colunas está
sendo feito automaticamente.
Exportando os dados
Para fazer a exportação dos dados o formulário conta com um método
chamado Gravar este deve ser vinculado tanto com o botão que exporta os
dados da tabela Customers como com o botão para exportar os dados da tabela
Orders. Abra o código do formulário principal e escreva o código
da Listagem 10.
Para que este método possa ser vinculado com o evento Click dos botões é
necessário que sua assinatura seja com os parâmetros conforme está
demonstrado na linha 53. O primeiro elemento, do tipo object, armazena qual
controle que foi o responsável pela chamada do método. Na listagem, na linha
56 é criada uma variável do tipo Button para receber dados do controle que
fez a chamada.
O exemplo não permite que outro tipo de controle faça a chamada para o
método, mas, se por algum motivo, o evento estiver vinculado com outro tipo
de controle, antes de fazer a conversão do parâmetro “sender” do tipo “object”
para “button” é necessário verificar se esta variável contém realmente dados
de um objeto do tipo correto através da palavra chave da linguagem C# “is”
conforme demonstrado das linhas 58 a 64. A conversão para “Button”
somente é executada se o objeto for do tipo correto, caso contrário, a rotina é
abandonada.
Nota do DevMan
Nota: No exemplo foi usado um único método para fazer a exportação apenas
para fins didáticos, principalmente, para demonstrar como inspecionar o tipo d
e um objeto enviado para um método. Entretanto, você pode achar interessant
e escrever métodos separados para exportar as tabelas.
Na linha 98 o programa abre uma janela de diálogo do tipo OpenFile para que
o usuário informe qual o arquivo deve ser lido. Se nenhum nome válido foi
informado (linha 101) a rotina é encerrada, caso contrário, é criada uma
instância de um objeto DataTable para poder ler o arquivo XML (linha 106).
O método ReadXml é chamado na linha 108 e o os dados carregados são
passados como fonte de dados para o controle DataGridView na linha 110.
Pelo código, das linhas 116 até 121 é buscado e validado um nome de arquivo
para ser carregado. A linha 124 cria um objeto DataSet que possui o método
ReadXml igual a classe DataTable. O método ReadXml carrega
automaticamente o conteúdo das tabelas, definindo um DataTable para cada
uma que for encontrada no arquivo. Isto simplifica bastante o trabalho uma
vez que, para percorrer os nós XML do arquivo seriam necessários muitos
passos. No interior da classe DataSet as tabelas podem ser acessadas através
dos enumeradores “[]” do C# e com isso, facilmente pode-se preencher os
controles DataGridView vinculando a propriedade DataSource com a tabela
adequada.
Conclusão
É sempre complicado tentar demonstrar os pontos principais de um recurso
porque o que em um projeto é essencial pode não ser em outro, entretanto, o
que foi exposto pode ser um bom ponto de partida para quem precisa trabalhar
com arquivos XML e precisa fazer isso com agilidade.
Existem muitas áreas onde os documentos XML estão presentes, para citar
apenas uma e com um alto grau de importância cito o projeto da Nota Fiscal
Eletrônica (NFE) que usa este formato de documento para envio e recepção
dos dados das empresas.
Links
DataTables (ADO.NET)
http://msdn.microsoft.com/en-us/library/t31h6yhs.aspx
ADO.NET Overview
http://msdn.microsoft.com/en-us/library/h43ks021(v=VS.100).aspx
Download do Northwind
http://download.microsoft.com/download/d/e/5/de57f203-3140-43e0-9473-d6
94d45bbd9b/SQL2000SampleDb.msi
por Vladimir Rech
Guru .net e tecnologias MS
Enviando e-mails
O artigo mostra como é fácil e rápido enviar
e-mails utilizando a plataforma .NET. Com
poucos passos e alguns conceitos qualquer
programa pode ser adaptado para envio de
mensagens de e-mail usando os recursos
que serão demonstrados.
Uma das primeiras formas de aplicação prática que surgiram na Internet foi a
troca de mensagens, logo apelidada de “E-mail” originalmente referindo-se a
“Eletronic Mail” ou, “Correio Eletrônico”. Hoje em dia este tipo de
nomenclatura parece obsoleto, entretanto, o seu uso ainda é intenso. O envio
de mensagens usando a Internet como meio de transmissão passa pela solução
de diversos problemas como o tipo de protocolo a ser usado, o servidor usado
para fazer o roteamento da mensagem, credenciais do usuário para poder usar
o servidor, formato da mensagem etc. Durante algum tempo era uma tarefa
bem difícil considerando os problemas acima, mas a evolução das linguagens
e plataformas permitiu que hoje tudo seja mais fácil. O framework .NET é
uma das plataformas que facilita muito o trabalho. Com poucas classes o
desenvolvedor poderá facilmente agregar ao seu aplicativo a funcionalidade
de envio de dados usando as mensagens de e-mail. Mesmo existindo muitos
programas específicos para esta finalidade, programas comerciais precisam
enviar os dados que estes manipulam e geram.
Embora esta facilidade exista, é pouco provável que você venha a usar este tip
o de comando com frequência, principalmente porque é pouco intuitivo. Em t
odos os casos, serve para demonstrar como houve evolução dos sistemas oper
acionais no sentido de se integrar com as tarefas que podem ser feitas usando-
se a Internet, inclusive o envio de mensagens de e-mail.
No .NET Framework o envio de e-mail pode ser feito de forma fácil e rápida,
graças às classes disponíveis no namespace System.Net.Mail, onde temos todo
o controle necessário para a criação de e-mails, configuração de servidor entre
outros.
System.Net.Mail
Tudo que precisamos para o envio de e-mails está no namespace
System.Net.Mail, na versão 1.0 do .NET utilizávamos o namespace
System.Web.Mail, mas desde a versão 2.0, foi criado o System.Net.Mail, com
mais funcionalidades e mais flexível, então não confudir na declaração do
namespace, o recomendado desde a versão 2.0 do .NET Framework é este
último citado. Dentre todas as classes disponíveis nele as principais e mais
utilizadas são:
• SmtpClient;
• MailMessage;
• MailAddress.
A classe SmtpClient
É a classe responsável pelo envio do e-mail, onde vamos informar qual o
nosso servidor de SMTP, segurança, vamos informar qual o usuário e senha
para autenticação. Um exemplo simples das configurações que podemos fazer
está naListagem 1.
Nota do Devman
Na linha 15 é informado qual o servidor que será usado para o envio. Outro
item importante é a identificação do usuário do servidor (host) através da
propriedade Credentials. Na linha 17 estão sendo enviados um nome e uma
senha (que deverão ser obtidas em um arquivo de configuração, por exemplo,
ou através da digitação do usuário). Uma outra maneira de se definir as
credenciais do usuário é da seguinte forma:
smtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;
A classe MailMessage
É utilizando a classe MailMessage que vamos configurar nosso e-mail, desde
quem está enviando, quem vai receber, se vamos enviar no formato de HTML,
título do e-mail, corpo do e-mail, é nela que também configuramos os anexos.
As principais propriedades desta classe estão exibidas na Tabela 1. A classe
MailMessage interage com várias outras classes do namespace, como por
exemplo, a classe MailAddress.
Propriedade Conteúdo
AlternativeViews Retorna uma coleção com os formatos alternativos que
podem ser usados para a mensagem. Por exemplo, ao se
enviar uma mensagem no formato HTML, pode se
enviar também nesta propriedade uma versão da mesma
mensagem no formato de texto puro para evitar que a
mensagem seja incorretamente exibida para o
destinatário, caso o programa que este esteja usando não
dê suporte para este formato – como por exemplo
mensagens visualizadas em alguns tipos de dispositivos
móveis ou programas de e-mail de outras plataformas.
Attachments Retorna uma coleção com os anexos que estão
vinculados com a mensagem. Use esta propriedade
quando precisar enviar algum arquivo junto com a
mensagem de e-mail. Este objeto é do tipo
AttachmentCollection – corresponde a uma coleção de
objetos da classe Attachment.
Bcc Retorna uma coleção contendo os endereços para o qual
será enviada uma cópia oculta (blind carbono copy) da
mensagem atual.
Body Representa o corpo da mensagem.
BodyEncoding Usada para definir a codificação – tipo de caracteres
ligados com o idioma – em que a mensagem será
enviada.
CC Retorna uma coleção com os endereços de e-mail para
os quais uma cópia da mensagem será enviada.
DeliveryNotificationOptions Configura o tipo de mensagem de entrega que será
usada para a mensagem. Use esta propriedade, por
exemplo, se desejar que o destinatário envie uma
confirmação do recebimento ou de leitura da mensagem
de e-mail.
From Configura o endereço de e-mail do remetente da
mensagem.
Headers Retorna os dados do header da mensagem (dados
adicionais).
HeadersEncoding Configura a codificação dos dados do header da
mensagem.
IsBodyHtml Informa se o corpo da mensagem está no formato
HTML ou não.
Priority Marca a prioridade a ser usada para a mensagem.
ReplyToList Configura uma coleção de endereços para os quais a
resposta para a mensagem poderá ser enviada.
Sender Configura um endereço de e-mail do remetente da
mensagem (semelhante a propriedade From).
Subject Usado para configurar o assunto da mensagem.
SubjectEncoding Define a codificação do campo Subject.
To Retorna uma lista com os endereços dos destinatários da
mensagem
Nota do DevMan
Nesta tabela, todos os itens onde são retornadas coleções de objetos as operaç
ões para acrescentar ou remover itens são feitas através dos métodos Add ou
Remove comuns para as coleções de objetos. Deve-se apenas observar que ca
da tipo de coleção corresponde a uma classe e deve-se conhecer detalhes desta
s classes. Também é importante perceber que nem sempre todos estes itens ser
ão usados, principalmente quando o tipo da mensagem for básica, mas é impor
tante conhecer quais os elementos pois, com certeza alguns virão a ser bem us
ados, como o envio de arquivos anexos.
A classe MailAddress
A classe MailAddress pode ser utilizada nas propriedades From, To, CC e
BCC da MailMessage, é nela que criamos um endereço de e-mail, de envio ou
recebimento, também podemos definir um nome mais amigável ao endereço
de e-mail:
O projeto de exemplo
Como foi demonstrado até este ponto, o envio de e-mail é bastante
simplificado com o .Net, logo não há muito o que inventar ao se fazer um
projeto deste tipo. A aplicação vai ter a função de envio de mensagens usando
as configurações que forem digitadas pelo usuário. Nenhuma função de
persistência será implantada, isso você poderá fazer mais tarde, apenas será
criada uma interface para o propósito de envio de e-mail. Crie um novo
projeto do tipo Windows Forms no Visual Studio através do menu File > New
Project, como mostra a Figura 3.
Figura 3. Criando o projeto no Visual Studio 2010
Design geral
Ao criar o projeto imediatamente um formulário padrão é adicionado.
Acrescente os seguintes componentes ao formulário para o design principal
que pode ser conferido na Figura 4:
Aba de endereçamento
É na primeira aba do controle TabControl onde o usuário deverá digitar os
dados de endereçamento da mensagem, para tanto arraste os seguintes
controles para a janela:
• Controle Button nomeado como btnEnviar. É no evento Click deste que será
definido o código para o envio da mensagem;
• Seis controles do tipo TextBox nomeados respectivamente como:
txtRemetente, txtDestinatario, txtCopia, txtBCC, txtAssunto, txtAnexo;
Nota do Devman
Neste exemplo não se está fazendo considerações sobre validações dos dados
como o endereço de e-mail, por exemplo. Entretanto, existem maneiras de se
validar este tipo de informação forçando inclusive o usuário a digitar somente
caracteres minúsculos nos campos e validando o endereço de e-mail com o us
o de expressões regulares. No momento este tipo de tratamento não cabe aqui,
mas pesquise sobre estas funcionalidades e enriqueça os projetos através da ag
regação destas funcionalidades.
Aba de configurações
É na segunda aba onde os dados da conexão serão digitados. Acrescente três
controles TextBoxs nomeando-os respectivamente como txtServidor,
txtUsuario e txtSenha. Neste último controle configure a propriedade
UseSystemPasswordChar como true para que ao digitar a senha o conteúdo do
campo não seja exibido. O design desta aba deve ficar parecido com o
da Figura 6.
Figura 6. Aba de configurações
Nota do Devman
Anexando arquivo
As mensagens de e-mail podem eventualmente conter arquivos anexos. No
projeto de exemplo esta funcionalidade vai ser implementada. Para facilitar a
localização dos arquivos no computador, foi acrescentado um controle não
visual do tipo OpenFileDialog. Com isto um componente deve estar
disponível na parte de baixo da janela de design como mostra a Figura 7.
A ideia geral é que ao clicar no botão com a legenda “...” que foi colocado ao
lado do campo Anexo, uma janela seja mostrada para se escolher o arquivo,
que pode ser de qualquer tipo. A Listagem 3 mostra o código necessário para
a pesquisa do arquivo.
Enviando a mensagem
Com todos os campos preenchidos ao clicar no botão Enviar da interface o
código deve preencher os dados da classe MailMessage e também SmtpClient.
No código da Listagem 4 estão colocados todos os passos desta aplicação de
exemplo para fazer o envio, além de alguns tratamentos para evitar problemas.
Neste código algumas validações são feitas, a primeira (da linha 31 a 35) é
verificar se algum endereço foi digitado no campo “CC”. Este campo é
responsável pelo endereço do Carbon Copy para envio de uma cópia – visível
aos outros destinatários. Ou seja, ao preencher este campo, todos os
destinatários saberão quem está recebendo uma cópia do e-mail.
<
Caso seja necessário enviar uma mensagem para vários destinatários mas não
se deseja que nenhum tome conhecimento do endereço de e-mail do outro, de
ve-se preencher somente o campo Bcc da mensagem. Isto evita inclusive a pro
pagação das mensagens indesejadas de e-mail (spans).
Nota do Devman
Enviando o e-mail
Preencha os dados da mensagem colocando os seus próprios dados de
endereços da mesma forma como foi feito na Figura 8.
Conclusão
Mesmo com especialistas apontando o fim da era do e-mail, acho difícil nos
livrarmos do bom e velho e-mail tão cedo, principalmente no meio
corporativo. Com o .NET podemos enviar e-mails simples como o
demonstrado aqui, a e-mails mais complexos, a qualquer momento, não
precisamos depender do cliente possuir um client de e-mail instalado para
conseguir enviar e-mails pelos nossos sistemas, podemos automatizar essa
tarefa e facilitar a vida dos nossos clientes. Considere situações, por exemplo,
de mala direta, envio de documentos vinculados a processos (como o projeto
NF-e), publicidade (embora, neste caso, é necessário uma permissão dos
destinatários), mailings lists etc., as possibilidades são muitas e certamente,
será fácil de serem executadas com .Net e as suas classes.
Links
MailMessage Class
http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.aspx
System.Net.Mail Namespace
http://msdn.microsoft.com/en-us/library/system.net.mail.aspx
Windows Phone 7
O artigo apresentará uma introdução básica
ao Windows Phone 7 e um overview sobre
a criação de telas utilizando o Silverlight. O
Silverlight disponibiliza um recurso chamado
layout controls, utilizaremos no artigo para
criar o layout das telas no Windows Phone
7.
Nota do DevMan
Nota do DevMan
Com a evolução dos aparelhos celulares, cada vez mais estamos trocando-os
com mais frequência, um dos motivos é a melhoria ou inclusão de diversos
recursos que facilitam o dia a dia de quem gosta de utilizar o celular para
tarefas além de fazer e receber ligações. Essa evolução tecnológica no
hardware também refletiu em uma evolução tecnológica no software, com
destaque aos sistemas operacionais que atualmente temos disponíveis.
A tela inicial contém uma barra chamada System Tray no topo. Essa barra
apresenta o sinal do celular, um medidor de bateria e a hora atual. Se o seu
aplicativo precisa aproveitar o máximo da tela, você poderá remover essa
barra de forma simples, colocando a propriedade SystemTray.IsVisible como
false no XAML. Em seguida temos uma tela padrão do Windows Phone, a
tela utiliza dos Layout Controls Grid e StackPanel, que veremos em detalhes
mais adiante. Os Layout Controls ajudam a separar as áreas na tela para que
os elementos possam ser posicionados de forma adequada.
Layout Controls
Para dispor os elementos em uma página no Windows Phone 7 temos cinco
recursos disponíveis, são eles, o Canvas, Grid, Stackpanel, Border e
Scrollviewer. Vamos conhecer um pouco sobre cada um deles e quando
utilizá-los.
<Canvas>
<Button Background="Red"
Content="Botão 1"
Canvas.Left="10"
Canvas.Top="0" ></Button>
<Button Background="Blue"
Content="Botão 2"
Canvas.Left="40"
Canvas.Top="30" ></Button>
<Button Background="Yellow"
Content="Botão 3"
Canvas.Left="70"
Canvas.Top="60"></Button>
<Button Background="Green"
Content="Botão 4"
Canvas.Left="100"
Canvas.Top="90" ></Button>
</Canvas>
O StackPanel ajusta os seus elementos em uma pilha, podendo ser uma pilha
vertical ou horizontal. Por padrão ele ajusta os elementos de cima para baixo.
Ele é interessante para quando quisermos trabalhar com um layout simples e
padronizado. Por exemplo, quando você inserir um elemento dentro do
StackPanel, ele vai ficar um embaixo do outro, isso porque a orientação
padrão do Stackpanel é Vertical. Veja na Listagem 2 um exemplo utilizando
os mesmos quatro botões, o resultado pode ser visto na Figura 2.
<Button Background="Red"
Content="Botão 1"/>
<Button Background="Blue"
Content="Botão 2" />
<Button Background="Yellow"
Content="Botão 3" />
<Button Background="Green"
Content="Botão 4"/>
</StackPanel>
<Button Background="Red"
VerticalAlignment="Top"
Content="Botão 1"/>
<Button Background="Blue"
VerticalAlignment="Bottom"
Content="Botão 2" />
<Button Background="Yellow"
VerticalAlignment="Center"
Content="Botão 3" />
<Button Background="Green"
VerticalAlignment="Stretch"
Content="Botão 4" />
</StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="230*" />
<ColumnDefinition Width="230*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="90*" />
<RowDefinition Height="678*" />
</Grid.RowDefinitions>
<Button Background="Red"
Content="Botão 1"
Grid.Row="0"
Grid.Column="0"/>
<Button Background="Blue"
Content="Botão 2"
Grid.Column="1"
Grid.Row="0"/>
<Button Background="Yellow"
Content="Botão 3"
Grid.Row="1"
Grid.Column="0" />
<Button Background="Green"
Content="Botão 4"
Grid.Column="1"
Grid.Row="1" />
</Grid>
<Border CornerRadius="50"
BorderBrush="Blue"
Background="AliceBlue"
BorderThickness="2" >
</Border>
Figura 5. Border
Listagem 6. Scrollviewer
<ScrollViewer
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<Image Source="foto.jpg" />
</ScrollViewer>
Figura 6. Scrollviewer
Vamos agora analisar uma simples aplicação que utiliza os layout controls
Grid e Stackpanel. A aplicação divide a tela em duas linhas, na primeira temos
um Stackpanel com dois botões, na segunda temos outro Stackpanel com um
formulário simples, contendo dois campos para que o usuário possa digitar seu
nome e sobrenome. Veja Listagem 7 e resultado na Figura 7.
Figura 7. Formulário com Layout Controls
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="105*" />
<RowDefinition Height="663*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0"
Orientation="Horizontal">
<Button Content="Enviar"
VerticalAlignment="Center" ></Button>
<Button Content="Limpar"
VerticalAlignment="Center" ></Button>
</StackPanel>
<StackPanel Grid.Row="1">
<TextBlock Text="Nome"
Margin="10"></TextBlock>
<TextBox ></TextBox>
<TextBlock Text="Sobrenome"
Margin="10"></TextBlock>
<TextBox ></TextBox>
</StackPanel>
</Grid>
1 <phone:PhoneApplicationPage
2 x:Class="WindowsPhoneApplication3.MainPage"
3
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:phone="clr-
namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
6 xmlns:shell="clr-
namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
7 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
8 xmlns:mc="http://schemas.openxmlformats.org/markup-
compatibility/2006"
9 mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
10 FontFamily="{StaticResource PhoneFontFamilyNormal}"
11 FontSize="{StaticResource PhoneFontSizeNormal}"
12 Foreground="{StaticResource PhoneForegroundBrush}"
13 SupportedOrientations="Portrait" Orientation="Portrait"
14 shell:SystemTray.IsVisible="True">
15
16 <!--LayoutRoot is the root grid where all page content is
placed-->
17 <Grid x:Name="LayoutRoot" Background="Transparent">
18 <Grid.RowDefinitions>
19 <RowDefinition Height="Auto"/>
20 <RowDefinition Height="*"/>
21 </Grid.RowDefinitions>
22
23 <!--TitlePanel contains the name of the application and
page title-->
24 <StackPanel x:Name="TitlePanel" Grid.Row="0"
Margin="12,17,0,28">
25 <TextBlock x:Name="ApplicationTitle"
26 Text="MY APPLICATION"
27 Style="{StaticResource PhoneTextNormalStyle}"/>
28 <TextBlock x:Name="PageTitle" Text="page name"
Margin="9,-7,0,0"
29 Style="{StaticResource PhoneTextTitle1Style}"/>
30 </StackPanel>
31
32 <!--ContentPanel - place additional content here-->
33 <Grid x:Name="ContentPanel" Grid.Row="1"
Margin="12,0,12,0"></Grid>
34 </Grid>
35
36 <!--Sample code showing usage of ApplicationBar-->
37 <!--<phone:PhoneApplicationPage.ApplicationBar>
38 <shell:ApplicationBar IsVisible="True"
IsMenuEnabled="True">
39 <shell:ApplicationBarIconButton
IconUri="/Images/appbar_button1.png"
40 Text="Button 1"/>
41 <shell:ApplicationBarIconButton
IconUri="/Images/appbar_button2.png"
42 Text="Button 2"/>
43 <shell:ApplicationBar.MenuItems>
44 <shell:ApplicationBarMenuItem Text="MenuItem 1"/>
45 <shell:ApplicationBarMenuItem Text="MenuItem 2"/>
46 </shell:ApplicationBar.MenuItems>
47 </shell:ApplicationBar>
48 </phone:PhoneApplicationPage.ApplicationBar>-->
49
50 </phone:PhoneApplicationPage>
O código gerado pelo Visual Studio é somente um exemplo, você pode apagar
tudo e criar o layout que desejar, conforme a necessidade de sua aplicação.
Conclusão
Vimos uma introdução aos controles de layouts e analisamos os códigos
gerados pela aplicação default quando criamos uma aplicação do tipo
“Windows Phone Application”. Além desse tipo de aplicação básica, existem
outros modelos “templates” para você utilizar como base para uma aplicação
Windows Phone 7, uma delas é chamado de “Windows Phone Panorama
Application”, um tipo de projeto modelo do Windows Phone que permite criar
aplicações que usam um tipo de recurso que disponibiliza uma navegação de
forma panorâmica, em uma tela através de touch screen. Existem diversos
projetos que utilizam desses recursos, como os próprios aplicativos do Office
e o XBOX Live que acompanham o Windows Phone 7.
Links
por Alexandre
Guru .net e tecnologias MS
Visual Studio 2010
Este artigo é o terceiro de uma série que vai
abordar as principais novidades presentes
no Visual Studio 2010, bem como
importantes recursos presentes em outras
versões da ferramenta.
De que se trata o artigo
Este artigo é o terceiro de uma série que vai abordar as principais novidades
presentes no Visual Studio 2010, bem como importantes recursos presentes
em outras versões da ferramenta.
Visual Studio
Programação Paralela
O .NET Framework 4 trouxe novas bibliotecas que permitem a utilização de
tarefas em paralelo em um aplicativo, ou seja a capacidade de executar
múltiplas threads ao mesmo tempo, simultaneamente. Neste aspecto os
aplicativos poderão utilizar vários processadores sem a preocupação de
trabalhar diretamente com as threads, assim, o Visual Studio 2010 permite
facilitar a programação com as suas bibliotecas de computação paralela. Neste
aspecto, utilizando os computadores mais atuais, praticamente todos são
multiprocessados, e essa arquitetura permite a divisão de tarefas entre seus
núcleos de processadores, assim os trabalhos podem ser divididos e
executados em paralelo, dessa forma, ampliando o desempenho e podendo
utilizar de forma mais adequada a capacidade de processamento de um
processador.
Parallel.For(0, 5, delegate(int x)
{
MessageBox.Show("Mensagem nº: " + x.ToString());
});
Além disso, a LINQ (Language Integrated Query), que foi uma linguagem
introduzida no .NET 3.0, auxilia na consulta a diferentes fontes de dados,
como bancos de dados relacionais, documentos XML ou outros tipos de
objetos. A partir de sua definição, o .NET Framework 4.0 adicionou um novo
conceito à LINQ e a programação paralela dando origem ao chamado PLINQ
(Parallel LINQ). Este novo modelo de execução de consultas é semelhante ao
formato utilizado em consultas de uma expressão LINQ tradicional, a
vantagem está na sua execução, que utilizará maiores recursos de
processamento, como vários processadores ou núcleos de execução quando
estiverem presentes e disponíveis no ambiente. A alteração na forma de
realizar uma consulta é bastante pequena e o uso de PLINQ será uma ótima
escolha para implementações em arquiteturas que exijam um grande
processamento paralelo.
O gerenciador de extensões
O Visual Studio 2010 possui o chamado Extension Manager (gerenciador de
extensões) através do gerenciador, é possível instalar extensões para a IDE do
Visual Studio, ele irá realizar o download, caso seja necessário, instalar a
extensão e realizar toda a manutenção em extensões já presentes no sistema,
como desinstalar, desativar ou reativar alguma que já foi instalada. Outra
opção disponível é a utilização de extensões desenvolvidas por terceiros,
outros fabricantes, presentes no gerenciador através da opção de pesquisa
online. A Figura 3 acessada pelo Visual Studio 2010 através do menu Tools,
indica a janela do gerenciador de extensões.
SharePoint
O desenvolvimento para SharePoint no Visual Studio 2010 foi aprimorado
possibilitando criar, editar, depurar, empacotar, implantar e ativar projetos
desenvolvidos diretamente no Visual Studio. Suas ferramentas auxiliam na
criação de projetos SharePoint que poderão se relacionar com o Microsoft
SharePoint Foundation 2010 e com o Microsoft SharePoint Server 2010. As
novas funcionalidades auxiliam na importação e modificação de soluções,
utilização de modelos de tipo de projeto e modelos de item de projeto, criação
de formulários de associação e inicialização para fluxo de trabalhos,
agregação e integração de dados, criação de web parts, navegação entre sites
do SharePoint utilizando o gerenciador de servidores, depuração, criação e
validação de soluções. A Figura 4apresenta a tela de criação de um projeto
SharePoint em branco no Visual Studio.
Figura 4. Tela para criação de um novo projeto SharePoint no Visual Studio
2010
Computação em nuvem
A utilização do Windows Azure Tools no Visual Studio 2010 é bastante
simplificada e possibilita o desenvolvimento de aplicativos voltados para web
de forma escalável e serviços que utilizem o Windows Azure. Este ambiente,
que é um sistema para desenvolvimento de serviços em nuvem, serve como
ponto de hospedagem e gerenciamento de serviços, fornecendo
armazenamento e gerenciamento de aplicações através de data centers. O
princípio básico indica que os aplicativos nele adicionados poderão ser
executados através de serviços do Windows Azure, possibilitando maior
escalabilidade e economia de manutenção de servidores de armazenamento e
licenciamento de recursos.
O Visual Studio possui extensões para habilitar, criar, depurar e concluir o
desenvolvimento de aplicativos e serviços que utilizem esta tecnologia, dessa
forma, as ferramentas do Windows Azure, voltadas para o VS 2010, facilitam
todo o processo de criação de software.
Comportamento avançado de
janelas
Ao utilizar o Visual Studio 2010, as janelas de documentos não estão
limitadas ao local de edição no ambiente de desenvolvimento (IDE). Neste
ambiente, principalmente as janelas de ferramentas e janelas de documentos,
podem ser ajustadas para uma melhor visualização e edição de espaço para
código, dependendo da forma como se deseja organizar as janelas. Dessa
forma, as janelas podem ser organizadas de diversas maneiras como arrastá-
las para as bordas do IDE, movê-las em qualquer parte do desktop, incluindo
arrastar para um segundo monitor, facilitando a visualização do código, e é
claro, as opções lado a lado e agrupamentos, circulando livremente entre o
ambiente de desenvolvimento ou sob alguma área flutuante permanecendo
com um estado de interligação com o projeto que está sendo desenvolvido em
todos os momentos. Observe que, obviamente, ao alterar o código em uma
janela de documento, a sua janela de designer também será modificada.
A Figura 5 demonstra o estilo flutuante da janela de código.
Figura 5. Janela de código em estilo flutuante podendo ser arrastada para
qualquer parte da tela, inclusive outro monitor
Conclusão
O Visual Studio 2010 apresenta várias novidades e melhorias no seu ambiente
de desenvolvimento integrado na utilização do .NET Framework versão 4, que
também apresenta novidades. Neste artigo foram abordadas algumas das
novidades presentes, seguindo a seqüência inicial desde o primeiro artigo
relacionado a este tema. Foram indicados os aperfeiçoamentos de designer
para desenvolvimento de aplicativos WPF e Silverlight, a sua fácil e simples
composição visual aprimorada que irá aumentar a produtividade na confecção
de aplicativos voltados para este tipo de desenvolvimento. Um grande
destaque aos principais recursos que podem ser vistos e utilizados na
programação paralela, a sua utilização visando aumentar o desempenho de um
aplicativo e a depuração de um aplicativo utilizando, principalmente, as
janelas Parallel Stacks e Parallel Tasks. Dando continuidade, e seguindo o
artigo, surge o gerenciador de extensões do Visual Studio que está melhorado
possuindo opções de instalação de novas extensões, atualização e pesquisas
online em busca de extensões disponíveis, inclusive as desenvolvidas por
terceiros que não sejam especificadamente da Microsoft.
Links
Visual Studio
http://www.microsoft.com/visualstudio
Gerenciador de Extensões
http://msdn.microsoft.com/pt-br/library/dd293638.aspx
O que há de novo no desenvolvimento do SharePoint
http://msdn.microsoft.com/pt-br/library/ee290856.aspx
Windows Azure
Este artigo aborda alguns conceitos sobre
computação na nuvem e começa a
demonstrar a plataforma de
desenvolvimento na nuvem da Microsoft, o
Windows Azure
Windows Azure
Na maioria das vezes o discurso que apóia este tipo de decisão é a segurança
dos dados estarem fisicamente dentro da empresa, o que é tema para um outro
artigo. Se por um lado a segurança é utilizada como argumento para manter
uma infraestrutura interna ou “on premise”, por outro lado existem fortes
argumentos contra esta posição. Um destes argumentos é referente ao alto
custo de manutenção para esta infraestrutura interna. Quando falamos em
manutenção estamos falando em manter as máquinas funcionando e em bom
estado, com poder de processamento suficiente para suportar a carga do
sistema mesmo em eventuais picos. Além disso, manter memória suficiente
para suportar a carga necessária para o sistema, prover suporte de rede e
internet disponíveis para que as máquinas (e consequentemente os serviços)
estejam acessíveis, prover suporte de energia garantindo que o serviço não
saia do ar mesmo em caso de falha na alimentação convencional dentre uma
série de outros fatores. Manter toda uma estrutura como esta, com qualidade, é
realmente muito caro.
Entendendo o problema da
escalabilidade
Quando falamos em escalabilidade geralmente pensamos em um ambiente de
muita demanda como bancos, grandes sites de vendas, grandes portais de
internet etc. A verdade é que todo serviço tem necessidade de escalabilidade.
Não são raros os serviços onde temos uma demanda crescente e em alguns
casos imprevisível. E ainda que tenhamos uma demanda previsível, por
estarmos fazendo uso de uma infraestrutura interna não temos a facilidade de
escalabilidade.
Quanto uma empresa levaria para, digamos, multiplicar por 40 mil seu poder
de processamento? Quantos novos servidores seriam necessários para manter
a aplicação no ar durante os 2 meses de pico?
O Windows Azure possui ainda uma inteligência muito grande no que diz
respeito à disponibilidade de nossas aplicações. Quando solicitamos a ele que
disponibilize duas máquinas com a nossa aplicação ele é inteligente o
suficiente para disponibilizar duas máquinas que sejam completamente
separadas de forma que não estejam sob a mesma dependência de alimentação
de energia ou rede. Desta forma caso o fornecimento de energia para uma das
máquinas seja interrompido a outra máquina continuará executando, e o
Windows Azure providenciará imediatamente uma nova máquina para o lugar
daquele que foi desligada. Esta mesma inteligência ocorre em momentos de
falha de hardware. O Azure possui um constante monitoramento de todos os
itens que compõem sua malha(ou Fabric). E no momento em que identifica
um problema automaticamente ele começa a remover as aplicações sob o
problema e as distribui para outras máquinas saudáveis.
Além de toda esta estrutura para executar nossos serviços o Windows Azure
ainda possui um conjunto de soluções de storage (ou armazenamento) que
estão prontas para atender soluções distribuídas e grandes processamentos
com uma capacidade também virtualmente ilimitadas.
Além dos BLOBs está disponível uma solução para armazenamento de dados
chamada de Azure Tables. É importante não confundir o Azure Tables com
alguma solução de banco de dados relacional: Azure Tables não é banco de
dados relacional. O Azure Tables provê uma maneira bastante eficiente de
armazenarmos dados de forma distribuída e escalável. Para processamentos de
serviços e comunicação entre aplicações existe ainda o Azure Queues. As
Queues são filas distribuídas onde são armazenadas tarefas para que diversos
outros serviços distribuídos possam executá-las em paralelo, facilitando a
comunicação e a distribuição de serviços de maneira escalável.
Conclusão
O Windows Azure não é apenas uma nova plataforma, um novo produto ou
ainda algo de momento. As soluções de cloud computing são soluções novas,
até então não disponíveis, que visam resolver grandes problemas que já
existem há tempos. A economia de recursos(tempo, dinheiro, equipe, espaço
etc.) é realmente muito significativa na maioria dos ambientes que possuem
soluções com demandas sazonais e esporádicas. Além disso a computação na
nuvem atende muito bem pequenos negócios com grande potencial de
crescimento.
Links
Site Oficial
http://www.microsoft.com/windowsazure/