<Índice> <1> <2> <3> <4> <5> <6> <7> <8> <9> <10> <11> <12> <13> <14> <15> <16> <17> <Pág. Princ.>

 

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.