Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Klasse eines <body>-Tag im Webbrowser ändern (https://www.delphipraxis.net/195849-klasse-eines-body-tag-im-webbrowser-aendern.html)

Codehunter 31. Mär 2018 20:05

Klasse eines <body>-Tag im Webbrowser ändern
 
Hallo!

Ich habe ein HTML-Dokument wie dieses:
Code:
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Test</title>
    <link href="dark.css" rel="stylesheet" type="text/css"/>
    <link href="light.css" rel="stylesheet" type="text/css"/>
    <style>
      body {
        border: none;
        margin: 0;
        padding: 0;
      }
    </style>
  </head>

  <body class="dark">
      Test
  </body>
</html>
Wie man sieht wird dem <body>-Tag direkt eine Klasse "dark" zugewiesen. Hier noch die beiden CSS-Dateien:
Code:
body.dark {
  color: #ffffff;
  background-color: #000000;
}
Code:
body.light {
  color: #000000;
  background-color: #ffffff;
}
(Das ist nur das Grundgerüst, deshalb wirkt das so banal)

Nun möchte ich zur Laufzeit das Body-Element holen und das Attribut "class" auf den Wert "light" ändern. Allerdings komme ich damit nicht so recht weiter:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Es: IHTMLElementCollection;
  E: IHTMLElement;
  Doc: IHtmlDocument3;
begin
  Webbrowser.Document.QueryInterface(IHtmlDocument3, Doc);
  Assert(Doc <> NIL);
  E:= (Webbrowser.Document AS IHTMLDocument2).body;
  if E <> NIL then begin
    E.setAttribute('className', 'light', EmptyParam);
  end;
end;
Die Variable E bleibt immer NIL (und ja, ReadyState passt, das Dokument ist fertig geladen). Hat jemand einen Tip wo ich den Fehler mache? Mit MSHTML-DOM habe ich eher selten zu tun...

Grüße
Cody

Codehunter 5. Apr 2018 10:23

AW: Klasse eines <body>-Tag im Webbrowser ändern
 
*hochschubs*

Hat keiner eine Idee?

Neutral General 5. Apr 2018 11:25

AW: Klasse eines <body>-Tag im Webbrowser ändern
 
Nur so auf den ersten Blick:
Warum setzt du "className" wenn du "class" ändern willst?

Edit: Sorry nicht gut genug gelesen. Ich werd den Beitrag editieren nachdem ich nochmal gelesen hab

Codehunter 5. Apr 2018 11:35

AW: Klasse eines <body>-Tag im Webbrowser ändern
 
Ja, das wäre Gegenstand der nächsten Entwicklungsschritte gewesen, ob nun "class" oder "className" (Beispiele finden sich für beides) aber so weit kommt es ja nicht, ich bekomme das Body-Element nicht zu fassen.

mkinzler 5. Apr 2018 11:41

AW: Klasse eines <body>-Tag im Webbrowser ändern
 
Hat der Body eine ID? Funktioniert die Ermittlung darüber?

Codehunter 5. Apr 2018 11:51

AW: Klasse eines <body>-Tag im Webbrowser ändern
 
Zitat:

Zitat von mkinzler (Beitrag 1398189)
Hat der Body eine ID? Funktioniert die Ermittlung darüber?

Leider nein, das hatte ich auch schon probiert. Um im Beispiel zu bleiben:
Code:
<!DOCTYPE html>
 <html>
   <head>
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <title>Test</title>
     <link href="dark.css" rel="stylesheet" type="text/css"/>
     <link href="light.css" rel="stylesheet" type="text/css"/>
     <style>
       body {
         border: none;
         margin: 0;
         padding: 0;
       }
     </style>
   </head>

   <body class="dark" id="theBody">
       Test
   </body>
 </html>
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   Es: IHTMLElementCollection;
   E: IHTMLElement;
   Doc: IHtmlDocument3;
begin
   Webbrowser.Document.QueryInterface(IHtmlDocument3, Doc);
   Assert(Doc <> NIL);
   E:= (Webbrowser.Document AS IHTMLDocument3).getElementById('theBody');
   if E <> NIL then begin // <-- E ist NIL
     E.setAttribute('className', 'light', EmptyParam);
   end;
end;

Neutral General 5. Apr 2018 11:51

AW: Klasse eines <body>-Tag im Webbrowser ändern
 
So hat es bei mir funktioniert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  E: IHTMLElement;
begin
  E := (Webbrowser1.Document AS IHTMLDocument2).body;
  if E <> NIL then
    E.setAttribute('className', 'light', 2); // Weiß nicht obs für die 2 ne schöne Konstante gibt
end;
Hab das HTML leicht abgeändert weil ich keine extra CSS Dateien haben wollte:
Code:
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Test</title>
    <style>
      body {
        border: none;
        margin: 0;
        padding: 0;
      }
     .dark {
        background-color:black;
        color:white;
     }
     .light {
        background-color:rgb(220,240,250);
     }
    </style>
  </head>

  <body class="dark">
      Test
  </body>
</html>

Codehunter 5. Apr 2018 12:05

AW: Klasse eines <body>-Tag im Webbrowser ändern
 
Wenn DAS bei dir funktioniert, dann habe ich woanders ein Problem. Die 10.2.3 Starter hat keinen TWebbrowser dabei, den habe ich mir selbst als ActiveX importiert und das Control dynamisch zur Laufzeit erzeugt. Das Laden und Darstellen vom HTML funktioniert wunderbar. Ich vermute derweil, dass sich das Problemchen woanders versteckt. Die Methodik soll eigentlich dann ablaufen, wenn der User das VCL-Style zur Laufzeit umschaltet und die Hintergrundfarbe clWindow z.B. von Weiß auf Schwarz wechselt. Scheinbar bringt der Style-Wechsel den Webbrowser durcheinander, sodass er in dem Moment das Body-Element nicht findet. Mach ich das nicht aktionsgetriggert sondern durch einen simplen Buttonclick, dann klappt das bei mir jetzt auch.

Daher müsste ich jetzt wohl die Frage wie folgt abändern: Wie kann ich (ggf. per Message) abfangen, wenn der StyleManager mit einem Style-Wechsel komplett fertig ist?

himitsu 5. Apr 2018 12:25

AW: Klasse eines <body>-Tag im Webbrowser ändern
 
Zitat:

Zitat von mkinzler (Beitrag 1398189)
Hat der Body eine ID? Funktioniert die Ermittlung darüber?

HTML hat eine definierte Grundstruktur und darüber geht das.

Code:
<html>
   <head>
   </head>
   <body>
   </body>
</html>
Einfach das erste innere Tag Namens "body" (wobei es ja eh nur Eines gegen darf).


Egal welche Doku ich sehe ... überall gibt es noch ein Result, was es in der Delphi-Implementation so nicht gibt.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Da hätte man ja mal schauen können, ob und welchen Fehler es gibt. :stupid:


PS: Du fragst erst IHTMLDocument3 ab, verwendest dann aber IHTMLDocument2. (vielleicht wird dabei intern was angestoßen/geändert)
Und der Michael geht gleich direkt auf IHTMLDocument2.

Außerdem das EmptyParam <> 2.

Codehunter 5. Apr 2018 12:41

AW: Klasse eines <body>-Tag im Webbrowser ändern
 
Die HTML-Struktur ist nicht das Problem. Mein allererster Code hätte auch funktioniert wie ich nun festgestellt habe. Das Problem besteht in dieser Initialisierungsphase vom StyleManager. Da kommt der Webbrowser durcheinander.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 Uhr.
Seite 1 von 2  1 2      

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