Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TWebBrowser druckt auf mehreren Seiten. (https://www.delphipraxis.net/177932-twebbrowser-druckt-auf-mehreren-seiten.html)

vit4l 6. Dez 2013 13:28

TWebBrowser druckt auf mehreren Seiten.
 
Hallo an alle,

brauche wieder euere Hilfe. Möchte über TWebbrowser und Druckvorschau (ohne druckvorschau das selbe Problem) eine Seite ausdrucken. Über mein Programm wird der Inhalt auf mehreren Seiten ausgedruckt. Navigiere ich allerdings mit IExplorer oder Mozzilla und drucke von dort aus wird nur eine Seite gedruckt. Kenn jemand die Lösung, damit mein Programm auch nur den selben Inhalt auf einer Seite ausdruckt?.

vit4l 10. Dez 2013 14:28

AW: TWebBrowser druckt auf mehreren Seiten.
 
push

p80286 10. Dez 2013 14:44

AW: TWebBrowser druckt auf mehreren Seiten.
 
Auch ich möchte viel....
wie druckst Du denn bisher?
ggf. hilft es schon die Ränder neu zu definieren oder mit einem anderen Font zu arbeiten oder .....

der Möglichkeiten ist Legion

Gruß
K-H

vit4l 10. Dez 2013 15:29

AW: TWebBrowser druckt auf mehreren Seiten.
 
Also viel möchte ich nicht, nur dass der TWebbrowser mir eine Seite ausdruckt genauso wie IExplorer. Aber danke für den Hinweis werde ich mal versuchen. Ich drucke ganz normal mit der Metohode:

WebBrowser1.ControlInterface.ExecWB(OLECMDID_PRINT PREVIEW, OLECMDEXECOPT_PROMPTUSER, vIn, vOut);

p80286 10. Dez 2013 17:03

AW: TWebBrowser druckt auf mehreren Seiten.
 
Na dann kennst Du ja auch das _PAGESETUP, hast Du das schon einmal genutzt?
Gruß
K-H

Volker Z. 10. Dez 2013 23:53

AW: TWebBrowser druckt auf mehreren Seiten.
 
Hallo,

Zitat:

[...] Über mein Programm wird der Inhalt auf mehreren Seiten ausgedruckt. Navigiere ich allerdings mit IExplorer oder Mozzilla und drucke von dort aus wird nur eine Seite gedruckt [...]
Ich vermute, dass die TWebBrowser-Instanz im Kompatibilitätsmodus läuft (ein fehlendes oder fehlerhaftes <!DOCTYPE oder Fehler im Quellcode reichen schon aus), wohingegen der IE o. ä. wohl im Standardmodus läuft. Dann gibt es Unterschiede im Rendering der Seite, was dann auch zu unterschiedlichen Druckausgaben führt.

Ob dem so ist kannst Du ja mal ausprobieren. Mit:
Delphi-Quellcode:
procedure TForm1.Button1Click (Sender : TObject);
var
  d : IHTMLDocument3;
begin
  if Assigned (WebBrowser1.Document) then
    begin
      d := WebBrowser1.Document as IHTMLDocument3;
      if Assigned (d) then
        ShowMessage (d.compatMode)
    end;
end;
kannst Du Dir anzeigen lassen in welchem Modus die TWebBrowser-Instanz gerade läuft (BackCompat = Kompatibilitätsmodus) und die aktuell geladene Seite anzeigt.

Mit:
Code:
<meta http-equiv="X-UA-Compatible" content="IE=edge">
kannst Du den IE "überreden" nicht in den Kompatibilitätsmodus zu schalten. Das setzt allerdings voraus, dass Du den HTML-Code manipulieren kannst.

Vermutlich hast Du diese Möglichkeit aber nicht. Wenn dem so ist, dann könntest Du das Meta-Tag dem IE aber sozusagen "unterjubeln"; das könnte z. B. so funktionieren:
Delphi-Quellcode:
function GetBrowserCompatMode (const WebBrowser : TWebBrowser) : Integer;
var
  d : IHTMLDocument5;
begin
  Result := -1;
  if not Assigned (WebBrowser) then
    Exit;

  d := WebBrowser.Document as IHTMLDocument5;
  if not Assigned (d) then
    Exit;

  if d.compatMode = 'CSS1Compat' then
    Result := htmlCompatModeCSS1Compat
  else
    Result := htmlCompatModeBackCompat
end;

procedure ReplaceHtmlDocument (const WebBrowser : TWebBrowser; const Html : string);
var
  d : IHTMLDocument2Disp;
begin
  if Assigned (WebBrowser) then
    begin
      d := WebBrowser.Document as IHTMLDocument2Disp;
      if Assigned (d) then
        begin
          d.open ('text/html', '_self', '', 'true');
          d.writeln (Html)
        end;
    end
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
var
  d : IHTMLDocument3;
  s : string;
  p, q : Integer;
  c : Char;
begin
  if GetBrowserCompatMode (WebBrowser1) = htmlCompatModeBackCompat then
    begin
      d := WebBrowser1.Document as IHTMLDocument3;
      if Assigned (d) then
        begin
          s := d.documentElement.outerHTML;

          // Die Suche nach der passenden Einfügestelle nur rudimentär
          p := PosEx ('<HEAD', s);
          if p = 0 then
            Exit;

          Inc (p, 5);
          q := PosEx ('<META', s, p);
          if q > 0 then
            Insert ('<base href="' + URL + '"><meta http-equiv="X-UA-Compatible" content="IE=edge">', s, p + 1)
          else
            begin
              c := s [p];
              while (c <> '>') and (c <> #0) do
                begin
                  Inc (p);
                  c := s [p]
                end;

              if c = '>' then
                Insert ('<base href="'+ URL + '"><meta http-equiv="X-UA-Compatible" content="IE=edge">', s, p + 1)
              else
                s := ''
            end;

          if s <> '' then
            ReplaceHtmlDocument (WebBrowser1, s)
        end
    end
end;
Gruß

vit4l 11. Dez 2013 12:57

AW: TWebBrowser druckt auf mehreren Seiten.
 
Vielen Dank an Volker Z. Genau deine Lösung hat mir geholfen. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz