[RESOLU] Problème avec les webgadgets... ayé c'est sûr...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Guac
Messages : 21
Inscription : dim. 03/août/2008 18:33

[RESOLU] Problème avec les webgadgets... ayé c'est sûr...

Message par Guac »

Bonjour à tous.
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
8)
Dernière modification par Guac le sam. 06/sept./2008 21:06, modifié 2 fois.
Guac
Messages : 21
Inscription : dim. 03/août/2008 18:33

Message par Guac »

<mode pénible>

UP

</mode pénible>

Une petite mise à jour, le schmilblik a pas mal avancé mais là ça coince.
Alors c'est vrai que y'a pas trop d'utilité au bousin, mais ça me hante ce truc...

FAUT QUE JE LE TERMINE !!!

C'est mon médecin qui le dit, si je termine pas ce que je commence je deviens fou...
(pis j'ai un peu envie de passer à autre chose accessoirement :wink: ).

Après ce up je recommence plus, promis ...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ce qui est curieux, c'est que ce problème n'apparait pas du tout en mode Debugeur ON !! (F6 avec Japbe) 8O


et meme que ce bug n'apparait pas toujours en mode debugeur OFF :?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

J'ai testé ton code avec 2 puis 3 contacts, j'ai fermé, réouvert... recherché plusieurs fois.. j'ai eu aucun soucis. (lancé avec Japbe)
Guac
Messages : 21
Inscription : dim. 03/août/2008 18:33

Message par Guac »

ah bon ?

vous voulez dire que lorsque vous sortez de la recherche en cliquant sur le webgadget, les recherches qui suivent fonctionnent normalement ?

Chez moi (avec l'ide d'origine) quel que soit le mode on/off du debuger, à chaque entrée clavier dans la zone de recherche, ça me défocus la zone, et ne rafraichit plus l'affichage, comme si le webgadget était freeze en fait, parce que si je contrôle les fichiers txt et html générés, ils sont bien à jour.

Le défaut est visible avec le debuger activé, on voit bien l'évènement 14001 qui vient foutre le bordel.

Et au fait , merci pour la rep, je vais de ce pas télécharger Japbe et voir ça.
Sinon selon vous ya pas de soucis au niveau du code ?
(ça me paraîtrait fantastique ça).
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Guac a écrit : Sinon selon vous ya pas de soucis au niveau du code ?
(ça me paraîtrait fantastique ça).
apparemment tu programme tres proprement.. :)

tu pourrais peut etre optimiser certains trucs comme par exemple

ta procedure :

Code : Tout sélectionner

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 
la meme :

Code : Tout sélectionner

Procedure.s majuscule ( chaine$ ) ;------ transforme la première lettre de chaine$ en majuscule 
      ProcedureReturn UCase(Left(chaine$,1))+Right(chaine$,Len(chaine$)-1)
EndProcedure
mais ce sont des details , Franchement :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Et celle ci pour le fun

Code : Tout sélectionner

Procedure.s majusculeBis( chaine$ )
  PokeB(@chaine$,(PeekB(@chaine$) & %11011111))
  ProcedureReturn chaine$
EndProcedure

t$="salut toto"
Debug majusculeBis(t$)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Guac
Messages : 21
Inscription : dim. 03/août/2008 18:33

Message par Guac »

Merci à tous.

Alors...
J'ai installé jaPBe, et faut reconnaître que... c'est excellent, j'ai passé un petit moment à me ballader dans les configurations, d'ailleurs j'ai vu au passage que tu avais un thème à ton nom Dobro.
M'enfin... adopté.

Par contre, j'ai toujours ce fameux bug de défocus de la zone de recherche.
Ca viendrait quand même pas de mon install, est ce que vous avez des libs supplémentaires concernant les gadgets ou des trucs comme ça ?

Ensuite, concernant les optimisations, autant la tienne Dobro j'avoue que j'aurais dû y penser, autant la tienne Comtois je plane complètement (j'en suis pas encore à ce niveau).
Et est ce que lorsque vous parlez d'optimisation dans ces cas là vous pensez à la vitesse d'éxécution du prog, ou est ce que c'est juste une optimisation de mise en forme ?
Parce que j'avoue que pour comprendre les votres à la lecture, c'est la tempête dans mon cerveau.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Guac a écrit : Et est ce que lorsque vous parlez d'optimisation dans ces cas là vous pensez à la vitesse d'éxécution du prog, ou est ce que c'est juste une optimisation de mise en forme ?
ben je dirai que deja c'est la mise en forme, c'est certain,
mais quand meme
on economise des variables , donc de la memoire,
et forcement de la vitesse
puisque moins de transfers de resultat dans des variables temporaires :)

mais comme je te l'ai dit, c'est juste purement par principe, puique tu te demandais si ton code etait correct , pour ma part, je le trouve super correcte ! , il y a bien des gens ici (moi y compris), qui ne programme pas si "clair" :D
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

@Guac, je trouve que c'est une bonne idée ton carnet d'adresse html. Il fallait y penser :!: et ton code est bien pour commencer à travailler dessus.

Je pense que le blème vient de la rapidité de recherche imposée par ton système de focus par le StringGadget() au webgadget qui a de ce fait besoin du focus en permanence. Je t'ai fais un essai avec un bouton pour lancer la recherche, tu pourras comparer les deux. Il faudrait arriver à faire un compromis entre les deux. N'oublies pas de tester lors de la création, la lecture ou la suppression des fichiers (regarde en fin de code)

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 
#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 () 
     
    
    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 
    
Else 
  MessageRequester("erreur","échec chargement répertoire")
  ProcedureReturn 0 
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")
       End ; arrête tout si ça marche pas
    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") 
       End 
    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) <>0  
    Else 
       MessageRequester("erreur","impossible initialiser fenêtre") 
      End 
    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,"") 
    ButtonGadget(#rechercher,10,240,100,22,"Rechercher")
    WebGadget(#zone_affichage_repertoire,120,10,670,580,path$+"PBrepertoire.html") 
    Else 
       MessageRequester("erreur","erreur initialisation gadgets")
      End  
    EndIf 
    
    If FileSize(path$+"PBrepertoire.txt") = -1;--------- si le fichier repertoire.txt n'existe pas on le crée 
     CreateFile(3,path$+"PBrepertoire.txt") 
     CloseFile(3) 
    EndIf 
    generer_code_html(repertoire()) 
EndProcedure 


;********************************************************************************************************** 
;*********************** programme principal ************************************************************** 
;********************************************************************************************************** 


init_repertoire() 

quit = 0 ;--------- flag 
;While quit = 0 ;--------- boucle principale 
Repeat
   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 #rechercher
                    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 #zone_rechercher  
                    Select EventType() 
                       Case #PB_EventType_Change ;--------- modification de l'entrée du champ recherche 
	                       If GetGadgetText(#zone_rechercher) = ""
				                  generer_code_html(repertoire())
                                                  SetGadgetState(#zone_affichage_repertoire,#PB_Web_Refresh)
				                 EndIf
;                             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 
Until quit = 1
 If FileSize(path$+"PBrepertoire.html") <> -1
  DeleteFile(path$+"PBrepertoire.html") 
 EndIf 
End 
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.
Guac
Messages : 21
Inscription : dim. 03/août/2008 18:33

Message par Guac »

@Jacobus

Merci beaucoup, ton petit bouton permet effectivement de se rendre compte de bien des choses que le debugger ne montre pas.
Cette histoire de temps de réponse du webgadget m'a tout l'air de bien tenir la route.
Je vais réfléchir à un compromis entre le bouton et la recherche temps réel à la volée.

Et merci pour tes conseils.
(Va falloir que je prenne des notes moi...) :roll:

Edit: je passe le sujet en résolu vu que sur ce problème spécifique de défocus j'ai une bonne piste.
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

bonsoir Guac

pourquoi tu utilise un webgadget pour afficher ta liste et pas une ListIconGadget? c'est juste pour savoir .

sinon merci à vous j'appris par de chose à travers de ce code .
Guac
Messages : 21
Inscription : dim. 03/août/2008 18:33

Message par Guac »

Tout simplement parce que ce code, c'est mes premiers pas dans le monde de la programmation, et que je le sentais bien le webgadget ( curiosité quoi ).
Puis accessoirement parce qu'à la vue des screens du listicongadget dans l'aide, je me suis dit que niveau présentation le webgadget permettrait de faire plein de trucs sympas si on s'en donnait la peine ( bon je reconnais que je m'en suis pas donné la peine ) et que ça ouvrait quelques possibilités .
En plus ça me faisait un peu plus de manips de chaines et de fichiers, vu que c'est mon tuto à moi ... :wink:

Edit: Tu es le deuxième à trouver un intérêt à mon premier code ! ! !
Déja 1 ça m'a surpris, mais 2 !
C'est encourageant, merci à vous !
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

bonjour Guac

jai imprimer ton code et je l'ai ranger dans classeur avec les autres codes que j'ai trouver sur ce forum .
cela me sert de tutoriel, d'exemple et de reference pour apprendre le PB
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

jbernard13 a écrit :bonjour Guac

jai imprimer ton code et je l'ai ranger dans classeur avec les autres codes que j'ai trouver sur ce forum .
cela me sert de tutoriel, d'exemple et de reference pour apprendre le PB
Ah les joies de l'informatique...

Sérieusement sans moqueries, et même si c'est hors sujet j'ai du mal à comprendre à une époque on on cherche "l'écologie"&économie de partout... Pourquoi ne pas laisser sur l'ordinateur car quand tu en as besoin... c'est que ton ordi est allumé :roll:
Répondre