Imprimir contrato !

Delphi

08/11/2003

Pessoal estou precisando imprimir um contrado que nele tenhas as variaveis como nome, endereço etc...Como faço para imprimir isso ?
No Qreport tem jeito ???

grato


Michel

Michel

Curtidas 0

Respostas

Edilcimar

Edilcimar

08/11/2003

isto dá trabalho, mas vale a pena pois sai exatamente como vc quer
Variaveis Linha, coluna : integer
indicev, indiceH : real;


Linha := 0;
Coluna := 0;
IndiceV := Printer.PageHeight / 2016;
IndiceH := Printer.PageWidth / 960;
Estas duas linhas fazem com que se calcule o valor a ser utilizado pela impressora independentemente da resolução da mesma, para imprimir uma folha oficio.
With table1 do // serve para imprimir todos os dados da tabela
begin
with printer.canvas do
begin
If linha = 0 then
begin
Font.size := 10;
Coluna := 0;
TextOut(Coluna,Linha,´Cliente´);
Coluna := Round(300 * IndiceH);
TextOut(Coluna,Linha,´Telefone´);
Linha := Linha + (30 * IndiceV);
end;
Font.Size := 9;
Coluna := 0;
NomeCliente := FieldByName(´NOME´).AsString;
TextOut(Coluna, Linha, NomeCliente);
Coluna := 290 * IndiceH;
FoneCliente := FieldByName(´FONE´).AsString;
TextOut(Coluna,Linha,FoneCliente);
Linha := Linha + 20;
If Linha > 1900 then
Begin
Linha := 0;
Printer.NewPage;
End;
Next;
End;

Teste o posicionamento das colunas em uma impressora e depois estará feito


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

08/11/2003

Colega,

Neste caso, eu prefiro utilizar OleAutomation com o Word, pois proporciona maior flexibilidade para o cliente, pois permite que ele altere cláusulas, formatação, etc, sem a necessidade de intervenção do Desenvolvedor.


GOSTEI 0
Michel

Michel

08/11/2003

MAs no word tem como eu colocar tipo assim um modelo ja deixando o contrato pronto e depois so colocar as variaveis ??? se tiver ~será q vc(s) nao sabem de alguma referencia para que eu possa fazer isso, por que estou precisando e nao sei por onde comecar !!

Muito obrigado

Michel


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

08/11/2003

Colega,

É extamente a isto que me refiro. Vou disponibilizar um modelo hoje a noite.


GOSTEI 0
Michel

Michel

08/11/2003

Obrigado Aroldo

No aguardo !!


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

08/11/2003

Colega,

Segue um exemplo de uma pequena aplicação para impressão de contrato de um sistema de factoring:

function TFormContratante.CrieObjeto(const ClasseNome: String): IDispatch;
var Classifique_Id: TGUID;
    Desconhecido: IUnknown;
begin
  Classifique_ID:=ProgIdToClassId(ClasseNome);
  if Succeeded(GetActiveObject(Classifique_ID, nil, Desconhecido)) then
    OleCheck(desconhecido.QueryInterface(Idispatch, Result))
  else
    Result:=CreateOleObject(ClasseNome);
end;

