PureBasic

Forums PureBasic
Nous sommes le Lun 24/Juin/2019 10:04

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 7 messages ] 
Auteur Message
 Sujet du message: TreeGadget() redéfinir le sous-niveau ?
MessagePosté: Sam 29/Oct/2016 8:25 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1569
Hello,

Le gadget TreeGadget() permet de créer des sous-niveau lors de la création d'un élément (AddGadgetItem(#Gadget, Position, Texte$ [, ImageID [, Options]])) où Option = niveau par rapport à la branche supérieure.

Une fois l'abre créé, la fonction GetGadgetItemAttribute() utilisée avec l'attribut #PB_Tree_SubLevel: Renvoie le sous-niveau actuel de l'élément dans l'arbre.

Cependant, cette fonction n'a pas son équivalent (SetGadgetItemAttribute()) pour redéfinir le sous-niveau :|

Actuellement deux solutions (sans API)
- Supprimer l'élément puis le re-créer avec le nouveau niveau
- Redessiner tout l'arbre

Pourrait-on modifier SetGadgetItemAttribute() pour qu'il concerne aussi le TreeGadget ?

:|

_________________
HP de 2012 - Intel i3-3220 @3.30 GHz, 2 coeurs, 4 threads - RAM 16 Go - Nvidia GT 620 1920x1080 DPI 100%
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TreeGadget() redéfinir le sous-niveau ?
MessagePosté: Sam 29/Oct/2016 8:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2135
Localisation: 50200 Coutances
Bonjour Marc56, je ne sais plus de qui est ce programme source, mais il est très bien, je pense que c'est un code que j'ai "francisé".
Code:
Procedure.L Arbre(Action.L, Arbre.L, Clef.L, Racine.S)
  Reaction.L = 0
  ClefFinale.L = CountGadgetItems(Arbre) - 1
  If Action <= 5
    JeunesseClef.L = GetGadgetItemAttribute(Arbre, Clef, #PB_Tree_SubLevel)
    Select Action
    Case 0:  Clef = - 1: JeunesseClef = 0
    Case 1
      For i = Clef To 0 Step - 1
        Jeunesse = GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel)
        If Jeunesse < JeunesseClef: Clef = i: i = 0
        ElseIf Jeunesse = 0: Clef = - 1: i = 0: EndIf
      Next i
    Case 2, 3, 5
      ClefFinale = CountGadgetItems(Arbre)
      For i = Clef + 1 To ClefFinale
        Jeunesse = GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel)
        If Action = 5: If Jeunesse <= JeunesseClef: Clef = i - 1: i = ClefFinale: EndIf
        ElseIf Action = 2: If Jeunesse > JeunesseClef: Clef = i: EndIf
          If Jeunesse <= JeunesseClef: i = ClefFinale: EndIf
        Else: If Jeunesse => JeunesseClef: Clef = i: EndIf
          If Jeunesse < JeunesseClef: i = ClefFinale: EndIf
        EndIf
      Next
      If Action = 5: JeunesseClef + 1: EndIf
    Case 4: JeunesseClef + 1
    EndSelect
    AddGadgetItem(Arbre, Clef + 1, Racine, 0, JeunesseClef)
    If Action = 4 Or Action = 5: SetGadgetItemState(Arbre, Clef, #PB_Tree_Expanded): EndIf
  Else
    Select Action
    Case 8
      Reaction.L = CreateFile(#PB_Any, Racine)
      If Reaction <> 0
        For i = 0 To ClefFinale
          WriteLong(Reaction, GetGadgetItemAttribute(Arbre, i, #PB_Tree_SubLevel) )
          WriteStringN(Reaction, GetGadgetItemText(Arbre, i, - 1) )
        Next
      EndIf
    Case 9: Reaction = ReadFile(#PB_Any, Racine)
      If Reaction <> 0:  i = 0
        Repeat
          Level.L = ReadLong(Reaction)
          String.s = ReadString(Reaction)
          AddGadgetItem(Arbre, i, String, 0, Level): i + 1
        Until Eof(Reaction)
      EndIf
    EndSelect
    If IsFile(Reaction): CloseFile(Reaction): EndIf
    ProcedureReturn Reaction
  EndIf
EndProcedure

Global DSt.S = ""
DSt + "GFFGFFG8F0GDF68F0GBF68F770G4F7G1F8FG070G3F77FFF8FG078G4F7F888FG07866G3F77FFFG078"
DSt + "G06G3FG378F4G06G2FG278FFF4G06G2FG178G0F4G06G2FG078G1F4G06G2FG17G1F466G5FG07G1F46"
DSt + "GFF4GFFGFFGFFGFFG6FGBCFG09CG9ECFG09GBCF99GEF99FFGB7F99GD7F99FFGB7F99GEF99FFGB9FG"
DSt + "19G9B9FGF9FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB7FFGE7G1FGB7GFFG2FGB7FFGE7FF7FFGB7"
DSt + "FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB9FG19G9B9FGF9F99GEF99FFGBCFG09CG9ECFG09GBCFF"
DSt + "7GFF7FFGB7FFGE7G1FGB7GFFG2FGB7FFGE7FF7FFGB7FF7GFF7FFGB7FFGE7FF7FFGB7FF7GFF7FFGB9"
DSt + "FG19G9B9FGF9F99GEF99FFGB7F99GD7F99FFGB7F99GEF99FFGBCFG09CG9ECFG09GBCGFFFFGB9G1F9"
DSt + "G9B9G1FGB9G1F99GEF99FFFGACFG19CG8ECFG19GACFF7GFF7FFFGA7FFGE7FF7FFFGA7FF7GFF7FFFG"
DSt + "A7FFGE7FF7FFFGA7FF7GFF7FFFGA7FFGE7G2FGA7GFFFFGB9G1F9G9B9G1FGB9G1F99GEF99FFFGA7F9"
DSt + "9GD7F99FFFGA7F99GEF99FFFGA7F99GD7F99FFFGA7F99GEF99FFFGA7F99GD7F99FFFGA7F99GEF99F"
DSt + "FFGACFG19CG8ECFG19GACGFFFFG20G57000FFG20G170007G00FG20G170007G00FG20G170007G00FG"
DSt + "20G170007G00FG20G170007G00FG20G57G00FGF0F000G9F000F000G1F000G1F000F000G0F07F70G0"
DSt + "F000F000G0F7FF70G0F000F000G2F70G1F000F000G2F0G2F000F000G9F000F000G2F0G2F000F000G"
DSt + "2F7G2F000F0FGB0F0FGF0GFFGFFGFFGFFG6F00GDF0FF0GFFF0F0GEF00GDF000G6F000GCF0EEEG50G"
DSt + "3F0G7E0G3F0G7E0G3F0G7E0G3F0G0EG80FFF0EEE0G7E0FFF0EE0G7E0G0F0E0G7E0G1F00G7E0G2FG9"
DSt + "0GFFG4F"

Procedure.L ValHex(a.s)
  x = Asc(a): If x < 58: S = x - 48: Else: S = x - 55: EndIf: ProcedureReturn S
EndProcedure

Procedure RecupIco()
  Ico.S = ""
  For i = 1 To Len(DSt): A.S = Mid(DSt, i, 1)
    If A = "G": N.S = Mid(DSt, i + 1, 1)
      A = Mid(DSt, i + 2, 1): For j = 1 To 4 + ValHex(N): Ico + A: Next: i + 2
    Else: Ico + A
    EndIf
  Next: Adr = 0
  For ix = 0 To 7
    CreateImage(ix, 20, 20): StartDrawing(ImageOutput(ix) )
      For y = 0 To 19
        For x = 0 To 19
          Adr + 1: Pt = ValHex(Mid(Ico, Adr, 1))
          If Pt & 8: coef = 255: Else: coef = 128: EndIf
          R =((Pt & 4) >> 2) * coef: V =((Pt & 2) >> 1) * coef: B =((Pt & 1) ) * coef
          C = RGB(R, V, B): If Pt = 7: C = RGB(192, 192, 192): EndIf
          If Pt = 8: C = RGB(128, 128, 128): EndIf: Plot(x, y, C)
        Next
      Next
      StopDrawing()
    Next
EndProcedure

Procedure Enreg(Gadget)
  Repeat
    Repeat
      Name.S = SaveFileRequester("Enregistrer sous", "", "Tout type de fichier|*.*;Base de données|*.BDD", 1)
      If Name = "": Goto ExitEnreg: EndIf
      If 0 Or FileSize(Name) = - 2: MessageRequester("Message", "Nom de fichier invalide !", 0): EndIf
    Until FileSize(Name) <> - 2
    If FileSize(Name) <> - 1
      Mess = MessageRequester("Message", "Le fichier " + Name + " existe déjà ! Voulez-vous l'écraser ?", #PB_MessageRequester_YesNoCancel)
      If Mess = #PB_MessageRequester_Cancel: Goto ExitEnreg: EndIf
    EndIf
  Until FileSize(Name) = - 1 Or Mess = #PB_MessageRequester_Yes
  Arbre(8, Gadget, 0, Name)
ExitEnreg:
EndProcedure

Procedure Charge(Gadget)
  Name.S = OpenFileRequester("Ouvrir", "", "Tout type de fichier|*.*;Base de données|*.BDD", 1)
  If FileSize(Name) < 0
    MessageRequester("Message", "Nom de fichier incorrect ou inexistant !", 0)
  Else
    Arbre(9, Gadget, 0, Name)
  EndIf
EndProcedure

;************************************************************************
; PREPARATION MENU
;************************************************************************
  ; On récupère les icônes
  ;************************
  RecupIco()

  ; On crée la fenêtre du menu
  ;****************************
  OpenWindow(0, 10, 10, 28, 28 * 8, "x", #PB_Window_BorderLess)
  StickyWindow(0, 1)
  HideWindow(0, 1)

  ; On crée les boutons du menu
  ;******************************
  For i = 0 To 7
    ButtonImageGadget(i, 0, 28 * i, 28, 28, ImageID(i) )
  Next i

  ; On rajoute un peu d'aide
  ;**************************
  GadgetToolTip(0, "Détruire l'arbre")
  GadgetToolTip(1, "Crée une clé 'soeur ainée'")
  GadgetToolTip(2, "Crée une clé 'soeur cadette'")
  GadgetToolTip(3, "Crée une clé 'soeur benjamine'")
  GadgetToolTip(4, "Crée une clé 'enfant ainé'")
  GadgetToolTip(5, "Crée une clé 'enfant benjamin'")
  GadgetToolTip(6, "Enregistrer sous")
  GadgetToolTip(7, "Ouvrir")
;************************************************************************
;************************************************************************


;************************************************************************
;  PREPARATION FENETRE PRINCIPALE
;************************************************************************
  ; On crée la fenêtre
  ;********************
  OpenWindow(1, 0, 0, 400, 450, "Arbre", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)

  ; On crée le TreeGadget
  ;***********************
  Global Gadget = TreeGadget(- 1, 0, 0, 400, 450, #PB_Tree_AlwaysShowSelection)
  LoadFont(0, "Verdana", 16, #PB_Font_Italic)
  SetGadgetFont(Gadget, FontID(0) )

  ; On crée un menu PopUp
  ;***********************
  CreatePopupMenu(0)
  MenuItem(0, "Renommer")
  MenuItem(1, "Supprimer")

  ; Derniers préparatifs
  ;**********************
  Arbre(0, Gadget, 0, "(vide)")
  SetGadgetState(Gadget, 0)
  ResizeWindow(0, WindowX(1) - 30, WindowY(1) + 30, #PB_Ignore, #PB_Ignore)
  HideWindow(0, 0)

;************************************************************************
;************************************************************************





  ; On fait une boucle d'événements
  ;*********************************
  Global Modified.L = 0
  Repeat
    Ev = WaitWindowEvent()
    Selected = GetGadgetState(Gadget)
    Select Ev
    Case #WM_RBUTTONDOWN
      DisplayPopupMenu(0, WindowID(1) )
    Case #PB_Event_Gadget
      Gadg = EventGadget()
      Select Gadg
      Case 0: Nouv = 0
        Arbre(0, Gadget, 0, "(vide_" + Str(Nouv) + ")"): Modified = 1
      Case 1, 2, 3, 4, 5
        ; If Selected <> -1
        ;  OldSelected = Selected
        Nouv + 1
        Arbre(Gadg, Gadget, Selected, "(vide_" + Str(Nouv) + ")"): Modified = 1
        ; Else
        ;  Selected = OldSelected
        ; EndIf
      Case 6
        Enreg(Gadget)
      Case 7
        Charge(Gadget)
      EndSelect
    Case #PB_Event_Menu
      Select EventMenu()
      Case 0
        SetGadgetItemText(Gadget, Selected, InputRequester("Renommer", "Entrez le nouveau nom :", GetGadgetItemText(Gadget, Selected, - 1) ), - 1 )
        Modified = 1
      Case 1
        If MessageRequester("Confirmer", "Voulez-vous réellement supprimer " + GetGadgetItemText(Gadget, Selected, - 1) + " ?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
          RemoveGadgetItem(Gadget, Selected): Modified = 1
          If CountGadgetItems(Gadget) = 0
            Arbre(0, Gadget, 0, "(vide)")
          EndIf
        EndIf
      EndSelect
    Case #PB_Event_SizeWindow
      ResizeGadget(Gadget, 0, 0, WindowWidth(1), WindowHeight(1) )
    Case #PB_Event_MoveWindow
      ResizeWindow(0, WindowX(1) - 30, WindowY(1) + 30, #PB_Ignore, #PB_Ignore)
    Case #PB_Event_CloseWindow
      If Modified
        Mess = MessageRequester("Message", "Le document n'a pas été enregistré. Souhaitez-vous le faire maintenant ?", #PB_MessageRequester_YesNoCancel)
        Select Mess
          Case #PB_MessageRequester_Yes
            Enreg(Gadget)
          Case #PB_MessageRequester_No
            Quit = 1
        EndSelect
      Else
        Quit = 1
      EndIf
    EndSelect
  Until Quit = 1

_________________
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TreeGadget() redéfinir le sous-niveau ?
MessagePosté: Sam 29/Oct/2016 9:10 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1978
bon j'etais aussi dessus

voici une modification d'un code de Olivier
le menu contextuel (bouton droit de la souris ) , permet de creer des enfants,des freres, et .... de renommer ! :)

Code:
; code : Olivier
; Purebasic 4.10
#Gad_Tree = 0
#Menu_TreeEdit = 0
#ItemIns_Enfant = 0
#ItemIns_Frere = 1
#ItemSuppr = 2
#ItemProper = 3
If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      CreateGadgetList(WindowID(0) )   
      TreeGadget(#Gad_Tree, 10, 10, 340, 160)   
      AddGadgetItem(#Gad_Tree, 0, "Root", 0, 0)   
      ;Boucle principale   
      CreatePopupMenu(#Menu_TreeEdit)
      OpenSubMenu("Ajouter")
      MenuItem(#ItemIns_Enfant, "Enfant")
      MenuItem(#ItemIns_Frere, "Frere")   
      CloseSubMenu()
      MenuItem(#ItemSuppr, "Enlever")
      MenuItem(#ItemProper, "Renommer")
Else
      End
EndIf
Repeat
      Select WaitWindowEvent()   
      Case #PB_Event_CloseWindow
            End   
      Case #WM_RBUTTONDOWN
            DisplayPopupMenu(0,WindowID(0))
      Case #PB_Event_Menu
            Select EventMenu()     
            Case #ItemIns_Enfant
                  ; On vérif qu'il y a une sélection /!\ Important : Merci Flype :)
                  If GetGadgetState(#Gad_Tree) <> -1
                        ; On récup la sélection
                        item = GetGadgetState(#Gad_Tree)
                        ; On récup alors le niveau de la sélection
                        ItemNiveau = GetGadgetItemAttribute(#Gad_Tree, item, #PB_Tree_SubLevel)
                        ; On mémorise le total: à 2 fois ça servira
                        ExitFor = CountGadgetItems(#Gad_Tree)
                        ; On va rechercher l'enfant cadet
                        For i = item + 1 To ExitFor
                                    TestNiveau = GetGadgetItemAttribute(#Gad_Tree, i, #PB_Tree_SubLevel)
                                    ; Dès qu'on trouve un frère, un tonton ou autre...
                                    If TestNiveau <= ItemNiveau
                                          ; On signale que le cadet était juste avant
                                          item = i - 1
                                          ; Et on arrête de chercher
                                          i = ExitFor
                                    EndIf
                              Next i
                              ; On rajoute le bébé!
                              AddGadgetItem(#Gad_Tree, item + 1, "Root"+ Str(n), 0, ItemNiveau + 1)
                              ; Et on ouvre la famille
                              SetGadgetItemState(#Gad_Tree, item, #PB_Tree_Expanded)
                              n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n"
                        EndIf
                  Case #ItemIns_Frere
                        ; On vérif qu'il y a une sélection
                        If GetGadgetState(#Gad_Tree) <> -1
                              ; On récup la sélection
                              item = GetGadgetState(#Gad_Tree)
                              ; On récup alors le niveau de la sélection
                              ItemNiveau = GetGadgetItemAttribute(#Gad_Tree, item, #PB_Tree_SubLevel)
                              ; On mémorise le total: à 2 fois ça servira
                              ExitFor = CountGadgetItems(#Gad_Tree)
                              ; On va rechercher le dernier des descendants, neveux compris
                              For i = item + 1 To ExitFor
                                          TestNiveau = GetGadgetItemAttribute(#Gad_Tree, i, #PB_Tree_SubLevel)
                                          ;Si c'est un frère, un fils, un neveu...
                                          If TestNiveau => ItemNiveau
                                                ; On le mémorise au cas où ce soit le dernier
                                                item = i
                                          EndIf
                                          ;Si c'est un tonton ou autre parent germain, recherche achevée
                                          If TestNiveau < ItemNiveau           
                                                i = ExitFor
                                          EndIf
                                    Next i
                                    ; On insère le nouveau frère cadet
                                    AddGadgetItem(#Gad_Tree, item + 1, "Root"+Str(n), 0, ItemNiveau)
                                    n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n"
                              EndIf
                        Case #ItemSuppr
                              If GetGadgetState(#Gad_Tree) <> -1
                                    ; On récup la sélection
                                    item = GetGadgetState(#Gad_Tree)
                                    ; On lui pete la gueule
                                    RemoveGadgetItem(#Gad_Tree, item)
                                    n + 1 ; ça ça sert pas à grand chose, juste pour écrire "Root n"
                              EndIf
                        Case #ItemProper
                              ; by Zorro
                              If GetGadgetState(#Gad_Tree) <> -1
                                    ; On récup la sélection
                                    item = GetGadgetState(#Gad_Tree)      
                                    debug item
                                    ItemNiveau = GetGadgetItemAttribute(#Gad_Tree,item, #PB_Tree_SubLevel)
                                    debug ItemNiveau
                                    Resultat$ = GetGadgetItemText(#Gad_Tree,item )
                                    nouveau_nom$=InputRequester("entrez un nom","entrez un nom","Toto")
                                    SetGadgetItemText(#Gad_Tree, item, nouveau_nom$)
                                    
                              EndIf
                        EndSelect
                  EndSelect
            ForEver
            

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TreeGadget() redéfinir le sous-niveau ?
MessagePosté: Sam 29/Oct/2016 9:19 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2135
Localisation: 50200 Coutances
Bonjour à toi aussi Zorro, je crois bien que le code que j'ai envoyé est du même auteur.

_________________
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TreeGadget() redéfinir le sous-niveau ?
MessagePosté: Sam 29/Oct/2016 11:58 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1978
ben pour une fois qu'on lui rend homage, il va pas raler :mrgreen: :mrgreen: :lol: :lol:

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TreeGadget() redéfinir le sous-niveau ?
MessagePosté: Lun 04/Fév/2019 9:04 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1569
Je remet ça up (2016) si jamais l'équipe cherche des petites finitions à faire au langage... 8)
https://www.purebasic.fr/french/viewtopic.php?p=187597#p187597

Pourquoi GetGadgetItemAttribute() n'a-t-il pas son opposé ? SetGadgetItemAttribute()

Même si la fonction ne redessine pas directement l'arbre, ce serait bien de pouvoir changer la valeur (#PB_Tree_SubLevel) directement.
Car c'est quand même un peu bidouille de devoir supprimer puis recréer un élément dans un Tree quand on veut simplement changer le niveau horizontal. (#PB_Tree_SubLevel). :?

Dans mon applis (en cours: treenote2 SQL), je créé un nouvel éléments, copie l'itemdata (qui me sert d'ID SQL), change le niveau, insère la nouvelle branche et supprime l'ancienne.
Avec un SetGadgetItemAttribute(), il suffirait de changer #PB_Tree_SubLevel puis redessiner tout l'arbre. :)

:?: :wink:

_________________
HP de 2012 - Intel i3-3220 @3.30 GHz, 2 coeurs, 4 threads - RAM 16 Go - Nvidia GT 620 1920x1080 DPI 100%
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: TreeGadget() redéfinir le sous-niveau ?
MessagePosté: Lun 04/Fév/2019 10:50 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4208
Localisation: Arras, France
Alors là, je te soutiens totalement. Je trouve ce gadget hyper mal fichu, même si fonctionnel. Je pense que Fred n'a pas le temps de rentrer dans son détail, il faudrait que quelqu'un qui aime les IU se penche là-dessus pour nous pondre quelque chose de plus pratique et de plus complet. Le plus gros souci, c'est le multiplateformes.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 7 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Google Adsense [Bot] et 4 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye