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 |
| |
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