Você está na página 1de 12

4.

ARQUIVOS EM VISUAL BASIC


Houve um tempo em que os computadores pessoais no tinham disco rgido instalado.
Tudo o que existia era uma unidade de disquete e nada mais. Naquele tempo voc inicializava o
computador a partir de um arquivo COMMAND.COM em disquete e para rodar o Turbo Pascal 3.0,
por exemplo, voc deveria carregar este programa a partir de um disquete de 360 kBytes, no qual
ainda sobrava espao para seus prprios programas. Pior do que isto, houve um tempo, no incio
da dcada de 80, em que os computadores no tinham nem mesmo unidade de disquete. Alguns
computadores dispunham de um meio para gravar arquivos em fita K7, mas outros no tinham nem
isso. Voc deve estar perguntando para que eles serviam, mas eu no sei a resposta. Imagino o
desespero de um usurio que, aps passar algumas horas desenvolvendo um programa no
jurssico Basic residente (que vinha instalado em memria ROM junto com o computador), no
podia grav-lo. O programa estava condenado morte quando o computador fosse desligado.

Felizmente, hoje os tempos so outros e, com as facilidades disponibilizadas por redes de


computadores e unidades de CD, mesmo os simpticos disquetes parecem estar com os dias
contados. Arquivos de todo tipo, que eram desconhecidos por um programador de PCs h vinte
anos, so hoje indispensveis e cada vez maiores. O VB, como qualquer outra linguagem, fornece
meios para abrir, ler e gravar vrios tipos de arquivos.

ARQUIVOS DE ACESSO SEQENCIAL

Arquivos seqenciais so aqueles que devem ter os dados acessados de maneira


ordenada, como o prprio nome inidica. No possvel ler os dados fora da seqncia em que
foram gravados. Alm disso, para ler um registro qualquer, devemos antes ler todos os registros
anteriores. No h um modo de pular diretamente para os dados do meio do arquivo.

Em um arquivo seqencial, cada registro uma linha de texto terminada com um caractere
de mudana de linha (CR-LF). Os registros tm tamanho varivel, podendo ser nulo. Tratamos
cada registro como uma linha de texto. Arquivos seqenciais tm um papel importante na histria
da informtica, mas so provavelmente o tipo de arquivo menos usado atualmente. As principais
limitaes dizem respeito ao tempo de acesso para registros localizados perto do fim de arquivos
muito grandes.

ARQUIVOS DE ACESSO ALEATRIO

Um arquivo de acesso aleatrio armazena dados como uma srie de registros numerados
de tamanho fixo. A diferena que cada registro pode ser acessado individualmente, sem termos
que passar por todos os outros. Cada registro dividido em um ou mais campos. O tamanho dos
registros e dos campos so definidos pelo programa quando o arquivo criado. s vezes se usa o
termo arquivo aleatrio e isto no realmente errado. Um arquivo deste tipo armazenado aos
pedaos no disco e por esta razo que voc deve usar o desfragmentador de tempos em
tempos, agrupando os pedaos e permitindo que a leitura e gravao sejam feitas mais
rapidamente .
ARQUIVOS DE ACESSO BINRIO

Arquivos binrios armazenam dados como uma seqncia no formatada de bytes. No


necessrio comprimento fixo de registros ou caracteres delimitadores. Cada byte pode ser
manipulado individualmente, mas necessrio que o porgramador tenha uma idia muito boa do
que est acontecendo. Arquivos executveis (.EXE) so exemplos de arquivos binrios.

ABERTURA DE ARQUIVOS

Abrir um arquivo significa alocar um buffer do computador para eventos de entrada e


sada. O Visual Basic disponibiliza o comando Open, cuja sintaxe mostrada abaixo.

Open Nome_do_Arquivo [For Modo][Access acesso][Lock] As [#] n_do_arquivo [Len=comp.],

onde:
Nome_do_arquivo: String que contm o nome do arquivo e caminhos eventuais. Se o
caminho no for especificado, o arquivo ser aberto na pasta atual;
Modo: palavra-chave que especifica o modo de acesso arquivo, conforme a tabela 9;
Acesso: palavra-chave opcional que especifica as operaes permitidas no arquivo
aberto, conforme a tabela 10;
Lock: palavra-chave opcional que controla o acesso a um arquivo por outros
processos, conforme a tabela 11;
n_do_arquivo: nmero do prximo arquivo livre (1 a 255)
comp.: tamanho do registro, em bytes, para arquivos aleatrios, ou o tamanho do
buffer para arquivos seqenciais.

Tabela 9 - Modos de abertura de arquivo

Modo Acesso ao arquivo


APPEND Acesso seqencial; se o arquivo j existe, novos dados sero adicionados no final dos dados j
existentes. Se o arquivo no existe, ele criado.
BINARY Acesso binrio para leitura e escrita. Se o arquivo no existe, ele criado.
INPUT Acesso seqencial para leitura. Se o arquivo no existe, ocorre um erro.
OUTPUT Acesso seqencial para gravao. Se o arquivo j existe, ele eliminado e um outro criado. Se o
arquivo no existe, ele criado.
RANDOM Acesso aleatrio para leitura e gravao. Se o arquivo no existe, ele criado. Esse o padro se
o argumento Modo for omitido.
Tabela 10 - Tipos de acesso a arquivos

Acesso Resultado
Read Arquivo aberto apenas para leitura
Write Arquivo aberto apenas para gravao
Read Arquivo aberto para leitura e gravao . Este modo vlido apenas
Write para arquivos aleatrios, arquivos binrios e arquivos seqenciais
abertos no modo APPEND.

Tabela 11 - Tipos de bloqueio (lock) de arquivos

Bloqueio Efeito
SHARED Todos os processos podem ler e gravar no arquivo.
LOCK READ Nenhum outro processo pode ler o arquivo.
LOCK WRITE Nenhum outro processo pode gravar no arquivo.
LOCK READ WRITE Nenhum outro processo pode ler ou gravar no arquivo.

Por exemplo, para abrir um arquivo seqencial para leitura, chamado VBJUNK.TXT, na
pasta atual, escreveramos:

Open VBJUNK.TXT For Input As #1

Para fechar um arquivo devemos usar o comando Close: Close [#] n_do_arquivo. O
nmero do arquivo pode ser determinado com a funo FreeFile, que retorna o nmero do prximo
arquivo livre: n_do_arquivo=FreeFile.

LEITURA DE ARQUIVOS SEQENCIAIS

O comando Open por si mesmo somente abre o arquivo, sem ler o contedo. Para ler
arquivos seqenciais devemos usar o comando Input$, cuja sintaxe mostrada a seguir.

Input$ (tamanho,[#]n_do_arquivo),

onde:
tamanho: tamanho, em bytes, do arquivo a ser lido;
n_do_arquivo: nmero usado no comando Open.

Para determinar o tamanho de um arquivo podemos usar a funo LOF, que significa
Length of File, ou Tamanho do Arquivo.

Exemplo: Input$ (LOF(1), #1)

Uma aplicao destes conhecimentos encontra-se no menu Abrir do Editor de textos. Este
menu carrega uma caixa de dilogo personalizada chamada frmAbrir, onde o usurio escolhe o
arquivo.
GRAVAO DE ARQUIVOS SEQENCIAIS

Para gravar arquivos sequenciais estes devem, antes, ter sido abertos para sada (output).
O comando mais comum para gravao Print #.

Print # n_do_arquivo, Lista,

onde o parmetro Lista contm os dados a serem gravados.

Exemplo: Print # 1, txtTexto.text.

LEITURA DE ARQUIVOS ALEATRIOS

Para ler o contedo de um arquivo aleatrio, use o comando Get, cuja sintaxe mostrada
abaixo,

Get Nmero_do_Arquivo, [n do registro], Var,

onde Nmero_do_Arquivo o nmero usado no comando Open. O nmero do registro que ser
carregada na Varivel Var opcional, mas as vrgulas no so. A varivel Var no pode ser um
array. Caso se deseje acessar todos os registros, deve-se usar um lao For...Next e gravar a leitura
em uma mesma varivel, usando talvez um array para armazenar o resultado final.

A maneira mais fcil de se usar arquivos aleatrios criando um tipo de dados definido
pelo usurio, com auxlio da instruo Type ...End Type (veja mais detalhes no prximo captulo).
Com este tipo de dados haver uma correspondncia perfeita entre a varivel e os dados gravados
em campos dos registros do arquivo.

GRAVAO DE ARQUIVOS ALEATRIOS

Para gravar o contedo de um arquivo aleatrio em disco, use o comando Put, cuja sintaxe
mostrada abaixo,

Put Nmero_do_Arquivo, [n do registro], Var,

As mesmas observaes feitas sobre o comando Get aplicam-se aqui. Entretanto, o


comando Put transfere o contedo da varivel Var oara o arquivo em questo.
USANDO ARQUIVOS BINRIOS

Os arquivos binrios aumentam a flexibilidade no armazenamento de dados, mas devido


natureza menos estruturada deles, a tarefa de controlar o armazenamento de informaes passa a
ser do programador.

Todo arquivo binrio aberto tem seu prprio ponteiro, que um valor numrico que aponta
para a posio do arquivo em que as operaes de entrada e sada (I/O) ocorrero. Cada posio
corresponde a um byte de dados; assim, um arquivo de n bytes ter posies numeradas de 1 at
n. Para mudar o ponteiro do arquivo e determinar o seu valor, usamos a instruo Seek e as
funes Seek() e Loc(), cujas respectivas sintaxes so as seguintes:

Seek [#] Nmero_do_Arquivo, NovaPos;


[pos=] Seek (Nmero_do_Arquivo);
[pos=] Loc (Nmero_do_Arquivo),

onde Nmero_do_Arquivo o nmero associado ao arquivo qundo ele aberto no modo binrio. A
instruo Seek define o ponteiro como NovaPos. A funo Seek() retorna a posio atual do
ponteiro, que corresponde ao prximo byte a ser lido ou escrito. A funo Loc() retorna a posio
do ltimo byte lido ou escrito.

GRAVAO E LEITURA DE ARQUIVOS BINRIOS

Para ler dados de um arquivo binrio, use a instruo Get. Para gravar dados, use a
instruo Put. Estas instrues so as mesma usadas na leitura e gravao de arquivos aleatrios,
mas, como estamos abrindo um arquivo binrio, elas sero interpretadas de maneira diferente pelo
VB, conforme a seguir:

Get [#] Nmero_do_Arquivo, [pos], var


Put [#] Nmero_do_Arquivo, [pos], var

onde pos especifica a posio do byte que deve ser lido ou gravado.

USANDO O CONTROLE COMMON DIALOG

Em vez de personalizar caixas de dilogo, podemos usar caixas prontas do Visual Basic. As
Edies Profissional e Enterprise oferecem cinco caixas de dilogo padronizadas, mostradas por
meio do controle Common Dialog. Este controle, como o Timer, no aparece na tela em tempo
de execuo. A tabela 12 mostra as caixas que podem ser mostradas.
Tabela 12 - Configuraes de Common Dialog

CAIXA DE DILOGO SINTAXE


Abrir Arquivo CommonDialog1.ShowOpen
Salvar Arquivo CommonDialog1.ShowSave
Seleo de Cores CommonDialog1.ShowColor
Seleo de Fontes CommonDialog1.ShowFont
Impresso CommonDialog1.ShowPrinter

QUADROS DE DILOGO ABRIR ARQUIVO E SALVAR


ARQUIVO

Para abrir qualquer quadro de dilogo com o Common Dialog necessrio especificar
algumas propriedades:

a) Especificar os filtros
CommonDialog1.Filter = Arquivos Texto(.txt)|.txt|

b) Especificar o filtro default


CommonDialog1.FilterIndex = 2

c) Abrir o quadro de dilogo


CommonDialog1.ShwouOpen

possvel, ainda, especificar a opo de Flags. Os valores para estas flags podem ser
encontradas no arquivo PROCONST.TXT que acompanha a Edio Profissional. Por exemplo,
para fazer aparecer um boto de Help no quadro de dilogo, fazemos:

CommonDialog1.Flags=OFN_SHOWHELP

Antes, porm, necessrio ter carregado o arquivo PROCONST.TXT em um mdulo do


Visual Basic que faa parte do projeto. Isto pode ser feito copiando-se o contedo deste arquivo e
colando-se em um mdulo.

O quadro de dilogo Salvar Arquivo semelhante, com nica diferena de que o comando
para mostra o quadro CommonDialog1.ShowSave.

QUADRO DE DILOGO SELEO DE CORES

a) Definir o valor da cor inicial


CommonDialog1.Flags=CC_RGBINIT

b) Abrir o quadro
CommonDialog1.ShowColor

c) Carregar a cor selecionada no objeto em questo. Por exemplo, a linha a seguir carregar a cor
selecionada na propriedade cor de fundo da caixa de figuras picFiguras:

picFiguras.BackColor = CommonDialog1.Color
QUADRO DE DILOGO SELEO DE FONTES

a) Definir os flags. Por exemplo, para permitir a seleo de fontes de tela e de impressora
(CF_BOTH) e permitir a seleo de efeitos, tais como sublinhado e tachado (CF_EFFECTS),
devemos fazer

CommonDialog1.Flags = CF_BOTH Or CF_EFFECTS,

onde as constantes CF_BOTH e CF_EFFECTS devem ter sido carregadas em um mdulo a partir
do arquivo PROCONST.TXT.

b) Abrir o quadro de dilogo


CommonDialog1.ShowFont

c) Carregar as propriedades de fontes para o objeto em questo

txtEdit.FontName = CommonDialog1.FontName
txtEdit.FontSize = CommonDialog1. FontSize
txtEdit.FontBold = CommonDialog1. FontBold
txtEdit.FontItalic = CommonDialog1. FontItalic
txtEdit.FontUnderline = CommonDialog1. FontUnderline
txtEdit.FontStrikeThru= CommonDialog1. FontStrikeThru
txtEdit.ForeColor = CommonDialog1.Color

O EDITOR DE TEXTOS COMPLETO

O controle Common Dialog pode ser usado para construir uma verso melhorada do
nosso editor de textos. Comee criando um novo projeto e personalizando o formulrio como na
figura 16. Os menus devem ser construdos com a ajuda da Janela de Projeto de Menus, de
acordo com a tabela 13.

O cdigo correspondente ao menu Editar idntico ao do editor anterior, fazendo uso do


objeto Clipboard. O cdigo completo do menu Arquivo mostrado abaixo, fazendo-se uso do
comando Select .. Case e do controle Common Dialog.
Tabela 13

Legenda Nome ndice Tecla de Atalho


Arquivo mnuArquivo - -
---Novo Arquivo mnuArquivoItem 0
--- Abrir mnuArquivoItem 1 Ctrl + F12
--- Salvar Como ... mnuArquivoItem 2 Shitf + F12
--- Fechar mnuArquivoItem 3
--- - mnuArquivoItem 4 -
--- Sair mnuArquivoItem 5 Ctrl + Z
Editar mnuEditar - -
--- Cortar mnuEditarItem 0 Ctrl + X
--- Copiar mnuEditarItem 1 Ctrl + C
--- Colar mnuEditarItem 2 Ctrl + V
Configuraes mnuConfig - -
--- Cor de Fundo mnuConfigItem 0 -
--- Fontes mnuConfigItem 1 -
Sobre ... mnuSobre - -

Private Sub mnuArquivoItem_Click(Index As Integer)


On Error GoTo OcorreuErro

Select Case Index ' Verifica o ndice do menu selecionado.


Case 0 ' Se index = 0, o usurio escolheu "Novo".
txtEdit.Text = ' Limpa a caixa de texto "txtEdit".
Nome_do_Arquivo = "Sem Ttulo" ' Escreve "Text Editor: Untitled" na legenda do
formulrio.
frmEditor.Caption = "Text Editor: " & Nome_do_Arquivo
Case 1 ' Se index = 1, o usurio escolheu "Abrir...".
' Especifica os filtros.
CommonDialog1.Filter = "Todos os arquivos(*.*)|*.*|Arquivos texto(*.txt)|*.txt|
Arquivos de lote (*.bat)|*.bat"
' Especifica o filtro default.
CommonDialog1.FilterIndex = 2
' Mostra a caixa de dilogo "File Open".
CommonDialog1.ShowOpen
Nome_do_Arquivo = CommonDialog1.Filename
AbreArquivo (Nome_do_Arquivo) ' Abre o arquivo escolhido.
Case 2 ' Se index = 2, o usurio escolheu "Save As...".
' Especifica os filtros.
CommonDialog1.Filter = "Todos os arquivos(*.*)|*.*|Arquivos texto(*.txt)|*.txt|
Arquivos de lote (*.bat)|*.bat"
' Especifica o filtro default.
CommonDialog1.FilterIndex = 2
' Mostra a caixa de dilogo "Save As...".
CommonDialog1.ShowSave
Nome_do_Arquivo = CommonDialog1.Filename
FechaArquivo (Nome_do_Arquivo)
Case 3 ' Se index = 3, o usurio escolheu "Fechar".
txtEdit.Text = "" ' Limpa a caixa de texto.
frmEditor.Caption = "Text Editor: Sem Ttulo" ' Atualiza a legenda do formulrio.
mnuArquivoItem(3).Enabled = False ' Desabilita este item de menu.
FechaArquivo (Nome_do_Arquivo) ' Fecha o arquivo atual.
Case 4 ' Este item de menu uma barra separadora.Nenhum cdigo necessrio aqui,
' pois a barra no pode ser selecionada e, consequentemente, no recebe o evento "click".
Case 5 ' Se index = 5, o usurio escolheu "Exit"
End ' Finaliza o aplicativo.
End Select
OcorreuErro:
' O usurio pressionou o boto "cancel", gerando um erro. O erro usado
' para fechar a caixa de dilogo sem executar ao alguma.
Exit Sub
End Sub

Figura 13 - O Editor de Textos

O controle Common Dialog retorna a propriedade Filename, que usada para abrir ou
salvar os arquivos, conforme o caso.

Voc deve, ainda escrever duas procedures em um mdulo de programao. A primeira


delas abre os arquivos sequenciais, recebendo o parmetro Nome_do_Arquivo.

Sub AbreArquivo(Nome_do_Arquivo As String)


Dim F As Integer
If "Text Editor: " + Nome_do_Arquivo = frmEdit.Caption Then
Exit Sub
Else
On Error GoTo OcorreuErro
F = FreeFile
Open Nome_do_Arquivo For Input As F
frmEdit.txtEditor.Text = Input$(LOF(F), F)
Close F
frmEdit.mnuArquivoItem(3).Enabled = True
frmEdit.Caption = "Text Editor: " + Nome_do_Arquivo
Exit Sub
End If
OcorreuErro:
MsgBox "Erro encontrado tentando abrir arquivo. Tente Novamente.", 48, "Editor de Textos"
Close F
Exit Sub
End Sub

A segunda procedure do mdulo fecha o arquivo, desalocando o buffer e limpando a caixa


de textos.

Sub FechaArquivo(Nome_do_Arquivo As String)


Dim F As Integer
On Error GoTo CloseError
If Dir(Nome_do_Arquivo) <> "" Then
resposta= MsgBox("Sobreescrever o arquivo?", MB_YESNO + MB_QUESTION +
B_DEFBUTTON2)
If resposta= IDNO Then Exit Sub
End If
F = FreeFile
Open Nome_do_Arquivo For Output As F
Print #F, frmEdit.txtEdit.Text
Close F
Nome_do_Arquivo = "Sem Ttulo"
Exit Sub
CloseError:
MsgBox "Erro encontrado tentando fechar o arquivo.", 48
Exit Sub
End Sub

Os cdigos das procedures AbreArquivo e Fecha arquivo so executados em mais de uma


situao no porgrama e, por esta razo, sempre melhor escrever procedures internas do que
repetir instrues desnecessariamente.

Note que estamos usando um gerenciador de erros simples, por meio das instrues On
Error e GoTo. Tudo o que esta rotina faz detectar um erro (tentativa de abrir um arquivo invlido,
falta de memria, etc) e desviar a execuo para o rtulo OcorreuErro, que encerrar a
procedure. Se no usssemos um gerenciador de erros, qualquer erro de tempo de execuo seria
fatal, abortando o programa. Veremos mais sobre tratamento de erros no captulo 8.

O cdigo para o menu Configurar direto, tratando-se de simples manipulao de


propriedades da caixa de textos e do Common Dialog.

Private Sub mnuConfigItem_Click(Index As Integer)


On Error GoTo RotErro

Select Case Index


Case 0 ' Cor de fundo
CommonDialog1.Flags = &H1&
CommonDialog1.ShowColor
txtEdit.BackColor = CommonDialog1.Color
Case 1 ' Fontes
CommonDialog1.Flags = &H3& Or &H100&
CommonDialog1.ShowFont
With txtEdit.
.FontName = CommonDialog1.FontName
.FontSize = CommonDialog1.FontSize
.FontBold = CommonDialog1.FontBold
.FontItalic = CommonDialog1.FontItalic
.FontUnderline = CommonDialog1.FontUnderline
.FontStrikethru = CommonDialog1.FontStrikethru
.ForeColor = CommonDialog1.Color
End With
End Select
RotErro:
Exit Sub
End Sub

Note o uso das clusulas With ... End With para retornar o valor de vrias propriedades de
txtEdit. Este um bom hbito de programao, que economiza esforo na escrita e resulta em
programas executveis menores.