gpt4 book ai didi

delphi - 从 TWebBrowser 打印

转载 作者:行者123 更新时间:2023-12-03 18:08:29 24 4
gpt4 key购买 nike

我正在使用以下单元通过显示在非模式对话框中的 TWebBrowser 来显示和打印 HTML 代码。在我的生产程序中,以下代码在 Windows-XP 下工作,但在 Windows-7 下失败(错误消息总是外部异常 C015D00F)。为了隔离问题,我编写了一个简单的测试程序,它还有一个包含 TWebBrowser 的非模态对话框;就其本身而言,这个测试程序可以在 Windows-7 上正常工作,但是当我将测试程序中的非模态对话框插入到生产程序中时,我得到了外部异常。

这大概表明调用程序有问题,而不是被调用单元有问题,但我看不出是什么问题。 HTML 代码是手工制作的,但显示正确。

可能是什么问题?打印代码来自Embarcadero site

unit Test4;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, MSHTML;

type
THTMLPreview = class(TForm)
web: TWebBrowser;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure webDocumentComplete(Sender: TObject; const pDisp: IDispatch;
var URL: OleVariant);
private
options: word;
fn: string;
procedure DoPrint;
public
Constructor Create (const afn, acapt: string; opts: word);
end;

implementation

{$R *.dfm}

constructor THTMLPreview.Create (const afn, acapt: string; opts: word);
begin
inherited create (nil);
caption:= acapt;
fn:= afn;
options:= opts;
web.Navigate (fn);
end;

procedure THTMLPreview.webDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
DoPrint
end;

procedure THTMLPreview.DoPrint;
var
HTMLDoc: IHTMLDocument2;
HTMLWnd: IHTMLWindow2;
HTMLWindow3: IHTMLWindow3;

begin
if options and 4 = 4 then
begin
HTMLDoc:= web.Document as IHTMLDocument2;
if HTMLDoc <> nil then
begin
HTMLWnd:= HTMLDoc.parentWindow;
HTMLWindow3:= HTMLWnd as IHTMLWindow3;
HTMLWindow3.print;
end
end
end;

procedure THTMLPreview.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if options and 1 = 1 then deletefile (fn);
action:= caFree
end;

end.

使用声明 Web.ControlInterface.ExecWB (OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER,
vaIn, vaOut)
给出相同的错误。

几天后编辑:

我尝试了一种完全不同的方法来解决这个问题。在 HTML 代码中,我添加了一个 javascript 片段,它显示了一个“打印”按钮并添加了一个“onprint”事件。再一次,这在我的开发机器 (XP) 上运行良好,但在我客户端的机器 (Win7) 上运行良好,在那里程序卡住并显示外部异常 C015D00F(与以前的地址相同)。

经过不小的谷歌搜索,我发现异常代码C015000F是由
“被停用的激活上下文不是最近激活的上下文。”这对一个可怜的 Delphi 程序员意味着什么?

最佳答案

如果我没记错的话,IHTMLWindow3.print 方法会弹出默认的“发送到打印机”系统对话框。你想要这个吗?对于一个应用程序,我曾经搜索过一种避免这种情况的方法,然后找到了这段代码。

var
r:TRect;
sh,ph:HDC;
begin
OleInitialize(nil);
WebBrowser1.Navigate('file://'+HtmlFilePath);
while WebBrowser1.ReadyState<>READYSTATE_COMPLETE do Application.HandleMessage;

//Printer.PrinterIndex:=//set selected printer here
Printer.BeginDoc;
try
Printer.Canvas.Lock;
try
sh:=GetDC(0);
ph:=Printer.Canvas.Handle;

//TODO: make rect a bit smaller for a page margin
//TODO: get page size from printer settings, assume A4 here (210x297mm)
r.Left:=0;
r.Top:=0;
r.Right:=2100 * GetDeviceCaps(sh,LOGPIXELSX) div 254;
r.Bottom:=2970 * GetDeviceCaps(sh,LOGPIXELSY) div 254;
WebBrowser1.BoundsRect:=r;

SetMapMode(ph,MM_ISOTROPIC);
SetWindowExtEx(ph,r.Right,r.Bottom,nil);
SetViewportExtEx(ph,r.Right,r.Bottom,nil);
r.Right:=GetDeviceCaps(ph,HORZRES)-1;
r.Bottom:=GetDeviceCaps(ph,VERTRES)-1;

(WebBrowser1.ControlInterface as IViewObject).Draw(
DVASPECT_CONTENT,
1,
nil,nil,0,ph,@r,nil,nil,0);
finally
Printer.Canvas.Unlock;
end;
Printer.EndDoc;
except
Printer.Abort;
raise;
end;

SetWindowExtEx 和 SetViewportExtEx 设置了正确的缩放比例,因此您可以在 HTML/CSS 中使用单位“mm”。

关于delphi - 从 TWebBrowser 打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15702976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com