un petit programme pour les contacts.

Programmation d'applications complexes
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

chris si tu es si malin essaye d'ecrire le meme programme en utilisant ta façon de programmer

alors explique ça : La boucle standard est tout à fait capable de gérer les messages de plusieurs fenêtres, sans avoir besoin d'en mettre une dans chaque procédure qui ouvre une fenêtre.
Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

Message par Lna »

Chris a écrit :Que vient faire cette boucle d'évènements en plein milieu d'une procédure? Mystère.

La boucle standard est tout à fait capable de gérer les messages de plusieurs fenêtres, sans avoir besoin d'en mettre une dans chaque procédure qui ouvre une fenêtre.
Je ne vois pas le problème, selon le contexte de la tâche à effectuer, cette méthode est parfaitement valable. 8O
D'autres méthodes sont aussi tout à fait possibles, comme dans tous les autres programmes terminés ou non. 8O
Chris a écrit :Que vient faire cette commande : If OpenFile ( #file , "Mes_Amies" )<>0 dans la procédure d'ouverture de la fenêtre principale?

Elle aurait plus sa place dans une procédure séparée, ce qui permettrait de la rappeler à n'importe quel moment pour recharger la LinkedList, après une modif, par exemple.
Etant donnée qu'elle n'est appelée qu'une seule fois dans le programme, de la même manière que l'on définit qu'une unique fois les gadgets, sa place comme sa forme sont tout à fait justifiées. 8O

Ce n'est pas un programme terminé, mais il prend forme à chaque rajout. 8)
Si ce programme était mal conçu, il ne fonctionnerait pas, ce qui n'est pas le cas. 8O
Chris a écrit :Tel qu'il est, ce programme est (déjà) un calvaire à débugger
Ce programme est logique, il ne pose pas difficultés de compréhension rien que pour cette raison. 8O


> Venom

Elle est intéressante ta procédure récursive RemoveGadget(), c'est un bel exemple technique. 8)

@ peluche
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

bernard13 a écrit :alors explique ça : La boucle standard est tout à fait capable de gérer les messages de plusieurs fenêtres, sans avoir besoin d'en mettre une dans chaque procédure qui ouvre une fenêtre.
Comme ça, tout simplement. Plusieurs fenêtres, une seule boucle.

Code : Tout sélectionner

Enumeration
  #Main
  #Fenetre1
  #Fenetre2
  #Fenetre3
  #Fenetre4
  #Fenetre5
EndEnumeration

Enumeration
  #Bouton1
  #Bouton2
  #Bouton3
  #Bouton4
  #Bouton5
  #BoutonFenetre1
  #BoutonFenetre2
  #BoutonFenetre3
  #BoutonFenetre4
  #BoutonFenetre5
  #Text
EndEnumeration

Procedure OpenWin_Main()
  If OpenWindow(#Main, 0, 0, 220, 200, "Fenetres", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(0))
      ButtonGadget(#Bouton1, 10,  10, 200, 20, "Ouvrir fenêtre 1")
      ButtonGadget(#Bouton2, 10,  40, 200, 20, "Ouvrir fenêtre 2")
      ButtonGadget(#Bouton3, 10,  70, 200, 20, "Ouvrir fenêtre 3")
      ButtonGadget(#Bouton4, 10, 100, 200, 20, "Ouvrir fenêtre 4")
      ButtonGadget(#Bouton5, 10, 130, 200, 20, "Ouvrir fenêtre 5")
      TextGadget(#Text, 10, 180, 200, 20, "Pas de fenêtre ouverte", #PB_Text_Center)
    EndIf
  EndIf
EndProcedure

Procedure OpenWin_1()
  If OpenWindow(#Fenetre1, 0, 0, 220, 40, "Fenetre 1", #PB_Window_SystemMenu, WindowID(#Main))
    If CreateGadgetList(WindowID(#Fenetre1))
      ButtonGadget(#BoutonFenetre1, 10,  10, 200, 20, "Fermer fenêtre 1")
      
      ProcedureReturn #True
    EndIf
  EndIf
EndProcedure

Procedure OpenWin_2()
  If OpenWindow(#Fenetre2, 0, 70, 220, 40, "Fenetre 2", #PB_Window_SystemMenu, WindowID(#Main))
    If CreateGadgetList(WindowID(#Fenetre2))
      ButtonGadget(#BoutonFenetre2, 10,  10, 200, 20, "Fermer fenêtre 2")
      
      ProcedureReturn #True
    EndIf
  EndIf
EndProcedure

Procedure OpenWin_3()
  If OpenWindow(#Fenetre3, 0, 140, 220, 40, "Fenetre 3", #PB_Window_SystemMenu, WindowID(#Main))
    If CreateGadgetList(WindowID(#Fenetre3))
      ButtonGadget(#BoutonFenetre3, 10,  10, 200, 20, "Fermer fenêtre 3")
      
      ProcedureReturn #True
    EndIf
  EndIf
EndProcedure

Procedure OpenWin_4()
  If OpenWindow(#Fenetre4, 0, 210, 220, 40, "Fenetre 4", #PB_Window_SystemMenu, WindowID(#Main))
    If CreateGadgetList(WindowID(#Fenetre4))
      ButtonGadget(#BoutonFenetre4, 10,  10, 200, 20, "Fermer fenêtre 4")
      
      ProcedureReturn #True
    EndIf
  EndIf
EndProcedure

Procedure OpenWin_5()
  If OpenWindow(#Fenetre5, 0, 280, 220, 40, "Fenetre 5", #PB_Window_SystemMenu, WindowID(#Main))
    If CreateGadgetList(WindowID(#Fenetre5))
      ButtonGadget(#BoutonFenetre5, 10,  10, 200, 20, "Fermer fenêtre 5")
      
      ProcedureReturn #True
    EndIf
  EndIf
EndProcedure

OpenWin_Main()

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        ;/ Ouverture des fenêtres "fille"
        Case #Bouton1
          If OpenWin_1()
            SetGadgetText(#Text, "Vous avez ouvert la fenêtre 1")
          EndIf
          
        Case #Bouton2
          If OpenWin_2()
            SetGadgetText(#Text, "Vous avez ouvert la fenêtre 2")
          EndIf
          
        Case #Bouton3
          If OpenWin_3()
            SetGadgetText(#Text, "Vous avez ouvert la fenêtre 3")
          EndIf
          
        Case #Bouton4
          If OpenWin_4()
            SetGadgetText(#Text, "Vous avez ouvert la fenêtre 4")
          EndIf
          
        Case #Bouton5
          If OpenWin_5()
            SetGadgetText(#Text, "Vous avez ouvert la fenêtre 5")
          EndIf
          
          ;/ Femeture des fenêtres "fille" par le bouton
        Case #BoutonFenetre1
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 1")
          CloseWindow(#Fenetre1)
          
        Case #BoutonFenetre2
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 2")
          CloseWindow(#Fenetre2)
          
        Case #BoutonFenetre3
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 3")
          CloseWindow(#Fenetre3)
          
        Case #BoutonFenetre4
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 4")
          CloseWindow(#Fenetre4)
          
        Case #BoutonFenetre5
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 5")
          CloseWindow(#Fenetre5)
          
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        ;/ Fermeture des fenêtres "fille" par l'icône [X]
        Case #Fenetre1
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 1")
          CloseWindow(#Fenetre1)
          
        Case #Fenetre2
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 2")
          CloseWindow(#Fenetre2)
          
        Case #Fenetre3
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 3")
          CloseWindow(#Fenetre3)
          
        Case #Fenetre4
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 4")
          CloseWindow(#Fenetre4)
          
        Case #Fenetre5
          SetGadgetText(#Text, "Vous avez fermé la fenêtre 5")
          CloseWindow(#Fenetre5)
          
          ;/ Fermeture de la fenêtre principale (et fin du programme)
        Case #Main
          Quit = #True
          
      EndSelect
  EndSelect
Until Quit
End
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

bon c'est une autre façon de faire néanmoins la méthode de bernard est tout aussi viable :)

on a tous nos méthodes de programmations chacun écrit les choses a sa façon il n'y a pas de méthode meilleur qu'une autre. seul le resultat compte :)

je ne sais pas comment j'aurais programmer ca personellement mais surement pas exactement de la meme facons que vous l'avez fait tout les deux :) ah ca non

j'aurais fait ca a MA manière :)

sur ce, encourageons bernard pour que son application devienne indispensable pour gerer nos contacts :)
ImageImage
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

merci chris de tes precieux conseil

pk tu mets : ProcedureReturn #true= à chaque fois dans les procedures des fenetres filles?

merci quand meme pour ta methode
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

bernard13 a écrit :merci chris de tes precieux conseil

pk tu mets : ProcedureReturn #true= à chaque fois dans les procedures des fenetres filles?

merci quand meme pour ta methode
Parce que si la fenêtre s'est bien ouverte, la procédure retourne #true (vrai), et ne retourne rien dans le cas contraire (ce qui équivaut, en fait, à #false (ou faux)).

Ca permet (dans ce cas) de tester si la fenêtre s'est bien ouverte ou non, et d'afficher le message dans le textgadget().

If OpenWin_1()
SetGadgetText(#Text, "Vous avez ouvert la fenêtre 1")
EndIf

J'aurai aussi bien pu mettre
If OpenWin_1()
SetGadgetText(#Text, "Vous avez ouvert la fenêtre 1")
Else
SetGadgetText(#Text, "La fenêtre 1 est coincée.")
EndIf
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Chris a écrit :J'aurai aussi bien pu mettre
If OpenWin_1()
SetGadgetText(#Text, "Vous avez ouvert la fenêtre 1")
Else
SetGadgetText(#Text, "La fenêtre 1 est coincée.")
EndIf
l'exemple est pas super bien choisi, si ta fenetre ne s'ouvre pas on ne verra pas le gadget, un petit messagerequester convient mieux ^_^

Dri
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Dr. Dri a écrit :
Chris a écrit :J'aurai aussi bien pu mettre
If OpenWin_1()
SetGadgetText(#Text, "Vous avez ouvert la fenêtre 1")
Else
SetGadgetText(#Text, "La fenêtre 1 est coincée.")
EndIf
l'exemple est pas super bien choisi, si ta fenetre ne s'ouvre pas on ne verra pas le gadget, un petit messagerequester convient mieux ^_^

Dri
Ben si, on le voit, puisque la fenêtre appelée par OpenWin_1 est une fenêtre "fille" et que le gadget #Text se trouve dans la fenêtre "mère" :wink:
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

merci Chris de ton aide
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Chris a écrit :Ben si, on le voit, puisque la fenêtre appelée par OpenWin_1 est une fenêtre "fille" et que le gadget #Text se trouve dans la fenêtre "mère" :wink:
WTF ? j'avais pas fait gaffe lol

Dri :lol:
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

bonjour

j'ai récris mon programme de Contact en utilsant que Chris m'a montrer pour la gestion des fenetres filles
voila la nouvelle version :

Code : Tout sélectionner

; Mes contact version 01
; écris par jbernard - copyright 2007 

; Les constantes 

; Fenetres 
 Enumeration
  #Fenetre_main
  #Fenetre_ajouter
 EndEnumeration
 ;Gadgets
 Enumeration
  #Liste_amie
  #Bouton_nouveau
  #Bouton_sauver
  #bouton_effacer 
  #bouton_info 
  #cadre
  #text_pseudo
  #champ_pseudo
  #text_prenom
  #champ_prenom
  #text_age
  #champ_age
  #text_ville
  #champ_ville 
  #text_mail
  #champ_mail
  #bouton_ajouter
  #bouton_annule 
  #file
 EndEnumeration
;procedure pour ajouter un ou une ami(e) à la liste 
 Structure Gestion
  Pseudo.s
  Prenom.s
  Age.s
  Ville.s
  Email.s
 EndStructure
 
 Global NewList Amis.Gestion()
 Procedure.b Effacer_liste()
  ClearList(Amis())
   ProcedureReturn l
 EndProcedure    

 ; Creation de la liste chainée 
 
 Procedure.b ajoute_amis()
  LastElement(Amis())
  If AddElement(Amis())
    Amis()\Pseudo=GetGadgetText(#champ_pseudo)
    Amis()\Prenom=GetGadgetText(#champ_prenom)
    Amis()\Age=GetGadgetText(#champ_age)
    Amis()\Ville=GetGadgetText(#champ_ville)
    Amis()\Email=GetGadgetText(#champ_mail)
   AddGadgetItem(#Liste_amie,-1,Amis()\pseudo+Chr(10)+Amis()\Prenom+Chr(10)+Amis()\age+Chr(10)+Amis()\ville+Chr(10)+Amis()\Email)
   EndIf
  ProcedureReturn l
 EndProcedure 
 
 
 ;Procedure d'effacement d'un nom de la liste 
 Procedure Supprimer_nom()
  Protected i,total_item.l
  total_item=CountGadgetItems(#Liste_amie)-1
   For i=total_item To 0  Step -1
   If GetGadgetItemState(#Liste_amie,i)&#PB_ListIcon_Checked
    RemoveGadgetItem(#Liste_amie,i)
    SelectElement(Amis(),i)
    DeleteElement(Amis())
    EndIf
    Next i
 EndProcedure 
 
 ; procedure de sauvegarde du fichier 
 Procedure sauver()
  ResetList(Amis())
  CreateFile(#file,"Contact.dat")
  ForEach Amis()
   WriteStringN(#file,Amis()\Pseudo)
   WriteStringN(#file,Amis()\Prenom)
   WriteStringN(#file,Amis()\Age)
   WriteStringN(#file,Amis()\Ville)
   WriteStringN(#file,Amis()\Email)
   Next 
   CloseFile(#file) 
 EndProcedure 
 
 
 
 
 
 
 
 
 
 ;Procedure des fenetres 
 
 ; Fenetre principale 
 
 Procedure main()
 If OpenWindow(#Fenetre_main,0,0,640,345," Mes Contacts version 01-2007",#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
 If CreateGadgetList(WindowID(#Fenetre_main))
  ListIconGadget(#Liste_amie,10,50,620,280,"Pseudo :",150,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
   AddGadgetColumn(#Liste_amie,1,"Prénom:",100)
   AddGadgetColumn(#Liste_amie,2,"Age:",50)
   AddGadgetColumn(#Liste_amie,3,"Ville:",195)
   AddGadgetColumn(#Liste_amie,4,"Email:",200)
   ButtonGadget(#Bouton_nouveau,10,10,120,30,"Ajouter un contact")
   ButtonGadget(#Bouton_sauver,150,10,120,30,"Sauver la liste")  
   ButtonGadget(#Bouton_effacer,290,10,120,30,"Effacer un contact")
   ButtonGadget(#bouton_info,435,10,120,30,"Information")
  EndIf
  EndIf 
 EndProcedure
 
 ;Fenetre ajouter un ami ou une amie 
 Procedure ajouter()
 If OpenWindow(#Fenetre_ajouter,0,0,320,340,"Ajouter un nouveau contact",#PB_Window_TitleBar|#PB_Window_ScreenCentered)
 If CreateGadgetList(WindowID(#Fenetre_ajouter)) 
  Frame3DGadget(#cadre,10,10,300,280,"")
  TextGadget(#text_pseudo,90,25,120,30,"Pseudo :",#PB_Text_Center)
  StringGadget(#champ_pseudo ,45,45,220,20,"")
  TextGadget(#text_prenom,90,75,120,30,"Prenom :",#PB_Text_Center)
  StringGadget(#champ_prenom,45,95,220,20,"")
  TextGadget(#text_age,90,125,120,30,"Age :",#PB_Text_Center)
  StringGadget(#champ_age,135,145,25,20,"",#PB_String_Numeric)
  TextGadget(#text_ville,90,175,120,30,"Ville :",#PB_Text_Center)
  StringGadget(#champ_ville,45,195,220,20,"")
  TextGadget(#text_mail,90,225,120,30,"Email :",#PB_Text_Center)
  StringGadget(#champ_mail,45,245,220,20,"")
  ButtonGadget(#bouton_ajouter,20,300,120,30,"Ajouter")
  ButtonGadget(#bouton_annule,180,300,120,30,"Annuler")
 ProcedureReturn #True
  EndIf
  EndIf
 
 
 EndProcedure 
 
 
 
 ;Boucle du programme 
 main()
 ;Chargement de la liste au demarrage du programme 
  If OpenFile(#file,"Contact.dat")<>0
   ResetList(Amis())
   OpenFile(#file,"Contact.dat")
   While Eof(#file)=0
   If AddElement(Amis())
     Amis()\Pseudo=ReadString(#file)
     Amis()\Prenom=ReadString(#file)
     Amis()\Age=ReadString(#file) 
     Amis()\Ville=ReadString(#file)
     Amis()\Email=ReadString(#file)
   AddGadgetItem(#Liste_amie,-1,Amis()\pseudo+Chr(10)+Amis()\Prenom+Chr(10)+Amis()\age+Chr(10)+Amis()\ville+Chr(10)+Amis()\Email)
   EndIf
   Wend
   CloseFile(#file)  
   EndIf
 ; programation de la gestion des evenements des fenetres 
 Repeat
   Select WaitWindowEvent () 
    Case #PB_Event_Gadget
     Select EventGadget()     
     Case #Bouton_nouveau:ajouter()
     Case#bouton_sauver:sauver()
     Case #bouton_effacer:Supprimer_nom()
     Case #bouton_info:MessageRequester("Information","Contact crée par Jbernard copyright 2007",#PB_MessageRequester_Ok)         
     Case #bouton_ajouter:ajoute_amis()
     CloseWindow(#Fenetre_ajouter)
     Case #bouton_annule
     CloseWindow(#Fenetre_ajouter) 
      
      EndSelect  
        Case #PB_Event_CloseWindow 
  Select EventWindow()
   Case #Fenetre_main
   Quit=#True
   EndSelect
  EndSelect
  Until Quit
  End
 
 
 
 
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ca fonctionne.

Dans ta procédure "Sauver", le ResetList() n'est pas utile puisque tu utilises la commande ForEach pour lire la liste, et que cette commande parcours la totalité de la liste depuis le début, quelle que soit la position du pointeur au moment de l'appel.
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

merci chris peux tu m'expliquer un peu pour ResetList() et Foreach?
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

comment je peux rajouter une bar de status qui indiquerais le nombre de contact dans la liste
si quelqu'un peux m'expliquer comment faire svp
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

bernard13 a écrit :comment je peux rajouter une bar de status qui indiquerais le nombre de contact dans la liste
si quelqu'un peux m'expliquer comment faire svp
c'est facile, tu lances l'éditeur purebasic, tu vas dans l'aide et tu regardes les exemples pour essayer de les comprendre. si tu as bien pensé à lancer l'éditeur tu pourras même les tester immédiatement.

Dri :roll:
Répondre