wordapplication como usar mais de 255 caracteres
Bom Dia
Uso uma função no meu sistema que pega os dados dos TEdit que estão na tela e repassa para um contrato no Microsoft Word, ele pega no contrato o parametro e procura o TEdit com o nome correspondente. Mas essa função toda vez que eu tento passar mais de 255 caracteres da erro dizendo "ERRO -> Seqüência de caracteres muito longa". E estou precisando passar uma descrição completa do produto para o contrato que passa de 2000 caracteres.
Por favor me ajudem, segue a função que uso abaixo:
procedure TfrmContrato.SpeedButton19Click(Sender: TObject);
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;
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
Curtidas 0
Respostas
Rodrigo Mourão
10/02/2010
Olá Jorge,
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,
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
Rodrigo Mourão
10/02/2010
Olá,
Estamos trabalhando no seu chamado, peço a gentileza que aguarde que em breve entraremos em contato.
Att,
Estamos trabalhando no seu chamado, peço a gentileza que aguarde que em breve entraremos em contato.
Att,
GOSTEI 0
Jorge Trento
10/02/2010
Ok estou no aguardo
att jorge
GOSTEI 0
Wesley Yamazack
10/02/2010
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
Jorge Trento
10/02/2010
Mas nesse caso ele passa para o word tranquilo, só que a minha necessidade, é que eu vou passar a descrição de um produto para um local no meio do contrato, sendo assim, como vou saber onde devo substituir o campo?
Porque no find voce da o parametro e o que voce qr colocar no local. Voce save algum meio de localizar dentro do word para depois substituir usando esse comando que voce me passou?
att jorge
GOSTEI 0
Wesley Yamazack
10/02/2010
Olá amigo,
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
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
Jorge Trento
10/02/2010
Bom Dia
Pois é o contrato não é fixo, eu vou treinar alguem no meu cliente para fazer contrato com teg's, assim eles vão poder fazer contratos conforme eles quiserem, ja que muitos clientes deles exigem outros padrões de contrato, então isso ficaria a cargo deles fazer o contrato com tag's para depois substituir. Encontrei esse cogido no forum, mas não estou conseguindo fazer rodar, algo na parte "Range.Find.Found = True" que não deixa entrar no if para efetuar a troca:
http://forum.devmedia.com.br/viewtopic.php?p=306440&sid=dd46388e1f285badad8fe6221dec664d
// 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; Consegue me ajudar? att jorge
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
Wesley Yamazack
10/02/2010
Ola amigo,
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
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
Jorge Trento
10/02/2010
Bom Dia
Aparentemente consegui resolver o problema, juntando um monte de post na net, segue a solução encontrada, por favor verifique se esta certa.
http://forum.devmedia.com.br/viewtopic.php?p=306440&sid=dd46388e1f285badad8fe6221dec664d
http://www.activedelphi.com.br/forum/viewtopic.php?p=133111&sid=a5dfe5f5078d147adfe437817071f848
//Abro uma opendialog para o usuario escolher o contrato
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
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
Wesley Yamazack
10/02/2010
Olá amigo,
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
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
Jorge Trento
10/02/2010
Bom Dia
Ok, pode encerrar o chamado. Muito obrigado por fazer o artigo, pois não quero que outros tenham o mesmo problema
att jorge
GOSTEI 0