Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
Delphi 12 Athens
|
AW: TWebBrowser Ausdrucken Fuß- und Kopfzeile verbergen
2. Okt 2011, 14: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;
$2B or not $2B
Geändert von himitsu ( 2. Okt 2011 um 16:06 Uhr)
|