procedure TFormContratante.btnContratoClick(Sender: TObject);
var Doc: Variant;
begin
Word2k := CrieObjeto(´Word.Application´);
  Doc := Word2k.Documents.Open(´c:\dados\factoring\contrato de factoring.doc´);

  // Contratante
  Doc.Content.Find.Execute(FindText := ´@01´, ReplaceWith := tbCadastroCED_NOME.Value);
  Doc.Content.Find.Execute(FindText := ´@02´, ReplaceWith := tbCadastroCED_DENOM.Value);
  Doc.Content.Find.Execute(FindText := ´@03´, ReplaceWith := tbCadastroCED_RAMO.Value);
  Doc.Content.Find.Execute(FindText := ´@04´, ReplaceWith := MascaraCNPJ(tbCadastroCED_CGC.Value));
  Doc.Content.Find.Execute(FindText := ´@05´, ReplaceWith := tbCadastroCED_INSCRI.Value);
  Doc.Content.Find.Execute(FindText := ´@06´, ReplaceWith := tbCadastroCED_ENDERE.Value);
  Doc.Content.Find.Execute(FindText := ´@07´, ReplaceWith := tbCadastroCED_BAIRRO.Value);
  Doc.Content.Find.Execute(FindText := ´@09´, ReplaceWith := tbCadastroCED_CIDADE.Value);
  Doc.Content.Find.Execute(FindText := ´@10´, ReplaceWith := tbCadastroCED_ESTADO.Value);
  Doc.Content.Find.Execute(FindText := ´@11´, ReplaceWith := MascaraCEP(tbCadastroCED_CEP.Value));
  Doc.Content.Find.Execute(FindText := ´@12´, ReplaceWith := tbCadastroCED_TELEFO.Value);
  Doc.Content.Find.Execute(FindText := ´@13´, ReplaceWith := tbCadastroCED_FAX.Value);

  // Corpo do contrato - Procuradores

  Doc.Content.Find.Execute(FindText := ´@50´, ReplaceWith := tbCadastroCED_CTO_P1.Value);
  Doc.Content.Find.Execute(FindText := ´@51´, ReplaceWith := tbCadastroCED_CTO_P2.Value);
  Doc.Content.Find.Execute(FindText := ´@54´, ReplaceWith := FormatDateTime( ´"Brasília-DF," dd "de" mmmm "de" yyyy´, tbCadastroCED_CTO_DT.Value));

  // Representante do contratante

  qPesquisa.Close;
  qPesquisa.ParamByName(´CODIGO´).AsInteger:= tbCadastroCED_REPRE.AsInteger;
  qPesquisa.Open;

  Doc.Content.Find.Execute(FindText := ´@14´, ReplaceWith := qPesquisaCED_NOME.Value);
  Doc.Content.Find.Execute(FindText := ´@15´, ReplaceWith := MascaraCNPJ(qPesquisaCED_CGC.Value));
  Doc.Content.Find.Execute(FindText := ´@16´, ReplaceWith := qPesquisaCED_INSCRI.Value);
  Doc.Content.Find.Execute(FindText := ´@17´, ReplaceWith := qPesquisaCED_RAMO.Value);
  Doc.Content.Find.Execute(FindText := ´@18´, ReplaceWith := qPesquisaCED_ENDERE.Value);
  Doc.Content.Find.Execute(FindText := ´@19´, ReplaceWith := qPesquisaCED_BAIRRO.Value);
  Doc.Content.Find.Execute(FindText := ´@20´, ReplaceWith := qPesquisaCED_CIDADE.Value);
  Doc.Content.Find.Execute(FindText := ´@21´, ReplaceWith := qPesquisaCED_ESTADO.Value);
  Doc.Content.Find.Execute(FindText := ´@22´, ReplaceWith := MascaraCEP(qPesquisaCED_CEP.Value));
  Doc.Content.Find.Execute(FindText := ´@23´, ReplaceWith := qPesquisaCED_TELEFO.Value);


  // Fiador

  qPesquisa.Close;
  qPesquisa.ParamByName(´CODIGO´).AsInteger:= tbCadastroCED_FIADOR.AsInteger;
  qPesquisa.Open;

  Doc.Content.Find.Execute(FindText := ´@24´, ReplaceWith := qPesquisaCED_NOME.Value);
  Doc.Content.Find.Execute(FindText := ´@25´, ReplaceWith := MascaraCNPJ(qPesquisaCED_CGC.Value));
  Doc.Content.Find.Execute(FindText := ´@26´, ReplaceWith := qPesquisaCED_INSCRI.Value);
  Doc.Content.Find.Execute(FindText := ´@27´, ReplaceWith := qPesquisaCED_RAMO.Value);
  Doc.Content.Find.Execute(FindText := ´@28´, ReplaceWith := qPesquisaCED_CIVIL.Value);
  Doc.Content.Find.Execute(FindText := ´@29´, ReplaceWith := qPesquisaCED_ENDERE.Value);
  Doc.Content.Find.Execute(FindText := ´@30´, ReplaceWith := qPesquisaCED_BAIRRO.Value);
  Doc.Content.Find.Execute(FindText := ´@31´, ReplaceWith := qPesquisaCED_CIDADE.Value);
  Doc.Content.Find.Execute(FindText := ´@32´, ReplaceWith := qPesquisaCED_ESTADO.Value);
  Doc.Content.Find.Execute(FindText := ´@33´, ReplaceWith := MascaraCEP(qPesquisaCED_CEP.Value));
  Doc.Content.Find.Execute(FindText := ´@34´, ReplaceWith := qPesquisaCED_TELEFO.Value);

  // Conjuge

  Doc.Content.Find.Execute(FindText := ´@35´, ReplaceWith := qPesquisaCED_CJ_NM.Value);
  Doc.Content.Find.Execute(FindText := ´@36´, ReplaceWith := MascaraCNPJ(qPesquisaCED_CJ_CPF.Value));
  Doc.Content.Find.Execute(FindText := ´@37´, ReplaceWith := qPesquisaCED_CJ_RG.Value);
  Doc.Content.Find.Execute(FindText := ´@38´, ReplaceWith := qPesquisaCED_CJ_PRO.Value);

  Doc.Content.Find.Execute(FindText := ´@52´, ReplaceWith := Concat(FloatToStrF(rxLimiteCredito.Value,ffNumber,15,2),´ (´,DinExtenso(rxLimiteCredito.Value),´)´));
  Doc.Content.Find.Execute(FindText := ´@53´, ReplaceWith := Concat(FloatToStrF(rxPromissoria.Value,ffNumber,15,2),´ (´,DinExtenso(rxPromissoria.Value),´)´));


  Word2k.Visible := true;
