Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#4

AW: TWebBrowser Ausdrucken Fuß- und Kopfzeile verbergen

  Alt 2. Okt 2011, 13:47
Ich weiß, ist schon alt, aber da ich das grad sah....


Man kann sich hier an vielen Stellen vom Delphi helfen lassen.

* die PWideChars (Header und Fotter) gleich in einen WideString, welcher intern schon das SysAllocString und SysFreeString gekapselt hat
* vaIn.parray ist ja schon ein PSafeArray, wodurch man sich die zusätzliche Variable psaHeadFoot erspart
* saBound erspart man sich, indem man es über einen ähnlichen Typen ercastet oder man erstellt sich zumindestens eine passende Konstante
* das leere Try-Except ist eh eine Unsitte und fliegt gleich mit raus

Delphi-Quellcode:
uses
  ActiveX, ComObj;

procedure WB_PrintWithHeaderFooter(WebBrowser: TWebBrowser; const Header, Footer: WideString);
var
  saBound: TSafeArrayBound;
  vaIn, vaStr: TVariantArg;
  rgIndex: LongInt;
begin
  saBound.lLbound := 0;
  saBound.cElements := 2;
  vaIn.vt := VT_ARRAY or VT_BYREF;
  vaIn.parray := SafeArrayCreate(VT_VARIANT, 1, saBound);

  rgIndex := 0;
  vaStr.vt := VT_BSTR;
  vaStr.bstrVal := Pointer(Header);
  OleCheck(SafeArrayPutElement(vaIn.parray, rgIndex, vaStr));

  rgIndex := 1;
  vaStr.vt := VT_BSTR;
  vaStr.bstrVal := Pointer(Footer);
  OleCheck(SafeArrayPutElement(vaIn.parray, rgIndex, vaStr));

  WebBrowser.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, OleVariant(vaIn));
end;
Delphi-Quellcode:
uses
  ActiveX, ComObj;

procedure WB_PrintWithHeaderFooter(WebBrowser: TWebBrowser; const Header, Footer: WideString);
var
  saBound: TSafeArrayBound;
  vaIn: TVariantArg;
  rgIndex: LongInt;
begin
  saBound.lLbound := 0;
  saBound.cElements := 2;
  vaIn.vt := VT_ARRAY or VT_BYREF;
  vaIn.parray := SafeArrayCreate(VT_VARIANT, 1, saBound);
  rgIndex := 0; OleCheck(SafeArrayPutElement(vaIn.parray, rgIndex, OleVariant(Header)));
  rgIndex := 1; OleCheck(SafeArrayPutElement(vaIn.parray, rgIndex, OleVariant(Footer)));
  WebBrowser.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, OleVariant(vaIn));
end;

Das Endergebnis (locker mal 60% weniger Code):
Delphi-Quellcode:
uses
  ActiveX, ComObj;

procedure WB_PrintWithHeaderFooter(WebBrowser: TWebBrowser; const Header, Footer: WideString);
var
  vaIn: TVariantArg;
  rgIndex: LongInt;
begin
  vaIn.vt := VT_ARRAY or VT_BYREF;
  vaIn.parray := SafeArrayCreate(VT_VARIANT, 1, TSafeArrayBound(Point(0, 2)));
  rgIndex := 0; OleCheck(SafeArrayPutElement(vaIn.parray, rgIndex, OleVariant(Header)));
  rgIndex := 1; OleCheck(SafeArrayPutElement(vaIn.parray, rgIndex, OleVariant(Footer)));
  WebBrowser.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, OleVariant(vaIn));
end;

// oder

procedure WB_PrintWithHeaderFooter(WebBrowser: TWebBrowser; const Header, Footer: WideString);
const
  saBound: TSafeArrayBound = (cElements: 2; lLbound: 0);
var
  vaIn: TVariantArg;
  rgIndex: LongInt;
begin
  vaIn.vt := VT_ARRAY or VT_BYREF;
  vaIn.parray := SafeArrayCreate(VT_VARIANT, 1, saBound);
  rgIndex := 0; OleCheck(SafeArrayPutElement(vaIn.parray, rgIndex, OleVariant(Header)));
  rgIndex := 1; OleCheck(SafeArrayPutElement(vaIn.parray, rgIndex, OleVariant(Footer)));
  WebBrowser.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, OleVariant(vaIn));
end;
Falls es irgendwo noch eine Art SafeArrayCreate gibt, welchem man gleich die Felder mitgeben kann, dann würde das wohl noch auf einem Einzeler zusammenfassen können.


PS: Die Codes in Post #3 und #4 sollten mit Win32 (ANSI und Unicode) funktionieren. Zu Win64 kann ich keine Aussage treffen.


[edit]
Arg, die Parameter sind ja krank
rgIndex: LongInt; muß also drin bleiben
Delphi-Quellcode:
procedure WB_PrintWithHeaderFooter(WebBrowser: TWebBrowser; const Header, Footer: WideString);
procedure PutElement(va: TVariantArg; idx: LongInt; const pv: OleVariant);
  begin OleCheck(SafeArrayPutElement(va.parray, idx, pv)); end;
const saBound: TSafeArrayBound = (cElements: 2; lLbound: 0);
var vaIn: TVariantArg;
begin
  vaIn.vt := VT_ARRAY or VT_BYREF;
  vaIn.parray := SafeArrayCreate(VT_VARIANT, 1, saBound);
  PutElement(vaIn, 0, Header);
  PutElement(vaIn, 1, Footer);
  WebBrowser.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, OleVariant(vaIn));
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Okt 2011 um 15:06 Uhr)
  Mit Zitat antworten Zitat