Fórum wordapplication como usar mais de 255 caracteres #15550
10/02/2010
0
var
DocOrigem , DocDestino : OleVariant;
Procurar , Substituir : OleVariant;
i :Integer; begin DlgWord.Execute; //Topendialog
if (ExtractFileExt(DlgWord.FileName) = '.dot') then
begin
WordApp:=TWordApplication.Create(Application.Owner);
WordApp.Visible := True;
WordDoc := TWordDocument.Create(Application.Owner);
DocOrigem := DlgWord.FileName;
WordDoc.ConnectTo(WordApp.Documents.Add(
DocOrigem,EmptyParam,EmptyParam,EmptyParam)); for i := 0 to ComponentCount -1 do
Begin
if Components[i] is TEdit then
begin
Procurar := '@'+Components[i].Name;
Substituir := (Components[i] as Tedit).Text; WordDoc.Content.Find.Execute(Procurar,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,Substituir,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
end;
end;
DocDestino := 'C:\Contrato.doc';
WordDoc.SaveAs(DocDestino,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
//WordDoc.Close; end
else
MessageDlg('Arquivo selecionado nao esta no formato correto.',mtWarning,[mbOK],0); flagwordcontrato := 'N';
end;
Jorge Trento
Curtir tópico
+ 0Posts
14/02/2010
Rodrigo Mourão
Desculpe a demora em entrar em contato porém noa recebi email de novo chamado na minha conta.
Bem trabalhar com activex e muito complicado mesmo, quando invocamos o qualquer aplicacao via OLE estamos na verdade consumindo um activex e como tal temos que dancar conforme a musica deles.
O metodo Find utilizado para realizar tal tarefa com certeza so aceita pequenos texto até porque sua utilizada é exatamente esta. Não sou especialista na API do word talvez possa até ser que exista na API um metodo para substituir grandes textos, vou verificar e tantar localizar algum metodo na tlb do word que possa lhe ajudar.
Peço a gentileza que aguarde.
Att,
Gostei + 0
18/02/2010
Rodrigo Mourão
Estamos trabalhando no seu chamado, peço a gentileza que aguarde que em breve entraremos em contato.
Att,
Gostei + 0
22/02/2010
Jorge Trento
Gostei + 0
23/02/2010
Wesley Yamazack
Olá amigo,
Em resposta a sua dúvida, também tive este problema ao escrever este artigo Word com Delphi, para resolver este problema, você terá que escrever direto no documento, ao invés de usar o Find.
Usando os comandos abaixo :
WinWord.Selection.TypeText(Memo1.Lines.text); //Você adiciona um texto
WinWord.Selection.MoveDown; //Move o Cursor para baixo, como se fosse um Enter
Veja se isso irá lhe ajudar, pois com o Find infelizmente não consegui fazer.
Um abraço
Wesley Y
Gostei + 0
23/02/2010
Jorge Trento
Gostei + 0
24/02/2010
Wesley Yamazack
Este comando você irá escrever direto onde o cursor do mouse estiver, com o MoveDown você poderá movimentar a posição do cursor até chegar ao ponto que você quer, supondo que seu contrato seja fixo, e que o texto com mais de 200 caracteres esteja na linha 7, você poderia colocar :
begin
for I = 0 to 6 do
WinWord.Selection.MoveDown; //Move o Cursor para baixo, como se fosse um Enter
WinWord.Selection.TypeText(Memo1.Lines.text); //Você adiciona um texto
end;
Faça este teste e veja se lhe ajuda
Um abraço
Wesley Y
Gostei + 0
24/02/2010
Jorge Trento
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; Consegue me ajudar? att jorge
Gostei + 0
24/02/2010
Wesley Yamazack
POr um acaso teria o codigo completo da unit que você adaptou este exemplo, seria mais facil, estou analisando, mas se você ja tiver fica mais facil.
Um abraço
Wesley Y
Gostei + 0
24/02/2010
Jorge Trento
DlgWord.Execute; MSWord := CreateOleObject('Word.Application');
MSWord.Application.Documents.Open(DlgWord.FileName);
//Deixo o word visivel
MSWord.Visible := true;
//Limpo os parametros de busca do word
MsWord.Application.Selection.Find.ClearFormatting; {Adiciono no find o parametro que quero buscar dentro do word,
e abaixo esta selecionado as condições}
MsWord.Application.Selection.Find.Text := '@edtinquilino';
MsWord.Application.Selection.Find.Replacement.Text := '';
MsWord.Application.Selection.Find.Forward := True;
MsWord.Application.Selection.Find.Wrap := wdFindContinue;
MsWord.Application.Selection.Find.Format := False;
MsWord.Application.Selection.Find.MatchCase := False;
MsWord.Application.Selection.Find.MatchWholeWord := False;
MsWord.Application.Selection.Find.MatchWildcards := False;
MsWord.Application.Selection.Find.MatchSoundsLike := False;
MsWord.Application.Selection.Find.MatchAllWordForms := False; //Executo o pesquisa, o parametro se estiver no texto vai ficar selecionado
MsWord.Application.Selection.Find.Execute; if MsWord.Application.Selection.Find.Found then { verifica se achou }
begin
//Substituo o parametro selecionado pelo texto que esta eu qro, nesse caso de um Tedit
MSWord.Application.Selection.TypeText(edtinquilino.text);
end; Se estiver certo, pesso que monte um artigo, ou algo assim para que outros tenham mais facilidade nesse tipo de problema
Gostei + 0
25/02/2010
Wesley Yamazack
Certamente funcionou , fiz os testes aqui e funcionou perfeitamente, porém só não consegui achar a unit onde tem o wdFindContinue;, esta dando erro nesta linha, eu comentei e aparentemente funcionou sem ela.
Esta semana vou fazer vários artigos para botar no Site e este seu será um deles.
Um abraço
Wesley Y
Gostei + 0
25/02/2010
Jorge Trento
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)