TStrToken

Home > Delphi > TMemoLog > TStrToken > unit ImgWrapper > Download

Esta classe foi feita originalmente para processar filtros de diálogos que carregam/salvam arquivos, mas depois acabou crescendo e agora ela faz muito mais do que isso, embora ainda seja muito boa para manipular filtros para arquivos,

Tokens
É comum ter que processar strings com **"tokens"**. Estes tokens são na prática sub-strings dentro da string, separados por algum caracter separador. Por exemplo em uma linha de texto, as palavras podem ser consideradas "tokens" se o espaço for considerado um separador. Alguns aplicativos são capazes de exportar registros, listas, tabelas, planilhas ou outras estruturas de dados em arquivos texto. Quase sempre estes arquivos contém linhas "tokenizadas".

O uso desta classe é bem simples, basta associar a string que será manipulada e indicar qual é o separador de tokens no momento de instanciar a classe. Depois disso é possível acessar cada token individualmente e acrescentar, modificar, inserir, remover ou ordenar os tokens da string associada.

A string que será processada precisa existir em uma variável externa, já que a classe não copia essa string para nenhuma variável interna. O que a classe faz é armazenar uma referência (ponteiro) para a string, então todo o processamento é feito na própria string fornecida. É por isso que o construtor da classe usa um parâmetro **var ** para a string.

O fato da classe usar uma referência à string em vez de fazer uma cópia dela, acelera o processamento porque evita a necessidade de copiar a string, que eventualmente pode ser bem longa: até 2 bilhões de caracteres unicode ou 4 bilhões de caracteres ascii. É um mecanismo prático e eficiente, mas exige que o programador tenha o cuidado de não alterar a string fora da classe, porque isso invalida todo o controle dos tokens.

Quick start
A classe tem alguns recursos um pouco mais avançados, mas o uso básico é realmente muito simples. A string que contém ou irá conter os tokens precisa existir em uma variável que persista durante toda a vida do objeto. Essa string deve ser associada ao objeto e o separador de tokens indicado no momento da construção. Depois disso já é possível acessar os tokens pela propriedade Token ou editar os tokens usando os métodos oferecidos. Na maior parte dos casos nem é preciso ter uma variável de referência, é possível usar objetos anônimos como no exemplo abaixo: code format="pascal" procedure LogOpenPictureFilter(Memo: TMemo); var flt: string; i: integer; begin // Obtem o filtro para leitura de imagens with TOpenPictureDialog.Create(nil) do try flt:= Filter; finally Free; end;

// Loga o filtro no memo, um token por linha with TStrToken.Create(flt, '|') do try for i:= 0 to tkCount-1 do     Memo.Lines.Add(Token[i]); finally Free; end; end;

code

Construção

 * type TokenizedStr = string; **


 * constructor Create(var str: TokenizedStr; Separator: char); **

Construtor da classe. O construtor percorre a string e monta toda a estrutura necessária para acesso dos tokens. Uma //"tokenized string"// é uma string que contém sub-strings (tokens) separadas pelo caracter informado em **Separator**. Por exemplo, supondo que o separador seja o caracter **'|', ** um exemplo de "tokenized string" seria **'aaa|bbb|ccc' **, que contém 3 tokens, respectivamente **'aaa'**, **'bbb'** e **'ccc'**., indexados de 0 a 2. A classe considera que o caracter separador é realmente algo que separa dois tokens. Para cada caracter separador na string, serão gerados sempre dois tokens, um antes e outro depois do caracter. Portanto a string **'|aaa|bbb|ccc' ** produz 4 tokens, sendo que o primeiro é vazio. Separadores em sequência também produzem tokens vazios. Por exemplo a string **'aaa|||ccc' ** produz 4 tokens, com dois tokens vazios entre **'aaa'** e **'ccc'**.

Acesso aos tokens
Permite acessar os tokens como se estivessem em um array. O primeiro tem o índice 0 (zero) e o último o índice **tkCount-1**. Além de ler, também é possível modificar os tokens através desta propriedade, bastando atribuir o novo valor.
 * property Token[index:integer]: string; default; **


 * property tkCount: integer; **

Retorna a quantidade de tokens na string. Apenas para leitura.

Este método realmente zera a string e o controle interno de tokens. Use com sabedoria.
 * procedure tkClear; **

Adiciona um token no final. O método já cuida de colocar o separador quando necessário. Retorna o índice do token na string.
 * function tkAdd(tok: string): integer; overload; **

Adiciona uma lista de tokens no final da string. Retorna a quantidade de tokens adicionados.
 * function tkAdd(tokens: TStrings): integer; overload; **

Deleta o token com o índice informado por index.
 * procedure tkDel(index: integer); **

Insere um token na posição informada por index.
 * procedure tkInsert(index: integer; tok: string); **

Acrescenta os tokens presentes na string TokenStr.
 * procedure tkAddTokens(TokenStr: TokenizedStr); **

Retorna um grupo (sequência) de tokens iniciando no token indicado por **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 130%;">startIndex **<span style="color: #000080; font-family: Arial,Helvetica,sans-serif; font-size: 130%;">, com a quantidade de tokens indicados por **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 130%;">GroupSize **<span style="color: #000080; font-family: Arial,Helvetica,sans-serif; font-size: 130%;">.
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 130%;">function getTokenGroup(startIndex, GroupSize: integer): string; **

Ordena os tokens em ordem alfabética (lexicográfica) crescente. Se **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 130%;">GroupSize ** for diferente de 1 então os tokens são agrupados antes de serem ordenados.
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 130%;">procedure tkSort(GroupSize:integer=1); **

Dá suporte à listas de strings. Esta propriedade pode facilitar bastante o uso da classe, mas exige alguns cuidados. Quando esta propriedade é acessada para leitura, a lista de strings retornada foi criada especialmente para isso (para ser retornada). Portanto é responsabilidade do programa liberar essa lista quando não é mais necessária.
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 130%;">property AsStringList: TStringList; **

Ao escrever nesta propriedade, tenha em mente que todo o conteúdo anterior da string será perdido. A string conterá apenas os tokens presentes na lista. Para adicionar uma lista de strings sem perder o conteúdo anterior use o método **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 130%;">tkAdd **.