首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用OleVariant参数进行TWebBrowser打印对话框?

如何使用OleVariant参数进行TWebBrowser打印对话框?
EN

Stack Overflow用户
提问于 2013-08-08 02:34:55
回答 1查看 1.5K关注 0票数 3

我试图在从TWebBrowser打印时实现自定义页眉和页脚,如本微软知识库问题(KB267240)中的信息所示。知识库文章非常有用,甚至包括一个冗长的代码示例,然而,代码示例是在C++而不是Delphi中,因此我不得不尝试自己将必要的数据结构转换为Delphi代码。我不太相信我已经正确地转换了我需要的部分代码。

这篇文章最重要的部分可能是,在下面的代码中,它解释了我的参数vaIn中应该包含哪些内容:

当您使用OLECMDID_PRINT元素的OLECMDID枚举和ExecWB方法时,可以通过变量参数pvaIn传入SAFEARRAY结构来指定扩展打印信息。这种SAFEARRAY数据类型最多需要五项: 1)包含自定义头的字符串(BSTR)。2)包含自定义页脚的字符串(BSTR)。3) .

当我运行我编写的代码时,它成功地删除了原始页眉和页脚,但没有用新的页眉和页脚字符串来替换它,所以我想知道我的代码在某些方面(或几种方式)是否不正确,或者我只是不应该期望它工作,因为我使用的是IE 9,而不是在编写知识库文章时的4-6范围内的版本。

代码语言:javascript
运行
复制
var
  vaIn, vaOut: OleVariant;
begin
    vaIn := VarArrayCreate([0,1], varOleStr); 
    vaIn[0] := VarAsType('new header', VarOleStr); //header
    vaIn[1] := VarAsType('new footer', VarOleStr); //footer

    // Show print-preview dialog 
    WebBrowser1.ControlInterface.ExecWB(OLECMDID_PRINTPREVIEW,
      OLECMDEXECOPT_DONTPROMPTUSER, vaIn, vaOut);
end;
EN

回答 1

Stack Overflow用户

发布于 2021-05-25 11:30:08

此打印具有自定义页眉/页脚。自定义标头不适用于OLECMDID_PRINTPREVIEW,但它们确实适用于OLECMDID_PRINT。关键是使用VT_ARRAY or VT_BYREF,因为TVariantArg必须通过引用传递。

代码信用:TEmbeddedWB at https://github.com/7even11/Delphi-EmbeddedWB

代码语言:javascript
运行
复制
procedure PrintWithHeaderFooter(ControlInterface: IWebBrowser2; Header, Footer: PWideChar; Options: OLECMDEXECOPT);
var
  saBound: TSafeArrayBound;
  psaHeadFoot: PSafeArray;
  vaIn, vaOut: TVariantArg;
  vHeadStr, vFootStr: TVariantArg;
  rgIndex: LongInt;
begin
  try
    saBound.lLbound := 0;
    saBound.cElements := 2;
    psaHeadFoot := SafeArrayCreate(VT_VARIANT, 1, saBound);
    vHeadStr.vt := VT_BSTR;
    vHeadStr.bstrVal := SysAllocString(Header);
    vFootStr.vt := VT_BSTR;
    vFootStr.bstrVal := SysAllocString(Footer);
    rgIndex := 0;
    OleCheck(SafeArrayPutElement(psaHeadFoot, rgIndex, vHeadStr));
    rgIndex := 1;
    OleCheck(SafeArrayPutElement(psaHeadFoot, rgIndex, vFootStr));
    vaIn.vt := VT_ARRAY or VT_BYREF;
    vaIn.parray := psaHeadFoot;
    ControlInterFace.ExecWB(OLECMDID_PRINT, Options,
      OleVariant(vaIn), OleVariant(vaOut));
    if vHeadStr.bstrVal <> nil then
      SysFreeString(vHeadStr.bstrVal);
    if vFootStr.bstrVal <> nil then
      SysFreeString(vFootStr.bstrVal);
  except
  end;
end;

procedure Print(ControlInterface: IWebBrowser2; bHideSetup: Boolean = False; bCustomHeaderFooter: Boolean = False; Header: string = ''; Footer: string = '');
var
  vaIn, vaOut: OleVariant;
begin
  if DocumentLoaded(ControlInterface.Document) then
  begin
    if bCustomHeaderFooter then
    begin
      if bHideSetup then
        PrintWithHeaderFooter(ControlInterface, TaskAllocWideString(Header), TaskAllocWideString(Footer), OLECMDEXECOPT_DONTPROMPTUSER)
      else
        PrintWithHeaderFooter(ControlInterface, TaskAllocWideString(Header), TaskAllocWideString(Footer), OLECMDEXECOPT_PROMPTUSER);
    end
    else
      if bHideSetup then
        ControlInterface.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vaIn, vaOut)
      else
        ControlInterface.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut)
  end;
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18117021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档