Générateur de page d'accueil pour navigateur web

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
PK1157
Messages : 10
Inscription : jeu. 14/mai/2015 23:37
Localisation : FRANCE 66 PYRENEES ORIENTALES

Générateur de page d'accueil pour navigateur web

Message par PK1157 »

Bonsoir à toutes et tous,
Je suis de ceux qui sont lassés des pages d'accueil de navigateur qui nous présentent la météo et les dernières avanies de la starlette du moment au milieu d'un torrent de publicités pour des remèdes contre les hémorroïdes ou la chute des cheveux …
En outre, le contenu actif de ce type de page se paie cher en terme de temps d'affichage quand on ne dispose pas d'un très haut débit.
Alors, j'ai décidé de me faire ma page d'accueil "à moi", statique et rapide, avec les liens qui m'intéressent vraiment.
Tout "gratter" en html avec Notepad++ m'a pris un certain temps …, mais ça a marché.
Pour vous éviter un pareil labeur, jai donc rédigé un programme en PureBasic qui génère la page d'accueil html en y intégrant les liens que vous jugez utiles.
Une fois la page générée, il suffit de l'enregistrer sur le PC et d'indiquer son adresse à votre navigateur favori dans l'option "page de démarrage".
Sur le plan de la programmation, outre PureBasic, ce projet est assez didactique, car il mêle du code html et des requêtes vers une base de données SQLITE.
Un essai vaut sans doute mieux qu'un long discours.
Après réflexion, je me suis rendu compte que mon envoi initial n'était qu'un infâme brouillon :
- Pas de documentation ou d'aide explicite au cours du programme ;
- Ma page d'exemple avec une requête SQL à lancer soi-même, pas top !
- Oubli de préciser que SQLITE3 est nécessaire au fonctinnement ;
… plus deux ou trois bogues ça et là.
Voici donc une nouvelle version qui ne nécessite plus une requête SQL externe (elle figure en DataSection en fin de source).
Addendum :
Le programme a été testé sous win10, et il devrait être opérationnel avec les versions précédentes de cet environnement, sous réserve de la possibilité d'y installer Sqlite3, le gestionnaire de Base de Données.
Une version adaptée à Linux est en gestation, pour peu que mes activités de fraîchement retraité m'en laissent le loisir …

Le programme principal :

Code : Tout sélectionner

; -------------------------------------------------
;                 G E N  H E L L O
; Générateur de Page d'Accueil pour Navigateur web
; -------------------------------------------------
;
Procedure.s _RepeteChaine(car$=" ",nb.i=1)	;	Fabrique une chaîne contenant <nb> fois la chaîne passée en premier paramètre.
	Res$="" : For k=1 To nb : Res$+car$ : Next k
	ProcedureReturn Res$
EndProcedure

