Objeto TStringManager
Autor: Isaac Trindade | Publicado: 2013-03-21T08:29:00-07:00


Objeto TStringManager

Olá a todos

Nas próximas semanas estarei postando no dicas4lazarus alguns objetos/classes desenvolvidos por mim.

São objetos simples, que eu escrevi para automatizar algumas tarefas realizadas diariamente.

No exemplo de hoje, veremos o TStringManager.


Descrição

O TStringManager é apenas um TStringlist com algumas funções especiais que eventualmente utilizamos para facilitar certas tarefas como adicionar conteudo a um arquivo ja existente, contar as palavras, e salvar no formato unix.

O método SaveToFileEx faz a mesma coisa que o SaveToFile. Porém, em alguns casos, o SaveFile do TStringList não salva no disco e não retorna erro, como no caso em que não tem permissão de escrita no disco. Usando o 
SaveToFileEx, se não tiver permissão, retornará um erro.


Utilização

Para usar o TStringManager, basta adicionar ao seu form e utiliza-lo como se fosse um Itens de um TListBox


Métodos

GetWordList(str: String) 

Retorna um TStringList com a lista de palavras passada no parametro str.&nbsp; Use esse método em conjunto com a propriedade WordList.

SavetoFileEx(strfilename: String)

Identico ao Savetofile, porem retorna erro em caso de falhas.

AppendToFile(strfilename: String)

Salva o texto em um arquivo já existente, adicionando no final do arquivo informado em strfilename. 

ConvertToUnix(SourceFile, TargetFile: String)

Função para converter um arquivo do formato windows para o linux.



Propriedades

WordList

Contem a lista de palavras criada pelo método GetWordList.

Items

Manipulador do TStringList.




Exemplo de uso:

var
Str1:TStringManager;
npalavras:Integer;
nlinhas:Integer;
begin
Str1:TStringManager.Create(self);

Str1.Items.Add('Exemplo simples de como utilizar o TStringManager');
Str1.Items.Add('Veremos como salvar o texto em um arquivo');
Str1.Items.Add('E tambem como adicionar o texto em um arquivo ja existente');
&nbsp;Str1.Items.Add('Quantas palavras tem o texto? chame GetWordList(seu texto) '); 


npalavras:=0;
for nlinhas:=0 to Str1.Items.count-1 do
Begin
&nbsp; &nbsp;&nbsp; GetWordList(Str1.Items[nlinhas]); 
&nbsp; &nbsp;&nbsp; npalavras:=npalavras+ WordList.count;
end;

ShowMessage('O texto contem '+inttostr(npalavras)+' palavras');


//Salvando em um novo arquivo 
Str1.SavetoFileEx('exemplo.txt'); 

Str1.Items.Add('Texto adicionado em arquivo ja existente');

//Salvando em um arquivo ja existente (append)
//No exemplo, irá adicionar o mesmo texto 3 vezes no arquivo exemplo.txt
Str1.AppendtoFile('exemplo.txt'); 
Str1.AppendtoFile('exemplo.txt');
Str1.AppendtoFile('exemplo.txt'); 


Str1.free;


end;


Segue abaixo o codigo fonte. Espero que seja util.

Até a próxima.



Codigo fonte


type
&nbsp; TStringManager = class(TComponent)
&nbsp; private
&nbsp;&nbsp;&nbsp; Fwordlist: TStrings;
&nbsp;&nbsp;&nbsp; FItems: TStrings;
&nbsp; public
&nbsp;&nbsp;&nbsp; constructor Create(AOwner: TComponent); override;
&nbsp;&nbsp;&nbsp; destructor Destroy; override;
&nbsp;&nbsp;&nbsp; procedure GetWordList(str: String);
&nbsp;&nbsp;&nbsp; procedure SavetoFileEx(strfilename: String);
&nbsp;&nbsp;&nbsp; procedure AppendToFile(strfilename: String);
&nbsp;&nbsp;&nbsp; procedure setItems(Value: TStrings);
&nbsp;&nbsp;&nbsp; procedure ConvertToUnix(SourceFile, TargetFile: String);

