BlogMS é um blog que vai mantendo uma lista actualizada de Blogs e Blogs de Equipas oficiais, e respectivos recursos RSS, da Microsoft.
Uma lista com os principais blogs, divididos por categorias, como por exemplo, Office Applications, Security, Software and Web Development, SQL and Business Intelligence, Dynamics, Consumer and Hardware Solutions, Microsoft Learning, Windows Desktop and Embedded, etc.
A lista completa tem actualmente 252 blogs: Official Microsoft Team Blogs / Microsoft Blogs
Além disso, fazem ainda um resumo semanal dos artigos publicados nos respectivos blogs, com os principais títulos e datas de publicação.
Um recurso importante para quem quer estar actualizado em uma ou mais áreas.
Antes de falar propriamente nos XML Literals, e porque nunca aqui foi referido e será utilizado neste exemplo, vou falar um pouco sobre a declaração Option Infer.
Option Infer
A declaração Option Infer On permite que não se indique o tipo de variável, sendo esta identificada efectuada automaticamente pelo compilador.
Isto é bastante útil para LINQ ou para Lambda Expressions e pode ser activado ou desactivado a nível do projecto (Tools - Options - Projects and Solutions - VB Defaults) ou a nível do documento, através da declaração "Option Infer On" ou "Option Infer Off". Por defeito está definido para "On".
Vejamos estas declarações:
Dim str = "Exemplo"
Dim int = 123
Dim dbl = 12.3
Dim list = New List(Of Integer)
Nestes exemplos, e caso esteja definido Option Infer On, as variáveis serão definidas como str = String, int = Integer, dbl = Double e list as System.Collections.Generics.List(of T).
É o mesmo que fazer:
Dim str As String = "Exemplo"
Dim int As Integer = 123
Dim dbl As Double = 12.3
Dim list As New List(Of Integer)
Caso estivesse definido como Option Infer Off, todas as variáveis ficariam definidas como Object, e não o tipo desejado.
XML Literals
Passando ao tema principal deste artigo, este pretende mostrar como os XML Literals permitem incorporar o XML directamente no código e com isso, conseguir manipular muito facilmente este tipo de ficheiros. Os XML Literals estão disponíveis a partir do Visual Studio 2008, suportando a maioria da especificação Extensible Markup Language (XML) 1.0.
Este exemplo cria, em modo runtime, a estrutura de um ficheiro XML, com alguns dados, estando disponível intellissence e auto-indenting do texto:
Dim bookList = _
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Lista de livros e revistas -->
<library>
<books>
<book name="Crepúsculo" author="Stephenie Meyer"/>
<book name="Equador" author="Miguel S. Tavares"/>
<book name="O Sétimo Selo" author="José R. dos Santos"/>
</books>
<magazine>
<magazineName>"MSDN Magazine"</magazineName>
<magazineName>"Code Magazine"</magazineName>
</magazine>
</library>
Com base no ficheiro criado, e para listar todas as revistas, indicando o caminho da estrutura XML até ao elemento pretendido, podemos criar um ciclo For Each:
For Each m In From element In _
bookList.<library>.<magazine>.<magazineName>
Debug.WriteLine(m.Value)
Next
Este é um método mais prático de o fazer, sem ser necessário indicar o caminho para o elemento pretendido, utilizando a propriedade Descendants, que irá retornar todos os elementos descendentes que encontre na descrição especificada entre as chavetas <>:
For Each m In From element In bookList...<magazineName>
Debug.WriteLine(m.Value)
Next
Para listar os livros, o processo é semelhante, mas desta vez como o Nome e o Autor estão como atributos, utiliza-se o caracter "@" para indicar qual o atributo a ler:
For Each book In From element In bookList...<book>
Debug.WriteLine("Livro: " & book.@name.ToString)
Debug.WriteLine("Autor: " & book.@author.ToString)
' Linha de separação
Debug.WriteLine(New String("-"c, 40))
Next
Para um pesquisa de informação podemos utilizar LINQ to XML. Neste caso, para procurar todos os registo que com a palavra "Selo":
Dim bookSearch = From b In bookList...<book>_
Where b.@name.ToString.Contains("Selo") _
Select b.@name, b.@author
For Each book In From element In bookSearch
Debug.WriteLine("Livro: "& book.name)
Debug.WriteLine("Autor: " & book.author)
' Linha de separação
Debug.WriteLine(New String("-"c, 40))
Next
Finalmente, podemos gravar para o disco, o XML que se encontra em memória
bookList.Save("d:\LivrosRevistas.xml")
É um exemplo simples de como ler informação utilizando XML Literals e LINQ to XML, que mostra que nunca foi tão fácil trabalhar com ficheiro XML.
Para breve mais exemplos sobre XML Literals!
Gary Lima, aka VBRocks, iniciou-se recentemente no mundo dos blogs. É um bom amigo e o seu contributo em diversas comunidades técnicas fizeram que seja Microsoft MVP desde 2008.
Para já, já estão disponíveis alguns bons artigos como:
Extension Methods
Delegates
Calculating a Bar Graph Scale
ADO.NET: SqlBulkCopy
ADO.NET: DataTables, In-depth
ADO.NET: DataTables, An Introduction
Para breve ele promete mais!
Aqui fica um blog a ter em conta para todos os amantes de VB
http://garylima.blogspot.com/
Como explicado e demonstrado em artigos anteriores, os Microsoft Reports podem exportar directamente para 3 formatos: Microsoft Excel, Adobe Acrobat e Imagem.
Para simplificar o processo de escolha ao utilizador, resolvi criar um botão personalizado, utilizando um ContextMenuStrip, que permita ao utilizador, seleccionar uma opção de exportação. Para diferenciar dos outros botões, resolvi desenhar um triângulo, indicando que irá expandir-se.
Simples, mas prático e simples de utilizar, e como poderá ter interesse para outros programadores, resolvi partilhar o código. Além disso, mostra como desenhar um objecto, através do método FillPolygon().
Para começar é necessário criar uma classe que irá herdar as propriedades de um Windows.Forms.Button
Imports System.Configuration
Public Class PopupButton
Inherits Windows.Forms.Button
Public WithEvents PopupButtonMenuStrip As ContextMenuStrip
Private exportOptions As List(Of String)
#Region "Propriedades"
Private m_ArrowWidth As Integer
'''<summary>
''' Define o tamanho(horizontal)
'''</summary>
Public Property ArrowWidth() As Integer
Get
Return m_ArrowWidth
End Get
Set(ByVal value As Integer)
m_ArrowWidth = value
End Set
End Property
Private m_ArrowHeight As Integer
'''<summary>
''' Define o tamanho(vertical)
'''</summary>
Public Property ArrowHeight() As Integer
Get
Return m_ArrowHeight
End Get
Set(ByVal value As Integer)
m_ArrowHeight = value
End Set
End Property
Private m_ArrowBrushColor As Brush
'''<summary>
''' Define a cor da seta
'''</summary>
Public Property ArrowBrushColor() As Brush
Get
Return m_ArrowBrushColor
End Get
Set(ByVal value As Brush)
m_ArrowBrushColor = value
End Set
End Property
#End Region
#Region "Construtor"
Sub New()
' Algumas pré-definições da seta
Me.ArrowWidth = 14
Me.ArrowHeight = 14
Me.ArrowBrushColor = Brushes.DarkGray
' Opções de exportação
exportOptions = New List(Of String)
exportOptions.Add("Microsoft Excel (*.xls)")
exportOptions.Add("Adobe Acrobat (*.pdf)")
exportOptions.Add("Imagem (*.jpg)")
Me.PopupButtonMenuStrip = New ContextMenuStrip
' Adiciona os itens ao menu
With Me.PopupButtonMenuStrip
.Items.Add(New ToolStripMenuItem() With {.Text = exportOptions(0).ToString})
.Items.Add(New ToolStripMenuItem() With {.Text = exportOptions(1).ToString})
.Items.Add(New ToolStripMenuItem() With {.Text = exportOptions(2).ToString})
End With
End Sub
#End Region
Enum output
Excel
PDF
Image
End Enum
' Definição de um evento para quando for seleccionada uma opção
Public Event PopupButtonMenuClick(ByVal sender As Object, _
ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs, _
ByVal output As output)
'''<summary>
''' Mostra o ContextMenuStrip
'''</summary>
Private Sub popupButton_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Click
Me.PopupButtonMenuStrip.Show(Me, New Point(0, Me.Height))
End Sub
''' <summary>
''' Desenha a seta no botão alinhada à direita
''' </summary>
Private Sub popupButton_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim h As Integer = (Me.Height / 2) + 3
Dim w As Integer = Me.Width - 15 ' offset
Dim points As New List(Of Point)
points.Add(New Point(w - (Me.ArrowWidth / 2), h - (Me.ArrowHeight / 2)))
points.Add(New Point(w, h))
points.Add(New Point(w + (Me.ArrowWidth / 2), h - (Me.ArrowHeight / 2)))
e.Graphics.FillPolygon(Me.ArrowBrushColor, points.ToArray)
End Sub
'''<summary>
''' Chama o evento PopupButtonMenuClick
'''</summary>
Private Sub PopupButtonMenuStrip_ItemClicked(ByVal sender As Object, _
ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) _
Handles PopupButtonMenuStrip.ItemClicked
Select Case e.ClickedItem.Text
Case exportOptions(0).ToString
RaiseEvent PopupButtonMenuClick(sender, e, output.Excel)
Case exportOptions(1).ToString
RaiseEvent PopupButtonMenuClick(sender, e, output.PDF)
Case exportOptions(2).ToString
RaiseEvent PopupButtonMenuClick(sender, e, output.Image)
End Select
End Sub
End Class
Após compilado o projecto, este botão (PopupButton), irá estar disponível na Toolbox.
Finalmente, após arrastar o botão para o Form, utiliza-se o evento PopupButtonMenuClick para verificar e definir que tipo de exportação fazer:
Private Sub btnExportar_PopupButtonMenuClick(ByVal sender As Object, _
ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs, _
ByVal output As PopupButton.output) _
Handles btnExportar.PopupButtonMenuClick
Select Case output
Case PopupButton.output.Excel
Debug.WriteLine("Exportar para Excel")
Case PopupButton.output.Image
Debug.WriteLine("Exportar para Imagem")
Case PopupButton.output.PDF
Debug.WriteLine("Exportar para PDF")
End Select
End Sub
Muito simples de utilizar, mas poderá simplificar o processo de selecção do tipo de exportação sem recorrer a um Form especifico ou sem utilizar múltiplos botões.
Espero que seja útil!