Lazarus - Tratamento de Arquivos Texto

Em determinadas situações tratar arquivos textos é necessário. Arquivos nesse formato são usados com frequência para troca de dados entre sistemas. Mesmo com a força de XML, esse formato ainda tem seu espaço.
Em Lazarus existem componentes que possibilitam o tratamento desse tipo de fontes de dados. Na aba de componentes Data Access encontramos o TSdfDataSet e o TFixedFormatDataSet. A seguir vamos abordar cada um deles e mostrar exemplos.

TSdfDataSet

Este componente permite tratar um arquivo texto que usa um delimitador entre os campos, como um arquivo csv. O arquivo já deve existir para ser utilizado. Pode ser criado facilmente usando um editor comum. Crie um arquivo e digite uma linha com três campos separados por vírgula, por exemplo:

1,JOÃO DA SILVA,joao@meuemail.com.br

Chame o arquivo de cliente.txt. Ele terá três campos: ID, NOME e EMAIL.
Crie uma nova aplicação no Lazarus. Vamos fazer tudo no próprio form, mas mantenha o hábito de colocar seus componentes de banco de dados em um Data Module, como costumamos fazer nos artigos anteriores.
Localize a aba Data Access e coloque um TSdfDataSet. Altere a propriedade Name para tbContato e, em FileName informe o nome do arquivo criado acima com o caminho completo. Na propriedade Delimiter é possível especificar um delimitador, que por padrão é (,).
Da mesma aba selecione um TDataSource e coloque no form. Altere Name para dsContato e selecione tbContato na propriedade DataSet.
Coloque três TDBEdits no form e identifique-os apropriadamente com TLabels. Defina a propriedade DataSource de cada um deles com dsContato. Defina DataField como Field1, Field2 e Field3, respectivamente. Deve ocorrer um erro em cada atribuição mas não se preocupe com isso. Se preferir, pode mudar a propriedade Active de tbContato para True e os nomes dos campos - Field1, Field2 e Field3 - devem aparecer automaticamente. Se ocorrer um erro ou os nomes dos campos não aparecerem verifique se o nome do arquivo está corretamente definido. Agora coloque um TDBNavigator da aba Data Controls e defina a propriedade DataSource como dsContato.


Agora vamos escrever o código para abrir e fechar a tabela. Faça como antes já fizemos. No evento OnShow do form escreva:

tbContato.Open;

E no evento OnClose, escreva:

tbContato.Close;

Execute o programa. Ele deve funcionar normalmente. Permite inserir, excluir, alterar e navegar nos registros.

TFixedFormatDataSet

Este componente é usado para manipular arquivos de texto onde cada campo tem um tamanho fixo. Quando o valor do campo não preenche totalmente o tamanho dele, o restante é completado com espaços. Assim como no componente anteior, neste também é necessário criar o arquivo antes. Simplesmente vamos criar um novo arquivo texto vazio. Fica definido que o campo Id terá 5 caracteres, Nome e Email terão 30 caracteres, cada um. Diferente de TSdfDataSet, a programação de exige um pouco de código, como veremos mais a frente.
Crie uma nova aplicação no Lazarus. Coloque um TFixedFormatDataSet no form e defina a propriedade Name como tbContato e na propriedade FileName informe o nome do arquivo texto criado com o caminho completo.
Coloque também um TDataSource. Mude Name para dsContato e selecione tbContato em DataSet.
Bem, este componente precisa de algum código para funcionar. Ele só reconhece um campo - Line. Line representa uma linha do arquivo. Então coloque três TEdits e mude as propriedades Names para edId, edNome e edEmail, respectivamente. Coloque três TLabels para identificar esses campos. Coloque um TDBNavigator e defina a propriedade DataSource como dsContato.
Localize o evento AfterScroll de tbContato e escreva o seguinte código para ele:

edId.Text := copy(tbContato.FieldByName('Line').Value, 1, 5);
edNome.Text := copy(tbContato.FieldByName('Line').Value, 6, 30);
edEmail.Text := copy(tbContato.FieldByName('Line').Value, 36, 30);

Com isso, a cada vez que navegamos em um registro, este código extrai cada parte e a atribui ao TEdit correspondente. No evento BeforePost de tbContato escreva:

tbContato.FieldByName('Line').Value := Espacos(edId.Text,5) + Espacos(edNome.Text,30) + Espacos(edEmail.Text,30);

A função Espacos() preenche cada campo com espaços até completar o tamanho do campo:

function TfrmTexto.Espacos(s: string; t: integer): string;
var
  i: integer;
begin
  result := s;
  for i := length(s) + 1 to t do
     result := result + ' ';
end;

O cabeçalho dessa função deve ser declarado na seção type junto aos outros métodos da unit. Agora escreva o código para abrir a tabela em OnShow e para fechar em OnClose.
Pronto. Compile e execute o programa. Neste exemplo, a tabela não entra em modo de edição automaticamente quando alteramos algum campo nos TEdits. É necessário ativar o modo de edição pressionando o botão correspondente no TDBNavigator.

5 comentários:

Anônimo disse...

Este conteúdo utilizei como base para manipular arquivos, algo que eu ainda não conhecia. Valeu!

RAO Sistemas disse...

Boa Noite... estou usando bem seus exemplos para windows CE... consegui fazer rodar... a questão é: com o TfixedFormatDataSet como eu informo o caminho para funcionar no Win CE?
Agradeço.

Professor Carlos disse...

Faça a atribuição do caminho em tempo de execução usando ExtractFilePath, devido o caminho no WinCE ter um formato diferente do Windows

Luis Antonio Fessel disse...

Postei no FB.
"Estou" criando um programa, no Kubuntu, para manipular o menu do GRUB.
O arquivo, como sabes, é um arquivo texto (GRUB.CFG), mas precisa ser acessado como administrador.
Existe uma maneira de fazê-lo no Lazarus?

Professor Carlos disse...

Não tenho muita experiência com Linux.
Executar sua aplicação como root não resolve?
Ou talvez executando um processo como root na sua aplicação usando TProcess

Django - Composição de queries brutas (raw queries)

Django Rest Framework (DRF) é uma poderosa ferramenta para criar Web APIs. Ele requer o uso de Python e do framework Django. Mesmo o Django...