Einzelnen Beitrag anzeigen

Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#6

AW: TWebBrowser druckt auf mehreren Seiten.

  Alt 11. Dez 2013, 00:53
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 = 'CSS1Compatthen
    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ß
Volker Zeller
  Mit Zitat antworten Zitat