quinta-feira, 21 de março de 2013

Objeto TStringManager

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;