&nbsp; protected
&nbsp; published
&nbsp;&nbsp;&nbsp; property WordList: TStrings Read FWordlist;
&nbsp;&nbsp;&nbsp; property Items: TStrings Read FItems Write setItems;
&nbsp; end;

constructor TStringManager.Create(AOwner: TComponent);
begin
&nbsp; inherited;
&nbsp; FWordList := TStringList.Create;
&nbsp; FItems := TStringList.Create;
end;

destructor TStringManager.Destroy;
begin
&nbsp; inherited;
end;

procedure TStringManager.getwordlist(str: string);
var
&nbsp; Count: integer;
&nbsp; i: integer;
&nbsp; len: integer;
&nbsp; s1: string;
begin
&nbsp; s1 := '';
&nbsp; FWordList.Clear;
&nbsp; len := length(str);
&nbsp; Count := 0;
&nbsp; i := 1;
&nbsp; while i &lt;= len do
&nbsp; begin
&nbsp;&nbsp;&nbsp; while ((i &lt;= len) and ((str[i] = #32) or (str[i] = #9) or (Str[i] = ';'))) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inc(i);
&nbsp;&nbsp;&nbsp; if i &lt;= len then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inc(Count);
&nbsp;&nbsp;&nbsp; while ((i &lt;= len) and ((str[i] &lt;&gt; #32) and (str[i] &lt;&gt; #9) and (Str[i] &lt;&gt; ';'))) do
&nbsp;&nbsp;&nbsp; begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s1 := s1 + str[i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inc(i);
&nbsp;&nbsp;&nbsp; end;
&nbsp;&nbsp;&nbsp; if s1 &lt;&gt; '' then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FWordList.Add(s1);
&nbsp;&nbsp;&nbsp; s1 := '';
&nbsp; end;

end;

procedure TStringManager.ConvertToUnix(SourceFile, TargetFile: string);
var
&nbsp; SAIDA: TFileStream;
&nbsp; Buffer: array[0..1] of char;
&nbsp; Entrada: TFileStream;
&nbsp; Lidos: integer;
begin
&nbsp; Entrada := TFileStream.Create(SourceFile, fmOpenRead);
&nbsp; SAIDA := TFileStream.Create(TargetFile, fmCreate);
&nbsp; repeat
&nbsp;&nbsp;&nbsp; Lidos := Entrada.Read(Buffer, 1);
&nbsp;&nbsp;&nbsp; if Buffer[0] = ''#13'' then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Continue;
&nbsp;&nbsp;&nbsp; SAIDA.Write(Buffer, Lidos);
&nbsp; until Lidos = 0;
&nbsp; Entrada.Free;
&nbsp; SAIDA.Free;
end;

procedure TStringManager.AppendToFile(strfilename: String);
var
&nbsp; FTextFile: TextFile;
&nbsp; x: integer;
begin
&nbsp; try
&nbsp; AssignFile(FTextFile, strfilename);
&nbsp; Append(FTextFile);
&nbsp; for x := 0 to FItems.Count - 1 do writeln(FTextFile, FItems[x]);
&nbsp; except
&nbsp; Showmessage('Problemas ao escrever em '+strfilename);
&nbsp; end;
&nbsp; CloseFile(FTextFile);

end;

procedure TStringManager.SavetoFileEx(strfilename: string);
var
&nbsp; FTextFile: TextFile;
&nbsp; x: integer;
begin
&nbsp; try
&nbsp; AssignFile(FTextFile, strfilename);
&nbsp; rewrite(FTextFile);
&nbsp; for x := 0 to FItems.Count - 1 do
&nbsp;&nbsp;&nbsp; writeln(FTextFile, FItems[x]);
&nbsp; except
&nbsp; Showmessage('Problemas ao escrever em '+strfilename);
&nbsp; end;
&nbsp; CloseFile(FTextFile);
end;

procedure TStringManager.setItems(Value: TStrings);
begin
&nbsp; if Items.Text &lt;&gt; Value.Text then
&nbsp; begin
&nbsp;&nbsp;&nbsp; Items.BeginUpdate;
&nbsp;&nbsp;&nbsp; try
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Items.Assign(Value);
&nbsp;&nbsp;&nbsp; finally
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Items.EndUpdate;
&nbsp;&nbsp;&nbsp; end;
&nbsp; end;

end;