Olá pessoal, vamos a um artigo muito interessante onde temos o objetivo de separar os dados encontrados em um Listbox usando um determinado delimitador.

Para construção deste exemplo, vamos precisar ter em uma aplicação em Delphi e nela adicionar 1 TListBox, 1 TButton e 1 TStringGrid.

Layout do Formulário

Figura 1. Layout do Formulário.

Objetivo é no Listbox carregar um arquivo .txt(poderíamos usar um TStringList para isso). Segundo ponto é ao clicar no Button as informações serem separadas num TStringGrid.

Consideração: Vou fazer de forma bem básica para que todos possam desfrutar da explicação, vou usar variáveis locais, mas não há necessidade disso, ok ?

Vou usar um layout de txt (basta você copiar e colocar o conteúdo abaixo na propriedade Items do TListBox) da seguinte forma:


20:05|segunda-Feira|E:\Arq.rar
17:22|terça-Feira|C:\Arquivos de progrmas\App2.exe
10:10|quarta-Feira|E:\Arq.txt
13:30|quinta-Feira|C:\windows\App3.exe

Podemos notar que temos um char que separa os "fields" em cada linha, no caso seria o "|". Sendo assim, precisamos separar em linhas e colunas os dados de cada Item do TListBox.

Neste ponto já temos o layout montado e texto a ser separado no nosso TListbox, vamos agora então a implementação e explicação do Código.

No evento onClick do TButton vamos implementar o seguinte código:


procedure TFrmPrincipal.Button1Click(Sender: TObject);
var
  Dados : TStringList; 
  {Foi criada uma StringList para auxiliar na separação dos dados}
  i  : Integer; {Esta variável serve para controlar o nosso LOOP e 
definir qual será a linha onde iremos "escrever" o conteúdo no TStringGrid.}
  Hora, Dia, Diretorio : String; {Observe que foram criadas 3 variáveis 
para armazenar os dados "Temporariamente" em memória}

begin
{Estou instanciando o nosso TStringList, pois caso não seja feito
 teremos um erro muito comum, ACCESS VIOLATION}

  Dados := TStringList.Create;
{Nestas linhas abaixo preparo o "Cabeçalho" da nossa Tabela}
  StringGrid1.Cells[0,0] := 'Hora';
  StringGrid1.Cells[1,0] := 'Dia';
  StringGrid1.Cells[2,0] := 'Diretorio';

{Chamos ao momento "mais" complexo do nosso artigo, 
onde vamos ter que fazer um Loop para poder varrer 
todo o TListBox e separar os dados em questão}

  for I := 0 to ListBox1.Items.Count - 1 do
  begin
{Logo abaixo você pode notar que uso propriedades bem 
simples mas de suma importancia, veja ao final do artigo
 a explicação para cada uma delas}

    Dados.Delimiter := '|';
    Dados.QuoteChar := ' ';
    Dados.StrictDelimiter := True;
{Aqui esta o "macete" do artigo, onde o TStringList irá receber
 apenas a linha que esta dentro do Loop, 0,1,2 e assim por diante}

    Dados.DelimitedText := ListBox1.Items.Strings[I];
{Neste momento estou fazendo uma coisa bem básica, pegando os dados 
separados e armazenando nas variáveis}
    Hora      := Dados[0];
    Dia       := Dados[1];
    Diretorio := Dados[2];

{Logo em seguida, vem o objetivo final do artigo, que é ilustrar os dados 
separados em cada linha e coluna do nosso TStringGrid. Observe que estou 
usando I+1, pois o nosso Loop começa com 0, mas esta linha definimos no 
começo do código para ser usada 
para o Cabeçalho. Atenção nisso!!!}

    StringGrid1.Cells[0,I+1] := Hora;
    StringGrid1.Cells[1,I+1] := Dia;
    StringGrid1.Cells[2,I+1] := Diretorio;

  end;

{Aqui abaixo eu usei um TMemo para quem quiser pegar um 
arquivo um pouco maior com mais "Colunas", o nosso tem apenas 3,
 "Colunas [Hora, Dia, Diretorio]".
Este código pode ser ignorado sem problemas algum observe que o 
mesmo esta comentado, quem quiser utilizar não esqueça de : 
Adicionar um TMemo e também declarar a variável J, ok ?
}

{    for J := 0 to Dados.Count-1 do
    begin
      Memo1.Lines.Add (Dados[J]);
    end;
    Memo1.Lines.Add ('=====================');

  end;    }

{Esta linha tem que ser mantida para poder liberar o Objeto Dados,
 criado no começo do Código.}

  Dados.Free;

end;

Vamos as explicações técnicas sobre alguns itens mencionados no código acima.

  • Delimiter - Geralmente é ",". Porém o nosso arquivo usamos o "|" para poder separar os dados de cada linha.
  • QuoteChar -Seria uma sequencia das strings sozinhas, ou seja, "Wesley Yamazack", seriam 2 itens.
  • StrictDelimiter - Quando false determina que o caractere de espaço também é interpretado como um delimitador, quando true não é interpretado
  • Delimiter …Serve para Separar a String em sequencias de Strings Individuas

Veja o resultado.

Formulário Funcionando

Figura 2. Formulário Funcionando.

Bom com isso finalizo este artigo, qualquer dúvida basta comentar no código.

Quem quiser enviar temas para novos artigos basta comentar em qualquer post ou então me enviar um e-mail direto.

Um abraço a todos!!!!