end;



GOSTEI 0
Michel

Michel

08/11/2003

Aroldo Obrigado vou testar amanha na firma!!

Michel Steev


GOSTEI 0
Michel

Michel

08/11/2003

Aroldo desculpa estar te encomodando, mas o meu estádando erro nesta linha. eu tenho q declararalgu coisa ??

[Error] Unit1.pas(30): Undeclared identifier: ´ProgIdToClassId´


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

08/11/2003

Olá Aroldo ou algum companheiro,

desculpe o aborrecimento, mas vc deu um exemplo na lista de um modelo de
contrato com campos ( marcações...não ao certo ) e gostaria de saber se
seria pedir muito um modelo já feito no Word, pois nunca fiz e nem sei por
onde começar...

estou necessitando deste tipo de material para um programa de academia de um
amigo...

fico grato,

valeu.

Fábio Cavalcanti


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

08/11/2003

Colega,

 Doc.Content.Find.Execute(FindText := ´@01´, ReplaceWith := tbCadastroCED_NOME.Value);


Na linha acima, o delphi vai procurar no documento do Word pela constante @01 (independente de onde esteja no documento) e substituir pelo conteúdo de tbCadastroCED_NOME.Value.


GOSTEI 0
Michel

Michel

08/11/2003

Cavalcante ou aroldo, desculpe a minha ignorancia mas eu nao estou coneguindo colocar o codigo para rodar...tenho q colocar algum componente ou declarar alguma coisa no USES..

Obrigado :wink:


GOSTEI 0
Fred

Fred

08/11/2003

Aroldo só uma pergunta: O que seria este Word2k??? uma variavel?? um componente?? O que??? :?


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

08/11/2003

Colegas,

Declare na lista de uses: ComObj e ActiveX.

Complementando o código:

var
  FormContratante: TFormContratante;
  Word2k: Variant;

implementation

uses Funcoes, Geral;



GOSTEI 0
Michel

Michel

08/11/2003

