|
Usuários |
|
76 Usuários Online
|
|
[Artigos]
[Básico] - DelimitedText CommandText Delimiter QuoteChar |
Publicado por rboaro : Segunda, Setembro 09, 2013 - 11:47 GMT-3 (349 leituras)
comentar Enviar para um amigo Versão para impressão
|
Antes de mais nada destaco que este artigo , não é um artigo técnico e tenta mostra os passos que envolvem estas propriedades da TString , tão comumentemente encontrada nos diversos códigos espalhados por aí. Vamos começar com uma pergunta clássica: Qual o Resultado de Showmessage(Lista.DelimitedText)?
A resposta é feita com uma pergunta : “O que foi Atribuida para Lista.DelimitedText ?”
Pergunta plausivel. Como saber o fim sem conhecer o começo, faz sentido. Mas só isto basta ?
Não! Não é só isto. Para recuperar o DelimitedText temos que definir previamente três parametros:
O Delimiter. Por padrão é “,” (Virgula)
O QuoteChar. Por padrão é “ (aspas)
O StrictDelimiter. Por padrão é False;
Qual a finalidade de cada um na Atribuição de DelimitedText?
Vamos começar pelo tão mais despercebido mas não menos importante que é a propriedade StrictDelimiter. Esta é talves é a mais simples de ser compreendida da três . Quando definida em False (Valor Padrão) determina que o caractere de espaço também é interpretado como um delimitador . Então passaremos a ter dois delimitadores . O Espaço e mais o que for definido pela propriedade Delimiter
Delimiter …Serve para Separar a String em sequencias de Strings Individuas
Agora ja visto esta duas definiçoes vejamos dois exemplos, logo logo veremos a terceira
Exemplo:
Lista.Delimiter:=’*';
Lista.StrictDelimiter:=False; //valor Padrão
Lista.DelimitedText:=’Marco * Antonio Salles’
Neste exemplo definimos Delimiter=’*’ ; StrictDelimiter=False (Padrao) e não definimos o QuoteChar. Por estar omitido o Delphi assumi o Valor = “ (Padrão) Vamos delimitar a String ( Marco * Antonio Salles ). Delimitar no sentido de Quebra-la em sequencia de Strings . Delimitando teremos Três Sequencias de Strings ou três cadeias de Strings Listadas abaixo :
> Marco
> Antonio
> Salles
Perceba que Salles e Antonio foram divididos pq o espaço tb contou como se fosse um Delimiter ja que propriedade StrictDelimiter esta definida como False.(obs)Para visualizar isto basta fazer um Showmessage(Lista.text) ou percorrer a lista com o comando for …
Agora Vamos fazer o mesmo Exemplo com a mesma String ( Marco * Antonio Salles ) porém definindo a propriedade StrictDelimiter=True .
Delimitando teremos duas sequencias de Strings Listadas abaixo que são
> Marco
> Antonio Salles
perceba que o espaço agora não conta mais e so temos um Delimeter que neste caso é o * (Asterisco)
Da mesma forma podemos Visalizar utilizando Showmessage(Lista.text) ou percorrer a lista com o comando for
Então o que o delimitexText faz é gerar uma sequencia de String ou cadeia de Strings a partir de uma String , seguindo é claro alguns critérios …
Nosso próximo passo passa será o Processo Inverso . Será Definir a String a partir de uma sequencia de String ou cadeia de Strings. Muitas das vezes temos necessidade de fazer este tipo de processo. Mas isto o Delphi ja Faz para Nos sem precisarmos digitar
quase nada . É apenas entender o processo inverso que envolve alguamas armadilhas , vamos a algumas delas .. Imagine a Lista
Lista.add(‘Marco ‘);
Lista.add(‘Antonio Salles’);
Se você prestar atenção , vai perceber que ja fizemos isto no processo Inverso. Isto é , geramos esta sequencia de String a partir da Definição de Lista.DelimitedText:=’Marco*Antonio Salles’ com a Propriedade StrictDelimiter definida em True … Então ja sabemos o que vai dar com propriedade StrictDelimiter definida em True , mas e se a propriedade StrictDelimiter for definida em false (Valor Padrão) O que iremos achar para a instrução abaixo :
ShowMessage(Lista.DelimitedText); Não podemos achar Marco*Antonio*Salles, porque no processo inverso geraria > Três sequencias de String (que é nosso primeiro Exemplo), e nos so temos duas sequencias de String ( o Objeto Lista foi definido somente com duas sequencias ). Como resolver este impasse?
A partir dai entra a propriedade QuoteChar da lista para definir o que se pode chamar de : sequencia de String individuais. Note bem esta definição : sequencia de String individuais. Neste caso é como se Antonio Salles fosse uma Unica String. E como seria esta definição ? o que fazer para o método entender que Antonio Salles
é uma unica String. Cercando a Sequencia de Strings pelo caracter da Propriedade QuoteChar que no por Padrão é "Aspas" , estamos dizendo ao método que elas tem que ficarem juntas
Então a String = Marco * “Antonio Salles” subtende-se que Antonio Salles incorpora uma única String. Lembre-se que isto so tem razão de ser quando a propriedade Lista.StrictDelimiter estiver definida em False , que é o caso que esta sendo tratado agora.
Pensem agora na seguinte situação
Lista.add(‘Marco’);
Lista.add(”);
Lista.Add(‘Antonio Salles’);
Qual seria a propriedade Lista.DelimitedText correspondente ????
Ja vimos que Para recuperar o DelimitedText temos que definir previamente três parametros: e especialmente o StrictDelimiter … Então vamos dividir este exemplo em duas situações
1) Caso
Lista.StrictDelimiter:=False; // espaço também é interpretado como um delimitador
Lista.delimiter:=’*';
Lista.QuoteChar:=’|';
Note que temos dois detalhes .. Como a String Antonio Salles esta junta temos que protege-lo do delimitador de espaço Isto é feito colocando o QuoteChar .. Mas é como atribuir uma String Vazia ??? Uma String vazia é ” . Porém no delphi ” equivale a “” . Então escrevemos o codigo :
Lista.DelimitedText:=’Marco*“”*“Antonio Salles“‘; mas como o QuoteChar foi definido para | é so substituir ficando então no final o seguinte
Lista.DelimitedText:=’Marco*||*|Antonio Salles|;
2)Caso
Lista.StrictDelimiter:=True; // espaço não é interpretado como delimitados
Lista.delimiter:=’*';
Lista.QuoteChar:=’|';
Nosso unico detalhe será atribuir a StringVazia … Ora , uma String Vazia é ” no delphi equivale a “” Então nosso codigo passa a ser
Lista.DelimitedText:=’Marco*“”*Antonio Salles’; mas como o QuoteChar foi definido para | é so substituir ficando no final o seguinte
Lista.DelimitedText:=’Marco*||*Antonio Salles’;
O Exemplo completo do Delphi segue abaixo:
procedure TForm6.Button5Click(Sender: TObject);
var
Lista:TStrings;
begin
Lista:=TStringList.Create;
//Definicoes gerais
Lista.delimiter:='*';
Lista.QuoteChar:='|';
//1)Caso
Lista.StrictDelimiter:=False;
Lista.DelimitedText:='Marco*| |*|Antonio Salles|';
Showmessage(Lista.Text); //Equivalente a
{lista.Add('Marco');
lista.Add(' ');
lista.Add('Antonio Salles');}
end;
//Segundo CASO
Lista.StrictDelimiter:=True;
Lista.DelimitedText:='Marco*||*Antonio Salles';
Showmessage(Lista.Text); //Equivalente a
{lista.Add('Marco');
lista.Add(' ');
lista.Add('Antonio Salles');}
Lista.Free;
end;
Como disse no artigo desde do inicio , não é nada tecnico , mas tentei passar um pouco destas propriedades do Delphi que são muito úteis. Não foi comentado sobre o CommandText , por questões de simplicidade , por se tratar de um
caso particular do DelimitedText na situaçao em que :
CommandText = DelimitedText para
Lista.StrictDelimiter:=True;
Lista.delimiter:=’,';
Lista.QuoteChar:=’”‘;
Vale ainda lembrar que existe uma função ExtractStrings da Unit Classes que retona a partir de uma String as Substrings com a seguinte definiçao:
function ExtractStrings(Separators, WhiteSpace: TSysCharSet;
Content: PChar;Strings: TStrings): Integer;
Separator – É um array onde você pode definir vários separadores
WhiteSpace – É um Array onde você define os caracteres que devem ser Ignorados quando ocorrerem no inicio da String.
Content – É a String de onde se deseja extrais as substrings.
E a Função ainda retorna o número de Substrings extraídas.
A sua aplicação não será vista neste neste Tuto , por não ser nosso objetivo. Ficamos por aqui , meus agradecimentos e espero ter sido útil . Meu muito obrigado Link Original do Artigo: http://marcosalles.wordpress.com/2011/02/01/delimitedtext-commandtext-delimiter-quotechar-que-coisa-complicada/
|
|
Comentários | |
| | Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|