Question WebView

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Question WebView

Message par Shadow »

Salut à tous,

Je m'intéresse actuellement au gadget WebView, j'ai pas trouver beaucoup d'exemple dessus ni une doc complète de comment ça marche :|
Ce que je voudrais savoir c'est si je peu réaliser une application en Java Script et la faire communiquer avec PureBasic avec ça ?

La réponse est très certainement oui, car j'ai un projet, très gros projet (Et ceux qui sont malin on surement déjà compris de quoi je parle ^^)
et je pense pouvoir le réaliser grâce à ce super Gadget, Merci PureBasic !

C'est pas des parole en l'air cette fois, si avec le Gadget WebView je peu communiquer avec le programme JavaScript
alors mon projet à de bonne chance de voir le jour.

Je prends toutes documentations disponible ainsi qu'exemples.
Question: Ya t-il une limite, de quoi est capable ce Gadget ?

Il peu tous gérer ?
Question vague, je sais...

Niveau latence normalement yen à pas ?
Je sais pas comment ça fonctionne, c'est pour ça que je demande.
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Re: Question WebView

Message par Shadow »

Déjà quand je teste un exemple simple de la doc ça crash à la fin :roll:

Code : Tout sélectionner

 ; Un simple bouton qui changera son étiquette par le résultat du rappel PureBasic
  ;
  Html$ =  ~"<button id=\"displayInfo\">Afficher les Infos</button>\n"+
           ~"<script>\n"+
           ~"  const displayInfoElement=document.getElementById(\"displayInfo\");\n"+
           ~"  document.addEventListener(\"DOMContentLoaded\", () => {\n"+
           ~"    displayInfoElement.addEventListener(\"click\", () => {\n"+
           ~"      window.displayInfo(1000, 2000).then(result => {\n"+
           ~"        displayInfoElement.textContent = result.sum;\n"+
           ~"      });\n"+
           ~"    });\n"+
           ~"  });\n"+
           ~"</script>";
    
  Procedure IncrementJS(ParametreJSON$)
    
    Dim Parameters(0)
    
    ParseJSON(0, ParametreJSON$)
    ExtractJSONArray(JSONValue(0), Parameters())
    
    Debug "Nb de Paramètres: " + ArraySize(Parameters())
    
    Debug "Paramètre 1: " + Parameters(0)
    Debug "Paramètre 2: " + Parameters(1)
    
    ProcedureReturn UTF8(~"{ \"sum\": "+Str(Parameters(0) + Parameters(1))+ "}")
  EndProcedure


  OpenWindow(0, 100, 100, 400, 400, "Salut", #PB_Window_SystemMenu)

  WebViewGadget(0, 0, 0, 400, 400)
  SetGadgetItemText(0, #PB_WebView_HtmlCode, Html$)
    
  BindWebViewCallback(0, "displayInfo", @IncrementJS())

  Repeat
    
  Event = WaitWindowEvent(1)
  
  ; Laisser le WebView traiter ses événements
  If Event = #PB_Event_Gadget
    ; Ne rien faire, juste laisser passer
  EndIf
  
Until Event = #PB_Event_CloseWindow
[21 :44 :33] Attente du démarrage du programme...
[21 :44 :33] Type d'exécutable: Windows - x64 (64bit, Unicode, Purifier)
[21 :44 :33] Exécutable démarré.
[21 :44 :39] L'exécutable de débogage se ferme de façon inattendue.
Pourquoi ça crash comme ça ?
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Avatar de l’utilisateur
SPH
Messages : 5018
Inscription : mer. 09/nov./2005 9:53

Re: Question WebView

Message par SPH »

PB 6.30 Beta 3

=> Aucun crash chez moi :idea:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Re: Question WebView

Message par Shadow »

SPH a écrit : sam. 29/nov./2025 22:48 PB 6.30 Beta 3

=> Aucun crash chez moi :idea:
Salut, t'es en 64 Bits ?
Peut etre que ça viens de là ? :?
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Avatar de l’utilisateur
SPH
Messages : 5018
Inscription : mer. 09/nov./2005 9:53

Re: Question WebView

Message par SPH »

Shadow a écrit : dim. 30/nov./2025 0:29
SPH a écrit : sam. 29/nov./2025 22:48 PB 6.30 Beta 3

=> Aucun crash chez moi :idea:
Salut, t'es en 64 Bits ?
Ouai 8)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Re: Question WebView

Message par Shadow »

Errf, je suis en PB 6.30 Beta 3, c'est peut etre sa le problème alors ?
C'est pas critique car ça marche, jusque à la fin du prog sa crach.

Sinon t'as pas d'info sur WebView ?, c'est pas très documenté ce truc :?
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Avatar de l’utilisateur
SPH
Messages : 5018
Inscription : mer. 09/nov./2005 9:53

Re: Question WebView

Message par SPH »

Moi, je code des jeux. J'ai pas besoin de 90% des instructions de PB.

Webview : je sais meme pas ce que c'est mais, vu le nom, ca doit etre un truc web.

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Re: Question WebView

Message par Shadow »

Oui c'est un gadget que je viens de découvrir qui permet en gros de gérer et d'afficher une page web (Avec HTML et du JavaScript)
Mais c'est pas si simple que ça...
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Avatar de l’utilisateur
SPH
Messages : 5018
Inscription : mer. 09/nov./2005 9:53

Re: Question WebView

Message par SPH »

Ce code viens de l'aide mais je ne sais pas ce qu'il fait.
Je pense qu'il faut d'abord savoir ce que l'on veux réaliser avant de piocher dans l'aide. Faut un projet précis...

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - WebView example file
;
;    (c) 2024 - Fantaisie Software
;
; ------------------------------------------------------------
;

Procedure IncrementCallback(JsonParameters$)
  Static Count
  
  Debug #PB_Compiler_Procedure +": " + JsonParameters$
  
  Count + 1
  ProcedureReturn UTF8(~"{ \"count\": "+Str(Count)+ "}")
EndProcedure

Procedure ComputeCallback(JsonParameters$)
  
  Debug #PB_Compiler_Procedure +": " + JsonParameters$
  
  Dim Parameters(0)
  
  ; Extract the parameters from the JSON
  ParseJSON(0, JsonParameters$)
  ExtractJSONArray(JSONValue(0), Parameters())
  
  Debug "Parameter 1: " + Parameters(0)
  Debug "Parameter 2: " + Parameters(1)
    
  ProcedureReturn UTF8(Str(Parameters(0) + Parameters(1)))
EndProcedure

OpenWindow(0, 100, 100, 400, 400, "Hello", #PB_Window_SystemMenu | #PB_Window_Invisible)

WebViewGadget(0, 0, 0, 400, 400)
SetGadgetText(0, "file://" + #PB_Compiler_Home + "examples/sources/Data/WebView/webview.html")
  
BindWebViewCallback(0, "increment", @IncrementCallback())
BindWebViewCallback(0, "compute", @ComputeCallback())

; Show the window once the webview has been fully loaded
HideWindow(0, #False)

Repeat 
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow


!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Re: Question WebView

Message par Shadow »

Oui mais il ne fonctionne pas chez moi cet exemple, dès que je clique ça bug.
[23 :57 :29] Attente du démarrage du programme...
[23 :57 :29] Type d'exécutable: Windows - x64 (64bit, Unicode, Purifier)
[23 :57 :29] Exécutable démarré.
[23 :57 :37] L'exécutable de débogage se ferme de façon inattendue.
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7340
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Question WebView

Message par falsam »

Voici deux fichiers que tu peux download ici https://falsam.com/download/purebasic/WebView_demo0.zip

Le code PB fait appel à un fichier HTML + JS qui va afficher un bouton sur lequel tu cliques.
Chaque évènement JS click est réceptionné par le code PB qui fera appel à une fonction callback qui va incrémenter une variable n qui sera elle même renvoyer au script JS qui mettra à jouer un compteur de clicks. (Une dinguerie) 🤪

Afin d'éviter des erreurs liées à des soucis de protections de dossiers, pourrais tu modifier les options du compilateur (Onglet Compiler/Exécuter) afin de créer l'exécutable temporaire dans le répertoire des sources.


Le code HTML + JS (Sans fioriture)

Code : Tout sélectionner

<!DOCTYPE html>
<html>
<head>

</head>
<body>
<!-- Construction de la page -->
<button id="buttonClick">Clique sur le bouton</button>
<p>Tu as cliqué <span id="countClicks">0</span> fois.</p>

<script>
	// La méthode JavaScript querySelectorAll() associe les constantes :
	// - buttonClick à l'attribut #buttonClick
	// - countClicks ) l'attribut #countClicks
	const [buttonClick, countClicks] = document.querySelectorAll("#buttonClick, #countClicks");
	
	// Attente de l'événement DOMContentLoaded
	// Le navigateur a complètement chargé le HTML 
	document.addEventListener("DOMContentLoaded", () => {
    
		// Attente d'un evenement "click" 
		buttonClick.addEventListener("click", () => {
			// C'est ici que se trouve la fonction increment() 
			// Qui va réceptionner la variable countClick,
			// Et qui mettra à jour le contenu du compteur de clic  
			window.increment().then(result => {
				countClicks.textContent = result.countClick;
			});
		});
	});
</script>
</body>
</html>
Le code PureBasic - Version 6.30 beta 3 (x64)

Code : Tout sélectionner

Procedure  OnClick(JsonParameters.s)
  Static n
  
  n + 1
  
  ; La valeur de la variable n sera envoyé à la variable JS "countClick" 
  ProcedureReturn UTF8(~"{ \"countClick\": " + Str(n)+ "}")
EndProcedure

OpenWindow(0, 0, 0, 800, 600, "Envoyer une variable PB à un Script JS", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Invisible)

WebViewGadget(0, 0, 0, 800, 600)
SetGadgetText(0, "file://"+ GetCurrentDirectory() + "demo0.html")

; BindWebViewCallback(#Gadget, JavaScriptFunction$, @Callback())
; A chaque clic sur le bouton, la fonction increment() décrit dans ton JS sera appelée par le callback OnClick() 
BindWebViewCallback(0, "increment", @OnClick())

; Afficher la fenetre de l'application uniquement quand le WebView est totalement charg
HideWindow(0, #False)

Repeat 
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Enjoy. Ha ha ha 🗒️🙃😁
Configuration : Windows 11 Famille 64-bit - PB 6.23 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Re: Question WebView

Message par Shadow »

Salut Falsam :)

Merci pour ton aide, malheureusement......
Bhaaaaaaa ça ne marche pas :(
[21 :58 :41] Attente du démarrage du programme...
[21 :58 :41] Type d'exécutable: Windows - x64 (64bit, Unicode, Purifier)
[21 :58 :41] Exécutable démarré.
[21 :58 :49] L'exécutable de débogage se ferme de façon inattendue.
Dès que je clique une fois sur le bouton, ça crach. :?
Tu l'as pondu ou ce code, par une IA ? :mrgreen:
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Re: Question WebView

Message par Shadow »

Cet exemple marche mais après que je clique sur OK de la boîte de dialogue, ça crach :?

Code Html à JS:

Code : Tout sélectionner

<!DOCTYPE html>
<html>
<head>
  <title>Simple Editor</title>
  <style>
    body { margin: 0; padding: 0; }
    canvas { display: block; border: 1px solid #ccc; }
  </style>
</head>
<body>
  <canvas id="canvas" width="800" height="600"></canvas>

  <script>
    const canvas = document.getElementById('canvas');
    const ctx = canvas.getContext('2d');
    
    // Un seul objet
    const rect = {
      x: 100,
      y: 100,
      w: 200,
      h: 150,
      color: '#3b82f6'
    };
    
    // Dessiner
    function draw() {
      ctx.fillStyle = '#fff';
      ctx.fillRect(0, 0, canvas.width, canvas.height);
      
      ctx.fillStyle = rect.color;
      ctx.fillRect(rect.x, rect.y, rect.w, rect.h);
      
      ctx.strokeStyle = '#333';
      ctx.lineWidth = 2;
      ctx.strokeRect(rect.x, rect.y, rect.w, rect.h);
    }
    
    draw();
    
    // Clic sur le rectangle
    canvas.addEventListener('click', (e) => {
      const rect_canvas = canvas.getBoundingClientRect();
      const x = e.clientX - rect_canvas.left;
      const y = e.clientY - rect_canvas.top;
      
      // Vérifier si on a cliqué sur le rectangle
      if (x >= rect.x && x <= rect.x + rect.w && y >= rect.y && y <= rect.y + rect.h) {
        // Appeler la fonction PureBasic
        onRectangleClicked();
      }
    });
  </script>
</body>
</html>

Code Purebasic:

Code : Tout sélectionner

Enumeration
  #Window
  #CustomEvent
  #WebViewGadget1
EndEnumeration

; Callback (ne bloque pas)
Procedure OnRectangleClicked(JsonParameters$)
  MessageRequester("Clic détecté!", "Vous avez cliqué sur le rectangle!")
  PostEvent(#PB_Event_Gadget, #Window, #CustomEvent)
  ProcedureReturn UTF8("{...}")
EndProcedure

; Charger le HTML
Define Html.s = ""

If ReadFile(0, "My File.html")
  While Eof(0) = 0
    Html.s + ReadString(0) + #CRLF$
  Wend
  CloseFile(0)
Else
  MessageRequester("Erreur", "Impossible d'ouvrir simple.html")
  End
EndIf

; Créer la fenêtre
OpenWindow(#Window, 100, 100, 800, 600, "Simple Editor")

; Créer le WebView
WebViewGadget(#WebViewGadget1, 0, 0, 800, 600, #PB_WebView_Debug)

; Charger le HTML
SetGadgetItemText(#WebViewGadget1, #PB_WebView_HtmlCode, Html.s)

BindWebViewCallback(#WebViewGadget1, "onRectangleClicked", @OnRectangleClicked())

; Boucle principale
; Boucle principale (affiche le message)
Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_Gadget And EventGadget() = #CustomEvent
    MessageRequester("Clic détecté!", MessageToShow$)
  EndIf
  
Until Event = #PB_Event_CloseWindow
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7340
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Question WebView

Message par falsam »

Shadow a écrit : lun. 01/déc./2025 22:00 Salut Falsam :)

Merci pour ton aide, malheureusement......
Bhaaaaaaa ça ne marche pas :(

Dès que je clique une fois sur le bouton, ça crach. :?
Tu l'as pondu ou ce code, par une IA ? :mrgreen:
Il fonctionne chez moi (voir ma signature) et je n'ai pas utilisé d'IA.
Configuration : Windows 11 Famille 64-bit - PB 6.23 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Re: Question WebView

Message par Shadow »

Je suis en 6.30 béta 4 x 64 Bit moi :?
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Répondre