:D Legal aroldo deu certo.. MUUUUUUUUIIIIITO obrigado agora sim vou poder terminar o meu sisteminha !!!!!

Por isso que sou fanatico pelo clubedelphi

heuhuheuhueuh

falow


GOSTEI 0
Anorex

Anorex

08/11/2003

pessoal, desculpe incomodar, onde posso encontrar material sobre como trabalhar com o word através do delphi.....


GOSTEI 0
Cgomes

Cgomes

08/11/2003

Caro Aroldo,

Tbem uso esse tipo de função, e ateh ontem tava tudo certo. Mas por alguma razão, em duas máquinas deu pau, quando executa a linha do CreateOleObject(´Word.Application´).

A máquina eh Win98 e Office2000. (A msema rotina funciona perfeitamente em outras tantas máquinas).

Vc tem idéia do que possa ser??

Grato...


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

08/11/2003

Colegas,

Quanto a documentação sobre o uso de Word e demais ferramentas do Office eu realmente não sei, sempre que precisei de alguma informação foi encontrada por aqui ou em outros sites de conteúdo Delphi.

Sobre o problema apresentado especificamente nas duas máquinas, acho que pode estar relacionado a memória disponível (insuficiente) ou permissões do usuário (menos provável).


GOSTEI 0
Jhfeller

Jhfeller

08/11/2003

Gostaria de saber como proceder quando o campo a ser substituido
for muito grande. Estou com um problema pois tenho um campo que
recebe um descritivo de serviço que na minha base de dados vem
de um campo Tmemo.
Estou enviando o campo para um Tstring e mover linha a linha mas
como a primeira linha que movo já substitui a variavel no texto do
word não consigo inserir as seguintes logo abaixo no texto.
Alguém tem alguma sugestão ????


GOSTEI 0
Cgomes

Cgomes

08/11/2003

Quanto a questão do JHFELLER, acho que deve ter uma variável só para ser substituída. Mesmo que vc passe mais de uma linha, o próprio word justifica.

Mais uma...

Alguem sabe como substituir uma string no word sem que seja através do CreateOleObject???

Estou usando o OleContainer, abro o documento mas naum sei como substituir as strings.

Se alguem puder ajudar...


GOSTEI 0
Jhfeller

Jhfeller

08/11/2003

Acontece que eu tenho apenas uma variavel no texto do word
para ser substituida mas o problema é que o texto que mando
é muito extenso porque é um campo Tmemo que recebe uma
descriminação do serviço contratado e foi em função disto que
tenho que trabalhar com as linhas para mandar uma a uma.


GOSTEI 0
Helio Nascimento

Helio Nascimento

08/11/2003

Caro Aroldo Zanela
Sei que vc. tem várias respostas a impressao e substitiuição de palavras junto ao WORD. Porém em todas, tem dado certo. Estes dias necessitei utilizar o seu exemplo e montei tudo certo. Funcionou perfeitamente. Só que tem uma coisa que vc. não comenta, o usuário de posse do arquivo já formatado tem a opção de salvar quando clica no ´x´ fechando o ´Word´, a pergunta é tem como o delphi fazer as substituições nas marcas pré-determinada e não oferecer a opção de salvar? - Pois aconteceu comigo, o documento que era a ´matriz´ foi salva em uma ´substituição´, e aí o delphi nao substituiu no próximo ´click´, porque o usuário regravou a ´matriz´.

O Certo era bloquear, somente para leitura e o Word não pedisse para ser gravado. tem como?

Saudações/Hélio


GOSTEI 0
José Henrique

José Henrique

08/11/2003

Helio,
Uma alternativa é salvar o documento montado com outro nome antes de exibi-lo pro usuário. O usuário poderá fazer mudanças a mão caso queira:
Word2k.Documents.SaveAs(´C:\teste.doc´); 
Word2k.Visible := true;

Voce pode apagar o arquivo áo fechar a aplicação.


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

08/11/2003

Colega,

Além da idéia do Jose Henrique, você pode:

