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: Dicas de Programação #9

Funções Recursivas

Recursão é um método de programação no qual uma função pode chamar a si mesma. O termo é usado de maneira mais geral para descrever o processo de repetição de um objecto de um jeito similar ao que já fora mostrado. Um bom exemplo disso são as imagens repetidas que aparecem quando dois espelhos são apontados um para o outro. (Fonte Wikipédia)

As funções recursivas são muito utilizadas nas diversas linguagens de programação. São funções que se chamam a si mesmo, permitindo simplificar código e executar tarefas que seriam bastante complicadas sem a sua utilização. Por exemplo, o preenchimento de uma Treeview ou mesmo o sistema utilizado na construção de fóruns, em que uma questão tem sub-questões e essa sub-questão pode ter mais sub-questões, e por aí fora.


Outro dos exemplos de aplicação deste método é a procura de controlos dentro de um Form. Através de um ciclo nos controlos do Form conseguem-se encontrar todos os seus controlos, mas os Containers (controlos que conseguem alojar outros controlos, como é o caso de um Panel ou GroupBox) podem por sua vez ter mais controlos. Um método recursivo resolve o problema.

No seguinte exemplo serão procuradas todas as CheckBoxes dentro do Form (incluindo dentro dos Containers) e seleccionar ou não seleccionar todas, de acordo com a escolha efectuada.


   
' Definição do tipo de acção
    Enum SelectOption
        Unselect = 0
        [Select] = 1
    End Enum


   
''' <summary>
    ''' Função recursiva que irá percorrer todos os controlos dentro
    '''  de um controlo principal, que será indicado
    ''' </summary>
    ''' <param name="ctrl">Controlo a </param>
    ''' <param name="option">Acção a efectuar</param>
    Private Sub SelectCheckBoxes(ByVal ctrl As Control, ByVal [option] As SelectOption)

        ' Ciclo em todos os controlos
        For Each c As Control In ctrl.Controls   

            ' Se o control for do tipo CheckBox converte para
            '  o tipo CheckBox e executa a opção indicada
            If TypeOf c Is CheckBox Then
                Dim cb As CheckBox = DirectCast(c, CheckBox)
                cb.Checked = [option]
            End If   

            ' Caso o controlo tenha sub-controlos, chama novamente
            ' a função actual (recursivamente) até não existirem mais.
            If c.HasChildren Then
                SelectCheckBoxes(c, [option])
            End If   

        Next

    End Sub


Finalmente para utilizar o Sub criado é apenas necessário:

    ' Selecciona todos os controlos
    Private Sub btnAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAll.Click
        SelectCheckBoxes(Me, SelectOption.Select)
    End Sub

    ' Retira a selecção de todos os controlos
    Private Sub btnNone_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNone.Click
        SelectCheckBoxes(Me, SelectOption.Unselect)
    End Sub

Este é um exemplo de como utilizar funções recursivas para seleccionar CheckBoxes mas poderá ser utilizado para procurar um controlo, contar o número de CheckBoxes seleccionadas, etc, etc.




Copiar dados do Excel para uma DataGridView

A DataGridView já tem a possibilidade de permitir copiar os seus dados e colar em outra aplicação. A propriedade que permite isto é a ClipboardCopyMode, que por defeito está seleccionada para EnableWithAutoHeaderText. No entanto o inverso não está previsto.

Para se adicionar está possibilidade à DataGridView é necessário ler a classe Clipboard através da sua função GetText(). Deste modo consegue-se ler o que está no Clipboard e colocar na DataGridView.

Este exemplo, que mostra como implementar esta funcionalidade, utiliza uma DataGridView sem estar vinculada a dados e utiliza a combinação de teclas Ctrl+V para colar os dados. Verifica ainda se o número de colunas copiadas é igual ao número de colunas existentes.

    ' No evento KeyDown da DataGridView
    Private Sub DataGridView1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown

        ' Caso as teclas pressinadas sejam CTRL+V
        If e.Control AndAlso e.KeyCode = Keys.V Then

            Try   

                ' Ciclo nas linhas copiadas
                For Each line As String In Clipboard.GetText.Split(vbNewLine)

                    ' Separa as colunas referentes à linha actual
                    Dim item() As String = line.Trim.Split(vbTab)

                    ' Se o número de colunas for diferente mostra uma mensagem de erro
                    If item.Length <> Me.DataGridView1.ColumnCount Then
                        Dim str As String = "O número de colunas copiadas é diferente do número de colunas da DataGridView"
                        Throw New Exception(str)
                    End If

                    ' Adicionar a linha a DataGridView
                    Me.DataGridView1.Rows.Add(item)

                Next

            Catch ex As Exception

                ' Mensagem de erro caso exista
                MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

            End Try

        End If

    End Sub

   

PS: Como  sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

3 comentários:

CONJUNTO RESIDENCIAL TIRADENTES disse...

Bom dia,
Como contar somente números azuis.
Um forte abraço,Viana.

Jorge Paulino disse...

Olá,

Não entendi o que quer dizer com "Como contar somente números azuis" ?

Pode explicar melhor ?

É sobre este artigo ou sobre outro ?

Histórias de Amor disse...

Parabéns muito explicativo.



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