Na paleta Server do Delphi encontramos diversos componentes que per- mitem uma conexão COM (Components Object Model) com a família Office. O padrão COM, desenvolvido pela Microsoft, oferece mais recur- sos ao programador que o uso da OLE Automation. Com estes compo- nentes o programador pode automatizar tarefas utilizando recursos de outros programas.
É possível criar um relatório no Word e depois realizar alterações através de um programa feito em Delphi. Facilitando a vida de usuários que necessitam editar estes relatórios, criando uma personalização a partir de um documento padrão.
Como exercício inicial, iremos criar um documento no Word com o texto escrito no componente Memo do projeto Bloco de notas.
Abra o projeto Bloco de Notas construído anteriormente. Adicione um botão e os componentes WordApplication e WordDocument da paleta Server.
Digite o seguinte código para o botão de comando. procedure TfrmBlocoNotas.btnWordClick(Sender: TObject); var NomeArquivo: OLEVariant; begin
WA.Connect; //Inicializa o Word
WD.Activate; //Exibe o aplicativo Word WD.NewInstance; //Cria um novo documento WD.Content.InsertAfter(memTexto.Lines.Text); //Insere texto NomeArquivo:=‘C:\Temp\Bloco.doc’; //String em OLEVariant WA.ActiveDocument.SaveAs(NomeArquivo,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam);
WD.Close; //Fecha documento
end;
Inicialmente é dada a abertura do Word e depois cria-se um novo docu- mento. A procedure InsertAfter adiciona um texto o final do documento, mas poderia ser InsertBefore para texto antes.
Na lista de code completion é possível observar todos os procedimentos e funções associadas à cada um desses objetos. Na ajuda do WordBasic é possível encontrar detalhes sobre a operação de cada procdimento. A partir do Word abra o Editor do Visual Basic (Ferramentas >> Macro) e na sua ajuda procure por SaveAs, escolhendo a opção Método SaveAs. Note que este método requer a definição de onze parâmetros para salvar o arquivo. Mas para salvar o texto digitado no programa, é necessário apenas informar o nome do arquivo a ser salvo, mantendo os demais parâmetros vazios. Isto faz o Word manter os valores padrão para cada opção de salvamento.
Execute o programa. Digite algum texto no Memo e depois dê um clique no botão Word, notando que o texto será escrito no documento, salvo e depois fechado.
Segundo exemplo com o uso dos componentes COM para Word será feito com o programa de Banco de dados. Este programa terá um botão no formulário Vendas que ao ser clicado, abrirá um documento modelo, alterará algumas palavras, baseadas no pedido corrente, salvando o do- cumento com outro nome.
Abra o programa Banco de dados criado anteriormente, incluindo um componente WordApplication e um botão no formulário frmVendas.
No Word digite um documento semelhante ao mostrado na figura a se- guir, mantendo as palavras chave que serão substituídas pelo programa: DATAHOJE, NUMEROPEDIDO, NOMECLIENTE,PRODUTONOME, QUANTIDADEPRODUTO e VALORTOTAL. Salve este documento com o nome de Recibo.doc.
A maneira mais fácil de saber quais métodos implementar no programa em Delphi para efetuar as mudanças necessárias no texto, é criar uma macro no Word e depois editar e copiar no Code explorer traduzindo-a para a linguagem Object Pascal, pois ela estará em WordBasic.
Grave uma macro substituindo a palavra DATAHOJE por qualquer outra, pois o que nós desejamos é apenas a sintaxe utilizada pelo Word. A listagem a seguir mostra uma macro que substitui o texto DATAHOJE por “24 de Janeiro” com a opção de substituir todas.
Sub Macro1() ‘
‘Macro1 Macro
‘Macro gravada 24/07/00 por Jair ‘ Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = ”DATAHOJE” .Replacement.Text = ”24 de Janeiro” .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace=wdReplaceAll End Sub
Na unidade do formulário frmVendas, acrescente um procedimento cha- mado Substituir que terá por função substituir cada palavra do documen- to. Este procedimento receberá dois parâmetro que são o texto a ser substituído e o substituto.
Na implementação do procedimento Substituir, cole a macro gravada no Word.
Associe os métodos ao componente WordApplication (WA) e retire os métodos de limpeza da procura (ClearFormatting) que serão utilizados somente uma vez. A seguir, traduza para Object Pascal.
procedure btnReciboClick(Sender: TObject);
procedure Substituir(Texto, TextoSub: String);
private
{ Private declarations }
implementation
procedure TfrmVendas.Substituir(Texto, TextoSub: String); {Texto contém a palavra que será substituída e
TextoSub a substituta}
var
Repor: OLEVariant;
//Tipo de variável aceita nos métodos Word
begin
Repor:= wdReplaceAll;
//Constante definida em Word97.pas
with WA.Selection.Find do begin Text := Texto; Replacement.Text := TextoSub; Forward := True; Wrap := wdFindContinue;
//Constante definida em Word97.pas Format := False;
end; WA.Selection.Find.Execute(EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,Repor); end;
O evento OnClick do botão, abre o arquivo Recibo.doc, limpa as formatações de procura, chama o procedimento Substituir para cada campo do documento, atribuindo a eles os valores do registro corrente nas tabelas, e por último salva com outro nome e fecha o documento.
procedure TfrmVendas.btnReciboClick(Sender: TObject);
var NomeArquivo: OLEVariant; begin NomeArquivo:=’C:\Temp\Recibo.doc’; WA.Documents.Open(NomeArquivo,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam); WA.Selection.Find.ClearFormatting; WA.Selection.Find.Replacement.ClearFormatting; Substituir (‘DATAHOJE’,FormatDateTime (‘dd” de “mmmm” de “yyyy’,Date)); Substituir(‘NUMEROPEDIDO’,tblVendasNumero.Value); Substituir(‘NOMECLIENTE’,tblClientesNome.Value); Substituir(‘PRODUTONOME’,tblVendasProduto.Value); Substituir(‘QUANTIDADEPRODUTO’,tblVendasQuantidade.AsString); Substituir(‘VALORTOTAL’,tblVendasValor.AsString); NomeArquivo:=’C:\Temp\Recibo’ + tblVendasNumero.Value + ‘.doc’; WA.ActiveDocument.SaveAs(NomeArquivo,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam); WA.ActiveDocument.Close(EmptyParam,EmptyParam,EmptyParam); end;
Execute o programa e no formulário frmVendas, clique no botão Recibo para ver o Word abrir o documento, alterar o texto, salvar e fechar com outro nome.