我试图从我的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;
答案 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>