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. 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');
Str1.Items.Add('Quantas palavras tem o texto? chame GetWordList(seu texto) ');
npalavras:=0;
for nlinhas:=0 to Str1.Items.count-1 do
Begin
GetWordList(Str1.Items[nlinhas]);
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
TStringManager = class(TComponent)
private
Fwordlist: TStrings;
FItems: TStrings;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure GetWordList(str: String);
procedure SavetoFileEx(strfilename: String);
procedure AppendToFile(strfilename: String);
procedure setItems(Value: TStrings);
procedure ConvertToUnix(SourceFile, TargetFile: String);
protected
published
property WordList: TStrings Read FWordlist;
property Items: TStrings Read FItems Write setItems;
end;
constructor TStringManager.Create(AOwner: TComponent);
begin
inherited;
FWordList := TStringList.Create;
FItems := TStringList.Create;
end;
destructor TStringManager.Destroy;
begin
inherited;
end;
procedure TStringManager.getwordlist(str: string);
var
Count: integer;
i: integer;
len: integer;
s1: string;
begin
s1 := '';
FWordList.Clear;
len := length(str);
Count := 0;
i := 1;
while i <= len do
begin
while ((i <= len) and ((str[i] = #32) or (str[i] = #9) or (Str[i] = ';'))) do
Inc(i);
if i <= len then
Inc(Count);
while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
begin
s1 := s1 + str[i];
Inc(i);
end;
if s1 <> '' then
FWordList.Add(s1);
s1 := '';
end;
end;
procedure TStringManager.ConvertToUnix(SourceFile, TargetFile: string);
var
SAIDA: TFileStream;
Buffer: array[0..1] of char;
Entrada: TFileStream;
Lidos: integer;
begin
Entrada := TFileStream.Create(SourceFile, fmOpenRead);
SAIDA := TFileStream.Create(TargetFile, fmCreate);
repeat
Lidos := Entrada.Read(Buffer, 1);
if Buffer[0] = ''#13'' then
Continue;
SAIDA.Write(Buffer, Lidos);
until Lidos = 0;
Entrada.Free;
SAIDA.Free;
end;
procedure TStringManager.AppendToFile(strfilename: String);
var
FTextFile: TextFile;
x: integer;
begin
try
AssignFile(FTextFile, strfilename);
Append(FTextFile);
for x := 0 to FItems.Count - 1 do writeln(FTextFile, FItems[x]);
except
Showmessage('Problemas ao escrever em '+strfilename);
end;
CloseFile(FTextFile);
end;
procedure TStringManager.SavetoFileEx(strfilename: string);
var
FTextFile: TextFile;
x: integer;
begin
try
AssignFile(FTextFile, strfilename);
rewrite(FTextFile);
for x := 0 to FItems.Count - 1 do
writeln(FTextFile, FItems[x]);
except
Showmessage('Problemas ao escrever em '+strfilename);
end;
CloseFile(FTextFile);
end;
procedure TStringManager.setItems(Value: TStrings);
begin
if Items.Text <> Value.Text then
begin
Items.BeginUpdate;
try
Items.Assign(Value);
finally
Items.EndUpdate;
end;
end;
end;