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.
Assinar:
Postar comentários (Atom)
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...
-
Para fazer nossa primeira aplicação usando banco de dados no Lazarus vamos usar o SQLite e o conjunto de componentes nativo SQLdb. Inicialme...
-
Para a criação de relatórios, o Lazarus já trás o componente LazReport, no entanto ele precisa ser instalado no IDE. Para fazer a instalação...
-
Neste post vamos apresentar alguns dos inúmeros recursos que o Editor de Código oferece aos desenvolvedores. O Editor pode ser configurado v...
5 comentários:
Este conteúdo utilizei como base para manipular arquivos, algo que eu ainda não conhecia. Valeu!
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.
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
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?
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
Postar um comentário