Fórum wordapplication como usar mais de 255 caracteres #15550

10/02/2010

0

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;
Jorge Trento

Jorge Trento

Responder

Posts

14/02/2010

Rodrigo Mourão

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,


Responder

Gostei + 0

18/02/2010

Rodrigo Mourão

Olá,

Estamos trabalhando no seu chamado, peço a gentileza que aguarde que em breve entraremos em contato.

Att,
Responder

Gostei + 0

22/02/2010

Jorge Trento

Ok estou no aguardo   att jorge
Responder

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
Responder

Gostei + 0

23/02/2010

Jorge Trento

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
Responder

Gostei + 0

24/02/2010

Wesley Yamazack

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
   


Responder

Gostei + 0

24/02/2010

Jorge Trento

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  
Responder

Gostei + 0

24/02/2010

Wesley Yamazack

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
Responder

Gostei + 0

24/02/2010

Jorge Trento

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
Responder

Gostei + 0

25/02/2010

Wesley Yamazack

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
Responder

Gostei + 0

25/02/2010

Jorge Trento

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar