SUBPROCEDIMENTOS E FUNÇÕES
Mas voltando aos subprocedimentos: você
já sabe que quando o usuário interage com o seu programa
(clicando em um botão, por exemplo) é gerado um Evento. Para
responder a este Evento é executado um suprocedimento.
EXEMPLO
Então um subprocedimento é tudo
aquilo que colocamos entre as linhas "Private Sub..."
e "End Sub" de um "respondedor de Eventos"?
Bom, aquilo é um subprocedimento sim. Mas subprocedimentos não é só isto. Na verdade existem dois tipos de subprocedimentos: Subs e Functions.
Vamos a um exemplo (outro daqueles inúteis). Em um Form (Form1), coloque uma ScrollBar (horizontal ou vertical, tanto faz). Ajuste seu Name para "BarraRol", seu Max para 15 e seu LargeChange para 5.
Abrindo um pequeno parênteses: as propriedades Max e Min de uma ScrollBar determinam o valor máximo e mínimo, respectivamente, que a ScrollBar pode possuir. A propriedade SmallChange determina de quanto será o incremento (ou decremento) quando uma daquelas setinhas nas pontas da ScrollBar é clicada. LargeChange determina de quanto será o incremento (ou decremento) quando a ScrollBar for clicada fora das setinhas ou daquela "caixinha" que pode ser arrastada. Coloque no Form1 também uma Label (LabelValor) e ajuste seu Caption para 0. Agora, ao Evento Change da BarraRol, acrescente o seguinte Código:
Private Sub BarraRol_Change()
LabelValor.Caption
= Str(BarraRol.Value)
End Sub
Neste exemplo criamos uma Sub (note que todo o Código está delimitado pelas linhas Private Sub... e End Sub).
E aquele "Private" tem algo a ver com escopo?
Tem sim. Agora inclua um botão (Zerador será seu name). Quando ele for clicado a ScrollBar irá "zerar":
Private Sub Zerador_Click()
BarraRol.Value = 0
End Sub
Certo. Agora, vamos incrementar. Coloque um Shape (é aquele botão da caixa de ferramentas com o desenho de um circulo e dois quadradinhos coloridos) no Form1. Nomeie este Shape como Figura e seu FillColor para azul (&H00FF0000&) e seu FillStyle para 0 (Solid). O Shape fica azul.
Digamos que a cor deste Shape mude a cada vez que o botão for clicado e cada vez que a ScrollBar tenha seu valor modificado. Como faríamos isto?
Daria para colocar o Código necessário nos subprocedimentos BarraRol_Change e Zerador_Click.
Daria, mas estaríamos escrevendo o mesmo Código duas vezes. Isto não é muito interessante. A melhor solução é criar um subprocedimento (uma Sub) que não esta diretamente associado a um Evento. Para fazer isto vá até a janela de edição do Form1 (dando um duplo clique em qualquer controle ou no próprio Form1). Na caixa de seleção "Object" escolha General. Aí, entre com o seguinte Código:
Private Sub MudaCor()
Figura.FillColor =
Figura.FillColor Xor &HFFFFFF
End Sub
Note que ao terminar de escrever a primeira
linha o VB automaticamente inclui o "End Sub".
O que este subprocedimento faz é uma operação lógica
XOR entre a cor atual do Shape e o número &HFFFFFF (255 em hexadecimal).
Este novo valor é atribuído à cor do Shape. Devido
às características do operador XOR, a cor ficará variando
entre o azul original e o amarelo.
Agora só falta fazer com que esta Sub
seja "chamada" nos momentos adequados. Isto é
feito alterando as Subs BarraRol_Change e Zerador_Click. Elas Ficarão
assim:
Private Sub BarraRol_Change()
LabelValor.Caption
= Str(BarraRol.Value)
MudaCor
End Sub
Private Sub Zerador_Click()
BarraRol.Value = 0
MudaCor
End Sub
Na verdade só incluímos a chamada
à Sub MudaCor que acabamos de criar.
Outra coisinha: uma Sub pode ser escrita tanto
na seção General de um Form como
em um Module.
E aquela história de escopo?
Ah, sim. Subprocedimentos também têm
escopo. Um subprocedimento (seja Sub ou Function),
quando declarado como Private pode ser "chamado" apenas por subprocedimentos
que estejam no mesmo Form ou Module que ele. Para permitir que seu subprocedimento
seja chamável de qualquer ponto do programa declare-o como Public
(é idêntico ao que fazemos com variáveis).
APROFUNDANDO
Talvez você esteja pensando o que faz aquele par de parênteses vazios ao lado de cada nome de subprocedimento.
Dentro daqueles parênteses colocamos
algum parâmetro que será utilizado
pelo subprocedimento. Vamos tornar nosso programa-exemplo ainda mais fantástico:
Quando a Sub MudaCor for chamada pela ScrollBar, a espessura da borda do
Shape ficará com uma espessura igual ao seu Value. Quando for chamada
pelo Botão, a borda ficará maior ainda (Uau!).
A primeira coisa a fazer é rescrever
a Sub MudaCor:
Private Sub MudaCor(MeuValor As Byte)
Dim c As Byte
Figura.FillColor =
Figura.FillColor Xor &HFFFFFF
Figura.BorderWidth
= MeuValor
End Sub
Agora sim! Temos alguma coisa dentro dos parênteses!
Aquilo que está entre os parênteses
significa o seguinte: quando esta Sub for chamada, deverá ser passado
um valor (no caso um número, um Byte). Este valor estará
disponível para a Sub na forma de uma variável (no exemplo,
"MeuValor"). Não é difícil compreender isto analisando
o exemplo. A estes valores "passados" a um subprocedimento damos o nome
de argumento.
O próximo passo é alterar os
outros subprocedimentos (os associados a Eventos)
para que eles forneçam o argumento necessário:
Private Sub BarraRol_Change()
LabelValor.Caption
= Str(BarraRol.Value)
MudaCor BarraRol.Value
End Sub
Private Sub Zerador_Click()
BarraRol.Value = 1
MudaCor 30
End Sub
Na primeira Sub é passado como argumento
a propriedade Value da BarraRol. Na segunda é
passado um número (30) diretamente.
Ainda é preciso ajustar o Min da BarraRol
para 1. Isto evitará que o programa tente
dar à Border do Shape um valor igual a 0 (o que geraria um erro).
Ainda é interessante dizer que podemos
criar subprocedimentos que admitem mais de um argumento.