WebGadget : petite question
WebGadget : petite question
Est il possible (sans passer par un fichier intermediaire) de charger dynamiquement du HTML dans un controle Webgadget ? (Le contenu d'une variable par exemple)
Une idée ?
Merci d'avance pour votre aide
Une idée ?
Merci d'avance pour votre aide
Salut & bienvenu
Si j'ai bien compris ,tu veut stocké une page web dans une variable ?
si oui ce code peut t'aider, il n'est pas de moi, je sais plus ou je l'ai chopé
@++
Si j'ai bien compris ,tu veut stocké une page web dans une variable ?
si oui ce code peut t'aider, il n'est pas de moi, je sais plus ou je l'ai chopé

Code : Tout sélectionner
Procedure.s OpenURL(Url.s,BufferSize.l)
isLoop.b=1
INET_RELOAD.l=$80000000
hInet.l=0: hURL.l=0: Bytes.l=0
Buffer.s=Space(BufferSize)
hInet = InternetOpen_("PB@INET", 1, #Null, #Null, 0)
hURL = InternetOpenUrl_(hInet, Url, #Null, 0, INET_RELOAD, 0)
Repeat
Delay(1)
InternetReadFile_(hURL, @Buffer, Len(Buffer), @Bytes)
If Bytes = 0
isLoop=0
Else
res.s = res + Left(Buffer, Bytes)
EndIf
Until isLoop=0
InternetCloseHandle_(hURL)
InternetCloseHandle_(hInet)
If *Retour.l : FreeMemory(*Retour) : EndIf
*Retour = AllocateMemory(Len(res)*4)
PokeS(*Retour,res)
ProcedureReturn PeekS(*Retour)
EndProcedure
Bienvenu,
Sur le forum anglais quelqu'un a écrit une fonction WebGadget_Write http://www.purebasic.fr/english/viewtop ... 7&start=60
Je pense que c'est ce que tu cherches.
Sur le forum anglais quelqu'un a écrit une fonction WebGadget_Write http://www.purebasic.fr/english/viewtop ... 7&start=60
Je pense que c'est ce que tu cherches.
En effet, c'est une solution, mais vu la taille ça me donne l'impression de chasser un moucheron avec un bazooka.
Donc, j'ai pensé à une autre façon de voir les choses.
Quand on veut charger dans une controle webgadget une page web, il suffit d'en donner l'adresse. Et si cette adresse est du type http://127.0.0.1 on se retrouve avec une requete locale.
D'où l'idée de monter un petit serveur. Je suis donc en train d'entreprendre la modification de l'Atomic Web Server donc le code est donné avec PB.
Et au lieu d'utiliser la fonction SendNetworkData(ConnectionID, *BufferMemoire, Longueur), pourquoi ne pas utiliser SendNetworkString(ConnectionID, String$) ?
En plus le code pourrait être encore plus épuré, vu qu'il est possible de controler le type de demande.
En revanche, petite question : Dans le header du fichier envoyé, la taille donnée c'est la taille sans le header ou c'est la taille totale du fichier envoyé ?
Bon... je retourne derrière mon clavier. Si vous avez des idées à me soumettre, des remarques, je suis preneur.
A bientôt

Donc, j'ai pensé à une autre façon de voir les choses.
Quand on veut charger dans une controle webgadget une page web, il suffit d'en donner l'adresse. Et si cette adresse est du type http://127.0.0.1 on se retrouve avec une requete locale.
D'où l'idée de monter un petit serveur. Je suis donc en train d'entreprendre la modification de l'Atomic Web Server donc le code est donné avec PB.
Et au lieu d'utiliser la fonction SendNetworkData(ConnectionID, *BufferMemoire, Longueur), pourquoi ne pas utiliser SendNetworkString(ConnectionID, String$) ?
En plus le code pourrait être encore plus épuré, vu qu'il est possible de controler le type de demande.
En revanche, petite question : Dans le header du fichier envoyé, la taille donnée c'est la taille sans le header ou c'est la taille totale du fichier envoyé ?
Bon... je retourne derrière mon clavier. Si vous avez des idées à me soumettre, des remarques, je suis preneur.
A bientôt
Voilà, donc après un petit brainstorming une solution (parmis tant d'autres)
Le code, comme indiqué s'inspire du serveur Web fourni avec PB.
Le code, comme indiqué s'inspire du serveur Web fourni avec PB.
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; Pico Web Server
;
; Basé sur l'Atomic web server - (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#String_0
#Button_0
#Web_0
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#Window_0, 253, 11, 443, 412, "Pico Web", #PB_Window_SystemMenu | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_0))
StringGadget(#String_0, 0, 0, 440, 130, "<HTML><BODY SCROLL=NO>Test envoie direct</BODY></HTML>")
ButtonGadget(#Button_0, 0, 130, 440, 20, "Transmettre données")
WebGadget(#Web_0, 0, 150, 440, 260, "")
EndIf
EndIf
EndProcedure
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 8070
*Buffer = AllocateMemory(10000)
Global EOL$
Global page$
EOL$ = Chr(13)+Chr(10)
If CreateNetworkServer(0, Port)
Open_Window_0()
SetGadgetText(#Web_0,"http://127.0.0.1:8070")
Repeat
Repeat
WEvent = WindowEvent()
If WEvent = #PB_Event_CloseWindow : Quit = 1 : EndIf
If WEvent = #PB_Event_Gadget
If EventGadget()=#Button_0
page$=GetGadgetText(#String_0)
SetGadgetState(#Web_0,#PB_Web_Refresh)
EndIf
EndIf
Until WEvent = 0
SEvent = NetworkServerEvent()
If SEvent
ClientID.l = EventClient()
Select SEvent
Case 1 ; When a new client has been connected...
Case 4 ; When a client has closed the connection...
Default
RequestLength.l = ReceiveNetworkData(ClientID, *Buffer, 2000)
Gosub ProcessRequest
EndSelect
Else
Delay(20) ; Don't stole the whole CPU !
EndIf
Until Quit = 1
CloseNetworkServer(0)
Else
MessageRequester("Pico Web", "Error: can't create the server (port in use ?).", 0)
EndIf
End
ProcessRequest:
;a$ = PeekS(*Buffer) : Pour récuperer la requete.
ContentType$ = "text/html"
;page$="<HTML><BODY>Test</BODY></HTML>"
head$="HTTP/1.1 200 OK"+EOL$
head$=head$+"Date: Wed, 07 Aug 1996 11:15:43 GMT"+EOL$
head$=head$+"Server: Pico Web Server 0.1"+EOL$
head$=head$+"Content-Length: "+Str(Len(page$))+EOL$
head$=head$+"Content-Type: "+ContentType$+EOL$
head$=head$+EOL$
page$=head$+page$
SendNetworkString(ClientID,page$)
Return
C'est simple en fait, et je n'avais pas compris ta requete, pourtant tu était clair
pour me faire pardonner voici le meme code, sauf que tu peut y stocker une page entière puis redimensionner la fenetre.

pour me faire pardonner voici le meme code, sauf que tu peut y stocker une page entière puis redimensionner la fenetre.

Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; Pico Web Server
;
; Basé sur l'Atomic web server - (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#String_0
#Button_0
#Web_0
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#Window_0, 253, 11, 443, 412, "Pico Web", #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_SizeGadget)
If CreateGadgetList(WindowID(#Window_0))
EditorGadget(#String_0,0,0,440,130)
ButtonGadget(#Button_0, 0, 130, 440, 20, "Transmettre données")
WebGadget(#Web_0, 0, 150, 440, 260, "")
SetGadgetText(#String_0 ,"<HTML><BODY SCROLL=NO>Test envoie direct</BODY></HTML>")
EndIf
EndIf
EndProcedure
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 8070
*Buffer = AllocateMemory(10000)
Global EOL$
Global page$
EOL$ = Chr(13)+Chr(10)
If CreateNetworkServer(0, Port)
Open_Window_0()
SetGadgetText(#Web_0,"http://127.0.0.1:8070")
Repeat
Repeat
WEvent = WindowEvent()
If WEvent = #PB_Event_SizeWindow
ResizeGadget(#String_0,0,0,WindowWidth(#Window_0),WindowHeight(#Window_0)/2)
ResizeGadget(#Web_0,0,(WindowHeight(#Window_0)/2)+20,WindowWidth(#Window_0),WindowHeight(#Window_0)/2)
ResizeGadget(#Button_0, 0, (WindowHeight(#Window_0)/2), WindowWidth(#Window_0),20)
EndIf
If WEvent = #PB_Event_CloseWindow : Quit = 1 : EndIf
If WEvent = #PB_Event_Gadget
If EventGadget()=#Button_0
page$=GetGadgetText(#String_0)
SetGadgetState(#Web_0,#PB_Web_Refresh)
EndIf
EndIf
Until WEvent = 0
SEvent = NetworkServerEvent()
If SEvent
ClientID.l = EventClient()
Select SEvent
Case 1 ; When a new client has been connected...
Case 4 ; When a client has closed the connection...
Default
RequestLength.l = ReceiveNetworkData(ClientID, *Buffer, 2000)
Gosub ProcessRequest
EndSelect
Else
Delay(20) ; Don't stole the whole CPU !
EndIf
Until Quit = 1
CloseNetworkServer(0)
Else
MessageRequester("Pico Web", "Error: can't create the server (port in use ?).", 0)
EndIf
End
ProcessRequest:
;a$ = PeekS(*Buffer) : Pour récuperer la requete.
ContentType$ = "text/html"
;page$="<HTML><BODY>Test</BODY></HTML>"
head$="HTTP/1.1 200 OK"+EOL$
head$=head$+"Date: Wed, 07 Aug 1996 11:15:43 GMT"+EOL$
head$=head$+"Server: Pico Web Server 0.1"+EOL$
head$=head$+"Content-Length: "+Str(Len(page$))+EOL$
head$=head$+"Content-Type: "+ContentType$+EOL$
head$=head$+EOL$
page$=head$+page$
SendNetworkString(ClientID,page$)
Return
Merci pour vos commentaires et pour la modification (complément) de code. Mais j'avais juste mis ça en place pour valider la procédure.
Ce petit module va s'insérer dans un projet plus complexe.
J'ai besoin de réaliser un applicatif qui va s'appuyer sur une base SQL déposée sur un serveur mutualisé. Qui dit mutualisé petit prix, dit bande passante, flux mensuel limités. Ca c'est pour l'aspect "serveur". Coté client l'affichage sera géré par un simple browser. La solution donc simpliste est d'utiliser le duo PHP/SQL pour faire tourner tout ça.
Mais dans la majorité des cas, le fonctionnement revient à envoyer une requete, executer un script PHP, charger du code / des graphismes. Et c'est là qu'intervient mon petit module. Au lieu de demander l'integralité de la page et des graphiques au serveur, pourquoi ne pas demander juste les données et faire la mise en forme finale coté client. Il est même envisageable (et envisagé) de charger une partie des graphismes d'avance sous la forme de fichier "packed". Car finalement, la majeure partie du temps, les scripts PHP ne servent qu'a faire de la mise en forme de données. Et là, si par exemple, au lieu de charger une page de (par exemple) 60 Ko il suffit de charger 1 ou 2 ko de données brutes, voilà qui va devenir ridicule au niveau charge serveur/flux de données. De là à créer un micro-langage de script en PB, il n'y a qu'un pas.
Donc, et je vous ferais parvenir le résultat de mes essais, plusieurs modules seront à créer :
- Vérification de version et mise à jour automatique de programmes / données
- Lecture de données sur une base SQL délocalisée et récupération sous forme de variable
- Mini langage de script (pourquoi pas
)
- Et autres choses à venir surement ...
A bientôt
Ce petit module va s'insérer dans un projet plus complexe.
J'ai besoin de réaliser un applicatif qui va s'appuyer sur une base SQL déposée sur un serveur mutualisé. Qui dit mutualisé petit prix, dit bande passante, flux mensuel limités. Ca c'est pour l'aspect "serveur". Coté client l'affichage sera géré par un simple browser. La solution donc simpliste est d'utiliser le duo PHP/SQL pour faire tourner tout ça.
Mais dans la majorité des cas, le fonctionnement revient à envoyer une requete, executer un script PHP, charger du code / des graphismes. Et c'est là qu'intervient mon petit module. Au lieu de demander l'integralité de la page et des graphiques au serveur, pourquoi ne pas demander juste les données et faire la mise en forme finale coté client. Il est même envisageable (et envisagé) de charger une partie des graphismes d'avance sous la forme de fichier "packed". Car finalement, la majeure partie du temps, les scripts PHP ne servent qu'a faire de la mise en forme de données. Et là, si par exemple, au lieu de charger une page de (par exemple) 60 Ko il suffit de charger 1 ou 2 ko de données brutes, voilà qui va devenir ridicule au niveau charge serveur/flux de données. De là à créer un micro-langage de script en PB, il n'y a qu'un pas.
Donc, et je vous ferais parvenir le résultat de mes essais, plusieurs modules seront à créer :
- Vérification de version et mise à jour automatique de programmes / données
- Lecture de données sur une base SQL délocalisée et récupération sous forme de variable
- Mini langage de script (pourquoi pas

- Et autres choses à venir surement ...
A bientôt
Salut Pascal, vraiment super!
Tu peux faire un éditeur de pages et site web rapido, en visionnant illico ce que tu codes en html. Ca peut devenir un wysywig sympa!

Tu peux faire un éditeur de pages et site web rapido, en visionnant illico ce que tu codes en html. Ca peut devenir un wysywig sympa!
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.