Procedure Afficheinfo()	;	Utilisée pour fabriquer les messages affichés dans les fenêtres d'aide (texte en DataSection).
	Tit$="" : Msg$=""
	Read.s x$
	While x$<>"<EOD>"
		If Tit$=""
			Tit$=x$
		Else
			If Msg$<>"" : Msg$+#CR$ : EndIf
			Msg$+x$
		EndIf
		Read.s x$
	Wend
	MessageRequester(Tit$,Msg$,#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
EndProcedure

Procedure DeclarVar()	;	Déclare les variables GLOBALES utilisées dans le corps du programme.
	Global$ ResSQL$=""	;	Contient le résultat (lignes séparées par <RC>) de la dernière requête SQL exécutée sur la BDD GenHello.sq3.
	Global$ VarPage$=""	;	Contient les valeurs (séparées par tabulation) du dernier enregistrement lu dans la Table <Pages> de la BDD GenHello.sq3.
	Global$ VarLien$=""	;	Contient les valeurs (séparées par tabulation) du dernier enregistrement lu dans la Table <Liens> de la BDD GenHello.sq3.
	Global$ Req$=""		;	Contient le texte de la requête SQL qui sera soumise au SGBD.
	Global$ HTM$=""		;	Contient le texte du fichier HTML résultat du programme ; il est construit à partir d'un en-tête(heading), d'un corps(body) et d'un en-pied(footing).
	Global EntHTM$=""		;	Contient l'en-tête du fichier HTML ; il définit notamment les styles utilisés dans le reste du document.
	Global$ VarForm$=""	;	Contenu de la balise <FORM> … </FORM> utilisée pour générer un lien hypertexte appelé par un Bouton.
	Global$ PathFic$="", NomFic$="", ExtFic$=""	;	Chemin, Nom de fichier et extension des fichiers externes utilisés.
	Global.i PageAct=0, LienAct=0						;	IDs de la Page et du Lien en cours de traitement par le programme.
	Global PosH.i=0 , PosV.i=0							;	Positions horizontale et verticale des gadgets utilisés dans les descriptions de fenêtre.
	Global.i PolSaisie=0, PolTitre=0					;	Polices utilisées dans les gadgets (cf procedure InitPol).
	Global.i FenPrinc=0, FenPage=100,	FenLien=200, FenRubriques=300	;	ID des fenêtres du programme.
	Global$ NomFenP$="GenHello", NomFenPg$="Page", NomFenL$="Lien", NomFenR$="Rubriques"	;	Nom des Fenêtres du programme.
	Global.i LargFenP=1125, HautFenP=960																	;	dimensions de la fenêtre principale.
	Global.i LargFenPg=400, HautFenPg=200																	;	dimensions de la fenêtre <Page>.
	Global.i LargFenL=500, HautFenL=400																		;	dimensions de la fenêtre <Lien>.
	Global.i LargFenR=480, HautFenR=500																		;	dimensions de la fenêtre <Rubrique>.
	Global.i i=0																									;	Variable entière "à tout faire" utilisée dans les boucles.
	Global$ x$=""																									;	Variable chaîne "à tout faire" utilisée un peu partout !
EndProcedure																										;

;	Chargement des Procédures de gestion de la Base de Données
IncludeFile("GestBDD.pb")
;
Procedure EcritHtm()
	;	====================================
	;	Ecriture du Fichier HTML de la Page
	;	====================================
	NomFicHTM$=PathFic$+NomFic$+".htm"
	If CreateFile(0, NomFicHTM$,#PB_File_NoBuffering | #PB_UTF8)
		WriteStringN(0,HTM$)
		CloseFile(0)
	Else
		MessageRequester("Information","Impossible de créer le fichier!")
	EndIf
EndProcedure

Procedure ExplodePath(NF$="") ; Récupère dans 3 variables le chemin, le nom et l'extension d'un fichier.
	PathFic$=GetPathPart(NF$) : NomFic$=GetFilePart(NF$,#PB_FileSystem_NoExtension) : ExtFic$=UCase(GetExtensionPart(NF$))
EndProcedure

Procedure.s FindExe(Exe$="")	;	Recherche sur les Lecteurs du PC (C:\, D:\, E:\, F:\) le chemin de l'appli SQLITE3.EXE.
										;	Cette appli est requise pour générer le fichier Exemple lors de la première utilisation de GenHello ou en cas de suppression du fichier GenHello.sq3.
	RepSQ3$=""
	Lecteurs$="C:\"+#TAB$+"D:\"+#TAB$+"E:\"+#TAB$+"F:\"
	For NumDisk=1 To 4
		Disk$=StringField(Lecteurs$,NumDisk,#TAB$)
		Cmd$="@ECHO Recherche dans le disque "+Disk$
		Cmd$+Chr(13)+Chr(10)+"@ECHO =================================="
		Cmd$+Chr(13)+Chr(10)+"DIR "+Disk$+Exe$+~".exe /s  | find \"pertoire de \" > FindExe.TXT"	;	Changer le motif si votre PC n'est pas en version française !
		If OpenFile(0,GetCurrentDirectory()+"FindExe.bat",#PB_Ascii)
			WriteStringN(0,Cmd$)
			CloseFile(0)
			Execution=RunProgram(GetCurrentDirectory()+"FindExe.bat"," ",GetCurrentDirectory(),#PB_Program_Wait)
			If ReadFile(0,GetCurrentDirectory()+"FindExe.TXT")
				While Eof(0) = 0 And RepSQ3$=""
					RepSQ3$=ReadString(0)
					RepSQ3$=StringField(RepSQ3$,2,"pertoire de")	;	Changer le motif si votre PC n'est pas en version française !
				Wend
				CloseFile(0)
			EndIf
		EndIf
		If RepSQ3$<>"" : Break : EndIf
	Next NumDisk
	ProcedureReturn RepSQ3$
EndProcedure

Procedure$ FormatLib(VarIn$="",Saut$="<br />")	;	Formate le libellé des Boutons pour éviter une trop grande largeur.
	VarOut$="" : Ligne$=""
	Lig$=ReplaceString(VarIn$,"  "," ") : ;	suppression des espaces multiples
	j=1 : Mot$=StringField(Lig$,j," ")
	While Mot$<>""
		If (Len(Ligne$)+Len(Mot$))<10
			If Ligne$<>"" : Ligne$+" " : EndIf
			Ligne$+Mot$
		Else
			If VarOut$<>"" : VarOut$+Saut$ : EndIf
			VarOut$+Ligne$ : Ligne$=Mot$
		EndIf
		j+1 : Mot$=StringField(Lig$,j," ")
	Wend
	If VarOut$<>"" : VarOut$+Saut$ : EndIf
	VarOut$+Ligne$
	ProcedureReturn VarOut$
EndProcedure

Procedure GenComboRub()	;	Garnit (ou rafraîchit) la ComboBox des Rubriques disponibles (cf. procédure ModifLien).
	ClearGadgetItems(207)
	LitTable("Rubriques","ORDER BY ID")
	j=-1 : i=1 : x$=Trim(StringField(ResSQL$,i,#CR$),#TAB$) : y$=Trim(StringField(VarLien$,3,#TAB$)," ")
	While x$<>""
		AddGadgetItem(207,-1,x$)
		If y$=x$ : j=i-1 : EndIf
		i+1 : x$=Trim(StringField(ResSQL$,i,#CR$),#TAB$)
	Wend
	SetGadgetState(207,j)
EndProcedure

Procedure RefreshRub()
	ClearGadgetItems(303)
	Req$="SELECT ID, (SELECT COUNT(*) FROM Liens WHERE Liens.IDRubrique=Rubriques.ID) AS 'Utilisations' FROM Rubriques ORDER BY ID"
	LitSQL(Req$)
	i=1 : x$=StringField(ResSQL$,i,#CR$)
	While x$<>""
		AddGadgetItem(303,-1,ReplaceString(x$,#TAB$,Chr(10)))
		i+1 : x$=StringField(ResSQL$,i,#CR$)
	Wend
	AddGadgetItem(303,-1,"~Nouvelle~"+Chr(10)+"Zéro")
EndProcedure


Procedure GereRubriques()	;	Fenêtre de gestion des Rubriques utilisables.
	If OpenWindow(FenRubriques, 0, 0, LargFenR, HautFenR, NomFenR$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		PosH=5 : PosV=5 : TextGadget   (301, PosH, PosV, LargFenR-10, 20, "Modification de Rubriques",#PB_Text_Center) : SetGadgetColor(301,#PB_Gadget_BackColor, $A0FFFF) : SetGadgetFont(301,PolTitre)
		PosH=5 : PosV+30 : ButtonGadget(302, PosH, PosV, LargFenR-10, 30, "Recommandations IMPORTANTES", #PB_Text_Center)
		PosH=5 : PosV+30 : ListIconGadget(303,PosH,PosV, LargFenR-10, HautFenR-117, "--- Rubriques ----",LargFenR-125,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
		AddGadgetColumn(303, 1, "Utilisations" , 90)
		RefreshRub()
		NbLig=CountGadgetItems(303)
		SetGadgetState(303,NbLig-1)
		
		PosV=HautFenr-30 : PosH=(LargFenR/4)-35 : ButtonGadget(331, PosH,PosV, 70, 25, "Modifier")
		PosH=(LargFenR/4)*2-35 : ButtonGadget(332, PosH,PosV, 70, 25, "Supprimer")
		PosH=(LargFenR/4)*3-35 : ButtonGadget(333, PosH,PosV, 70, 25, "Terminé")
		Repeat
			Event = WaitWindowEvent()
			Select Event
				Case #PB_Event_Gadget
					Select EventGadget()
						Case 302 : Restore AideRubriques : Afficheinfo()
						Case 331
							LigSel=GetGadgetState(303)
							If LigSel>=0
								LibAct$=GetGadgetItemText(303,LigSel,0)
								x$=InputRequester("Modif Libellé de Rubrique", "(un Libellé VIDE annule la modification)", LibAct$)
								x$=ReplaceString(x$,"  "," ") : x$=Trim(x$)
								If x$<>""
									If x$<>LibAct$
										If LibAct$="~Nouvelle~"
											Req$="INSERT INTO Rubriques (ID) VALUES ('"+x$+"')": MajSQL(Req$)
										Else
											Req$="UPDATE Rubriques SET ID='"+x$+"' WHERE ID = '"+LibAct$+"'" : MajSQL(Req$)
											Req$="UPDATE Liens SET IDRubrique='"+x$+"' WHERE IDRubrique = '"+LibAct$+"'" : MajSQL(Req$)
										EndIf
										RefreshRub()
									EndIf
								EndIf
							EndIf
						Case 332
							LigSel=GetGadgetState(303)
							If LigSel>=0
								LibAct$=GetGadgetItemText(303,LigSel,0) : NbUtil=Val(GetGadgetItemText(303,LigSel,1))
								If LibAct$<>"~Nouvelle~" And NbUtil=0
									If	MessageRequester("ATTENTION","Vous CONFIRMEZ la SUPPRESSION de la Rubrique "+LibAct$+" ?",#PB_MessageRequester_YesNo | #PB_MessageRequester_Warning) = #PB_MessageRequester_Yes
										Req$="DELETE FROM Rubriques WHERE ID='"+LibAct$+"'"
										MajSQL(Req$)
									Else
										MessageRequester("Opération Annulée","Suppression Abandonnée",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
									EndIf
									RefreshRub()
								Else
									MessageRequester("Erreur","On ne peut supprimer une Rubrique actuellement utilisée ou <~Nouvelle~>",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
								EndIf
							EndIf
						Case 333 : Event = #PB_Event_CloseWindow
					EndSelect
			EndSelect
		Until Event = #PB_Event_CloseWindow
		CloseWindow(FenRubriques)
	EndIf
	
EndProcedure

Procedure.i Htm2PbColor(cHTM$="")	;	Convertit une couleur HTML (chaîne Hexa) en une couleur PureBasic (entier).
	c=Val("$"+cHTM$)
	Res=Val("$"+RSet(Hex(Red(c)),2,"0")+RSet(Hex(Green(c)),2,"0")+RSet(Hex(Blue(c)),2,"0"))
	ProcedureReturn Res
EndProcedure

Procedure$ InitHtm()	;	Crée la partie en-tête du document final
	EntHTM$=~"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"
	EntHTM$+#CR$+~"<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fr\">"
	EntHTM$+#CR$+#TAB$+~"<head>"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,2)+~"<title>Menu Web</title>"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,2)+~"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,2)+~"<meta name=\"author\" content=\"PK1157\">"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,2)+~"<style type=\"text/css\">"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,3)+~"h1 {text-align: center ;}"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,3)+~"table {white-space: nowrap ; width: 100% ; max-width: 1600px ; font-size : normal ; text-align :center ; vertical-align: middle ; border: 1px solid black ;}"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,3)+~"td {white-space: nowrap ; font-size: normal ; text-align: center ; vertical-align: middle ; border: 1px solid black ;}"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,3)+~"form {margin: auto ;}"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,3)+~"input {font-size: 100% ;}"
	EntHTM$+#CR$+_RepeteChaine(#TAB$,2)+~"</style>"
	EntHTM$+#CR$+#TAB$+~"</head>"
	EntHTM$+#CR$+#TAB$+~"<body>"
	CorpsHTM$=_RepeteChaine(#TAB$,2)+~"<h1><u>Menu Web</u></h1>"
	PiedHTM$=#TAB$+~"</body>"+#CR$+~"</html>"
EndProcedure

Procedure InitPol()	;	Polices utilisées par les fenêtres du programme
	Fonte$="Liberation Sans Narrow" : If LoadFont(1, Fonte$, 11) : PolSaisie=FontID(1) : SetGadgetFont(#PB_Default, FontID(1)) : EndIf
	Fonte$="Liberation Sans" : If LoadFont(2, Fonte$, 12,#PB_Font_Bold|#PB_Font_Italic) : PolTitre=FontID(2) : EndIf
EndProcedure

Procedure.s Pb2HtmColor(cPB.i=0)	;	Convertit une couleur PureBasic (entier) en une couleur HTML (chaîne Hexa).
	Res$=RSet(Hex(Red(cPB)),2,"0")+RSet(Hex(Green(cPB)),2,"0")+RSet(Hex(Blue(cPB)),2,"0")
	ProcedureReturn Res$
EndProcedure

Procedure.i ProdCoulTxt(CoulFond$="FFFFFF")	;	Détermine la couleur du Texte en fonction de la valeur calculée de la luminosité de la couleur de fond.
	c.i=Val("$"+CoulFond$)
	If ((Red(c)*299 + Green(c)*587 + Blue(c)*114)/1000)<125
		CoulRes=RGB(255,239,191)
	Else
		CoulRes=RGB(95,15,0)
	EndIf
	ProcedureReturn CoulRes
EndProcedure

Procedure RemplitTable(NomTb$)
	NumTb=0 : NbLig=0 : Sel$=""
	Select NomTb$
		Case "Pages"
			NumTb=20
		Case "Liens"
			NumTb=30 : Sel$="WHERE IDPage="+PageAct+" ORDER BY IDRubrique, ID"
	EndSelect
	If NumTb>0
		ClearGadgetItems(NumTb)
		LitTable(NomTb$,Sel$)
		i=1 : x$=StringField(ResSQL$,i,#CR$)
		While x$<>""
			AddGadgetItem(NumTb,-1,ReplaceString(x$,#TAB$,Chr(10)))
			i+1 : x$=StringField(ResSQL$,i,#CR$)
		Wend
		NbLig=CountGadgetItems(NumTb)
		SetGadgetState(NumTb,NbLig-1)
	EndIf
	Select NomTb$
		Case "Pages"
			For i=0 To CountGadgetItems(20)-1
				c$=GetGadgetItemText(20,i,3) : SetGadgetItemColor(20,i,#PB_Gadget_BackColor,Htm2PbColor(c$),3)
				SetGadgetItemColor(20,i,#PB_Gadget_FrontColor,ProdCoulTxt(c$),3)
			Next i
			PageAct=Val(GetGadgetItemText(20,GetGadgetState(20),0))
			RemplitTable("Liens")
		Case "Liens"
			LienAct=Val(GetGadgetItemText(30,GetGadgetState(30),0))
	EndSelect
EndProcedure

Procedure DuplicLien()	;	Duplique le Lien sélectionné ; le nouveau Lien peut être modifié à loisir.
	If PageAct>1
		PageNouv=0
		Req$="INSERT INTO Liens (IDPage, IDRubrique, Nom, URL, ParamGet, Bouton, InfoLogin, InfoPwd, Identifiant, MotDePasse)"
		Req$+" SELECT IDPage, IDRubrique, Nom, URL, ParamGet, Bouton, InfoLogin, InfoPwd, Identifiant, MotDePasse FROM Liens WHERE ID="+LienAct
		MajSQL(Req$)
		RemplitTable("Liens")
	Else
		MessageRequester("Opération Interdite","La page Exemple ne peut être Modifiée.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
	EndIf
EndProcedure

Procedure DuplicPage()	;	Duplique la Page en cours et les Liens qui la composent ; idéal pour fabriquer une nouvelle page sans partir de zéro !
	PageNouv=0
	Req$="INSERT INTO Pages (Nom, Utilisateur) SELECT Nom, Utilisateur FROM Pages WHERE ID="+PageAct : MajSQL(Req$)
	Req$="SELECT MAX(ID) FROM Pages" : LitSQL(Req$) : PageNouv=Val(ResSQL$)
	Req$="INSERT INTO Liens (IDPage, IDRubrique, Nom, URL, ParamGet, Bouton, InfoLogin, InfoPwd, Identifiant, MotDePasse)"
	Req$+" SELECT "+PageNouv+", IDRubrique, Nom, URL, ParamGet, Bouton, InfoLogin, InfoPwd, Identifiant, MotDePasse FROM Liens WHERE IDPage="+PageAct
	MajSQL(Req$)
	RemplitTable("Pages")
EndProcedure

Procedure ModifLien()	;	Ouverture d'une fenêtre de mise à jour du Lien en cours.
	If PageAct>1
		VarLien$=LitFiche("Liens","WHERE ID="+LienAct)
		If OpenWindow(FenLien, 0, 0, LargFenL, HautFenL, NomFenL$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
			PosH=5 : PosV=5 : TextGadget   (201, PosH, PosV, LargFenL-10, 20, "Modification de Lien",#PB_Text_Center) : SetGadgetColor(201,#PB_Gadget_BackColor, $A0FFFF) : SetGadgetFont(201,PolTitre)
			PosH=5 : PosV+30 : TextGadget(202,PosH, PosV,65,20,"ID Lien :") : SetGadgetColor(202,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(203,PosH, PosV,65,20,StringField(VarLien$,1,#TAB$),#PB_String_ReadOnly)
			GadgetToolTip(203,"Non Modifiable, géré par le SGBD")
			PosH=5 : PosV+30 : TextGadget(204,PosH, PosV,65,20,"ID Page :") : SetGadgetColor(204,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(205,PosH, PosV,65,20,StringField(VarLien$,2,#TAB$),#PB_String_ReadOnly)
			GadgetToolTip(205,"Non Modifiable, géré par le SGBD")
			PosH=5 : PosV+30 : TextGadget(206,PosH, PosV,65,20,"Rubrique :") : SetGadgetColor(206,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : ComboBoxGadget(207,PosH, PosV,LargFenL-posh-40,20,#PB_ComboBox_Editable)
			GadgetToolTip(207,"(Bouton [*] pour Ajouter, Modifier ou Supprimer une nouvelle Rubrique)") : GenComboRub()
			PosH=LargFenL-35 : ButtonGadget(208, PosH, PosV-5, 30, 30, "*")
			PosH=5 : PosV+30 : TextGadget(209,PosH,PosV,65,20,"Nom Lien :") : SetGadgetColor(209,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(210,PosH,PosV,LargFenL-posh-40,20,StringField(VarLien$,4,#TAB$))
			GadgetToolTip(210,"Nom d'usage : Google, Youtube, etc., sans le www ou http.")
			PosH=5 : PosV+30 : TextGadget(211,PosH,PosV,65,20,"URL :") : SetGadgetColor(211,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(212,PosH,PosV,LargFenL-posh-40,20,StringField(VarLien$,5,#TAB$))
			PosH=LargFenL-35 : ButtonGadget(213, PosH, PosV-5, 30, 30, "?")
			GadgetToolTip(212,"Cliquer sur le bouton [?] à droite pour l'aide sur URL.")
			PosH=5 : PosV+30 : TextGadget(214,PosH,PosV,65,20,"ParamGet :") : SetGadgetColor(214,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(215,PosH,PosV,LargFenL-posh-40,20,StringField(VarLien$,6,#TAB$))
			PosH=LargFenL-35 : ButtonGadget(216, PosH,PosV-5, 30, 30, "?")
			GadgetToolTip(215,"Cliquer sur le bouton [?] à droite pour l'aide sur ParamGet.")
			PosH=5 : PosV+30 : TextGadget(217, PosH,PosV, 65, 20, "Bouton :") : SetGadgetColor(217,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : CheckBoxGadget(218, PosH,PosV, LargFenL-PosH-5, 20, "(Afficher un Bouton au lieu d'un Lien Hypertexte standard)") : SetGadgetState(218, Val(StringField(VarLien$,7,#TAB$)))
			PosH=5 : PosV+30 : TextGadget(219, PosH,PosV, 65, 20, "InfoLogin :") : SetGadgetColor(219,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : CheckBoxGadget(220, PosH,PosV, LargFenL-PosH-5, 20, "(Cocher pour afficher une Infobulle de l'Identifiant)") : SetGadgetState(220, Val(StringField(VarLien$,8,#TAB$)))
			PosH=5 : PosV+30 : TextGadget(221, PosH,PosV, 65, 20, "InfoPwd :") : SetGadgetColor(221,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : CheckBoxGadget(222, PosH,PosV, LargFenL-PosH-5, 20, "(Cocher pour afficher une Infobulle du Mot de Passe)") : SetGadgetState(222, Val(StringField(VarLien$,9,#TAB$)))
			PosH=5 : PosV+30 : TextGadget(223, PosH,PosV, 65, 20, "Login :") : SetGadgetColor(223,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(224,PosH,PosV,LargFenL-posh-40,20,StringField(VarLien$,10,#TAB$))
			GadgetToolTip(224,"Ce n'est pas très prudent de laisser cette info en clair …")
			PosH=5 : PosV+30 : TextGadget(225, PosH,PosV, 65, 20, "PassWd :") : SetGadgetColor(225,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(226,PosH,PosV,LargFenL-posh-40,20,StringField(VarLien$,10,#TAB$))
			GadgetToolTip(226,"C'est très imprudent de laisser cette info en clair …")
			PosH=LargFenL/5-40 : PosV=HautFenL-30 : ButtonGadget(230, PosH,PosV, 80, 25, "Valider")
			PosH=LargFenL/5*4-40 : ButtonGadget(231, PosH,PosV, 80, 25, "Annuler")
			Repeat
				Event = WaitWindowEvent()
				Select Event
					Case #PB_Event_Gadget
						Select EventGadget()
							Case 208
								GereRubriques() : GenComboRub()
							Case 213
								Restore AideURL : AfficheInfo()
							Case 216
								Restore AideParamGET : AfficheInfo()
							Case 230
								VarLien$=GetGadgetText(203)+#TAB$+GetGadgetText(205)+#TAB$+GetGadgetText(207)+#TAB$+GetGadgetText(210)+#TAB$+GetGadgetText(212)+#TAB$+GetGadgetText(215)
								VarLien$+#TAB$+GetGadgetState(218)+#TAB$+GetGadgetState(220)+#TAB$+GetGadgetState(222)+#TAB$+GetGadgetText(224)+#TAB$+GetGadgetText(226)
								If StringField(VarLien$,3,#TAB$)<>"" And StringField(VarLien$,4,#TAB$)<>"" And StringField(VarLien$,5,#TAB$)<>""
									Req$="UPDATE Liens SET IDPage='"+StringField(VarLien$,2,#TAB$)+"', IDRubrique='"+StringField(VarLien$,3,#TAB$)+"'"
									Req$+", Nom='"+StringField(VarLien$,4,#TAB$)+"', URL='"+StringField(VarLien$,5,#TAB$)+"'"
									Req$+", ParamGet='"+StringField(VarLien$,6,#TAB$)+"', Bouton='"+StringField(VarLien$,7,#TAB$)+"'"
									Req$+", Infologin='"+StringField(VarLien$,8,#TAB$)+"', InfoPwd='"+StringField(VarLien$,9,#TAB$)+"'"
									Req$+", Identifiant='"+StringField(VarLien$,10,#TAB$)+"', MotDePasse='"+StringField(VarLien$,11,#TAB$)+"'"
									Req$+" WHERE ID="+StringField(VarLien$,1,#TAB$)
									MajSQL(Req$)
									RemplitTable("Pages")
									Event = #PB_Event_CloseWindow
								Else
									MessageRequester("Données Incomplètes","La Rubrique, le Nom et l'URL DOIVENT être renseignés.",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
								EndIf
							Case 231
								Event = #PB_Event_CloseWindow
						EndSelect
				EndSelect
			Until Event = #PB_Event_CloseWindow
			CloseWindow(FenLien)
		EndIf
	Else
		MessageRequester("Opération Interdite","La page Exemple ne peut être Modifiée.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
	EndIf
EndProcedure

Procedure ModifPage()	;	Ouverture d'une fenêtre de mise à jour de la Page en cours.
	VarPage$=LitFiche("Pages","WHERE ID="+PageAct)
	If PageAct>1
		If OpenWindow(FenPage, 0, 0, LargFenPg, HautFenPg, NomFenPg$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
			PosH=5 : PosV=5 : TextGadget   (101, PosH, PosV, LargFenPg-10, 20, "Modification de Page d'Accueil",#PB_Text_Center) : SetGadgetColor(101,#PB_Gadget_BackColor, $A0FFFF) : SetGadgetFont(101,PolTitre)
			PosH=5 : PosV+30 : TextGadget(102,PosH,PosV,65,20,"ID Page : ") : SetGadgetColor(2,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(103,PosH,PosV,65,20,StringField(VarPage$,1,#TAB$),#PB_String_ReadOnly) : GadgetToolTip(103,"Non Modifiable, géré par le SGBD")
			PosH=5 : PosV+30 : TextGadget(104,PosH,PosV,65,20,"Nom Page : ") : SetGadgetColor(104,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(105,PosH,PosV,LargFenPg-PosH-5,20,StringField(VarPage$,2,#TAB$)) : GadgetToolTip(105,"Hello, Bonjour ou Accueil sont très bien ...")
			PosH=5 : PosV+30 : TextGadget(106,PosH,PosV,65,20,"Utilisateur : ") : SetGadgetColor(106,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(107,PosH,PosV,LargFenPg-PosH-5,20,StringField(VarPage$,3,#TAB$)) : GadgetToolTip(107,"Moi ou le nom de l'ami(e) qui en utilisera le résultat (la page HTML).")
			c$=StringField(VarPage$,4,#TAB$) : c=Htm2PbColor(c$)
			PosH=5 : PosV+30 : TextGadget(108,PosH,PosV,65,20,"Fond : ") : SetGadgetColor(108,#PB_Gadget_BackColor, $A0FFA0)
			PosH=75 : StringGadget(109,PosH,PosV,80,20,c$,#PB_String_ReadOnly) : SetGadgetColor(109,#PB_Gadget_BackColor, Htm2PbColor(c$)) : SetGadgetColor(109,#PB_Gadget_FrontColor,ProdCoulTxt(c$)) : GadgetToolTip(109,"Utiliser le bouton <Changer> pour choisir la couleur.")
			PosH=160 : ButtonGadget(110, PosH,  PosV-5, 80, 30, "Changer")
			PosH=LargFenPg/5-40 : PosV=HautFenPg-30 : ButtonGadget(111, PosH,  PosV, 80, 20, "Valider")
			PosH=LargFenPg/5*4-40 : ButtonGadget(112, PosH,  PosV, 80, 20, "Annuler")
			Repeat
				Event = WaitWindowEvent()
				Select Event
					Case #PB_Event_Gadget
						Select EventGadget()
							Case 110
								c=ColorRequester(c)
								If c>=0
									c$=Pb2HtmColor(c) : SetGadgetText(109,Pb2HtmColor(c)) : SetGadgetColor(109,#PB_Gadget_BackColor, Htm2PbColor(c$)) : SetGadgetColor(109,#PB_Gadget_FrontColor,ProdCoulTxt(c$))
								EndIf
							Case 111
								VarPage$=GetGadgetText(103)+#TAB$+GetGadgetText(105)+#TAB$+GetGadgetText(107)+#TAB$+GetGadgetText(109)
								Req$="UPDATE Pages SET Nom='"+StringField(VarPage$,2,#TAB$)+"', Utilisateur='"+StringField(VarPage$,3,#TAB$)+"', Fond='"+StringField(VarPage$,4,#TAB$)+"' WHERE ID="+PageAct
								MajSQL(Req$)
								RemplitTable("Pages")
								Event = #PB_Event_CloseWindow
							Case 112 : Event = #PB_Event_CloseWindow
						EndSelect
				EndSelect
			Until Event = #PB_Event_CloseWindow
			CloseWindow(FenPage)
		EndIf
	Else
		MessageRequester("Opération Interdite","La page Exemple ne peut être Modifiée.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
	EndIf
EndProcedure

Procedure NouvLien()	;	Crée un nouveau Lien dans la Page en cours.
	Req$="INSERT INTO Liens (IDPage) SELECT '"+PageAct+"'" : MajSQL(Req$)
	RemplitTable("Liens")
EndProcedure

Procedure NouvPage()	;	Crée une nouvelle Page (vide de Liens).
	Req$="INSERT INTO Pages (Nom, Utilisateur) SELECT 'Hello', 'Inconnu'" : MajSQL(Req$)
	RemplitTable("Pages")
EndProcedure

Procedure SupprLien()	;	Suppression du Lien en cours !
	If	MessageRequester("ATTENTION","Vous CONFIRMEZ la SUPPRESSION du Lien "+LienAct+" ?",#PB_MessageRequester_YesNo | #PB_MessageRequester_Warning) = #PB_MessageRequester_Yes
		Req$="DELETE FROM Liens WHERE ID="+LienAct
		MajSQL(Req$)
		RemplitTable("Liens")
	Else
		MessageRequester("Opération Annulée","Suppression Abandonnée",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
	EndIf
EndProcedure

Procedure SupprPage()	;	Suppression de la Page en cours et de TOUS les Liens qui la composent.
	If	MessageRequester("ATTENTION","Vous CONFIRMEZ la SUPPRESSION de la Page "+PageAct+" ?",#PB_MessageRequester_YesNo | #PB_MessageRequester_Warning) = #PB_MessageRequester_Yes
		Req$="DELETE FROM Liens WHERE IDPage="+PageAct : MajSQL(Req$)
		Req$="DELETE FROM Pages WHERE ID="+PageAct : MajSQL(Req$)
		RemplitTable("Pages")
	Else
		MessageRequester("Opération Annulée","Suppression Abandonnée",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
	EndIf
EndProcedure

Procedure GetParams(VarIn$="")	;	Analyse le contenu de ParamGET pour ventiler les variables du formulaire HTML.
	VarOut$=ReplaceString(VarIn$,"?","") : VarOut$=ReplaceString(VarOut$,"&",#CR$) : VarOut$=ReplaceString(VarOut$,"=",#TAB$) : VarOut$=ReplaceString(VarOut$," ","&nbsp;")
	VarOut$=ReplaceString(VarOut$,"\n","&#10;")
	iPrm.i=1 : xPrm$=StringField(VarOut$,iPrm,#CR$)
	While xPrm$<>""
		VarForm$+#CR$+_RepeteChaine(#TAB$,6)+~"<input type=\"hidden\" id=\""+StringField(xPrm$,1,#TAB$)+~"\" name=\""+StringField(xPrm$,1,#TAB$)+~"\" value=\""+StringField(xPrm$,2,#TAB$)+~"\">"
		iPrm+1 : xPrm$=StringField(VarOut$,iPrm,#CR$)
	Wend
	
EndProcedure

Procedure$ GenCorps()	;	Fabrication du corps (body) de la page HTML.
	Body$="" : VRub$=""
	ValRub$="" : ValNom$="" : ValURL$="" : ValParamGet$="" : ValBouton.i=0 : ValInfoLogin.i=0 : ValInfoPwd.i=0 : ValIdentifiant$="" : ValMotDePasse$=""
	LitTable("Liens","WHERE IDPage="+PageAct+" ORDER BY IDRubrique, Nom")
	i=1 : x$=StringField(ResSQL$,i,#CR$)
	While x$<>""
		ValRub$=FormatLib(StringField(x$,3,#TAB$),"<br />")
		ValNom$=FormatLib(StringField(x$,4,#TAB$),"&#010;") : ValURL$=StringField(x$,5,#TAB$) : ValParamGet$=StringField(x$,6,#TAB$)
		ValBouton=Val(StringField(x$,7,#TAB$)) : ValInfoLogin=Val(StringField(x$,8,#TAB$)) : ValInfoPwd=Val(StringField(x$,9,#TAB$))
		ValIdentifiant$=StringField(x$,10,#TAB$) : ValMotDePasse$=StringField(x$,11,#TAB$)
		If ValRub$<>VRub$
			If VRub$<>"" : Body$+#CR$+_RepeteChaine(#TAB$,3)+"</tr>" : EndIf
			VRub$=ValRub$
			Body$+#CR$+_RepeteChaine(#TAB$,3)+"<tr>"+#CR$+_RepeteChaine(#TAB$,4)+~"<td style=\"font-size : 150% ;\">"+VRub$+"</strong></td>"
		EndIf
		Info$=""
		If ValInfoLogin>0 And ValIdentifiant$<>"" : Info$="Login: "+ValIdentifiant$ :  EndIf
		If ValInfoPwd>0 And ValMotDePasse$<>"" : If Info$<>"" : Info$+"&#010;" : EndIf : Info$+"Pwd: "+ValMotDePasse$ : EndIf
		If ValParamGet$<>""
			If Left(ValParamGet$,1)="?"
				VarForm$="" : GetParams(ValParamGet$)
				Body$+#CR$+_RepeteChaine(#TAB$,4)+~"<td>"
				Body$+#CR$+_RepeteChaine(#TAB$,5)+~"<form action=\""+ValURL$+~"\">"+VarForm$
				Body$+#CR$+_RepeteChaine(#TAB$,6)+~"<input type=\"submit\" value=\""+ValNom$+~"\">"
				Body$+#CR$+_RepeteChaine(#TAB$,5)+~"</form>"
				Body$+#CR$+_RepeteChaine(#TAB$,4)+~"</td>"
			Else
				ValURL$+ValParamGet$
				If Info$<>"" : Info$+"&#010;" : EndIf : Info$+"Compléter l'URL dans la barre d'adresse par "+ValParamGet$
				If ValBouton
					Body$+#CR$+_RepeteChaine(#TAB$,4)+~"<td>"
					Body$+#CR$+_RepeteChaine(#TAB$,5)+~"<form action=\""+ValURL$+~"\">"
					Body$+#CR$+_RepeteChaine(#TAB$,6)+~"<input type=\"submit\""
					If Info$<>"" : Body$+~" title=\""+Info$+~"\"" : EndIf
					Body$+~" value=\""+ValNom$+~"\" />"
					Body$+#CR$+_RepeteChaine(#TAB$,5)+~"</form>"
					Body$+#CR$+_RepeteChaine(#TAB$,4)+~"</td>"
				Else
					Body$+#CR$+_RepeteChaine(#TAB$,4)+~"<td><a href=\""+ValURL$+~"\""
					If Info$<>"" : Body$+~" title=\""+Info$+~"\"" : EndIf
					Body$+">"+ValNom$+"</a></td>"
				EndIf
			EndIf
		Else
			If ValBouton
				Body$+#CR$+_RepeteChaine(#TAB$,4)+~"<td>"
				Body$+#CR$+_RepeteChaine(#TAB$,5)+~"<form action=\""+ValURL$+~"\">"
				Body$+#CR$+_RepeteChaine(#TAB$,6)+~"<input type=\"submit\""
				If Info$<>"" : Body$+~" title=\""+Info$+~"\"" : EndIf
				Body$+~" value=\""+ValNom$+~"\">"
				Body$+#CR$+_RepeteChaine(#TAB$,5)+~"</form>"
				Body$+#CR$+_RepeteChaine(#TAB$,4)+~"</td>"
			Else
				Body$+#CR$+_RepeteChaine(#TAB$,4)+~"<td><a href=\""+ValURL$+~"\""
				If Info$<>"" : Body$+~" title=\""+Info$+~"\"" : EndIf
				Body$+">"+ValNom$+"</a></td>"
			EndIf
		EndIf
		i+1 : x$=StringField(ResSQL$,i,#CR$)
	Wend
	If Body$<>""
		EntTable$=_RepeteChaine(#TAB$,2)+"<table>"
		EntTable$+#CR$+_RepeteChaine(#TAB$,3)+"<tr>"
		EntTable$+#CR$+_RepeteChaine(#TAB$,4)+"<th><h2>Rubriques</h2></th><th><h2>Liens</h2></th>"
		EntTable$+#CR$+_RepeteChaine(#TAB$,3)+"</tr>"
		Body$=EntTable$+#CR$+Body$
		Body$+#CR$+_RepeteChaine(#TAB$,3)+"</tr>"
		Body$+#CR$+_RepeteChaine(#TAB$,2)+"</table>"
	EndIf
	ProcedureReturn Body$
EndProcedure

;	-------------------
;	Programme Principal
;	-------------------
DeclarVar() : InitPol() : InitHtm()


If TestBDD()>0
	If OpenWindow(FenPrinc, 0, 0, LargFenP, HautFenP, NomFenP$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		If CreateMenu(0, WindowID(0))   
			MenuTitle("Utilitaires")
			MenuItem(1, "&Rafraîchir Tables"+Chr(9)+"Ctrl+R") : AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_R, 1)	;	Utile dans le cas d'une modification concurrente de la BDD (par SQLSTUDIO, par exemple).
			MenuItem(2, "Re&Numéroter Tables"+Chr(9)+"Ctrl+N") : AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_N, 2);	Réinitialise les IDs des Pages et des Liens après des suppressions dans la BDD (accessoire).
			MenuItem(9, "Quitter"+Chr(9)+"Escape") : AddKeyboardShortcut(0, #PB_Shortcut_Escape, 9)										;	Commenter serait superflu !
		EndIf
		TextGadget   (1, 5, 5, LargFenP-10, 20, "Générateur de Page d'Accueil pour Navigateur internet",#PB_Text_Center) : SetGadgetColor(1,#PB_Gadget_BackColor, $A0FFFF) : SetGadgetFont(1,PolTitre)
		;	Pages
		TextGadget   (2, 5, 35, 322, 20, "Pages",#PB_Text_Center) : SetGadgetColor(2,#PB_Gadget_BackColor, $A0FFA0)
		ListIconGadget(20, 5, 60, 321, 28+10*21, "IDPage", 55, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection)
		AddGadgetColumn(20, 1, "Nom de Page" , 100) : AddGadgetColumn(20, 2, "Utilisateur" , 100) : AddGadgetColumn(20, 3, "Fond" , 62)
		ButtonGadget(21,5,300,70,25,"Nouvelle") : ButtonGadget(22,80,300,70,25,"Dupliquer") : ButtonGadget(23,155,300,70,25,"Modifier") : ButtonGadget(24,257,300,70,25,"Supprimer")
		;	Liens
		TextGadget   (3, 335, 35, 785, 20, "Liens",#PB_Text_Center) : SetGadgetColor(3,#PB_Gadget_BackColor, $FFFFA0)
		ListIconGadget(30, 335, 60, 785, 28+10*21, "Lien", 40, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection)
		AddGadgetColumn(30, 1, "Page" , 45) : AddGadgetColumn(30, 2, "Rubrique" , 140) : AddGadgetColumn(30, 3, "Nom" , 150) : AddGadgetColumn(30, 4, "URL" , 180)
		AddGadgetColumn(30, 5, "ParamGet" , 145) : AddGadgetColumn(30, 6, "Bouton" , 70)
		AddGadgetColumn(30, 7, "InfoLogin" , 70) : AddGadgetColumn(30, 8, "InfoPwd" , 70)
		AddGadgetColumn(30, 9, "Identifiant" , 145) : AddGadgetColumn(30, 10, "MotPasse" , 145)
		ButtonGadget(31,385,300,70,25,"Nouveau") : ButtonGadget(32,460,300,70,25,"Dupliquer") : ButtonGadget(33,535,300,70,25,"Modifier") : ButtonGadget(34,650,300,70,25,"Supprimer")
		ButtonGadget(35,800,300,70,25,"Visualiser") : ButtonGadget(36,960,300,140,25,"Enregistrer la Page Html")
		WebGadget(40, 5, 330, LargFenP-10, HautFenP-335, "")
		RemplitTable("Pages")
		Repeat
			Event = WaitWindowEvent()
			Select Event
				Case #PB_Event_Gadget
					Select EventGadget()
							;	-----------
							;	Table Pages
							;	-----------
						Case 20
							If EventType()=#PB_EventType_Change
								PageAct=Val(GetGadgetItemText(20,GetGadgetState(20),0)) : VarPage$=LitFiche("Pages","WHERE ID="+PageAct) : RemplitTable("Liens")
							Else
								If EventType()=#PB_EventType_LeftDoubleClick
									PageAct=Val(GetGadgetItemText(20,GetGadgetState(20),0)) : VarPage$=LitFiche("Pages","WHERE ID="+PageAct) : RemplitTable("Liens")
									ModifPage()
								EndIf
							EndIf
						Case 21
							NouvPage()	;	Nouvelle Page
						Case 22
							DuplicPage()	; Dupliquer Page
						Case 23
							If PageAct>1
								ModifPage()	;	Modification Page
							Else
								MessageRequester("Opération Interdite","La page Exemple ne peut être Modifiée.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
							EndIf
						Case 24
							If PageAct>1
								SupprPage()	;	Suppression Page
							Else
								MessageRequester("Opération Interdite","La page Exemple ne peut être Supprimée.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
							EndIf
							;	-----------
							;	Table Liens
							;	-----------
						Case 30
							If EventType()=#PB_EventType_Change
								LienAct=Val(GetGadgetItemText(30,GetGadgetState(30),0))
							Else
								If EventType()=#PB_EventType_LeftDoubleClick
									LienAct=Val(GetGadgetItemText(30,GetGadgetState(30),0))
									If PageAct>1 : ModifLien() : Else : MessageRequester("Opération Interdite","La page Exemple ne peut être Modifiée.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info) : EndIf
								EndIf
							EndIf
						Case 31
							;	Nouveau Lien
							If PageAct>1 : NouvLien() : Else : MessageRequester("Opération Interdite","La page Exemple ne peut être Modifiée.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info) : EndIf
						Case 32
							;	Dupliquer Lien
							DuplicLien()
						Case 33
							;	Modification Lien
							If PageAct>1 : ModifLien() : Else : MessageRequester("Opération Interdite","La page Exemple ne peut être Modifiée.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info) : EndIf
						Case 34
							;	Suppression Lien
							If PageAct>1 : SupprLien() : Else : MessageRequester("Opération Interdite","La page Exemple ne peut être Modifiée.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info) : EndIf
							;	-------------
							;	Visualisation
							;	-------------
						Case 35
							If EventType()=#PB_EventType_LeftClick
								VarPage$=LitFiche("Pages","WHERE ID="+PageAct)
								NomPage$=StringField(VarPage$,2,#TAB$)
								c$=StringField(VarPage$,4,#TAB$) : CouleurPage$=c$ : CouleurTexte$=Pb2HtmColor(ProdCoulTxt(c$))
								StylePage$=~"<body style=\"background-color : #"+CouleurPage$+" ; color : #"+CouleurTexte$+~";\">"
								HTM$=ReplaceString(EntHTM$,"black","#"+CouleurTexte$)
								HTM$+#CR$+CorpsHTM$+#CR$+GenCorps()+#CR$+PiedHTM$
								HTM$=ReplaceString(HTM$,"Menu Web",NomPage$)
								HTM$=ReplaceString(HTM$,"<body>",StylePage$)
								SetGadgetItemText(40,#PB_Web_HtmlCode,HTM$)
							EndIf
							;	----------------------------------
							;	Enregistrement de la Page-Résultat
							;	----------------------------------
						Case 36
							If EventType()=#PB_EventType_LeftClick
								If HTM$<>""
									NomFicHTM$=SaveFileRequester("Sélectionnez un fichier", PathFic$+NomPage$+".htm", "HyperTextMarkupLanguage(*.htm)|*.htm", 0)
									If NomFicHTM$<>""
										ExplodePath(NomFicHTM$)
										If FileSize(PathFic$+NomFic$+".htm")>0
											If MessageRequester("Ce fichier existe déjà !","Vous confirmez l'écrasement ?",#PB_MessageRequester_YesNoCancel) = #PB_MessageRequester_Yes
												EcritHtm()
											EndIf
										Else
											EcritHtm()
										EndIf
									Else
										MessageRequester("Annulation.", "Sauvegarde HTM Annulée", #PB_MessageRequester_Ok)
									EndIf
								Else
									MessageRequester("Opération Inutile, Page VIDE !","Visualisez la page avant de l'enregistrer.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
								EndIf
							EndIf
					EndSelect
				Case #PB_Event_Menu
					Select EventMenu()
						Case 1 : RemplitTable("Pages")
						Case 2 : ReNumID("Pages") : ReNumID("Liens") : RemplitTable("Pages")
						Case 9 : End
					EndSelect
			EndSelect
		Until Event = #PB_Event_CloseWindow
		CloseWindow(FenPrinc)
	EndIf
Else
	;	Séquence exécutée lors de la premier utilisation du logiciel GenHello ou après une suppression (involontaire ?) du fichier de la BDD (GenHello.sq3).
	If MessageRequester("Base GenHello.sq3 inaccessible","Voulez-vous la créer ?",#PB_MessageRequester_Warning | #PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes
		If OpenFile(0,GetCurrentDirectory()+"GenHello.sql",#PB_UTF8)
			Restore Exemple
			Read.s Cmd$
			While Cmd$<>"<EOD>"
				WriteStringN(0,Cmd$)
				Read.s Cmd$
			Wend
			CloseFile(0)
			DirSQ3$=FindExe("sqlite3")
			If DirSQ3$<>""
				DirSQ3$+"\"
				Cmd$=GetCurrentDirectory()+"GenHello.sq3 < "+GetCurrentDirectory()+"GenHello.sql"
				Cmd$=ReplaceString(Cmd$,"\","/")
				cmd$=DirSQ3$+"sqlite3 "+Cmd$
				If OpenFile(0,GetCurrentDirectory()+"RestGenHello.bat",#PB_Ascii)
					WriteStringN(0,Cmd$)
					CloseFile(0)
					Execution=RunProgram(GetCurrentDirectory()+"RestGenHello.bat"," ",GetCurrentDirectory(),#PB_Program_Wait)
					If OpenDatabase(0,"GenHello.sq3","","")
						CloseDatabase(0)
						MessageRequester("La base est générée.","Veuillez relancer le programme.",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
					Else
						MessageRequester("Erreur","Impossible d'ouvrir la base GenHello.sq3",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
					EndIf
				Else
					MessageRequester("Erreur","Impossible de créer le fichier RestGenHello.bat",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
				EndIf
			Else
				MessageRequester("Erreur","Sqlite3.exe introuvable"+#CR$+"Vous pouvez le télécharger ici :"+#CR$+"https://www.sqlite.org/download.html",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
			EndIf
		Else
			MessageRequester("Erreur","Impossible de créer le fichier GenHello.sql",#PB_MessageRequester_Ok | #PB_MessageRequester_Error)
		EndIf
	Else
		MessageRequester("Dommage !","Peut-être une prochaine fois …",#PB_MessageRequester_Ok | #PB_MessageRequester_Info)
	EndIf
EndIf

;	----------------------------------------------------------------------------------------------
;	Données pour la fabrication du fichier GenHello.sql initial (Exemples) et des fenêtres d'Aide
;	----------------------------------------------------------------------------------------------
;	Chaque série se termine par la chaîne <EOD> (End Of Data) pour signifier qu'il n'y a plus rien à lire dans la série concernée.
DataSection
	Exemple:
	Data.s ~"PRAGMA foreign_keys=OFF;"
	Data.s ~"BEGIN TRANSACTION;"
	Data.s ~"CREATE TABLE Rubriques (ID TEXT NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK UNIQUE ON CONFLICT ROLLBACK COLLATE RTRIM);"
	Data.s ~"INSERT INTO \"Rubriques\" VALUES('Autres');"
	Data.s ~"INSERT INTO \"Rubriques\" VALUES('Encyclopédies');"
	Data.s ~"INSERT INTO \"Rubriques\" VALUES('<i>Fouineurs</i>');"
	Data.s ~"INSERT INTO \"Rubriques\" VALUES('Horaires');"
	Data.s ~"INSERT INTO \"Rubriques\" VALUES('Utilitaires');"
	Data.s ~"INSERT INTO \"Rubriques\" VALUES('Cartes et Plans');"
	Data.s ~"CREATE TABLE Pages (ID INTEGER NOT NULL PRIMARY KEY ON CONFLICT ROLLBACK AUTOINCREMENT UNIQUE, Nom TEXT NOT NULL COLLATE RTRIM DEFAULT Hello, Utilisateur TEXT NOT NULL COLLATE RTRIM DEFAULT Moi, Fond TEXT COLLATE RTRIM DEFAULT FFFFCF NOT NULL ON CONFLICT ROLLBACK);"
	Data.s ~"INSERT INTO \"Pages\" VALUES(1,'Hello','Exemple','FFFFDF');"
	Data.s ~"CREATE TABLE Liens (ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, IDPage INTEGER REFERENCES Pages (ID) ON DELETE CASCADE ON UPDATE CASCADE MATCH FULL NOT NULL ON CONFLICT ROLLBACK, IDRubrique TEXT NOT NULL ON CONFLICT ROLLBACK COLLATE RTRIM REFERENCES Rubriques (ID) ON DELETE CASCADE ON UPDATE CASCADE MATCH FULL DEFAULT ZZZ, Nom TEXT DEFAULT ('<--Nouveau-->') NOT NULL ON CONFLICT ROLLBACK COLLATE RTRIM, URL TEXT NOT NULL ON CONFLICT ROLLBACK DEFAULT ('www.quelquechose.truc') COLLATE RTRIM, ParamGet TEXT COLLATE RTRIM, Bouton BOOLEAN, InfoLogin BOOLEAN NOT NULL DEFAULT (0), InfoPwd BOOLEAN NOT NULL DEFAULT (0), Identifiant TEXT COLLATE RTRIM, MotDePasse TEXT COLLATE RTRIM);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(1,1,'Encyclopédies','Meilleur Dico (Atilf)','http://atilf.atilf.fr/',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(2,1,'<i>Fouineurs</i>','Annuaire Téléphonique','https://www.pagesjaunes.fr/',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(3,1,'<i>Fouineurs</i>','Bing','https://www.bing.com/',NULL,0,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(4,1,'<i>Fouineurs</i>','Ecosia','https://www.ecosia.org',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(5,1,'<i>Fouineurs</i>','Google','https://www.google.fr',NULL,0,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(6,1,'Horaires','Autocars Pyrénées-Orientales','http://www.asperi.fr',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(7,1,'Utilitaires','Mon IP Publique','http://www.asperi.fr','?REQ=IP',1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(8,1,'Cartes et Plans','Cadastre','https://www.cadastre.gouv.fr',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(9,1,'Cartes et Plans','Google Maps','https://www.google.fr/maps',NULL,0,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(10,1,'Cartes et Plans','Open Street Map (OSM)','https://www.openstreetmap.org',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(11,1,'Cartes et Plans','I.G.N.','https://www.geoportail.gouv.fr/',NULL,0,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(12,1,'Cartes et Plans','Aiguille Etretat (OSM)','https://www.openstreetmap.org/search','?zoom=18&lat=49.70703&lon=0.19264',0,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(13,1,'Utilitaires','Mon Débit internet','http://www.speedzilla.net/',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(14,1,'Encyclopédies','Tout sur tout (Wikipedia)','https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(15,1,'Horaires','Heure Actuelle','https://time.is/fr/',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(16,1,'Utilitaires','Codage Image Base64','https://www.base64decode.org/',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(17,1,'Autres','Forum PureBasic','https://www.purebasic.fr/french/',NULL,1,0,0,NULL,NULL);"
	Data.s ~"INSERT INTO \"Liens\" VALUES(18,1,'Autres','Un petit mot pour l''auteur !','mailto://pk1157@laposte.net','?subject=GenHello&body=Merci, c''est pratique\n(ou pas !)\n…',1,0,0,NULL,NULL);"
	Data.s ~"DELETE FROM sqlite_sequence;"
	Data.s ~"INSERT INTO \"sqlite_sequence\" VALUES('Pages',1);"
	Data.s ~"INSERT INTO \"sqlite_sequence\" VALUES('Liens',17);"
	Data.s ~"COMMIT;"
	Data.s ~"<EOD>"
	AideURL:
	Data.s ~"Format de l'URL d'un lien"
	Data.s ~"<PROTOCOLE><ADRESSE>[PORT] où :"
	Data.s ~"- PROTOCOLE="
	Data.s ~"	http:// | https://"
	Data.s ~"	ou	file://"
	Data.s ~"	ou	mailto:"
	Data.s ~"	ou	[user[pwd]@]ftp://"
	Data.s ~"- ADRESSE=[www.]sitecible.<fr|com|org|…>[/machin/truc]"
	Data.s ~"- PORT=vide si standard"
	Data.s ~"	ou	deux points(:), suivis du n° de port"
	Data.s #CR$
	Data.s ~"EXEMPLES : "
	Data.s ~"-	http://127.0.0.1"
	Data.s ~"-	http://localhost:80"
	Data.s ~"-	http://monimprimante:1234"
	Data.s ~"-	https://www.google.fr"
	Data.s ~"-	file://C:/windows"
	Data.s ~"-	ftp://ftp.uni-bayreuth.de/pub/math/"
	Data.s ~"-	mailto://pk1157@laposte.net"
	Data.s ~"<EOD>"
	AideParamGET:
	Data.s ~"Paramètre(s) transmis par méthode GET"
	Data.s ~"?<VARIABLE>=<VALEUR>[&<VARIABLE>=<VALEUR>[&<VARIABLE>=<VALEUR>]] où :"
	Data.s ~"- le premier paramètre (couple <VARIABLE>=<VALEUR>) est précédé par un point d'interrogation <?> ;"
	Data.s ~"- le(s) paramètre(s) suivant(s) par une esperluette <&>."
	Data.s #CR$
	Data.s ~"Note : si un ou plusieurs paramètres sont transmis par la méthode GET, le lien sera affiché par un bouton, même si cette option n'est pas cochée."
	Data.s ~"<EOD>"
	AideRubriques:
	Data.s ~"Mise à Jour d'un libellé de Rubrique"
	Data.s ~"- La MODIFICATION d'une Rubrique existante se propagera sur TOUS les Liens qui l'utilisent !"
	Data.s ~"  (même si le Lien se réfère à une autre Page que celle en cours)."
	Data.s #CR$
	Data.s ~"- La SUPPRESSION d'une Rubrique existante sera bloquée si un Lien existant l'utilise,"
	Data.s ~"  (même si le Lien se réfère à une autre Page que celle en cours)."
	Data.s #CR$
	Data.s ~"- La CREATION d'une Rubrique ne peut conduire à deux Rubriques au libellé identique."
	Data.s ~"  (Ce serait inutile ou absurde, mais, on ne sait jamais …)."
	Data.s #CR$
	Data.s ~"- Pour AJOUTER une Rubrique,  sélectionner la Rubrique ~Nouvelle~ et cliquer sur [Modifier]."
	Data.s #CR$
	Data.s ~"NOTE : On peut \"injecter\" des entités HTML (&nbsp; ou &#133; par exemple) pour mettre en forme le Libellé de la Rubrique."
	Data.s ~"<EOD>"
EndDataSection
Les routines de gestion de la BDD Sqlite :

Code : Tout sélectionner

;	+====================+
;	|		GestBDD			|
;	+====================+
;
;	Lecture de la Base de Données SQLITE3 : GenHello.sq3
;	Initialisation des Données du programme.

UseSQLiteDatabase()
Global DBName$="GenHello", DBUser$="", DBPassWord$="", IDDB=0

Procedure TestBDD()
	Res=0
	IDDB=OpenDatabase(#PB_Any, DBName$+".sq3", DBUser$, DBPassWord$, #PB_Database_SQLite)
	If IDDB>0
		CloseDatabase(IDDB)
		Res=1
	EndIf
	ProcedureReturn Res
EndProcedure

Procedure.s LitFiche(TbName$="",CritSel$="")
	IDDB=OpenDatabase(#PB_Any, DBName$+".sq3", DBUser$, DBPassWord$, #PB_Database_SQLite)
	LigSQL$=""
	If IDDB>0
		If DatabaseQuery(IDDB, "SELECT * FROM "+TbName$+" "+CritSel$)
			While NextDatabaseRow(IDDB)
				LigSQL$=""
				For i=0 To DatabaseColumns(IDDB)
					If LigSQL$<>"" : LigSQL$+#TAB$ : EndIf
					LigSQL$+GetDatabaseString(IDDB, i)
				Next i
			Wend
			FinishDatabaseQuery(IDDB)
		EndIf
		CloseDatabase(IDDB)
	Else
		MessageRequester("Abandon","Connection Impossible à la Base de Données: "+DatabaseError())
	EndIf
	ProcedureReturn LigSQL$
EndProcedure

Procedure LitTable(TbName$="",CritSel$="")
	IDDB=OpenDatabase(#PB_Any, DBName$+".sq3", DBUser$, DBPassWord$, #PB_Database_SQLite)
	ResSQL$=""
	If IDDB>0
		If DatabaseQuery(IDDB, "SELECT * FROM "+TbName$+" "+CritSel$)
			While NextDatabaseRow(IDDB)
				LigSQL$=""
				For i=0 To DatabaseColumns(IDDB)
					If LigSQL$<>"" : LigSQL$+#TAB$ : EndIf
					LigSQL$+GetDatabaseString(IDDB, i)
				Next i
				If ResSQL$<>"" : ResSQL$+#CR$ : EndIf
				ResSQL$+LigSQL$
			Wend
			FinishDatabaseQuery(IDDB)
		EndIf
		CloseDatabase(IDDB)
	Else
		MessageRequester("Abandon","Connection Impossible à la Base de Données: "+DatabaseError())
	EndIf
EndProcedure

Procedure LitSQL(Req$="")
	ResSQL$=""
	IDDB=OpenDatabase(#PB_Any, DBName$+".sq3", DBUser$, DBPassWord$, #PB_Database_SQLite)
	If IDDB>0
		If DatabaseQuery(IDDB, Req$)
			While NextDatabaseRow(IDDB)
				LigSQL$=""
				For i=0 To DatabaseColumns(IDDB)
					If LigSQL$<>"" : LigSQL$+#TAB$ : EndIf
					LigSQL$+GetDatabaseString(IDDB, i)
				Next i
				If ResSQL$<>"" : ResSQL$+#CR$ : EndIf
				ResSQL$+LigSQL$
			Wend
			FinishDatabaseQuery(IDDB)
		EndIf
		CloseDatabase(IDDB)
	Else
		MessageRequester("Abandon","Connection Impossible à la Base de Données: "+DatabaseError())
	EndIf
EndProcedure

Procedure MajSQL(Req$="")
	IDDB=OpenDatabase(#PB_Any, DBName$+".sq3", DBUser$, DBPassWord$, #PB_Database_SQLite)
	If IDDB>0
		If DatabaseUpdate(IDDB, Req$)
			FinishDatabaseQuery(IDDB)
		EndIf
		CloseDatabase(IDDB)
	Else
		MessageRequester("Abandon","Connection Impossible à la Base de Données: "+DatabaseError())
	EndIf
EndProcedure

Procedure ReNumID(NomTab$="")
	ResSQL$=""
	IDDB=OpenDatabase(#PB_Any, DBName$+".sq3", DBUser$, DBPassWord$, #PB_Database_SQLite)
	If IDDB>0
		If NomTab$<>""
			Req$="SELECT ID FROM "+NomTab$+" ORDER BY ID"
			If DatabaseQuery(IDDB, Req$)
				While NextDatabaseRow(IDDB)
					LigSQL$=GetDatabaseString(IDDB, 0)
					If ResSQL$<>"" : ResSQL$+#CR$ : EndIf
					ResSQL$+LigSQL$
				Wend
				FinishDatabaseQuery(IDDB)
			EndIf
			;			Debug ResSQL$
			i=1 : j=Val(StringField(ResSQL$,i,#CR$))
			While j>=i
				If j>i
					If DatabaseUpdate(IDDB, "UPDATE "+NomTab$+" SET ID="+Str(i)+" WHERE ID="+Str(j))
						FinishDatabaseQuery(IDDB)
					EndIf
				EndIf
				If NomTab$="Pages"
					If DatabaseUpdate(IDDB, "UPDATE Liens SET IDPage="+Str(i)+" WHERE IDPage="+Str(j))
						FinishDatabaseQuery(IDDB)
					EndIf
				EndIf
				i+1 : j=Val(StringField(ResSQL$,i,#CR$))
			Wend
			If DatabaseUpdate(IDDB, "UPDATE SQLITE_SEQUENCE SET seq=(SELECT MAX(ID) FROM "+NomTab$+") WHERE name='"+NomTab$+"'")
				FinishDatabaseQuery(IDDB)
			EndIf
		EndIf
		CloseDatabase(IDDB)
	Else
		MessageRequester("Abandon","Connection Impossible à la Base de Données: "+DatabaseError())
	EndIf
EndProcedure
Dernière modification par PK1157 le mar. 08/sept./2020 21:25, modifié 4 fois.
Windows 10 64 bits
Linux XUbuntu
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Générateur de page d'accueil pour navigateur web

Message par Ollivier »

Après quelques centaines d'accès aux pages essentielles tels que impôts, sécu, etc... Mon ordinateur a glissé tiré par le câble des écouteurs reliés à moi. Mes tympans vont bien, mais l'ordinateur, il va suffisamment mal pour être certain que je ne peux pas tester ce code.

Cependant, merci pour ce partage de travail, né à cause de la lourdeur strictement égoïste (je n'ai pas d'autre mot) des pages HTML proposée pour des raisons vraiment obscures.
Avatar de l’utilisateur
PK1157
Messages : 10
Inscription : jeu. 14/mai/2015 23:37
Localisation : FRANCE 66 PYRENEES ORIENTALES

Re: Générateur de page d'accueil pour navigateur web

Message par PK1157 »

Désolé pour vos oreilles et votre PC !
Je finalise une version corrigée des lourdeurs de code et qui permet d'insérer la page d'exemple sans recourir à un outil externe tel SqliteStudio.
Je la mettrai en ligne ce soir iu demain.
Bonne journée,
PK1157
Windows 10 64 bits
Linux XUbuntu
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Générateur de page d'accueil pour navigateur web

Message par Ollivier »

Tu peux me tutoyer. Dans cet espace ici, sur ce forum, c'est plus simple. Ça évite les confusions quand il y a plus que deux personnes qui communiquent dans un sujet.

Et on est bien d'accord : ce sont les lourdeurs des sites institutionnels qui me gonflent, pas ton code.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Générateur de page d'accueil pour navigateur web

Message par Kwai chang caine »

Déjà je suis arrivé à le lancer et il fonctionne, pour le reste une doc serait bien utile :wink:
En tout cas merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Générateur de page d'accueil pour navigateur web

Message par Ollivier »

Kwaï Chang Caine a écrit :une doc serait bien utile
Il suffit de poser les questions qui te viennent à l'esprit et, je crois bien que l'auteur te répondra assez vite avec précision.
Avatar de l’utilisateur
PK1157
Messages : 10
Inscription : jeu. 14/mai/2015 23:37
Localisation : FRANCE 66 PYRENEES ORIENTALES

Re: Générateur de page d'accueil pour navigateur web

Message par PK1157 »

Ollivier a écrit :Après quelques centaines d'accès aux pages essentielles tels que impôts, sécu, etc... Mon ordinateur a glissé tiré par le câble des écouteurs reliés à moi. Mes tympans vont bien, mais l'ordinateur, il va suffisamment mal pour être certain que je ne peux pas tester ce code.

Cependant, merci pour ce partage de travail, né à cause de la lourdeur strictement égoïste (je n'ai pas d'autre mot) des pages HTML proposée pour des raisons vraiment obscures.
Bonjour,
J'ai publié une version corrigée, augmentée et surtout opérationnelle !
Pour la documentation, j'ai mis des bulles d'aide partout où c'était nécessaire.
Bonne journée,
PK1157
Windows 10 64 bits
Linux XUbuntu
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Générateur de page d'accueil pour navigateur web

Message par Ollivier »

Sinon, il y a http://www.w3schools.com pour une doc "à donf".

En tout cas, KCC va être content, s'il y a de l'aide partout sous forme de bulles.

Perso, je n'aime pas trop les bulles : il y a une autre méthode avec la barre système de la fenêtre. Ce n'est qu'une suggestion, pas une exigence. Les bulles me déconcentrent : il faut attendre un lap de temps et, ça cache une partie autour de la souris.

Mais ce n'est pas important : là, ça serait intéressant que tu dises pour quel OS ça fonctionne, quel explorateur. Et, accessoirement, le temps consacré à la programmation de ce travail, tout comme le temps consacré pour rajouter de l'aide, on peut en discuter pour donner une idée du boulot.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Générateur de page d'accueil pour navigateur web

Message par Ollivier »

Remarque plus proche encore de ton code : (je ne peux que le lire ton code, pas l'exécuter pour l'instant) t'as une bonne maîtrise du langage Basic, pourquoi tu ne gèrerais pas le contenu Body$ plus à ta guise.

Je vois des Body$+CR$+"un contenu".
Peut-être qu'une méthode SetBody("un contenu") serait plus convivial à programmer.

Code : Tout sélectionner

Global gBody.S

Procedure SetBody(Ctn$)

   gBody + CR$ + Ctn$

EndProcedure
Ça ne change rien sur le moment au fonctionnement du programme, mais ça facilite la lisibilité et l'ajout de nouvelles lignes HTML.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Générateur de page d'accueil pour navigateur web

Message par Kwai chang caine »

Merci beaucoup PK1157 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre