使用OLE(Imprimir em ole object(word application)com delphi)在MS Word中打印一系列页面

时间:2014-06-24 18:20:05

标签: delphi

我试图从我的Ole Object对象中打印一系列页面,但它对我不起作用 - 我得到一个"类型不匹配"执行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;

2 个答案:

答案 0 :(得分:3)

我在D7中尝试使用英文版的Office2007代码。

我在Doc.PrintOut上遇到异常错误,这是Delphi通常的“Type Mismatch”。通过试验传递给Doc.PrintOut的参数,我认为它是

Range := wdPrintFromTo

导致异常,因为“范围”通常是一个文本块,而wdPrintFromTo是一个数字常量(但是,我在下面提到的Word宏使用数值常量作为范围,所以也许Word只是没有不喜欢你用的那个。)

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

  • 用两个整数iFrom和iTo替换vFrom和vTo,我认为它是OleVariants(我不认为这真的很重要,只是更容易检查页面范围参数是否正确构造。

  • 将代码从“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
    );
    

显然,这个PrintOut包含的参数是Word宏包含的参数。而且通常其中一些可能是多余的。

答案 1 :(得分:0)

谢谢大家! MartynA,Jan Doggen,David Heffernan,Mason Wheeler和所有其他人!!

我通过以下代码获得解决方案:

<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>