Page 2 sur 3

Publié : mar. 30/oct./2007 22:21
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.

Publié : mar. 30/oct./2007 22:22
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

Publié : mar. 30/oct./2007 23:48
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

Publié : mer. 31/oct./2007 0:02
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 :)

Publié : mer. 31/oct./2007 8:16
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

Publié : mer. 31/oct./2007 20:00
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

Publié : mer. 31/oct./2007 21:54
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

Publié : mer. 31/oct./2007 22:07
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:

Publié : mer. 31/oct./2007 22:24
par bernard13
merci Chris de ton aide

Publié : mer. 31/oct./2007 22:40
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:

Publié : ven. 02/nov./2007 15:21
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
 
 
 
 

Publié : ven. 02/nov./2007 17:28
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.

Publié : ven. 02/nov./2007 18:00
par bernard13
merci chris peux tu m'expliquer un peu pour ResetList() et Foreach?

Publié : sam. 03/nov./2007 13:42
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

Publié : sam. 03/nov./2007 13:48
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: