Imprimir contrato !
No Qreport tem jeito ???
grato
Michel
Respostas
Edilcimar
08/11/2003
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
Aroldo Zanela
08/11/2003
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.
Michel
08/11/2003
Muito obrigado
Michel
Aroldo Zanela
08/11/2003
É extamente a isto que me refiro. Vou disponibilizar um modelo hoje a noite.
Michel
08/11/2003
No aguardo !!
Aroldo Zanela
08/11/2003
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;
Michel
08/11/2003
Michel Steev
Michel
08/11/2003
[Error] Unit1.pas(30): Undeclared identifier: ´ProgIdToClassId´
Cavalcanti.fabio
08/11/2003
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
Aroldo Zanela
08/11/2003
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.
Michel
08/11/2003
Obrigado :wink:
Fred
08/11/2003
Aroldo Zanela
08/11/2003
Declare na lista de uses: ComObj e ActiveX.
Complementando o código:
var FormContratante: TFormContratante; Word2k: Variant; implementation uses Funcoes, Geral;
Michel
08/11/2003
Por isso que sou fanatico pelo clubedelphi
heuhuheuhueuh
falow
Anorex
08/11/2003
Cgomes
08/11/2003
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...
Aroldo Zanela
08/11/2003
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).
Jhfeller
08/11/2003
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 ????
Cgomes
08/11/2003
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...
Jhfeller
08/11/2003
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.
Helio Nascimento
08/11/2003
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
José Henrique
08/11/2003
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.
Aroldo Zanela
08/11/2003
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;
Helio Nascimento
08/11/2003
Aquele Abraçoooo.
Sds/Hélio
Helio Nascimento
08/11/2003
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
Aroldo Zanela
08/11/2003
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.
Bruno Cassucci
08/11/2003
Mordred
08/11/2003
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
Cabelo
08/11/2003
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
Vitor Rodrigues
08/11/2003
Doc.Content.Find.Execute(FindText := ´Contrato´, ReplaceWith := ´Licença´, [b]Replace:=wdReplaceAll[/b]);
Tente usar assim
Doc.Content.Find.Execute(FindText := ´Contrato´, ReplaceWith := ´Licença´, Replace:= 2);
Vitor Rodrigues
08/11/2003
Você tambem pode utilizar o componente WordApplication que fica na aba servers do delphi 7.
Vitor Rodrigues
08/11/2003
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.
Vitor Rodrigues
08/11/2003
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.
Wanderok
08/11/2003
Vitor Rodrigues
08/11/2003
Atenciosamente,
Vitor S. Rodrigues
Helio Nascimento
08/11/2003
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é +
Vitor Rodrigues
08/11/2003
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.
Helio Nascimento
08/11/2003
Vou testá-la. Depois volto a comentar. No mais...
Obrigado pela sua atenção.
Até breve.
Eduardo Mendonça
08/11/2003
Eduardo Mendonça
08/11/2003