5. NOÇÕES DE PROGRAMAÇÃO VARIÁVEIS As variáveis, em Visual Basic, são classificadas de acordo com o esquema a seguir: Tabela 14 ESCOPO VIDA DECLARAÇÃO Local Dinâmica ou Estática Dim, Static (dentro de uma procedure) Módulo Estática Dim (seção declarations de um formulário ou módulo) Public Estática Public (seção declarations de um módulo) Variáveis Locais são declaradas dentro de uma procedure (Sub ou Function) e são vistas apenas por esta procedure. Variáveis locais podem ser estáticas, se declaradas com a palavra Static, ou dinâmicas, se declaradas com Dim. Variáveis dinâmicas perdem o valor quando a procedure é encerrada, ou seja, o espaço de memória é alocado quando a procedure é iniciada e desalocado quando do seu encerramento. Todas as variáveis no Visual Basic são inicializadas com o valor zero. Variáveis dinâmicas são um ótimo recurso para reduzir o espaço de memória e devem ser usadas sempre que possível. Variáveis de Módulo são sempre estáticas e devem ser declaradas na seção Declarations de um módulo ou formulário com a palavra reservada Static. Embora sejam estáticas, tais variáveis são vistas por todas os procedimentos do módulo em que foram declaradas, mas não por procedures externas a ele. Variáveis Públicas também são declaradas em um módulo e, além de serem estáticas, são vistas por todas os procedimentos de todos os formulários e módulos do projeto. Quando você não souber como declarar uma variável, declare-a como Public, mas é bom ter em mente que esta variável exige um espaço de memória constante. Portanto, excessivas variáveis Públicas podem acarretar em falta de memória. Variáveis Públicas não podem ser declaradas dentro de um formulário. Da mesma forma, a palavra reservada Dim não pode ser usada na seção declarations de um módulo. Os tipos de variáveis reservados pelo Visual Basic são os seguintes: Tabela 15 TIPO DESCRIÇÃO VARIAÇÃO (APROXIMADA) Integer 2 Bytes, inteira 32.768 Long 4 Bytes, inteira 2.147.483.648 Single 4 Bytes, ponto flutuante 1,4.10-45 a 3,4.10 38 Double 8 Bytes, ponto flutuante 1,798.10-324 a 4,94.10 308 Currency 8 Bytes, ponto flutuante 922337203685477,58 String string 0 a 65.500 Variant - - Por exemplo, uma variável Public do tipo inteiro pode ser declarada da seguinte maneira:
Public Nome_da_Variável As Integer ARRAYS Arrays são matrizes, ou variáveis indexadas, em Visual Basic, declaradas de forma semelhante a outras variáveis. Arrays podem ser de qualquer tipo, inclusive tipos de dados definidos pelo usuário. Também podem ser estáticos, locais ou Públicas. Unidimensionais: Dim Soma (1 To 2). Este array será constituído por vinte números: Soma(1), Soma (2)... Soma (20). Bidimensionais: Public Mult (1 To 15, 1 To 15). Multidimensionais: O Visual Basic adimite até 60 dimensões. O Visual Basic permite a declaração de arrays dinâmicos, que são usados quando não se sabe antecipadamente o tamanho de um array. A utilização de arrays dinâmicos envolve dois passos: 1. Declarar o array sem fazer referência às dimensões: Dim DynArray (). 1. Redimensionar o array. Este passo só pode ser feito dentro de uma procedure: ReDim DynArray (1 To 10). A palavra reservada ReDim apaga todos os valores anteriores do array. Para evitar isto, podemos usar a palavra Preserve: ReDim Preserve DynArray 1 To 10). Somente o limite superior da última dimensão de um array dinâmico pode ser alterado quando se usa Preserve. Não é necessário que o limite inferior de uma dimensão seja 1. Podemos declarar um array da seguinte forma: Dim Matriz (-10 To 35, -5 To 20). Para não perdermos de vista quais são os limites das dimensões de arrays, podemos usar duas funções: -2. UBound: retorna o maior índice disponível para a dimensão indicada. Sintaxe: UBound (array, dimensão); LBound: retorna o menor índice disponível para a dimensão indicada. Sintaxe: UBound (array, dimensão). Exemplo: Seja a matriz M(-3 To 4, -2 To 5). UBound (M, 1) retorna 4. LBound (M, 2) retorna Em Visual Basic, arquivos que excedem 64 kbytes são denominados Huge Arrays (Arrays Enormes). O limite máximo para estes arrays é de 64 Mbytes (ou a memória do computador). Não existe nenhuma declaração especial para Huge Arrays. O Visual Basic cuida de tudo sozinho.
TIPOS DE DADOS DEFINIDOS PELO USUÁRIO Tipos de dados definidos pelo usuário são mais flexíveis do que qualquer outro tipo. Até mesmo mais flexíveis do que arrays dinâmicos, pois podem incluir estes últimos. Para usar estes tipos de dados, declaramos, antes, o tipo, em um módulo do projeto: Type Agenda Nome As String*50 Endereço As String*80 Telefone As String*11 End Type A seguir, declaramos uma variável estática, local ou Public como pertencente ao tipo de dados definido anteriormente. Public MinhaAgenda (0 To 100) As Agenda Tipos de dados definidos pelo usuário são coleções de registros divididos em campos, conforme a tabela a seguir. Tabela 16 Registro NOME ENDEREÇO TELEFONE 0 Fernando Color Miami 354-6565 1 Fernando Henrique Brasília 253-8686 2 Anthony Blair 10, Downing Street, London 646-6868............ 100 Bill Clinton The White House 999-73474
EXEMPLO: UM BANCO DE DADOS A utilização mais clássica de tipos de dados definidos pelo usuário é na construção de bancos de dados. De fato, antigamente todos os bancos de dados deviam ser construídos desta forma. Veremos que, embora o VB forneça excelentes ferramentas para construir e manter bancos de dados, frequentemente é necessário construir pequenos bancos com as próprias mãos. Isto acontece porque, eventualmente, o banco de dados de que necessitamos é muito pequeno para justificar a utilização da maquinaria de banco de dados do VB. Inicie um novo projeto e insira alguns controles conforme a figura abaixo. frmendereços txtunome txtpnome txtcidade cmdações() txtendereço txtuf txtcep cmdmover() Insira um módulo, renomeando-o para Endereços.bas, e declare as seguintes variáveis: Option Explicit Type Endereço PNome As String * 20 LName As String * 20 Endereço As String * 40 Cidade As String * 15 UF As String * 2 CEP As String * 5 End Type Public CR As Endereço Public NovoRegistro As Boolean Public RegistroAtual As Integer Public NúmeroDeRegistros As Integer Public RegistroAntigo As Integer Public NomeArqCompleto As String Public NumArquivo As Integer Public Const NOMEARQ = "ENDEREÇO.DAT"
Note que Endereço é o tipo de variável definida pelo usuário, tendo os seguintes campos: PNome, UNome, Endereço, Cidade, UF e CEP. CR é a variável pertencente ao tipo de dados Endereço. As outras variáveis são auxiliares. A primeira linhas de botões de comando é um array de controles, com índices variando entre zero e três. A mesma coisa vale para a segunda linha de botões. O arquivo de banco de dados, que chamaremos de ENDEREÇO.DAT, é aberto no evento Load do formulário: Private Sub Form_Load() Dim Resposta As Integer ' Gera o caminho completo para o arquivo NomeArqCompleto = App.Path & "\" & NOMEARQ NumArquivo = FreeFile 'Abre o arquivo e calcula o número de registros Open NomeArqCompleto For Random As #NumArquivo Len = Len(CR) NúmeroDeRegistros = (LOF(NumArquivo) / Len(CR)) ' Se o arquivo está vazio If NúmeroDeRegistros = 0 Then Resposta = MsgBox("Novo arquivo - iniciar a entrada de dados?", vbyesno, "New file") If Resposta = vbyes Then NovoRegistro = True Form1.Show Call AdNovoEndereço Else Close (NumArquivo) End Else ' Se o arquivo não está vazio, mostra o primeiro registro RegistroAtual = 1 NovoRegistro = False
As procedures AdNovoEndereço e MostraRegistro podem ser escritas no próprio formulário, seção General, ou no módulo Endereço.bas: Public Sub AdNovoEndereço() ' Adiciona um novo registro no final do arquivo NúmeroDeRegistros = NúmeroDeRegistros + 1 RegistroAntigo = RegistroAtual RegistroAtual = NúmeroDeRegistros cmdaction(0).caption = "&Salvar" cmdaction(1).caption = "&Cancelar" 'Apaga conteúdo das caixas de texto. txtpnome.text = "" txtunome.text = "" txtendereço.text = "" txtcidade.text = "" txtuf.text = "" txtcep.text = "" txtunome.setfocus Public Sub MostraRegistro(Record As Integer) 'Lê o registro especificado e exibe o conteúdo Get #NumArquivo, Record, CR Atualiza o conteúdo das caixas de texto. txtunome.text = CR.LName txtpnome.text = CR.PNome txtendereço.text = CR.Endereço txtcidade.text = CR.Cidade txtuf.text = CR.UF txtcep.text = CR.CEP Case. A procedure para os comandos cmdações faz uso, como sempre, da instrução Select... Private Sub cmdações_click(index As Integer) Dim Resposta As Integer If NovoRegistro Then Select Case Index Case 0 ' Salvar. Call SalvaRegistroAtual NovoRegistro = False cmdações(0).caption = "&Novo" cmdações(1).caption = "&Deletar" Case 1 ' Cancelar RegistroAtual = RegistroAntigo NovoRegistro = False cmdações(0).caption = "&Novo"
cmdações(1).caption = "&Deletar" Case 2 ' Lista frmlist.show Case 3 ' Sair Call ByeBye End Select Else Select Case Index Case 0 ' Novo NovoRegistro = True Call AdNovoEndereço Case 1 ' Deletar Resposta = MsgBox("Deletar este endereço?", vbyesno + vbquestion) If Resposta = vbyes Then txtpnome.text = "" txtunome.text = "" txtendereço.text = "" txtcidade.text = "" txtuf.text = "" txtcep.text = "" Call SalvaRegistroAtual Case 2 ' Lista frmlist.show Case 3 ' Sair Call ByeBye End Select As procedures ByeBye e SalvaRegistroAtual devem ser escritas no módulo ou na seção General de frmendereço: Public Sub ByeBye() Close #NumArquivo Unload Form1
Public Sub SalvaRegistroAtual() CR.LName = txtunome.text CR.PNome = txtpnome.text CR.Endereço = txtendereço.text CR.Cidade = txtcidade.text CR.UF = txtuf.text CR.CEP = txtcep.text Put #NumArquivo, RegistroAtual, CR Para finalizar a minha parte, falta a procedure associada aos botões cmdmover(), que simplesmente gerencia o estado da variável RegistroAtual e a exibição dos registros: Private Sub cmdmove_click(index As Integer) If NovoRegistro Then Exit Sub ' Salva o registro atual caso ele tenha sido modificado Call SalvaRegistroAtual Select Case Index Case 0 'Primeiro registro RegistroAtual = 1 Case 1 ' Registro anterior RegistroAtual = RegistroAtual - 1 If RegistroAtual < 1 Then RegistroAtual = 1 Beep MsgBox ("Primeiro registro!") Case 2 ' Próximo registro RegistroAtual = RegistroAtual + 1 If RegistroAtual > NúmeroDeRegistros Then RegistroAtual = NúmeroDeRegistros Beep MsgBox ("Último registro!") Case 3 Último registro RegistroAtual = NúmeroDeRegistros End Select Fica como exercício implementar o formulário frmlista, que deve conter uma lista (ListBox) a ser preenchida com o conteúdo de ENDEREÇO.DAT durante o evento load de frmlista. Em vez de uma ListBox você pode usar também uma Grid. INSTRUÇÕES DO VISUAL BASIC A seguir encontram-se descritas as sintaxes das principais instruções do Visual Basic.
FOR... NEXT For contador = início To fim[step incremento] [instruções] [Exit For] [instruções] Next [contador] WHILE... WEND While condição [indtruções] Wend DO... LOOP Do [{While Until} condição] [instruções] [Exit Do] [instruções] Loop SELECT... CASE Select Case expressão_teste [Case lista-n [instruções]]... [Case Else [instruções]] End Select WITH With objeto [instruções] End With