Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Criar botão para exportar os Microsoft Reports

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!

6 comentários:

Scorch disse...

Bom post. ;)

Apenas na linha 120 da classe, mais concretamente a: points.Add(NewPoint(w + (Me.ArrowWidth / 2), h - (Me.ArrowHeight / 2)))
devia ser:

points.Add(New Point(w + (Me.ArrowWidth / 2), h - (Me.ArrowHeight / 2)))

Scorch disse...
Este comentário foi removido pelo autor.
Jorge Paulino disse...

Obrigado pela correcção Scorch!

O SyntaxHighlighter que uso junta muitas keywords(não sei qual o motivo), e tenho sempre de corrigir alguma coisa, mas esta passou-me.

Já está corrigido :)

Anónimo disse...

Eu tenho que fazer uma PAP (prova de aptidao profissional) ate agora os profes nao ensinaram rigorosamente nada. Se me arranjaxem manuais ou algo que me ajude agradecia tou a zeros mesmo. tenho que criar um software tipo powerpoint ajundem.... bgd

Jorge Paulino disse...

Boas,

Podes encontrar alguma informação interessante em Recursos de Aprendizagem. Existe informação muito interessante para iniciar.

Podes também colocar as tuas dúvida na comunidade Portugal a Programar

Espero que ajude!

Anónimo disse...

Teria como colocar ícones no menu estilo toolstripmenuitem?



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject
Google-Translate-ChineseGoogle-Translate-Portuguese to FrenchGoogle-Translate-Portuguese to GermanGoogle-Translate-Portuguese to ItalianGoogle-Translate-Portuguese to JapaneseGoogle-Translate-Portuguese to EnglishGoogle-Translate-Portuguese to RussianGoogle-Translate-Portuguese to Spanish

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico