No artigo Criando e Gravando dados em Txt com Delphi foi apresentado como realizar a criação e a gravação de dados em um arquivo texto
usando o identificador padrão TextFile. A seguir no artigo Lendo dados de Txt com Delphi foi demonstrado como recuperar os dados de arquivos que utilizam o formato txt. Neste terceiro é último artigo que aborda este tema será desenvolvido um controle de notas escolares criando, gravando e recuperando os dados de um arquivo texto.

Uma variável que representa um arquivo texto é declarada fazendo-se referência ao identificador padrão TextFile. As operações de entrada (Readln) ou saída (Writeln) subsequentes sobre o arquivo devem ser precedidas por uma chamada ao procedimento AssignFile e pelo comando de abertura adequado:
a) Reset: prepara um arquivo existente para leitura.
b) Rewrite: um novo arquivo em disco é criado e preparado para processamento.
c) Append: abre um arquivo texto existente para estendê-lo (saídas adicionais).

A lista com os principais procedimentos aplicados aos arquivos texto pode ser encontrada, novamente, no artigo Criando e Gravando dados em Txt com Delphi.

Para demonstrar a utilização dos procedimentos que manipulam arquivos texto em operações de entrada e saída será desenvolvida uma aplicação Delphi para controlar um diário de classe mantendo no arquivo informações como o nome do aluno e o valor de duas notas escolares.


Desenvolvendo a Aplicação Delphi
Criar uma nova aplicação no ambiente de desenvolvimento Delphi 7 através da opção do menu "File|New|Application..." e realizar os dois passos descritos a seguir:

1º Passo: interface

Desenvolver o formulário principal da aplicação como sugere a Figura 1. Atenção: observe que as caixas de textos explicativos utilizadas na figura apresentam a ordem sequencial e o nome do componente, a página da sua localização e as propriedades que devem ser alteradas com os respectivos valores.


Figura 1. Formulário principal da aplicação.

2º Passo: implementação
A interação de um programa com um dispositivo de armazenamento através de arquivos passa por três etapas: abertura do arquivo, gravação ou leitura dos dados e fechamento do arquivo. A seguir serão apresentados os códigos implementados para realizar um controle de notas escolares usando arquivo texto.

a) Declarar no início da implementation do formulário da aplicação a variável arquivo como mostra a Listagem 1.

Listagem 1. Declarando a variável arquivo.
var arq: TextFile;

b) No evento "onShow" do formulário da aplicação será aberto o arquivo "diario.txt" na unidade de disco "d". Se o arquivo não existir ele será criado (Rewrite), caso contrário, ele será aberto para saídas adicionais (Append) como mostra a Listagem 2.

Listagem 2. Evento "onShow" do formulário da aplicação.
procedure TForm1.FormShow(Sender: TObject);
begin
  AssignFile(arq, 'd:\diario.txt');
  {$I-}
  Reset(arq);
  {$I+}
  if (IOResult <> 0)
     then Rewrite(arq) { arquivo não existe e será criado }
  else begin
         CloseFile(arq);
         Append(arq); { o arquivo existe e será aberto para saídas adicionais }
       end;
end;	

c) No evento "onKeyPress" do componente de entrada edNota1 é realizada a verificação se a tecla pressionada pelo usuário corresponde a um caractere numérico. Com esta implementação, mostrada na Listagem 3, só serão aceitas informações numéricas do tipo real na entrada de dados das notas escolares. Foram utilizados no código os caracteres de controle #8 que corresponde a tecla Backspace e #7 que produz um efeito sonoro na forma de um beep. Nota: a utilização do objeto Sender enviado pelo evento permite que este procedimento também possa ser utilizado no evento "onKeyPress" do componente de entrada edNota2.

