AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Klasse eines <body>-Tag im Webbrowser ändern
Thema durchsuchen
Ansicht
Themen-Optionen

Klasse eines <body>-Tag im Webbrowser ändern

Ein Thema von Codehunter · begonnen am 31. Mär 2018 · letzter Beitrag vom 6. Apr 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Klasse eines <body>-Tag im Webbrowser ändern

  Alt 31. Mär 2018, 21:05
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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 5. Apr 2018, 11:23
*hochschubs*

Hat keiner eine Idee?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

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

  Alt 5. Apr 2018, 12:25
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 5. Apr 2018 um 12:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 5. Apr 2018, 12:35
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 5. Apr 2018, 12:41
Hat der Body eine ID? Funktioniert die Ermittlung darüber?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 5. Apr 2018, 12:51
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;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

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

  Alt 5. Apr 2018, 12:51
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>
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 5. Apr 2018 um 12:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 5. Apr 2018, 13:05
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?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 5. Apr 2018, 13:25
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.


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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Apr 2018 um 13:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 5. Apr 2018, 13:41
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.
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