- Armazenar a matriz num local protegido e fazer uma cópia para uma área de trabalho antes das substituições (CopyFile);

- Armazenar a matriz num blob e extrair para uma área de trabalho;


GOSTEI 0
Helio Nascimento

Helio Nascimento

08/11/2003

Ok - beleza . Obrigado a jose Henrique/Aroldo Zanella pela atenção.

Aquele Abraçoooo.


Sds/Hélio


GOSTEI 0
Helio Nascimento

Helio Nascimento

08/11/2003

Aroldo Zanela

Volto ao tema, pedindo-lhe esclarecimentos ao que segue:
1- A idéia de colocar estas ´matrizes´ no campo blob é legal. Fica sempre guardada a original.
2- A criaçao do campo seria text?
3- Como faço para colocar este *.doc no Campo Blob? Não saberia fazer!
4- Como Faço para fazer a leitura deste campo e gravar numa pasta e trabalha-lo ?

Espero pela sua ajuda !

Saudações/Hélio


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

08/11/2003

Colega,

Use o método LoadFromFile do objeto TField associado ao campo blob do tipo binario para armazenar o arquivo. Existem tópicos aqui sobre este assunto.


GOSTEI 0
Bruno Cassucci

Bruno Cassucci

08/11/2003

Aroldo, como eu faço para substituir mais de uma mesma variável? Por exemplo, tenho um documento do word com 10 variaveis @nome, entendeu?


GOSTEI 0
Mordred

Mordred

08/11/2003

Segundo a própria documentação do Word Basic fornecida pelo site da Microsoft, bastaria incluir o parâmetro [b:eab68606be]Replace:=wdReplaceAll[/b:eab68606be]
Doc.Content.Find.Execute(FindText := ´Contrato´, ReplaceWith := ´Licença´, [b]Replace:=wdReplaceAll[/b]);

O problema é que da forma como está, o Delphi não compila:
[Error] Unit1.pas(77): Undeclared identifier: ´wdReplaceAll´

Aliás, aproveitando o post, alguém sabe os comandos para manipular cabeçalho e rodapé? Desde já agradeço. XD


GOSTEI 0
Cabelo

Cabelo

08/11/2003

Aproveitando o tópico....

Um contrato, depois de redigido, e aprovado, não poderá mais ser alterado certo?????

Se eu precisar de enviar o arquivo para o cliente, como faço, não posso mandar simplesmente um .DOC, tenho que mandar um .PDF.

Como transformar o contrato inteiro em .PDF ???????

Sem alterar nada...

OBS : Trabalho em .CLX


GOSTEI 0
Vitor Rodrigues

Vitor Rodrigues

08/11/2003

Segundo a própria documentação do Word Basic fornecida pelo site da Microsoft, bastaria incluir o parâmetro [b:3709e5fe7c]Replace:=wdReplaceAll[/b:3709e5fe7c]
Doc.Content.Find.Execute(FindText := ´Contrato´, ReplaceWith := ´Licença´, [b]Replace:=wdReplaceAll[/b]);
O problema é que da forma como está, o Delphi não compila: [Error] Unit1.pas(77): Undeclared identifier: ´wdReplaceAll´ Aliás, aproveitando o post, alguém sabe os comandos para manipular cabeçalho e rodapé? Desde já agradeço. XD


Tente usar assim

Doc.Content.Find.Execute(FindText := ´Contrato´, ReplaceWith := ´Licença´, Replace:= 2);



GOSTEI 0
Vitor Rodrigues

Vitor Rodrigues

08/11/2003

Quanto a questão do JHFELLER, acho que deve ter uma variável só para ser substituída. Mesmo que vc passe mais de uma linha, o próprio word justifica. Mais uma... Alguem sabe como substituir uma string no word sem que seja através do CreateOleObject??? Estou usando o OleContainer, abro o documento mas naum sei como substituir as strings. Se alguem puder ajudar...


Você tambem pode utilizar o componente WordApplication que fica na aba servers do delphi 7.


GOSTEI 0
Vitor Rodrigues

Vitor Rodrigues

08/11/2003

Bom pessoal,

Para salvar o documento antes que alterem e salvem a matriz eu usei a metodologia passada pelo amigo [b:ea859358d0]´José Henrique´[/b:ea859358d0], mas como não obtive sucesso pois deu um erro informando que o método SaveAs do documents naum poder ser usado, entaum dei uma futucada na net e usei ActiveDocuments.Content ao inves Documents, e resolvido a questão de manter a matriz a salvo.

Como podem ver eu adiciono as units necessárias para fazer toda a integração funcionar que são ComObj e ActiveX.

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, ActiveX, Buttons, ExtCtrls;


E logo abaixo o código das alterações multiplas das variáveis do documento do word.

procedure TfAtaReuniao.sbImprimirClick(Sender: TObject);
var
  FileName: OleVariant;
  SavePath: OleVariant;
  MSWord: OleVariant;
begin
  // Setando o Caminho do Modelo de Documento - MODELO_ATA.DOC
  FileName := ExtractFilePath(Application.ExeName) + ´MODELO_ATA.DOC´;

  // Setando o Caminho de Salvamento dos Documentos
  SavePath := ExtractFilePath(Application.ExeName) + ´\ATAS´;

  // Instanciando o Objeto
  MSWord := CreateOleObject(´Word.Application´);

  // Abrindo o Documento
  MSWord.Documents.Open(FileName);

  // Salvando uma Cópia do Documento
  MSWord.ActiveDocument.SaveAs(SavePath + ´\ATA_000001´);

  // Começando as Substituições das Variáveis do Documento
  MSWord.ActiveDocument.Content.Find.Execute(FindText := ´<¬NUMEROATA¬>´, ReplaceWith := edNumeroAta.Text, Replace := 2);
  MSWord.ActiveDocument.Content.Find.Execute(FindText := ´<¬NOMESINDICO¬>´, ReplaceWith := edSindico.Text, Replace := 2);
  //MSWord.ActiveDocument.Content.Find.Execute(FindText := ´<¬CONDOMINOSPRESENTES¬>´, ReplaceWith := memPresentes.Text, Replace := 2);
  MSWord.ActiveDocument.Content.Find.Execute(FindText := ´<¬ASSUNTOA¬>´, ReplaceWith := edAssuntoA.Text, Replace := 2);
  MSWord.ActiveDocument.Content.Find.Execute(FindText := ´<¬ASSUNTOB¬>´, ReplaceWith := edAssuntoB.Text, Replace := 2);
  MSWord.ActiveDocument.Content.Find.Execute(FindText := ´<¬ASSUNTOC¬>´, ReplaceWith := edAssuntoC.Text, Replace := 2);
  MSWord.ActiveDocument.Content.Find.Execute(FindText := ´<¬ENCERRAMENTO¬>´, ReplaceWith := edEncerramento.Text, Replace := 2);
  //MSWord.ActiveDocument.Content.Find.Execute(FindText := ´<¬CONDOMINOSAUSENTES¬>´, ReplaceWith := memAusentes.Text, Replace := 2);

  // Habilitando a Visibilidade do MSWord
  MSWord.Visible := True;
end;


Minhas dúvidas são as seguintes:
1- Com esse método todo ai você consegue apenas substituir as variáveis no contexto do documento, se por acaso você necessitar de substituir uma variável no Cabeálho ou Rodapé do documento ele não substitui. Como substituir variáveis no Cabeçalho e ou no Rodapé.

2- Como podem ver existem substituições que eu comentei devido dar erro porque veem de um campo memo e na hora da substituição ele diz que o parametro é muito grande. Mediante isso pensei na seguinte solução, ao invés de substituir, adicionar as linhas do campo memo uma a uma, uma abaixo da outra a partir da posição da variável de substituição. Mas como fazer isso inserir um texto num local específico do word?

3- Como poderia inserir ou alterar imagens dentro do documento, por exemplo o documento matriz teria algumas imagens padrão como : foto1, foto2, foto3. Ai eu substituiria essas imagens pelas devidas fotos mantendo seus tamanhos e tudo mais para que não atrapalhe na formatação do documento.

Bom amigos, essas saum minhas dúvidas.


GOSTEI 0
Vitor Rodrigues

Vitor Rodrigues

08/11/2003

Pessoal,

Quanto as dúvidas 1 e 2 eu consegui sanar de alguma maneira.
A substituição de uma variável constante no rodapé ou cabeçalho do documento eu naum consegui. Mas por outro lado eu consegui abrir o cabeçalho ou o rodapé e inserir textos dentro deles, logo arranquei a variável constante e insiro automaticamente pelo delphi todo o texto inclusive a variável. Código demonstrando isso logo abaixo.

// Montando o Cabeçalho do Documento
  MSWord.ActiveDocument.PageSetup.DifferentFirstPageHeaderFooter := False;
  MSWord.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.InsertAfter(Text:= ´Ata Número: ´ + edNumeroAta.Text);
  MSWord.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Paragraphs.Alignment := wdAlignParagraphRight;
  MSWord.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Bold:= True;
  MSWord.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Italic:= True;
  MSWord.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Font.Size := 16;
  MSWord.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Font.Name := ´Arial´;

  // Montando o Rodapé do Documento
  MSWord.ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).PageNumbers.Add(PageNumberAlignment:=wdAlignPageNumberCenter, FirstPage := True);
  MSWord.ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range.Font.Size := 10;
  MSWord.ActiveDocument.Sections.Item(1).Footers.Item(wdHeaderFooterPrimary).Range.Font.Name := ´Arial´;


Este código acima irá inserir o numero de página no centro do rodapé com fonte arial e tamanho 10, e no cabeçalho o texto Ata Número : XXXX aonde o XXX é substituido pelo numero da ATA em questao.

Quanto a dúvida de relativo ao problema que muitos de nós encontramos e postamos no forum no caso de o campo ser um memo ou uma list, os dados sendo um TStringList. Ocorre um erro dizendo que o parametro é muito grande no caso de uma tentativa de replace no FIND. Logo entaum usei o método de pesquisa sem substituir e logo após insiro os textos na mão um a um através de um loop como podem ver abaixo.

