![]() |
Klasse eines <body>-Tag im Webbrowser ändern
Hallo!
Ich habe ein HTML-Dokument wie dieses:
Code:
Wie man sieht wird dem <body>-Tag direkt eine Klasse "dark" zugewiesen. Hier noch die beiden CSS-Dateien:
<!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>
Code:
body.dark {
color: #ffffff; background-color: #000000; }
Code:
(Das ist nur das Grundgerüst, deshalb wirkt das so banal)
body.light {
color: #000000; background-color: #ffffff; } 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:
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...
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; Grüße Cody |
AW: Klasse eines <body>-Tag im Webbrowser ändern
*hochschubs*
Hat keiner eine Idee? |
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 |
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.
|
AW: Klasse eines <body>-Tag im Webbrowser ändern
Hat der Body eine ID? Funktioniert die Ermittlung darüber?
|
AW: Klasse eines <body>-Tag im Webbrowser ändern
Zitat:
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; |
AW: Klasse eines <body>-Tag im Webbrowser ändern
So hat es bei mir funktioniert:
Delphi-Quellcode:
Hab das HTML leicht abgeändert weil ich keine extra CSS Dateien haben wollte:
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;
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> |
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? |
AW: Klasse eines <body>-Tag im Webbrowser ändern
Zitat:
Code:
Einfach das erste innere Tag Namens "body" (wobei es ja eh nur Eines gegen darf).
<html>
<head> </head> <body> </body> </html> Egal welche Doku ich sehe ... überall gibt es noch ein Result, was es in der Delphi-Implementation so nicht gibt. ![]() 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. |
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 07:33 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 by Thomas Breitkreuz