Gerando documentos RTF com TPageProducer.

É só para web? Não! Vamos resolver problemas com soluções

 

Estes dias respondi em um fórum uma pergunta de um participante, indicando problemas para gerar um relatório no QuickReport quando o relatório tem mais de uma página. Note que possivelmente o texto do relatório estará incluído dentro do seu executável. Isto é muito ruim para processos de manutenção. A solução para a pergunta acima pode ser usando o componente para imprimir mais de um relatório no QuickReport (TQRmpositeReport), mas isto é assunto para outra coluna. Vou mostrar como resolver este tipo de problema usando o componente TPageProducer.

TPageProducer está na aba Web. Não é só para aplicações web?

A resposta é não. O TPageProducer é um componente extremamente simples, mas extremamente útil para qualquer processo de troca de marcações em arquivos em formato Texto. Um arquivo RTF (Rich Text Format) é baseado em uma linguagem de marcação, como ocorre com o HTML,por exemplo.

O objetivo deste artigo é mostrar como usar o TPageProducer para modificar o conteúdo de um documento RTF que possui marcações, como as que colocamos em nossas páginas de internet.

O documento de teste

Veja na Figura 1 o documento que foi editado no WordPad e salvo em formato RTF.

 

Figura 1 Documento editado com o Wordpad. Veja as Tags transparentes no texto <#tag>

Com o componente TPageProducer, podemos indicar tags dentro do documento. Estas tags iniciam com “<#” e são seguidas de uma identificação, que é o nome da tag. São terminadas com o caractere “>”. Exemplo: <#usuario>.

As tags também podem possuir parâmetros. Veja na figura 1 o exemplo da tag data, que possui o parâmetro formato. Isto permite personalizar ainda mais as informações que serão processadas pela aplicação Delphi, dando mais liberdade a solução.

Iremos agora mostrar os passos para construir a aplicação de teste, que vai manipular um documento RTF (modelo) e gerar um outro documento.

Criando a aplicação de Teste

Coloque os componentes abaixo em um formulário para construir a aplicação que temos na Figura 2:

Componente

Propriedade

Valor

TForm

Name

FrmPrincipal

Caption

Gerando RTF com TPageProducer

TLabeledEdit

Name

EdTitulo

EditLabel.Caption

Título

TLabeledEdit

Name

EdUsuario

EditLabel.Caption

Usuário

TLabeledEdit

Name

EdEMail

EditLabel.Caption

E-Mail

TLabeledEdit

Name

EdDataContato

EditLabel.Caption

Data de Contato

TLabeledEdit

Name

EdArquivoBase

EditLabel.Caption

Arquivo Base

TButton

Name

BtnProcurarArquivoBase

Caption

Procurar

TLabeledEdit

Name

EdPastaSaida

EditLabel.Caption

Pasta Saída

TButton

Name

BtnProcurarPastaSaida

Caption

Procurar

TButton

Name

BtnGerar

Caption

Gerar

TOpenDialog

Name

OpenDialog

Title

Escolha arquivo RTF

Filter

Arquivos RTF (*.rtf)|*.rtf

TPageProducer

Name

PageProducer

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Figura 2 Tela construída para testar a geração de arquivo RTF via componente TPageProducer

Agora temos que escrever um pouco de código. Vamos começar com o evento OnCreate do Formulário, disponível na Listagem 1, para inicializar alguns componentes da interface.

 

Listagem 1: Evento OnCreate do formulário

procedure TFrmPrincipal.FormCreate(Sender: TObject);

begin

  EdArquivoBase.Text :=

     ExtractFilePath(Application.ExeName)+'base\teste.rtf';

  EdPastaSaida.Text :=

     ExtractFilePath(Application.ExeName)+'saida\';

  OpenDialog.InitialDir :=

     ExtractFilePath(Application.ExeName)+'base\';

  EdDataContato.Text := FormatDateTime('dd/mm/yyyy hh:nn', now);

end;

 

Com isto os caminhos dos arquivos base para rodar a aplicação estarão pré-configurados, assim como o campo com a data de contato.

