Visitantes que leram esse artigo, também visitaram:
  • Semp Toshiba leva alta tecnologia e o design avançado de seus produtos para a Casa Cor 2009
  • O que é Desfragmentador de disco?
  • MP3 para WAV fácil com Winamp
  • Resolvendo uma Questão do Big Brother Brasil
  • Renomeando Arquivos em Lote no XP


  • Entrada e Saída em Arquivos – Parte 2

    Postado por Plinio Cruz em 28 de outubro de 2008 na categoria Programação, Visual Basic | Seja o primeiro a comentar

    1 Estrela2 Estrela3 Estrela4 Estrela5 Estrela (1 votos, média: 4,00)
    Loading ... Loading ...

    Ignorando os Limites de Linha

    Ainda que a instrução Print # normalmente seja usada para escrever apenas uma linha, ou parte dela, você pode usá-la para escrever quantas linhas quiser de uma única vez, como foi feito no programa Configurador. A instrução Line Input #, ao contrário, está restrita ao processamento de uma única linha de cada vez.

    Alternativamente, você pode usar a função Input$ do Visual Basic para ler um arquivo de entrada, um caractere de cada vez. A função Input$ retorna a string de caracteres lida do arquivo de entrada, incluindo os caracteres de final de linha. Eis a sintaxe:

    lnput$(QtdCaract, #NúmeroArquivo)

    Você pode especificar a leitura de 1 a 32.767 caracteres (QtdCaract) em uma única vez. Se o arquivo contiver uma quantidade de caracteres menor do que a especificada, o Visual Basic gerará uma mensagem de erro Input past end of file (Entrada além do final do arquivo).

    Você poderia escrever facilmente o programa Configurador usando a função Input$. Veja, a seguir, o procedimento de evento btnAbrir_Click, reescrito para usar esta função:
    Sub btnAbrir_Click ( )

    Dim Clinha As String

    If ConfigAchado Then

    Beep

    Exit Sub

    End If

    Open “C:\CONFIG.SYS” For Input As #1

    TxtConteúdo.Text = lnput$(LOF(1), #1)

    Close #1

    ConfigAchado = True

    End Sub
    Esse procedimento lê o arquivo CONFIG.SYS de uma só vez, o que é aceitável, pois o CONFIG.SYS normalmente é um arquivo pequeno. Com arquivos maiores, seria necessária a construção de um laço que verificasse a ocorrência do final do arquivo (EOF). Observe também que o procedimento reescrito usa a função LOF (que retorna o comprimento do arquivo). Essa função recebe um número de arquivo como argumento e retorna a quantidade de bytes que o arquivo contém.

    Arquivos de Acesso Aleatório

    A maioria dos programadores eventualmente encontra dois problemas com leitura seqüencial como a que acabou de ser descrita. Uma das questões é que nem sempre é eficiente representar dados textualmente. Por exemplo, você pode armazenar o número 42,1596 em uma variável de precisão simples (4 bytes), porém seriam necessários 7 bytes para armazenar esse valor como texto em um arquivo seqüencial. Outro problema é que, em determinadas ocasiões, torna-se necessário processar as informações de forma não-seqüencial.

    Retornemos novamente às nossas amigas doninhas. Da última vez em que as vimos, estava sendo construído um banco de dados para armazenar informações a seu respeito. Naquela altura, a suposição era de que todas as informações sobre as doninhas seriam armazenadas em variáveis de programas (em matrizes). Com tal abordagem, no entanto, as modificações feitas nos dados demandavam alterações do programa, um problema equivalente a ter de modificar fisicamente seu processador de textos para cada documento que fosse escrito.

    A solução natural é armazenar os dados em um arquivo. Você não deseja armazenar dados como texto, é preferível armazená-los como são tratados pelos programas: inteiros como inteiros, números de dupla precisão como dupla precisão. Além disso, você será capaz de acessar certa informação vital sobre uma certa doninha a qualquer instante, sem ter de ler o arquivo seqüencialmente até encontrar o que deseja. Nas páginas seguintes, construiremos o banco de dados de doninhas, para demonstrar um programa que usa acesso aleatório a arquivos.

    Abertura e Fechamento de Arquivos de Acesso Aleatório

    A sintaxe da instrução Open para arquivos de acesso aleatório é a seguinte:

    Open NomeArquivo For Random As NúmeroArquivo Len = TamanhoRegistro

    Nessa versão da instrução Open, você não especifica o modo lnput (Entrada) ou Output (Saída), pois poderá ler e gravar arquivos de acesso aleatório sem ter de abrir e fechar o arquivo toda vez. Adicionalmente, você deve fornecer o tamanho do registro, que é a quantidade de bytes a serem lidos ou gravados a cada instrução Get ou Put (instruções usadas para leitura e gravação do arquivo). Por exemplo, se você pretendesse usar um arquivo contendo apenas números inteiros, o tamanho do registro seria 2. Porém, se cada valor no arquivo fosse do tipo Currency, o tamanho do registro deveria ser 8. Se não for especificado o tamanho de registros, o Visual Basic assumirá 128. (Há grande possibilidade de esse valor default não ser apropriado para seu arquivo.)

    Para poder determinar o tamanho de registro para o banco de dados de doninhas, é preciso verificar os dados que você planeja ler e gravar. No Capítulo 6, você definiu o tipo de dado DoninhaTFB como segue:
    Type DoninhaTFB

    Nome As String

    Cor As String

    Peso As Integer

    Tamanho As Integer

    Data_nascimento As Double

    Cor_topete As String

    Compr_topete As Integer

    End Type
    Supondo que cada registro seja exatamente igual a isso, você pode somar o comprimento de todos os campos componentes para obter o tamanho do registro. Infelizmente, há três campos que são strings, e você não tem como saber o comprimento deles.

    Para resolver essa questão, o Visual Basic permite que você declare comprimentos fixos para strings. Se usar essa capacidade, impondo algumas restrições aos seus dados, você poderá calcular o tamanho do registro. Por exemplo, se você restringir o nome das doninhas a 32 caracteres e a cor a 12 caracteres, poderá redefinir o tipo DoninhaTFB como segue:
    Type DoninhaTFB

    Nome As String * 32

    Cor As String * 12

    Peso As Integer

    Tamanho As Integer

    Data_nascimento As Double

    Cor_topete As String * 12

    Compr_topete As Integer

    End Type
    A expressão String * 32 fixa em 32 bytes o tamanho para cada nome de doninha. Caso o nome ocupe menos de que 32 posições, o Visual Basic preencherá o nome com espaços em branco no final. Nomes que requeiram mais de 32 posições serão truncados. Assim, o comprimento total do registro de DoninhaTFB é agora 70 bytes; (32 + 12 + 2 + 2 + 8 + 12 + 2).

    Fechar um arquivo de acesso aleatório é bem simples. Use a instrução Close exatamente da mesma forma que é usada para fechamento de arquivos seqüenciais. Por exemplo, se você abriu um arquivo de acesso aleatório, como arquivo #1, use a instrução Close #1 para fechá-lo.

    Lendo e Gravando Arquivos de Acesso Aleatório

    As instruções Get e Put são usadas para ler e gravar em arquivos de acesso aleatório. A sintaxe para essas duas instruções é simples:

    Get #NúmeroArquivo, [NúmeroRegistro], variável

    Put #NúmeroArquivo, [NúmeroRegistro], variável

    A instrução Get lê o dado a partir do arquivo, armazenando-o em uma variável, enquanto a instrução Put grava o conteúdo da variável especificada no arquivo. Nos dois casos, você pode especificar o número do registro. Caso não seja especificado o número do registro, será usada a próxima posição seqüencial no arquivo.

    Um arquivo de acesso aleatório parece-se muito com uma matriz de tipos definidos pelo usuário. A principal diferença é que os dados são armazenados em disco, e não na memória, assim eles não se perdem quando o programa encerra o seu processamento. (Observe, ainda, que os registros em disco são indexados, começando pelo registro 1, enquanto a indexação de elementos de uma matriz é iniciada por 0.) A Figura 10.11 mostra como os registros são armazenados em disco.

     

    Figura 10.11 Registros em um arquivo de acesso aleatório.

     

    O Aplicativo de Banco de Dados Doninha

    Vamos iniciar agora a construção do aplicativo de banco de dados Doninha, que controlará as suas doninhas de topete. Naturalmente, se você não tiver a felicidade de possuir pelo menos uma doninha, lembre-se de que esse programa poderá ser facilmente adaptado para controlar outros tipos de informações.

    O planejamento básico para o banco de dados de doninhas envolve o uso de um arquivo de acesso aleatório para armazenar informações sobre as doninhas. Quando você processar o aplicativo, ele varrerá o arquivo, juntando o nome de cada doninha e exibindo a lista desses nomes numa caixa de lista. Ao se escolher um dos nomes dessa lista, o programa localizará o registro da doninha desejada no arquivo e exibirá todas as informações relevantes. Além disso, botões de comando permitirão que você inclua uma nova doninha ou elimine uma doninha do arquivo.

    Para iniciar, crie um projeto novo. Coloque no form uma caixa de lista combinada, seis caixas de texto, sete rótulos e dois botões de comando. O esquema inicial é mostrado na Figura 10.12.

     


    Figura 10.12 Projeto inicial do form para o aplicativo de banco de dados Doninha.

    Configure as propriedades dos objetos, conforme indicado pela Figura9.13. Após isto, o form deverá parecer-se com o mostrado na Figura 10.14.

     


    Figura 10.13 Configuração de propriedades para o aplicativo de banco de dados Doninha.

     


    Figura 10.14 O projeto final do form para o aplicativo de banco de dados Doninha.

    O aplicativo precisa de algumas declarações de escopo global. Criaremos para isto um módulo de código. Escolha a opção Add Module do menu Project. Na janela de código, inclua as seguintes declarações na seção de declarações gerais:
    Type DoninhaTFB

    Nome As String * 32

    Cor As String * 12

    Peso As Integer

    Tamanho As Integer

    Data_nascimento As Double

    Cor_topete As String * 12

    Compr_topete As Integer

    End Type

    Public Const DONINHA_TAM_REG = 70
    A definição da constante DONINHA_TAM_REG facilitará a leitura do seu programa; a visão do nome da constante em vez do número 70 lembra o que o valor realmente significa. Entretanto, a maior razão para o uso de constantes desse tipo é a facilidade de manutenção do programa.

    Suponha que, no futuro, seja necessário redefinir o tipo DoninhaTFB; talvez pela necessidade de incluir um novo campo, ou porque você chegou à conclusão de que 32 caracteres são insuficientes para os nomes. Se você não tivesse usado uma constante para o tamanho do registro, seria necessário examinar cada linha do programa, alterando o número 70 para o novo tamanho do registro. Além disso, teria de tomar o cuidado de verificar se cada número 70 que aparece no,programa realmente refere-se ao tamanho do registro. Usando o nome de uma constante, você pode apenas trocar o valor da constante, e o restante do programa será instantaneamente atualizado com o novo tamanho de registro.

    O restante das declarações são locais ao form. Feche a janela de código para o módulo de código e abra a janela de código para o form. Inclua as seguintes linhas na seção de declarações gerais:

    Dim DoninhaAtualIx As Integer ‘Número da doninha atual
    Dim DoninhaCont As Integer ‘Quantid. total de doninhas
    Dim RegModif As Integer ‘Flag booleano

    Essas variáveis armazenarão um número de índice, indicando quais registros de doninhas estão sendo exibidos; controlarão a quantidade total de registros de doninhas armazenados no arquivo; e controlarão quando houve ou não alteração de qualquer informação no vídeo. (Observe que esse programa usa a abreviação Ix em vez de Index, pois Index é o nome de uma propriedade Visual Basic.)

    Para inicializar o sistema, o programa deverá ler cada registro do arquivo e colocar os nomes das doninhas na caixa de lista. O usuário poderá então escolher um nome. O programa responderá, recuperando o registro completo para a tal doninha e exibindo-o. Se o usuário modificar o registro, essas alterações serão gravadas de volta no arquivo.

    Para ilustrar um estilo de programação que funcione a contento com grandes quantidades de dados, esse programa não lerá todos os registros, armazenando-os em uma matriz. Em vez disso, ele trabalhará inteiramente com variáveis de memória. Mantendo apenas um registro na memória de cada vez, você consegue reduzir significativamente os requisitos de memória.

    Por questões de simplicidade, o programa requer que todos os nomes possam ser alocados na memória de uma única vez, porém se o comprimento médio dos nomes é de 8 ou 9 caracteres, isso não deverá ser um problema. Supondo que o arquivo de dados exista em uma localização predefinida em disco, você pode escrever a seguinte rotina de inicialização. (Nesse aplicativo, não usaremos a função FileOpenDIg. Assumiremos um nome de arquivo e um caminho de acesso predeterminado para os dados. O caminho C:\VB designa o diretório do Visual Basic em meu sistema; assegure-se de usar um caminho de acesso que seja válido para o seu sistema.)

     

    Figura 10.15

    A instrução Open abre ou cria o arquivo. A função LOF retorna a quantidade total de bytes ocupados pelo arquivo, que dividida pelo tamanho do registro permite obter a quantidade total de registros. Depois, cada registro existente é lido e o nome de cada doninha é inserido na caixa de lista.

    Quando a inicialização termina, o usuário pode escolher o nome de uma doninha para exibir os seus dados e eventualmente alterar alguma informação. Os procedimentos mostrados na Figura 10.16 atendem a esses requisitos.

     


    Figura 10.16 Os procedimentos MostrarDoninha e AtualizarDoninhaAtual

    O procedimento MostrarDoninha recebe o número do índice (elemento) como argumento. Ele assinala esse valor para a variável DoninhaAtualIx e acessa o arquivo para recuperar os dados da doninha gravados no registro correspondente ao valor de DoninhaAtuallx, atualizando cada campo de exibição. A seguir, configura o status RegModif para indicar que o registro ainda não foi modificado. O procedimento AtualizarDoninhaAtual verifica o status RegModif para determinar quando se trata de um registro modificado. Caso não tenha sido alterado, o procedimento simplesmente encerra o seu processamento. Se o usuário tiver alterado o registro, o valor atual de cada campo é recuperado e o registro alterado é gravado novamente em disco.

    As outras tarefas principais do programa são: criar novos registros e remover registros desatualizados. Você pode criar novos registros com o procedimento de função mostrado na Figura 10.17. (Discutiremos os procedimentos de remoção um pouco mais adiante.) A função NovaDoninha preenche o registro da doninha com o nome que lhe é passado como argumento e com valores defaults; para os outros campos. Ela incrementa DoninhaCont para levar em consideração a nova doninha, grava o novo registro no arquivo de dados e inclui o nome na caixa de lista. Uma vez que o registro novo é sempre gravado no final do arquivo, o seu índice na caixa de lista é o mesmo que o valor anterior de DoninhaCont, que é retornado ao procedimento chamador como valor da função.
    Function NovaDoninha (NovoNome As String) As Integer
    Dim Doninha As DoninhaTFB

    Doninha.Nome = NovoNome

    ‘Assinalamento de informações default

    Doninha.Cor = “Marrom”

    Doninha.Peso = 0

    Doninha.Tamanho = 0

    Doninha.Data_nascimento = Now

    Doninha.Cor_topete = “Marrom”

    Doninha.Compr_topete = 0

    ‘Assinalar número do índice como retorno

    NovaDoninha = DoninhaCont

    ‘Incrernentar quantidade de doninhas

    DoninhaCont = DoninhaCont + 1

    ‘Gravar o novo registro

    Put #1, DoninhaCont, Doninha

    ‘Incluir o nome na lista de doninhas

    cboNome.Additem Doninha.Nome

    RegModif = False

    End Function

     
    Figura 10.17 O procedimento de função NovaDoninha.

    Os procedimentos escritos até agora para esse programa foram definidos na seção geral do form, pois cada rotina executa uma tarefa específica. Esses procedimentos podem ser chamados por qualquer outro procedimento, inclusive por procedimentos de eventos, de forma que é melhor defini-los como unidades independentes em vez de codificá-los como parte de um procedimento de evento de um determinado objeto. É melhor realizar o trabalho específico do aplicativo em procedimentos gerais, fazendo com que o código nos procedimentos de eventos sirva de conexão entre a interação do usuário e a parte funcional do programa.

    A primeira conexão importante é o vínculo entre a inicialização do programa e a inicialização do banco de dados. Quando você inicia o programa, o procedimento de evento Load do form é o primeiro a ser chamado:
    Sub Form_Load ()

    DoninhaInicia

    End Sub
    É preciso conectar a escolha de um nome feita pelo usuário a partir da caixa combinada ao procedimento que faz a exibição do registro. Além disso, você deve ligar a criação de um novo registro ao botão Incluir. Estas duas rotinas fazem essas conexões:

     

    Figura 10.18

    Posicionar o registro exibido é simples, pois, somando-se 1 ao índice do nome na caixa de lista, obtém-se a posição do registro no arquivo. Com a segunda rotina, o usuário é incitado a nomear a nova doninha quando um clique é dado no botão Incluir. Se não for fornecido um nome, não será incluído qualquer registro. Caso contrário, o procedimento chama NovaDoninha para criar o novo registro e passa o valor do índice retornado diretamente para MostrarDoninha, de forma que o novo registro seja exibido.

    Para completar esse aplicativo, você deve implementar o suporte para edição de registros de doninhas. Serão necessárias duas rotinas simples para cada caixa de texto. O procedimento Change executa a instrução RegModif = True, e o procedimento LostFocus atualiza o registro chamando AtualizarDoninhaAtual. O código para cada caixa de texto é apresentado na Figura 10.19.

     


    Figura 10.19 Procedimentos de eventos para as caixas de texto no aplicativo de banco de dados Doninha.

    É melhor apenas configurar o status RegModif, em vez de chamar a rotina AtualizarDoninhaAtual diretamente, pois o procedimento Change é chamado pelo Visual Basic toda vez que o conteúdo de uma caixa de texto se altera. Por exemplo, se você digitar Vermelho na caixa de texto para Cor, o procedimento Change é chamado oito vezes, uma para cada letra digitada. No entanto, o registro não deve ser atualizado até que o novo conteúdo para a caixa de texto esteja completo, assim o programa chama a rotina para atualização no procedimento de evento LostFocus.

    O que é o evento LostFocus (perder o foco)? Todo e qualquer controle na tela pode ser o “foco de atenção” em um determinado instante durante o processamento de um aplicativo. O Windows controla isso através dos eventos GotFocus e LostFocus. Por exemplo, quando você dá um clique numa caixa de texto, o evento GotFocus é disparado. O foco permanece na caixa de texto enquanto você estiver digitando. Ao pressionar a tecla TAB ou dar um clique em algum outro controle, a caixa de texto receberá o evento LostFocus e o novo controle receberá GotFocus. Portanto, quando o procedimento LostFocus de uma caixa de texto for processado, você saberá que o usuário completou a digitação e seu programa pode chamar a rotina de atualização.

    O aplicativo de banco de dados Doninha agora está pronto para ser processado. Pressione F5 para iniciar a sua execução. Por ser a primeira vez que você está processando o programa, nenhuma entrada aparecerá na caixa de lista. Dê um clique no botão Incluir e introduza os dados para três ou quatro doninhas. Então, pressione Alt-F4 para sair do programa e processe-o novamente. Conforme ilustrado na Figura 10.20, você deveria ser capaz de escolher um dos nomes que acabou de incluir.

     


    Figura 10.20 Processando o aplicativo de banco de dados Doninha.

    Artigo gentilmente cedido por CodeLines

    Deixe seu comentário