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 Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen? (https://www.delphipraxis.net/211017-wie-thtmlviewer-onimagerequest-mit-tedgeborwser-umsetzen.html)

Rolf Frei 14. Jul 2022 16:35

Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen?
 
Ich habe hier noch den THtmlViewer im Einsatz, der aber leider betreffs CSS nicht mehr so recht auf der Zeit ist. Grundlegende Sachen unterstützt er zwar, aber vieles eben auch nicht. Daher habe ich mir überlegt, diesen nun mit den TEdgeBrowser zu ersetzen. Leider fehlen mir da aber praktisch alle Feauters des THmtmlViewers, die ich bisher benötigt habe und habe keine Ahnung wie ich diese im Edge Browser umsetzen kann.

Ich nutze die Events OnImageRequest/OnImageRequeted um dynamisch Bilder zur Runtime zu generieren und diese als Stream im Event an THtmlViewer zu übegeben. Die Image-URL der geladen HMTL-Seite (übergabe als String und nicht als Datei) wird auch von mir mit speziellen Informationen gefüttert, anhand derer ich dann im OnImageRequest Event, genau weiss was für ein Bild ich erzeugen muss. Diese Image-"Url's" sind so nicht vom Browser selber ladbar. (Beispiel: <img href="123@ID-5@abcdgfhts">)

Ein weiteres Problem: Durch das Klicken auf ein solches Bildes, will ich eine Aktion in meinem Programm ausführen.Auhc hier shenich keine Lösung wie das umgesetzt werden kann.

Das hat alles sehr poblemlos mit dem THtmlViwer funktioniert, aber mit dem TEdgeBrowser, als auch dem TWebBrowser, sehe ich da keine Möglichkeit, diesen als lokale HTML Engine zu nutzen. Ich will den nicht als Browser für Internetseiten nutzen, sondern einfach nur von mir erzeugten HTML-Text und speziell formatierte Images-Urls anzeigen.

Kann mir da jemand weiterhelfen wie ich da vorgehen kann? Ist das überhaupt so umsetzbar mit dem TEgdeBrowser oder soll ich doch besser beim THtmlViewer bleiben?

Bernhard Geyer 14. Jul 2022 16:45

AW: Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen?
 
Ich würde das z.B. mit ICS (u.U. reichen auch die Serverkomponenten von Delphi auch aus) umsetzen und das über einen lokalen Webserver laufen zu lassen.
Dieser erzeugt "0815" HTML5-Code, welches du dann mit der TEdgeBrowser anzeigen lässt.

himitsu 14. Jul 2022 17:00

AW: Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen?
 
Statische Bilder/HTML/CSS/JS/... kannst auch über das res:// Protokoll aus den Ressourcen deiner EXE oder einer DLL laden.
(alternativ zu einzeln auf der Platte liegenden Dateien über das file:// Protokoll)
https://docs.microsoft.com/en-us/pre...10218(v=vs.85)

Und jupp, einfach einen lokalen TIdHTTPServer in der EXE und dann auf http://localhost:port/einname (mußt nur bezüglich des Ports etwas anpassen, denn 80 oder 8080 würde ich nicht empfehlen)
* entweder "irgendeinen" statischen Port vorschreiben, den niemand Anderes auf dem PC nutzen darf (der frei sein muß)
* oder beim Start nach einem freien (5-stelligen) Port suchen und ihn sozusagen dynamisch anpassen

oder alternativ vielleicht mit NamedPipes o.Ä. versuchen
https://github.com/richfitz/httppipe
https://github.com/request/request/issues/2296

und dann gäbe es immernoch die Variante die Bilder ins %temp% zu legen und von da zu laden :angle2:



PS: Bilder kann man auch ins HTML einbetten.
anstatt
HTML-Code:
<img src=".../picture.png">
ein
HTML-Code:
<img src="data:image/png;base64,...">
mit dem Dateiinhalt als Base64 (Delphi-Referenz durchsuchenTBase64Encoding / Base64EncodeBase64Encode / Hier im Forum suchenBase64Encode)

https://www.thesitewizard.com/html-t...ata-urls.shtml

Rolf Frei 14. Jul 2022 17:12

AW: Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen?
 
@Bernhard Geyer
Da es hier um ein nicht kommerzielles und hauptsächlich für den Eigenbedarf bestimmtes Programm geht, kann das auf keinen Fall die Lösung sein. Sowas macht Null Sinn für das was ich machen will und wäre wie mit Raketen auf Flöhe schiessen. :) Der Webserver hätte garnicht die nötigen Infos um die Bilder zu generieren. Das Klicken auf die Bilder und auslösen einer Reaktion in meinem Programm (wie ein TButton.OnClick) wäre auch noch nicht gelöst. Das Programm läuft offline und lokal und mit privaten Daten, die auf keinem Webserver irgendwas zu suchen haben.

Kann doch nicht sein, das man im eigenen Programm keine Events für das Anklicken oder das Laden von Bilddateien bekommt und da nach eigenen Wünschen eingreiffen kann. Ich will doch einfach nur die Anzeige eines HTML-String ohne Navigation etc.

himitsu 14. Jul 2022 17:20

AW: Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen?
 
Nicht irgendein Webserver im Internet, sondern ein lokaler Webserver HTTP-Server, in deiner EXE ... genauer lesen :zwinker:

JS/HTML5 sollte für <IMG> Funktionen bieten, um den Click als Aufruf an deinen Webserver zurückzugeben. (falls es im TWebBrowser/TEdgeBrowser kein passendes OnClick-Event gibt)

Rolf Frei 14. Jul 2022 17:34

AW: Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen?
 
Zitat:

Zitat von himitsu (Beitrag 1508789)
Statische Bilder/HTML/CSS/JS/... kannst auch über das res:// Protokoll aus den Ressourcen deiner EXE oder einer DLL laden.
(alternativ zu einzeln auf der Platte liegenden Dateien über das file:// Protokoll)
https://docs.microsoft.com/en-us/pre...10218(v=vs.85)

Und jupp, einfach einen lokalen TIdHTTPServer in der EXE und dann auf http://localhost:port/einname (mußt nur bezüglich des Ports etwas anpassen, denn 80 oder 8080 würde ich nicht empfehlen)
* entweder "irgendeinen" statischen Port vorschreiben, den niemand Anderes auf dem PC nutzen darf (der frei sein muß)
* oder beim Start nach einem freien (5-stelligen) Port suchen und ihn sozusagen dynamisch anpassen

oder alternativ vielleicht mit NamedPipes o.Ä. versuchen
https://github.com/richfitz/httppipe
https://github.com/request/request/issues/2296

und dann gäbe es immernoch die Variante die Bilder ins %temp% zu legen und von da zu laden :angle2:

PS: Bilder kann man auch ins HTML einbetten
https://www.thesitewizard.com/html-t...ata-urls.shtml

1. Die Bilder müssen dynamisch zur Runtime generiert werden, also nicht mit Resourcen.

2. Einen intgerierten Webserver nur um was so simples zu machen, was der THtmlViwer mit Leichtigkeit machen kann, ist fern jeglicher Realität und keine Lösung als Ersatz für die THmtlViwer Komponente, vor allem für meinen Verwendungszweck.

3. Die temporären Dateien wären sicher eine unschöne Notlösung, aber nichts was ich machen will, wenn es anders geht. Habe mir auch überlegt diese als Base64 zu encoden und diekt im HTML einzubetten. Das gefällt mir aber auch nicht so recht, da dadurch das Erstellen des HTML-Strings, vermutlich deutlich verlangsamt würde. Sind doch pro Seite jeweils ca. 50 Bilder.

4. Die Bilder sind ja nur ein Problem, aber die Interaktion, Events auf Tasten/Mausklicks etc. vom TEdgeBrowser und meiner Anwendung, muss doch irgendwie machbar sein ohne all diese unschönen Umwege. Wenn das nicht geht, dass ich auf Anklicken von Bildern in meinem Programm reagieren kann, inklusive Infos welches Bild angeklickt wurde, kann ich es eh vergessen.

Im Moment habe ich das Gefühl, dass diese Komponente rein dazu da ist, eine Webpage darzustellen, aber für die Interaktion mit der eigenen Anwendung nicht zu gebrauchen ist. Kann mir aber echt nicht vorstellen, dass MS da so eine Müll produziert hat, der keine Möglichkeit bietet, auf das Rendering und Aktionen der Seite Einfluss zu nehmen.

Der schöne Günther 14. Jul 2022 18:17

AW: Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen?
 
Zitat:

Die temporären Dateien wären sicher eine unschöne Notlösung, aber nichts was ich machen will, wenn es anders geht. Habe mir auch überlegt diese als Base64 zu encoden und diekt im HTML einzubetten. Das gefällt mir aber auch nicht so recht, da dadurch das Erstellen des HTML-Strings, vermutlich deutlich verlangsamt würde. Sind doch pro Seite jeweils ca. 50 Bilder.
Du sagst "wäre sicher" und "vermutlich würde". Probier es doch einfach aus, geht doch schnell.
Ist der Browser-Engine wohl ziemlich egal, und das Enkodieren als Base64 kann man auf heutigen Systemen auch vernachlässigen, solange du jetzt keine Bilder im Bereich von Dutzenden Megapixeln vorhattest.

KodeZwerg 14. Jul 2022 23:56

AW: Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen?
 
tedgebrowser-component-calling-native-code-from-a-script-running-on-the-embedde

Da wird dir gezeigt wie man interagieren könnte.

Rolf Frei 15. Jul 2022 17:53

AW: Wie THtmlViewer.OnImageRequest mit TEdgeBorwser umsetzen?
 
Danke für den Link. Ja so könnte ich zumindest die Interaktion umsetzen. Mal schauen wie gut das funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04: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