// Setando o Range
  Range := MSWord.ActiveDocument.Content;

  // Incluindo os Condôminos Presentes
  for J := 1 to 2 do
  begin
    Range.Find.Execute(FindText:=´<¬CONDOMINOSPRESENTES¬>´, Forward:= True);
    If (Range.Find.Found = True) Then
      begin
        Range.Text := memPresentes.Lines.Strings[0];
        Range.Bold := False;
        Range.Italic := True;
        for I := 1 to (memPresentes.Lines.Count - 1) do
          Range.InsertAfter(Text:= #13 + memPresentes.Lines.Strings[I]);
          Range.Italic := True;
      end;
    Range.Collapse;
  end;

  // Incluindo os Condôminos Ausentes
  Range.Find.Execute(FindText:=´<¬CONDOMINOSAUSENTES¬>´, Forward:= False);
  If (Range.Find.Found = True) Then
    begin
      Range.Text := memAusentes.Lines.Strings[0];
      Range.Bold := False;
      Range.Italic := True;
      for I := 1 to (memAusentes.Lines.Count - 1) do
        Range.InsertAfter(Text:= 13 + memAusentes.Lines.Strings[I]);
        Range.Bold := False;
        Range.Italic := True;
    end;
  Range.Collapse;


Como meu modelo de documento é uma ATA aonde vou ter dois parametros iguais que é a listagem dos condominos presentes em dois locais diferente e a listagem de condominos ausentes. Usei este código acima.

Abaixo posto o modelo do documento
[url]http://rapidshare.com/files/98295407/MODELO_ATA.DOC.html[/url]

PS. O código ainda está bem rústico, vou ainda lapidar e otimizar mais o código.


GOSTEI 0
Wanderok

Wanderok

08/11/2003

Espetacular esta ´DICA´ !!!!


GOSTEI 0
Vitor Rodrigues

Vitor Rodrigues

08/11/2003

Alguem ai ja conseguiu inserir imagens dentro do word usando esse método que estamos usando?


Atenciosamente,
Vitor S. Rodrigues


GOSTEI 0
Helio Nascimento

Helio Nascimento

08/11/2003

Caro amigo Darkstalkers

Legal a sua participação neste tópico.
Venho também batalhando uma solução para conseguir fazer com que o Delphi 7 após as substituições no documento altere para apenas ´Somente Leitura´ travando para não ser alterado.
Desde o lançamento deste tópico até hoje ainda não encontrei uma solução, na mão a gente sabe fazer mas via programação ainda não.
Se nesta luta você conseguir fazer isto, por favor compartilhe comigo e aos demais pois assim não haveria a necessidade de transformar este documento em PDF.
Até +


GOSTEI 0
Vitor Rodrigues

Vitor Rodrigues

08/11/2003

Bom ainda não fiz isso eu estou atentando mais ao problema com alteração ou inserção de fotos. Quanto a inserção já consegui resolver como inserir fotos em células de tabela dentro do word e ainda redimensiona-las logo em seguida. Assim que eu conseguir um tempo lega aqui eu posto a solução.

Quanto ao seu problema se formos seguir a lógica da coisa, provávelmente para se setar um documento como somente leitura basta que salvemos ele com proteção e senha assim ele não maís poderá ser alterado a não ser que a pessoa possua a senha, caso contrário abrirá ele como somente leitura.

Já vi que quando você vai abrir um documento voce tem opções de setar informações como senha de somente leitura e quando salvar como também tem as mesmas informações, logo creio que seja no método ´[b:717e0ba751]saveas[/b:717e0ba751]´ do ActiveDocument.

Exemplo
WordApplication.ActiveDocument.SaveAs();

Onde os parametros podem ser:

Parameters
[b:717e0ba751]Parametro[/b:717e0ba751] [b:717e0ba751]Tipo[/b:717e0ba751]
[b:717e0ba751]FileName System.OleVariant [/b:717e0ba751]
FileFormat System.OleVariant
LockComments System.OleVariant
[b:717e0ba751]Password System.OleVariant [/b:717e0ba751]
AddToRecentFiles System.OleVariant
[b:717e0ba751]WritePassword System.OleVariant[/b:717e0ba751]
[b:717e0ba751]ReadOnlyRecommended System.OleVariant [/b:717e0ba751]
EmbedTrueTypeFonts System.OleVariant
SaveNativePictureFormat System.OleVariant
SaveFormsData System.OleVariant
SaveAsAOCELetter System.OleVariant
Encoding System.OleVariant
InsertLineBreaks System.OleVariant
AllowSubstitutions System.OleVariant
LineEnding System.OleVariant
AddBiDiMarks System.OleVariant

Creio que os parametros que importam são os em negrito.

Tente algo como abaixo, não testei apenas estou sugerindo.
WordApplication.ActiveDocument.SaveAs(FileName := ´Path+Name´, Password:= ´senha´, WritePassword := ´senha´, ReadOnlyRecomended := True);

Não tenho certeza de funcionar mais é ai mesmo que tem que ser inserido.


GOSTEI 0
Helio Nascimento

Helio Nascimento

08/11/2003

Darkstalker. Show.Colega.

Vou testá-la. Depois volto a comentar. No mais...
Obrigado pela sua atenção.

Até breve.


GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

08/11/2003

Onde posso Achar uma exemplo em código para eu visualizar melhor cada comando
GOSTEI 0
Eduardo Mendonça

Eduardo Mendonça

08/11/2003

Onde posso Achar uma exemplo em código para eu visualizar melhor cada comando
GOSTEI 0
POSTAR