Caso o usuário queira selecionar outro arquivo de base para trocar as variáveis, vamos abrir um diálogo para permitir esta seleção. Veja isto na Listagem 2.

 

Listagem 2: Evento OnClick do botão BtnProcurarArquivoBase

procedure TFrmPrincipal.BtnProcurarArquivoBaseClick(Sender: TObject);

begin

  if((OpenDialog.Execute)and

     (FileExists(OpenDialog.FileName))) then

    EdArquivoBase.Text := OpenDialog.FileName;

end;

 

Outra configuração que pode ser feita se refere à pasta para saída do formulário. Veja o ccódogo para permitir a troca desta, na Listagem 3.

 

Listagem 3: Evento OnClick do botão BtnProcurarPastaSaida

procedure TFrmPrincipal.BtnProcurarPastaSaidaClick(Sender: TObject);

var

  pasta : String;

begin

  pasta := EdPastaSaida.Text;

  if(SelectDirectory(pasta,

     [sdAllowCreate, sdPerformCreate, sdPrompt],1000)) then

    EdPastaSaida.Text := pasta;

end;

Vamos ao que interessa! Geração do documento!

Vamos ao código referente ao botão de geração e depois o código mais importante, referente ao TPageProducer, que fará a troca das informações configuradas no documento RTF.

Veja o código que vai controlar a geração do novo arquivo na Listagem 4.

 

Listagem 4: Evento OnClick do botão BtnGerar

procedure TFrmPrincipal.BtnGerarClick(Sender: TObject);

var TextoResultado : TStringList;

    NomeArquivoSaida : String;

begin

  PageProducer.HTMLFile := EdArquivoBase.Text;

  TextoResultado := TStringList.Create;

  NomeArquivoSaida := IncludeTrailingPathDelimiter(

                         EdPastaSaida.Text) +

                         FormatDateTime('yyyymmddhhnnsszzz',now) +

                         '_' + EdTitulo.Text + '.rtf';

  try

    TextoResultado.Text := PageProducer.Content;

    TextoResultado.SaveToFile(NomeArquivoSaida);

  finally

    TextoResultado.Free;

  end;

end;

 

Este código vai gerar um novo documento na pasta de saída, seguindo o padrão montado na variável NomeArquivoSaida. Se você mandar gerar um arquivo agora, somente com o código que fizemos até o momento, vai verificar que o arquivo está igual ao arquivo base, mas tocas marcações como por exemplo a <#usuario>, não estão mais incluídas no arquivo. Isto porque o Delphi processou as tags, mas não encontrou o código para dar um novo valor a estas tags.

Para podermos escrever este processo, iremos utilizar o evento OnHTMLTag do componente TPageProducer. Vejamos a Listagem 5 com este código, o mais importante desta dica.

 

Listagem 5: Evento OnHTMLTag do componente PageProducer

procedure TFrmPrincipal.PageProducerHTMLTag(Sender: TObject; Tag: TTag;

  const TagString: String; TagParams: TStrings; var ReplaceText: String);

begin

  if(TagString = 'titulo') then

    ReplaceText := EdTitulo.Text;

  if(TagString = 'usuario') then

    ReplaceText := EdUsuario.Text;

  if(TagString = 'email') then

    ReplaceText := EdEMail.Text;

  if(TagString = 'data') then

  begin

    if(TagParams.Values['formato'] <> '') then

      ReplaceText := FormatDateTime(TagParams.Values['formato'],

       StrToDateTime(EdDataContato.Text))

    else

    ReplaceText := EdDataContato.Text;

  end;

end;

 

Feito isto o nosso aplicativo para gerar documentos RTFs usando o componente TPageProducer está pronto. Você pode agora montar aquele processo para geração de contratos usando este tipo de solução, extremamente simples.

Baixe o código fonte com esta aplicação pronta para uso.

Conclusões

Verificamos mais um uso para o componente TPageProducer, para processar arquivos do tipo Rich Text Format, os RTF. Agora é com você, crie novas soluções a partir deste exemplo.

Clique Aqui para fazer o download