Beschreibung zu: WebView4Delphi (für Windows WebView2)

Antworten
Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 333
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Beschreibung zu: WebView4Delphi (für Windows WebView2)

Beitrag von Jorg3000 »

Hallo!
Hier zunächst ein kleines Vorwort, weil dies der erste Beitrag in diesem Unterforum ist. Ich habe dieses Forum "Komponenten-Vorstellungen" vorgeschlagen, weil es bei vielen externen Packages/Komponenten gar keine Beschreibung, nur eine minimale Beschreibung oder keine deutsche Beschreibung gibt.

Ich wurde gebeten, hier als erstes mal selber eine Komponente vorzustellen. Ich nehme WebView4Delphi, das ich letztes Wochenende neu ausprobiert habe.
Die Länge geht über eine übliche Komponenten-Beschreibung hinaus, weil ich (ursprünglich für mich selbst) Infos über das ganze Thema WebView2 zusammengetragen habe.

Damit der folgende Beschreibungstext zukünftig evtl. auch an anderer Stelle für die Komponente verwendet werden kann, vorab die Erklärung:
Mit dem Veröffentlichen eines Beitrags oder Kommentars in diesem Forums-Thread erklärt sich jeder Verfasser damit einverstanden, dass sein Beschreibungstext ohne Namensnennung für eine Komponentenbeschreibung in allen Medien genutzt werden darf. Dies umfasst auch gekürzte, auszugsweise oder in bearbeiteter Form veröffentlichte Fassungen. Der Verfasser verzichtet auf jegliche Ansprüche in Bezug auf die Nutzung und Bearbeitung und Veröffentlichung seines Textes. Dies entspricht der bedingungslosen Lizenz CC0 (Creative Commons Zero).

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 333
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Beschreibung zu: WebView4Delphi (für Windows WebView2)

Beitrag von Jorg3000 »

WebView4Delphi

WebView4Delphi erlaubt das Einbetten des Edge-Browsers in Pascal-Programme unter Windows.
Man erhält WebView4Delphi über den Lazarus Online-Package-Manager oder bei GitHub: https://github.com/salvadordf/WebView4Delphi

Das Browser-Control kann man nicht nur zum Darstellen von Webseiten nutzen, sondern auch z.B. für eine eigene GUI per HTML, denn man kann den Browser mit HTML und JavaScript füttern, das man in seinem Pascal-Programm selber erzeugt.
Auch das Auslesen von Inhalten ist möglich. Dabei läuft die Datenübergabe modern über JSON, das man am besten im Browser von einem injizierten JavaScript zusammentragen lässt.

WebView4Delphi (4 = "for", nicht Version 4) ist eine Open-Source-Komponente unter MIT-Lizenz für Delphi und Lazarus, die eine einfache Integration von WebView2 ermöglicht.
WebView2 ist eine Windows-spezifische Schnittstelle, die seit Windows 10 (ab Update von 2021) mitsamt des Browser-Kerns automatisch in Windows enthalten ist und automatisch mit upgedatet wird. Deshalb funktioniert WebView4Delphi nur auf Windows.
Unter Linux oder MacOS kann man CEF4Delphi (CEF = Chromium Embedded Framework) verwenden, muss dann aber ggf. den großen Chromium-Kern in einer festen Version selber mitbringen, oder?

WebView2 ist ein Ersatz für das alte MSHTML (in Delphi bekannt als TWebBrowser), das auf dem Internet Explorer basiert, der 2015 von Edge abgelöst wurde. MSHTML ist zwar in Windows immer noch enthalten und erhält sogar gelegentlich Sicherheitsupdates, kennt aber keine aktuellen CSS- und JavaScript-Standards, z.B. wurden HTML5 und CSS3 vom Internet Explorer nur unvollständig umgesetzt und ECMAScript 2015 (ES6) gar nicht unterstützt.

Unglücklicherweise muss man für WebView2 eine kleine Loader-DLL selber mitbrigen, nämlich die "WebView2Loader.dll" von Microsoft. Die DLL ist nur ca. 150 kb klein, aber ich finde es trotzdem sehr ärgerlich, dass sie nicht zentral in Windows bereitsteht.
In WebView4Delphi kann man den Pfad und Dateinamen der mitgebrachten DLL wenigsten selber per GlobalWebView2Loader.LoaderDllPath festlegen.

Im \source-Ordner von WebView4Delphi finden sich einige Beispiele auch für Lazarus.

Etwas gewöhnungsbedürftig an WebView2 ist, dass die Zugriffe asynchron laufen, weil für jedes Chromium-Control ein eigener Process gestartet wird. Im Task-Manager sieht man dann ggf. mehrere "Microsoft Edge WebView2" (msedgewebview2.exe).
Für das Programmieren bedeutet es, dass man in der Kommunikation mit dem Browser nicht sofort ein Ergebnis erhält, sondern irgendwann einen Callback, für den man eine eigene Procedure erstellen muss.

Wenn man eine Web-App für einen externen Browser programmiert, erzeugt man i.d.R. im eigenen Programm einen lokalen Webserver, der vom Browser über localhost oder 127.0.0.1 angesprochen wird. Dies funktioniert auch bei einem eingebetteten Browser. Alternativ hat man die Möglichkeit, alle Requests des Browsers abzufangen und selber zu beantworten. Dann kann man sich den Webserver und die Kommunikation über einen Port sparen.

Hier noch ein paar Links:
GitHub: https://github.com/salvadordf/WebView4Delphi
Seite des Autors: https://www.briskbard.com/index.php?lan ... id=webview
WebView2: https://learn.microsoft.com/en-us/micro ... -to/static
API: https://learn.microsoft.com/de-de/micro ... s=win32cpp

Vielleicht kann ich in nächster Zeit noch ein paar praktische Code-Schnipsel nachliefern.
Grüße, Jörg

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1609
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Beschreibung zu: WebView4Delphi (für Windows WebView2)

Beitrag von fliegermichl »

Kann man das als Ersatz für ein WidgetSet verstehen?
Mir ist noch nicht ganz klar, was für Vorteile das gegenüber einem "normalen" LCL Programm haben soll.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 333
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Beschreibung zu: WebView4Delphi (für Windows WebView2)

Beitrag von Jorg3000 »

fliegermichl hat geschrieben: Mi 12. Mär 2025, 08:18 Mir ist noch nicht ganz klar, was für Vorteile das gegenüber einem "normalen" LCL Programm haben soll.
Wenn man mit der LCL zufrieden ist und damit alles machen kann, was man benötigt, braucht man nicht krampfhaft nach Vorteilen einer Browser-Darstellung zu suchen.
Es ist eher umgekehrt: Wenn man z.B. eine eigene Web-Anwendung hat oder plant, könnte man ihr in einem Pascal-Programm ein Zuhause geben. :)
Man könnte die Bereitstellung z.B. aus PHP in eine Lazarus-Anwendung verlagern und somit eine ursprüngliche Web-Anwendung auch als monolithisches Programm anbieten.

Zudem mag ich an HTML und JavaScript die fast grenzenlose Flexibilität bei der Gestaltung einer Oberfläche und der Darstellung der Inhalte, die man in der LCL nur mit sehr viel Aufwand hinbekommt.
Es ist halt eine zusätzliche, völlig andere Möglichkeit für eine GUI oder als GUI-Beiwerk. Aber es macht nur Sinn, wenn man auf HTML/JS Bock hat.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1609
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Beschreibung zu: WebView4Delphi (für Windows WebView2)

Beitrag von fliegermichl »

Bedeutet das, ich kann eine neue Anwendung sowohl als Desktopprogramm, als auch als Webanwendung auf dem Webserver mit dem gleichen Quellcode betreiben?
Das wäre sehr interessant.

Kann ich da ein konkretes Beispiel (Minimalprogramm) finden?

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 333
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Beschreibung zu: WebView4Delphi (für Windows WebView2)

Beitrag von Jorg3000 »

Im Prinzip ja.
Zur Verdeutlichung fehlt eigentlich ein Zwitter-Beispielprogramm, das sowohl einen Webserver integriert, als auch einen Browser einbettet. Beide Programmteile würden an die gleiche Datenbasis/Programmlogik (Pascal) angebunden. Dann könnte man entweder per externem Browser (z.B. Firefox) den Inhalt über localhost abrufen - oder das Programm schiebt den Inhalt aktiv in den eingebetteten Browser, wobei kein Server benötigt wird. Als Fensteranwendung hätte man dann eine geschlossene Windows-Anwendung, und ohne Fenster einen Webservice z.B. für eine Intranet-Seite - aber beides mit der gleichen Datenbasis und Business Logic (in Pascal).

Gut wäre es, wenn es eine Weiche gäbe, die entweder auf externe Port-Anfragen oder auf interne WebView2-Anfragen regiert (was abgesehen von der Quelle ziemlich das Gleiche ist) und als Schnittstelle für dieselbe Anwendungslogik dient.
Vielleicht finde ich nächste Woche Zeit, mal ein Beispiel zu programmieren, denn ich brauche soetwas im Prinzip auch selber. :)

Antworten