Listagem 3. Evento "onKeyPress" dos componentes edNota1 e edNota2.
procedure TForm1.edNota1KeyPress(Sender: TObject; var Key: Char);
begin
  if (Key in ['.', ','])
     then if (pos(',', (Sender as TEdit).Text) = 0)
             then Key := ','
          else Key := #7
  else if (not(Key in ['0'..'9', #8]))
          then Key := #7;
end;

d) A Listagem 4 apresenta a implementação do evento "onClick" do botão "Gravar Aluno" que realiza a gravação (Writeln) de uma linha, que corresponde aos dados de um aluno, no arquivo texto. Nota: foi utilizado como separador entre os campos nome do aluno e notas escolares o caractere "|" (pipe) para facilitar o procedimento de recuperação destes dados.

Listagem 4. Evento "onClick" do botão "Gravar Aluno".
procedure TForm1.Button1Click(Sender: TObject);
begin
{ verifica se todos os campos foram informados }
  if ((edAluno.Text <> '') and (edNota1.Text <> '') and
      (edNota2.Text <> ''))
     then begin
{ grava uma linha com os dados de um aluno no arquivo }
            Writeln(arq, edAluno.Text, '|', edNota1.Text, '|',
              edNota2.Text, '|');
            edAluno.Clear;
            edNota1.Clear;
            edNota2.Clear;
          end;
end;

e) O procedimento para recuperação dos dados, através do procedimento Readln, apresentado na Listagem 5 deverá ser implementado no evento "onClick" do botão "Ler Alunos".

Listagem 5. Evento "onClick" do botão "Ler Alunos".
procedure TForm1.Button2Click(Sender: TObject);
var         linha, nome: string;
                nreg, i: integer;
    nota1, nota2, media: real;
begin
  Memo1.Clear;

  Reset(arq); { abre o arquivo texto para leitura }

  nreg := 0;
  while (not Eof(arq)) do { enquanto não atingir a marca de final de arquivo }
  begin
    Readln(arq, linha); { lê uma linha, com os dados de um aluno, do arquivo }

    nreg := nreg + 1;

    i := pos('|', linha);
    nome := copy(linha, 1, i-1); { recupera o nome do aluno }
    delete(linha, 1, i);

    i := pos('|', linha);
    nota1 := StrToFloat(copy(linha, 1, i-1)); { recupera a 1a. nota do aluno }
    delete(linha, 1, i);

    i := pos('|', linha);
    nota2 := StrToFloat(copy(linha, 1, i-1)); { recupera a 2a. nota do aluno }

{ processando e exibindo os dados recuperados }
    media := (nota1 + nota2) / 2;
    Memo1.Lines.Add('Registro Nro.: ' + IntToStr(nreg));
    Memo1.Lines.Add('Nome do Aluno: ' + nome);
    Memo1.Lines.Add('1a. nota.....: ' + FloatToStr(nota1));
    Memo1.Lines.Add('2a. nota.....: ' + FloatToStr(nota2));
    Memo1.Lines.Add('Média........: ' + FloatToStr(media));
    if (media >= 6.0)
       then Memo1.Lines.Add('Situação.....: Aprovado')
    else Memo1.Lines.Add('Situação.....: Reprovado');
    Memo1.Lines.Add('');
  end;

  CloseFile(arq);
  Append(arq);
end;

Aspectos importantes da codificação apresentada na Listagem 5:
1) O procedimento Reset reabre o arquivo para leitura e coloca o ponteiro de arquivo no início.
2) O processo de repetição, para ler "todas" as linhas do arquivo de texto, foi implementado através de uma instrução while com a expressão lógica not eof(arq) que encerra o processo de leitura sempre que o ponteiro do arquivo atingir a marca de fim-de-arquivo.
3) Cada linha do arquivo corresponde aos dados de um aluno que forão separados por caracteres pipe. A recuperação dos dados nome do aluno e notas escolares foi implementada usando a função pos que retorna a posição de um caractere pipe e a função copy que separa um pedaço da linha. O procedimento delete apaga as partes da linha que foram separadas.

f) Por último, no evento "onClose" do formulário da aplicação será fechado o arquivo "diario.txt", como mostra a Listagem 6.

Listagem 6. Evento "onClose" do formulário da aplicação.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CloseFile(arq); { fecha o arquivo texto aberto }
end;

Executando a aplicação deve-se informar o nome de um aluno e suas respectivas notas escolares nos componentes de entrada. Ao pressionar o botão "Gravar Aluno" as informações serão gravadas no arquivo texto "diario.txt" na unidade de disco "d". Para visualizar o resultado da gravação basta abrir o arquivo "diario.txt" através do bloco de notas, como mostra a Figura 2.


Figura 2. Arquivo "diario.txt" aberto pelo bloco de notas.

Para recuperar e processar os dados gravados no arquivo deve-se pressionar o botão "Ler Alunos". O resultado desta operação pode ser observado na Figura 3.


Figura 3. Ilustrando a execução da aplicação: pressionando o botão "Ler Alunos".

Obrigado e um abraço.

Prof. Omero Francisco Bertol (http://www.pb.utfpr.edu.br/omero/)
Apliicações Delphi (http://www.pb.utfpr.edu.br/omero/Delphi/Exercicios.htm)
Download da Aplicação (http://www.pb.utfpr.edu.br/omero/Delphi/Artigos/TXT_Delphi_ParteIII.rar)