使用OLE打印MS Word中的一系列页面(Imprimir em OLE对象(Word应用程序)com delphi)

使用OLE打印MS Word中的一系列页面(Imprimir em OLE对象(Word应用程序)com delphi),delphi,Delphi,我试图从我的Ole对象打印一系列页面,但它对我不起作用-在执行对Doc.PrintOut的调用时出现“类型不匹配”异常 有人能帮我避免这个错误吗?以下是测试中使用的代码: if (OpenDialog1.Execute) then begin // Cria objeto principal de controle do Word WinWord := CreateOleObject('Word.Application'); if (n

我试图从我的Ole对象打印一系列页面,但它对我不起作用-在执行对Doc.PrintOut的调用时出现“类型不匹配”异常

有人能帮我避免这个错误吗?以下是测试中使用的代码:

  if (OpenDialog1.Execute) then
    begin
        // Cria objeto principal de controle do Word
        WinWord := CreateOleObject('Word.Application');
        if (not (VarIsEmpty(WinWord))) then
           begin
              // Mostra o Word
              try
                  WinWord.Visible := false;
                  Docs := WinWord.Documents;
                  // Abre um documento
                  Doc := Docs.Open(OpenDialog1.FileName);
                  //Doc.PrintOut(false, Range, 1, 2);
                  //Doc.PrintOut(Copies := 2);
                  vFrom := 1;
                  vTo := 2;
                  Doc.PrintOut(Background := false, Append := false, Range :=       wdPrintFromTo, OutputFileName := EmptyParam, From := vFrom, To := vTo);
                  // erro recebido: tipo não correspondente
              finally
                  // Fecha o Word
                  WinWord.Quit;
           end;
    end;

    showmessage('Fim!');
end;
<pre><code>
procedure TForm1.Button1Click(Sender: TObject);
var
  WinWord, Docs, Doc: Variant;
  vNomeImpressoraPadraoOriginal : string;
  vFrom, vTo : integer;
begin
  if (OpenDialog1.Execute) then
  begin
    try
      // Cria objeto principal de controle do Word
      WinWord := CreateOleObject('Word.Application');
      if (not (VarIsEmpty(WinWord))) then
      begin
        // Mostra o Word
        try
          WinWord.Visible := false;
          Docs := WinWord.Documents;
          // Abre um documento
          Doc := Docs.Open(OpenDialog1.FileName);
          vFrom := 1;
          vTo := 2;
          // referência do comando: http://support.microsoft.com/kb/176069/EN-US
          Doc.PrintOut(0, 0, '3', '', '1', '2');
          // previous code
          // Doc.PrintOut(Background := false, Append := false, Range :=       wdPrintFromTo, OutputFileName := EmptyParam, From := vFrom, To := vTo);
        finally
          // Fecha o Word
          WinWord.ActiveDocument.Close(SaveChanges := 0);
          WinWord.Quit;

          WinWord := Unassigned;
          Docs := Unassigned;
          Doc := Unassigned;
        end;
      end;

      showmessage('Fim!');
    finally

    end;
  end;
end;
</code></pre>

我使用Office2007的英语版本在D7中尝试了您的代码

我在Doc.PrintOut上得到一个异常错误,这是Delphi通常的“类型不匹配”。通过实验传递给Doc.PrintOut的参数,我认为

Range := wdPrintFromTo
这导致了异常,因为“range”通常是一个文本块,而wdPrintFromTo是一个数值常量(但是,我下面提到的单词macro使用了一个数值常量作为范围,所以Word可能与您使用的那个不一样)

然后,我让Word录制了一个宏来打印一个6页文档的前两页,然后发现我可以通过进行以下更改使您的代码正常工作:

  • 用两个整数iFrom和iTo替换vFrom和vTo(我假设它们是OleVariants)(我认为这并不重要,只是更容易检查pagerange参数是否正确构造)

  • 将“vFrom:=[…]到Doc.PrintOut”的代码替换为

    iFrom := 1;
    iTo := 2;
    
    Doc.PrintOut(
      Range := wdPrintRangeOfPages,
      Item := wdPrintDocumentContent,
      Copies := 1,
      Pages := IntToStr(iFrom) + '-' + IntToStr(iTo),
      PageType := wdPrintAllPages,
      ManualDuplexPrint := False,
      Collate := True,
      Background := True,
      PrintToFile := False,
      PrintZoomColumn := 0,
      PrintZoomRow := 0,
      PrintZoomPaperWidth := 0,
      PrintZoomPaperHeight := 0
    );
    
显然,此打印输出包含的参数是单词macro包含的参数。通常,其中一些参数可能是多余的。

谢谢大家! 马蒂娜、简·多根、大卫·赫弗南、梅森·惠勒和所有其他人

我得到的解决方案代码如下:


很抱歉,这是一个讲英语的网站。这里讲葡萄牙语的人不多。(Sinto muito,esteéum site de língua Inglès.Não hámuitas pessoas aqui que falam Portuguès.)试试葡萄牙语:@user3772322我想只有英语读者可能需要知道什么是“tipo Não通讯员”“意思是。Google Translate将其呈现为“无对应类型”。你认为这正确吗?即使修复了它,也值得投反对票,因为没有问题描述。只是“它不工作”@MartynA这是隐藏起来的,不是用英语写的。这是一个糟糕的问题。你回答了真是太好了。我同意。但这不是一个好问题。我们不想让糟糕的问题被否决。这会给它们带来虚假的突出。遗憾的是,否决是不好的。@TLama:谢谢你的兴趣。我并没有试图用我所做的修改来回退你的编辑后来,只是你的错误提示我注意到了几个输入错误。我完全不知道这种类型的参数传递。事实证明,这是一个OLE功能@Jan Doggen:是的,自从D2中Delphi添加了自动化支持以来,这种情况就一直存在。在我离开后的一两周,Anders Hejlsberg出现在Compuserve上的Borland区域t走出来,握着用户的手,完成了对OLE对象自动化的最初探索,并解释说他必须添加到编译器中的一个功能是支持这种类型的参数传递。我想Borland认为他们希望吸引的VBER会期待它,并抱怨Delphi不支持它。这很有趣ng有多少种不同的方法可以让MS Word做同一件事?你显然找到了另一种方法。很高兴你能让它工作。不管怎样,如果你愿意,请点击它左边的“接受”按钮来“接受”我的答案。如果你以前没有遇到过这种情况,那么通过增加我们的联系,这对我们双方都有好处堆栈上的“声誉”溢出一点-随着声誉的增加,您可以做更多的事情-第一个是能够对其他人的问题和答案发表评论。