Je reviens vers vous pour un nouveau coup de pouce.
Je découvre le purebasic ( et la programmation au passage ) et j'ai fais ce code il y a quelques semaines.
Je suis parti d'un truc tout simple, et puis d'ajout en ajout, bricolage en bricolage, le code a plus rien à voir avec ce qu'il était à l'origine.
Je l'ai laissé en l'état avant de passer à autre chose, son but était juste de me permettre de commencer quelque part.
Mais j'aime finir ce que je commence et du coup je reviens sur ce code pour le débugger.
Mon problème se situe sur la fonction recherche de ce petit programme.
Lorsque je l'utilise dès l'ouverture pas de soucis.
Si je procède à un nouvel enregistrement et que je lance ma recherche derrière, le fichier html est bien mis à jour, mais l'affichage ne suit plus ( à tester après avoir enregistrer quelques contacts ) .
Je soupçonne fortement mon utilisation du webgadget, j'ai déja eu des soucis similaires avec l'affichage de base, mais par contre là je ne comprends pas pourquoi.
Si personne ne se sent le courage de jeter un oeil sur ce code devenu bordélique je comprendrai.
Et un grand merci d'avance aux aventuriers qui tenteront l'expérience.
Edit : j'ai fait un peu de ménage, et apparement mon défaut viendrait plus du côté de la gestion des évènements dans l'appel de la fonction rechercher, son traitement et sa sortie... ( j'espère que j'ai été clair ).
Edit(bis) : Désolé d'insister, voilà le code remanié, plus de problèmes de gestion des évènements, par contre je confirme donc mon soucis au niveau du webgadget, et je sais pas où je me suis planté, tout fonctionne comme il faut tant qu'on ne clique pas sur le webgadget, après ça se met à délirer et la zone de recherche perd le focus à chaque évènement clavier. Si c'est encore trop le bordel pour comprendre mon code, dites le moi, mais c'est sûr que j'aimerai bien trouver la solution, pour ma culture personnelle ...
Code : Tout sélectionner
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;++ Un essai de programme (le premier, indulgence needed) en pure basic. +++
;++ Répertoire avec ajout et recherche de contacts. +++
;++ Présentation dans un webgadget, code html généré automatiquement. +++
;++ Et enfin...euh... et .... bah.... voilà quoi.... c'est tout... +++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;****************************************************************************************************
;************************ déclaration des constantes ************************************************
;****************************************************************************************************
Enumeration
;indices des fenêtres
#fenetre_principale
#fenetre_ajouter_contact
#fenetre_rechercher_contact
;indices des gadgets
#bouton_ajouter_contact
#zone_nom
#zone_prenom
#zone_telephone
#zone_fonction
#bouton_enregistrer_contact
#bouton_ok_ajouter_contact
#bouton_annuler_ajouter_contact
#zone_affichage_repertoire
#label_rechercher
#zone_rechercher
#label_trier
#option_nom
#option_prenom
#option_fonction
EndEnumeration
;**********************************************************************************************************
;*********************** déclaration des structures, listes et variables **********************************
;**********************************************************************************************************
Structure contact
nom$
prenom$
telephone$
fonction$
EndStructure
Global NewList recherche.contact()
Global NewList repertoire.contact()
Global path$ = GetCurrentDirectory()
Global trier$ = "nom" ;--------- critère de tri pour les listes
;**********************************************************************************************************
;*********************** déclaration des procédures *******************************************************
;**********************************************************************************************************
Procedure.s majuscule ( chaine$ ) ;------ transforme la première lettre de chaine$ en majuscule
debut$ = Left(chaine$,1)
fin$ = Right(chaine$,Len(chaine$)-1)
debut$ = UCase(debut$)
chaine$ = debut$ + fin$
ProcedureReturn chaine$
EndProcedure
Procedure charger_repertoire () ;--------- place le contenu de repertoire.txt dans la liste repertoire
If ReadFile(1,path$+"PBrepertoire.txt") ;--------- accès à repertoire.txt en lecture seule
ClearList(repertoire()) ;--------- remise à zéro de la liste repertoire
While Eof(1) = 0 ;--------- parcours du fichier et affectation des champs dans la liste
ligne$ = ReadString(1)
AddElement(repertoire())
repertoire()\nom$ = StringField(ligne$, 1 , "¤")
repertoire()\prenom$ = StringField(ligne$, 2 , "¤")
repertoire()\telephone$ = StringField(ligne$, 3 , "¤")
repertoire()\fonction$ = StringField(ligne$, 4 , "¤")
Wend
CloseFile(1)
Else
MessageRequester ("erreur","impossible d'ouvrir le répertoire")
EndIf
ProcedureReturn 1
EndProcedure
Procedure generer_code_html (liste.contact()) ;--------- traduction de la liste paramètre en code html pour présentation dans le webgadget
If charger_repertoire () : Else : MessageRequester("erreur","échec chargement répertoire") : EndIf
Select trier$
Case "nom"
SortStructuredList(liste(),2,OffsetOf(contact\nom$),#PB_Sort_String)
Case "prenom"
SortStructuredList(liste(),2,OffsetOf(contact\prenom$),#PB_Sort_String)
Case "fonction"
SortStructuredList(liste(),2,OffsetOf(contact\fonction$),#PB_Sort_String)
EndSelect
If CreateFile(0,path$+"PBrepertoire.html")
WriteStringN(0,"<!DOCTYPE html PUBLIC "+Chr(34)+"-//W3C//DTD HTML 4.01//EN"+Chr(34)+ "http://www.w3.org/TR/html4/strict.dtd"+Chr(34)+">")
WriteStringN(0,"<html>")
WriteStringN(0,"<head>")
WriteStringN(0,"<meta content="+Chr(34)+"text/html"+Chr(59)+" charset=ISO-8859-1"+Chr(34)+" http-equiv="+Chr(34)+"content-type"+Chr(34)+">")
WriteStringN(0,"<title></title>")
WriteStringN(0,"</head>")
WriteStringN(0,"<body>")
WriteStringN(0,"<table style="+Chr(34)+"text-align: left"+Chr(59)+" width: 100%"+Chr(59)+Chr(34)+" border="+Chr(34)+"0"+Chr(34)+"cellpadding="+Chr(34)+"2"+Chr(34)+ "cellspacing="+Chr(34)+"0"+Chr(34)+">")
WriteStringN(0,"<tbody>")
WriteStringN(0,"<small>")
WriteStringN(0,"<small>")
WriteStringN(0,"<small>")
WriteStringN(0,"<span style="+Chr(34)+"font-family: MS sans serif "+Chr(59)+Chr(34)+">")
ForEach liste() ;--------- pour chaque élément de la liste, génération du code html, lignes paires surlignées en bleu, lignes impairs en blanc
index = ListIndex(liste())
If index = 0 Or index % 2 = 0
WriteStringN(0,"<tr><td style="+Chr(34)+"background-color: RGB(235, 255, 255); width: 25%"+Chr(34)+">"+liste()\nom$+"</td>")
WriteStringN(0,"<td style="+Chr(34)+"background-color: RGB(235, 255, 255); width: 25%"+Chr(34)+">"+liste()\prenom$+"</td>")
WriteStringN(0,"<td style="+Chr(34)+"background-color: RGB(235, 255, 255); width: 25%"+Chr(34)+">"+liste()\telephone$+"</td>")
WriteStringN(0,"<td style="+Chr(34)+"background-color: RGB(235, 255, 255); width: 25%"+Chr(34)+">"+liste()\fonction$+"</td></tr>")
EndIf
If index % 2 = 1
WriteStringN(0,"<tr><td style="+Chr(34)+"background-color: RGB(255, 255, 255); width: 25%"+Chr(34)+">"+liste()\nom$+"</td>")
WriteStringN(0,"<td style="+Chr(34)+"background-color: RGB(255, 255, 255); width: 25%"+Chr(34)+">"+liste()\prenom$+"</td>")
WriteStringN(0,"<td style="+Chr(34)+"background-color: RGB(255, 255, 255); width: 25%"+Chr(34)+">"+liste()\telephone$+"</td>")
WriteStringN(0,"<td style="+Chr(34)+"background-color: RGB(255, 255, 255); width: 25%"+Chr(34)+">"+liste()\fonction$+"</td></tr>")
EndIf
Next
WriteStringN(0,"</span></small></small></small>") ;--------- code de finition du fichier html
WriteStringN(0,"</tbody>")
WriteStringN(0,"</table>")
WriteStringN(0,"</html>")
CloseFile(0) ;--------- génération du code terminée, on referme le fichier
ProcedureReturn 1
Else
MessageRequester("erreur","échec génération code html")
EndIf
EndProcedure
Procedure enregistrer_contact (nom$,prenom$,tel$,fonction$) ;--------- inscription des données saisies dans le fichier repertoire.txt
If Len(nom$) > 20 Or Len(prenom$) > 20 Or Len(tel$) > 15 Or Len(fonction$) > 20 : ProcedureReturn 0 : EndIf
If OpenFile(2,path$+"PBrepertoire.txt")
position = Lof(2)
FileSeek(2,position)
WriteStringN(2,nom$+"¤"+prenom$+"¤"+tel$+"¤"+fonction$)
CloseFile(2)
ProcedureReturn 1
Else
MessageRequester("erreur","impossible d'accéder au fichier repertoire.txt")
EndIf
EndProcedure
Procedure ajouter_contact () ;--------- ouvre une fenêtre qui permet la saisie des champs de données utilisés par le répertoire
If OpenWindow(#fenetre_ajouter_contact,0,0,300,210,"ajouter contact",#PB_Window_ScreenCentered | #PB_Window_SystemMenu, WindowID(#fenetre_principale)) = 0 ;--------- ouverture fenetre ajouter contact
MessageRequester("erreur","impossible ouvrir fenetre")
EndIf
If CreateGadgetList (WindowID(#fenetre_ajouter_contact)) ;--------- création des gadgets fenêtre ajouter contact
StringGadget(#zone_nom,10,10,280,20,"- Nom du contact - 20 caractères maximum -",#PB_String_BorderLess)
StringGadget(#zone_prenom,10,50,280,20,"- Prénom du contact - 20 caractères maximum -",#PB_String_BorderLess)
StringGadget(#zone_telephone,10,90,280,20,"- Téléphone du contact - 15 caractères maximum -",#PB_String_BorderLess | #PB_String_Numeric)
StringGadget(#zone_fonction,10,130,280,20,"- Fonction du contact - 20 caractères maximum -",#PB_String_BorderLess)
ButtonGadget(#bouton_ok_ajouter_contact,40,170,100,30,"Enregistrer contact")
ButtonGadget(#bouton_annuler_ajouter_contact,160,170,100,30,"Annuler")
Else
MessageRequester("erreur","erreur création gadgets")
EndIf
nom$ = "" ;--------- déclaration des variables locales
prenom$ = ""
telephone$ = ""
fonction$ = ""
quitter_ajouter_contact = 0 ;--------- flag
While quitter_ajouter_contact = 0 ;--------- boucle fenetre ajouter contact
Select WaitWindowEvent()
Case #PB_Event_CloseWindow ;--------- clic sur quitter
quitter_ajouter_contact =1
Case #PB_Event_Gadget
Select EventGadget()
Case #bouton_ok_ajouter_contact ;--------- clic sur enregistrer contact
nom$ = GetGadgetText(#zone_nom) ;--------- on récupère les données présentes dans les champs
prenom$ = GetGadgetText(#zone_prenom)
telephone$ = GetGadgetText(#zone_telephone)
fonction$ = GetGadgetText(#zone_fonction)
nom$ = majuscule (nom$) ; --------- on passe les initiales en majuscule
prenom$ = majuscule (prenom$)
If enregistrer_contact (nom$,prenom$,telephone$,fonction$) ;--------- on enregistre ces données dans le fichier txt
quitter_ajouter_contact = 1 ;--------- flag à 1, on quitte la boucle
Else
MessageRequester("erreur","enregistrement du contact a échoué")
quitter_ajouter_contact = 1
EndIf
Case #bouton_annuler_ajouter_contact ;--------- clic sur annuler enregistrement
quitter_ajouter_contact = 1 ;--------- flag à 1, on quitte la boucle
Case #zone_nom
If EventType() = #PB_EventType_Focus : SetGadgetText(#zone_nom,nom$) : EndIf
Case #zone_prenom
If EventType() = #PB_EventType_Focus : SetGadgetText(#zone_prenom,prenom$) : EndIf
Case #zone_telephone
If EventType() = #PB_EventType_Focus : SetGadgetText(#zone_telephone,telephone$) : EndIf
Case #zone_fonction
If EventType() = #PB_EventType_Focus : SetGadgetText(#zone_fonction,fonction$) : EndIf
EndSelect
EndSelect
Wend
CloseWindow(#fenetre_ajouter_contact)
EndProcedure
Procedure rechercher_contact (chaine$) ;--------- recherche sur tout les champs du répertoire et enregistrement des résultats dans la liste "recherche"
fin_recherche = 0
While fin_recherche = 0
ClearList(recherche()) ;--------- remise à zéro de la liste de recherche
ForEach repertoire() ;-------- recherche de la présence de cette chaine dans la liste répertoire
nom$ = LCase(repertoire()\nom$) ;--------- on passe tout les caractères des champs en minuscules avant de lancer la recherche
prenom$ = LCase(repertoire()\prenom$)
fonction$ = LCase(repertoire()\fonction$)
resultat = FindString(nom$,chaine$,1) + FindString(prenom$,chaine$,1) + FindString(fonction$,chaine$,1)
If resultat <> 0 ;--------- la chaine a été trouvé quelque part dans le répertoire
AddElement(recherche()) ;--------- on enregistre l'élément concerné dans la liste de recherche
recherche()\nom$ = repertoire()\nom$
recherche()\prenom$ = repertoire()\prenom$
recherche()\telephone$ = repertoire()\telephone$
recherche()\fonction$ = repertoire()\fonction$
EndIf
Next
fin_recherche = 1
Wend
EndProcedure
Procedure init_repertoire()
If OpenWindow (#fenetre_principale, 0,0,800,600, "PBrépertoire", #PB_Window_ScreenCentered + #PB_Window_SystemMenu) ;--------- ouverture fenetre principale
Else
MessageRequester("erreur","impossible initialiser fenêtre")
EndIf
If CreateGadgetList (WindowID(#fenetre_principale)) ;--------- création des gadgets
ButtonGadget(#bouton_ajouter_contact,10,10,100,30,"Ajouter contact")
TextGadget(#label_trier,10,80,100,15,"Trier par :")
OptionGadget(#option_nom,10,100,100,15,"Nom")
OptionGadget(#option_prenom,10,120,100,15,"Prénom")
OptionGadget(#option_fonction,10,140,100,15,"Fonction")
SetGadgetState(#option_nom,1)
TextGadget(#label_rechercher,10,200,100,15,"Rechercher :")
StringGadget(#zone_rechercher,10,215,100,20,"")
WebGadget(#zone_affichage_repertoire,120,10,670,580,path$+"PBrepertoire.html")
Else
MessageRequester("erreur","erreur initialisation gadgets")
EndIf
If ReadFile(3,path$+"PBrepertoire.txt") = 0 ;--------- si le fichier repertoire.txt n'existe pas on le crée
CreateFile(3,path$+"PBrepertoire.txt")
CloseFile(3)
Else
CloseFile(3)
EndIf
generer_code_html(repertoire())
EndProcedure
;**********************************************************************************************************
;*********************** programme principal **************************************************************
;**********************************************************************************************************
init_repertoire()
quit = 0 ;--------- flag
While quit = 0 ;--------- boucle principale
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget ; --------- clics sur les gadgets
Select EventGadget()
Case #bouton_ajouter_contact
ajouter_contact()
generer_code_html(repertoire())
SetGadgetState(#zone_affichage_repertoire,#PB_Web_Refresh)
Case #zone_affichage_repertoire
Debug #PB_Web_SelectedText
Case #zone_rechercher
Select EventType()
Case #PB_EventType_Change ;--------- modification de l'entrée du champ recherche
Debug EventType()
rechercher_contact(GetGadgetText(#zone_rechercher))
If CountList(recherche()) = 0 : generer_code_html(repertoire()) : Else : generer_code_html(recherche()) : EndIf
SetGadgetState(#zone_affichage_repertoire,#PB_Web_Refresh)
Case #PB_EventType_Focus
Debug EventType()
SetGadgetText(#zone_rechercher,"")
Case #PB_EventType_LostFocus
Debug EventType()
SetGadgetText(#zone_rechercher,"")
generer_code_html(repertoire())
SetGadgetState(#zone_affichage_repertoire,#PB_Web_Refresh)
EndSelect
Case #option_nom
trier$ = "nom"
generer_code_html(repertoire())
SetGadgetState(#zone_affichage_repertoire,#PB_Web_Refresh)
Case #option_prenom
trier$ = "prenom"
generer_code_html(repertoire())
SetGadgetState(#zone_affichage_repertoire,#PB_Web_Refresh)
Case #option_fonction
trier$ = "fonction"
generer_code_html(repertoire())
SetGadgetState(#zone_affichage_repertoire,#PB_Web_Refresh)
EndSelect
Case #PB_Event_CloseWindow ;--------- clic sur quitter
quit =1
EndSelect
Wend
DeleteFile(path$+"PBrepertoire.html")
End
