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 IfNext
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 ThenTry
' 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:
Bom dia,
Como contar somente números azuis.
Um forte abraço,Viana.
Olá,
Não entendi o que quer dizer com "Como contar somente números azuis" ?
Pode explicar melhor ?
É sobre este artigo ou sobre outro ?
Parabéns muito explicativo.
Enviar um comentário