begin process at 2008 05 16 09:09:14
1 173 235 membres
76 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BESOIN DE SUGGESTIONS


Information sur la source

Catégorie :Optimisation du code Classé sous : Tutoriel, suggestions, code Niveau : Débutant Date de création : 29/04/2008 Date de mise à jour : 05/05/2008 11:30:20 Vu / téléchargé: 1 815 / 94

Note :
Aucune note

Commentaire sur cette source (34)
Ajouter un commentaire et/ou une note


Description

Bonjour, cette source fait suite a mon message sur le Forum
http://www.vbfrance.com/infomsg_BESOIN-SUGGESTIONS-CODE_1122798.aspx

le but est de montrer ici les différentes méthode employées pour répondre à l'énoncé qui suit :

Soit un Form1 qui affiche les détails d'un facture.
Un textbox CcTxtClient, affiche le nom et numéro du client.
lorsque l'on clique sur le bouton CcBtnClient, une Form2 s'affiche.

Form2 contient la liste des clients de la base de données.
si nous avions déjà lié notre facture a un client, l'entrée correspondant à celui-ci doit être par défaut séléctionnée dans la ListView. Il m'est possible de presser Ok ou Cancel depuis la Form2, afin de mettre fin a la selection de mon client.

Form1.CcTxtClient doit bien evidemment refleter ma selection.

Conclusion

Vous trouverez une maquette de départ dans le Zip joint. il ne comprend pas grand chose, juste le strict nécessaire.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

05 mai 2008 11:30:20 :
Ajout de ma vision de la chose
  • signaler à un administrateur
    Commentaire de Renfield le 29/04/2008 14:57:35 administrateur CS

    LIBRE_MAX a proposé :

    Form1:
    Private Sub CcBtnClient_Click()
        With Form2
            If .CcLst.ListItems.Count = 0 Then
                MsgBox "...non défini ou introuvable !", vbInformation, "..."
                Unload Form2
            Else
                .CcLst.ListItems(1).Selected = .CcLst.ListItems(1).EnsureVisible
                .Show vbModal
            End If
        End With
    End Sub

    -------------------------------------

    Form2:
    Private Sub CcBtnOk_Click()
        CcLst_DblClick
    End Sub

    Private Sub CcLst_DblClick()
    Dim cCode As Long
    Dim cNom As String
        On Error GoTo Handler
        With CcLst
            If .ListItems.Count <> 0 Then
                cCode = Mid$(.SelectedItem.Key, 2)
                cNom = .SelectedItem.Text
                
                Form1.CcTxtClient.Text = cCode & " - " & cNom
                Unload Me
            End If
        End With
    Exit Sub
    Handler:
        MsgBox Err.Description
    End Sub

    (Form_Load non recopié)

  • signaler à un administrateur
    Commentaire de MadM@tt le 29/04/2008 16:35:41

    Ahhhh le vilain Renfield, il poste une source juste pour avoir l'avis des autres. ça mériterait une punition héhé ;-)
    c'est quand meme une activité punie par la loi !

  • signaler à un administrateur
    Commentaire de Renfield le 29/04/2008 16:40:43 administrateur CS

    pas pour avoir votre avis...
    pour mettre du code a dispo en vue d'aprécier les differents points de vue sur ce probleme.

    l'idée, c'est de tout condenser, au final.

    disons, sur le fil ^^

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 29/04/2008 18:34:34

    Re-,
    A supposer que mon CcTxtClient.Text  contient déjà  le nom ou le code complet du client (ou du fournisseur),ma requete ne m' enverra qu' une seule ligne.
    Alors à moi de voir si j' affiche ma form2 ou pas.
    Deux possibilités:
    Soit j' affiche , ce qui permet à l' utilisateur de vérifier les infos (surtout si dans ma liste
    j' ai d' autres données outre le code et le nom (asresse, Tel/Fax etc...)
    Soit je n' affiche pas ma form2.Mais l' utilisateur risque de ne pas comprendre le pourquoi.

    Cette deuxième solution est préconusée quand il s' agit de remplir une grille Détails facture
    avec le code et nom article.Si le code est saisi en entier, on se contente vérifier son existante.
    Si ma requete me renvoie une ligne, je passe outre l' affichage de la liste et j' insère directement
    le produit  dans la grille.

    Si tu as remarqué dans l' exemple  que j' ai donné, je me sert de la même form, pour lister
    les clients ou les fourniseurs en vue d' une facture achat, ou vente ou avoir achat ou avoir vente
    ou edition situation client ou edition situation fournisseur ou reglement facture client ou règlement
    facture fournisseur et plein d' autre choses encore.Un simple tag me permet de savoir de quoi il S' agit.

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 29/04/2008 18:45:33

    Voici la sub qui me permet de remplir ma liste avec
    comme paramètre ma chaine expression sql et
    l' objet listview .


    Public Sub GET_TIERS(xQuery As String, xLV As ListView)
       xLV.ListItems.Clear
       Dim rsT As Recordset
       Set rsT = pDB.OpenRecordset(xQuery, dbOpenSnapshot)
       With rsT
        On Error Resume Next
        .MoveFirst
        .MoveLast
        If .BOF And .EOF Then GoTo EEXIT
         Dim i As Integer
         i = 0
         .MoveFirst
        Do While Not .EOF
           i = i + 1
           xLV.ListItems.Add i, , ![code]
           xLV.ListItems(i).SubItems(1) = ![nom]
         .MoveNext
        Loop
       End With
    EEXIT:
    rsT.Close
    Set rsT = Nothing

    End Sub


    A appeler dans Private Sub CcBtnClient_Click()
    On rècupère le contenu de la zone
    et on construit notre expression en tenant compte de ce contenu.


  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 30/04/2008 00:28:58

    Beh c' est encore moi...
    Quand je suis sur un truc, je m' y colle :-)
    D' un autre côté, s' il s' agit d' un condensé, autant faire les choses correctement.
    d' ou ma question:
    Qu e se passera t- il si suite à

    Form1.CcTxtClient.Text = cCode & " - " & cNom

    l' utilisateur reclique sur le CcBtnClient
    Si on s' en  tient à ce qu' on a prévu, c à d , récupèrer le contenu de la zone et faire une recherche (entière pour le code ou partielle pour le nom) , on ne trouvera jamais
    123 - DUPOND Antoine par exemple.On a bien 123 comme code et DUPOND Antoine comme nom mais pas la comlnaison des deux.
    123 - DUPOND Antoine n' étant pas numérique, il va chercher du coté des noms.Et c' est sûr qu' il ne trouvera pas.

    Que prévoir alors dans ce cas ?
    Ma suggestion:

    Form1.CcTxtClient.Text = cCode & " - " & cNom
    Form1.CcTxtClient.Tag = Form1.CcTxtClient.Text
    Lorsqu' on clique sur rechercher, on vérifie si .Text=.Tag
    ou non.
    Premier cas: rien n' a changé =>on ne fait rien
    Deuxième cas: l' utilisateur a reformuler sa recherche différement, on effectue la recherche.

    La suite est facilement imaginable...






  • signaler à un administrateur
    Commentaire de Renfield le 30/04/2008 06:22:11 administrateur CS

    on peut redécouper les données, pour en extraire l'ID
    j'airais aussi pu utiliser deux zones de texte, remarques

    par contre, si on recliques sur CcBtnClient, il faut afficher la liste de tous les clients, et séléctionner dans cette liste celui qui est lié a la facture.

  • signaler à un administrateur
    Commentaire de Brosske le 30/04/2008 09:33:48

    Je pense qu'il faut simplement abandonner le listview et utiliser un autre controle qui permets de placer le curseur là ou l'on veut :-)

  • signaler à un administrateur
    Commentaire de Renfield le 30/04/2008 09:38:19 administrateur CS

    ... ne peut on pas selectionner un item donné, dans un listview ?

  • signaler à un administrateur
    Commentaire de Brosske le 30/04/2008 09:57:15

    J'ai l'impression........

    Par exemple avec un listbox on utilise :
    listbox.listindex=x
    et hop, le client est sélectionné :-)

    Mais pour un listview je n'ai pas trouvé cette propriété.

  • signaler à un administrateur
    Commentaire de Renfield le 30/04/2008 10:12:43 administrateur CS

    propirété Selected des objets ListItem :

    ListView1.ListItems( n ).Selected = True

  • signaler à un administrateur
    Commentaire de drissou le 30/04/2008 10:17:44

    Bonjour
    j'arrive en retard..
    pour ma part je créerai (et je l'ai déjà fait) un procédure publique dans form2 qui récupérerai le numéro interne du client choisi
    du style

    load Form2
    form2.ProcTransmet NumClient
    form2.show vbmodal


    J'ai utilisé ceci pour qu'une feuille soit appelée de plusieurs feuilles différentes. J'ai donc introduit dans cette procédure une paramètre définissant la feuille appelante.
    En fonction de la feuille appelante, losrque je clique sur le bouton OK, je tranmets à la feuille appelant le nouveu numéro interne du client

    On aurait de la forme
    select case Appelant
        case "feuille1"
             form1.MiseAjour (NumClient)
        case else
    end select

    dans form1 j'ai donc une procédure publique qui met à jour les données voulues, en focntion de NumClient..

    J'espère avoir été assez clair..

    Driss

  • signaler à un administrateur
    Commentaire de Renfield le 30/04/2008 10:23:30 administrateur CS

    l'idée est interessante.
    on apercoit là l'une des problématique essentielle : la réutilisabilité, et l'intégration de/dans de nouvelles forms

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 30/04/2008 10:41:57

    Bonjour,
    en restant sur le concept de la selection dans une listview,
    on peut tout imaginer.
    -Utilisation de deux Zone une pour code et l' autre pour le nom.
    Faisable mais très couteuse en code.Car il faudra toujours mettre
    à jour un control par rapport à l' autre, et faire la recherche à partir
    de la zone qui vient être modifié.
    -Le découpage est faisable avec Split sur " - ", et un test sur la première partie.

    -Pour la recheche, dans mes applics j' utilise trois sorte de procèdures pour ça.

    //Recherche dans la première colonne .Généralement l' ID.
    Public Function RECHERCHER(xValeur As Variant, xListView As ListView) As Boolean
         Dim i As Integer
         Dim iC As Integer
       With xListView
         iC = .ListItems.Count
         If iC = 0 Then Exit Function
      
           For i = 1 To iC
              If .ListItems(i).Text = xValeur Then
                 .ListItems(i).Selected = .ListItems(i).EnsureVisible
                 RECHERCHER = True
                 Exit For
              End If
           Next i
      
       End With
    End Function

    //Recherche dans un SubItem .Généralement le NOM en entier
    Public Function RECHERCHER_(xValeur As Variant, xListView As ListView, xListsub As Integer) As Boolean
         Dim i As Integer
         Dim iC As Integer
       With xListView
         iC = .ListItems.Count
         If iC = 0 Then Exit Function
      
           For i = 1 To iC
              If .ListItems(i).ListSubItems(xListsub).Text = xValeur Then
                 .ListItems(i).Selected = .ListItems(i).EnsureVisible
                 RECHERCHER_ = True
                 Exit For
              End If
           Next i
      
       End With
    End Function

    //Recherche Partielle dansdans un SubItem .
    Public Function RECHERCHER_PART(xValeur As Variant, xListView As ListView, xListsub As Integer) As Boolean
         Dim i As Integer
         Dim iC As Integer
          Dim LenV As Integer
      With xListView
         iC = .ListItems.Count
         If iC = 0 Then Exit Function
         LenV = Len(xValeur)
           For i = 1 To iC
              If Left$(.ListItems(i).ListSubItems(xListsub).Text, LenV) = xValeur Then
                 .ListItems(i).Selected = .ListItems(i).EnsureVisible
                 RECHERCHER_PART = True
                 Exit For
              End If
           Next i
      
       End With
    End Function

    Ainsi après avoir remplit ma listview je lance une recherche à partir du contenu de ma
    zone de text.

    Pour listr tous les Clients, je le fait mais uniquement si la zone de text est vide.

    Pour l' ID, comme je l' ai dit précèdement, j' utilise un deuxi_me TextBox en arrière plan (visible=False).
    Ainsi quand je fais
    Form1.CcTxtClient.Text = cCode & " - " & cNom
    Je fais aussi
    Form1.TxtIdClient.Text = cCode
    Ainsi sans devoir décomposer ma chaine, je peux rattacher la facture au client.

    et p'ui c tout :-)

    A+


  • signaler à un administrateur
    Commentaire de Renfield le 30/04/2008 10:45:21 administrateur CS

    hum!
    Function FindItem(sz As String, [Where], [Index], [fPartial]) As ListItem
        Membre de MSComctlLib.ListView
        Recherche un élément dans la liste et renvoie une référence à cet élément.


    pourquoi utiliser un textbox, si masqué... une varaibel publique serait surement plus appropriée, non ?

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 30/04/2008 10:50:02

    sûrement, un label est plus approprié.
    Quand au FindItem, beh je prèfère des routines
    personnalisée.De plus FindItem m' as fait tellement souffrir à mes débuts que je ne l' ai plus "revu" depuis :-)

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 30/04/2008 10:52:54

    un label et pas une variable,si je lie mes controls directement à la table.

  • signaler à un administrateur
    Commentaire de Brosske le 30/04/2008 10:59:20

    ok :-)

    alors pourquoi ne pas mettre dans le form2_load :

    if le_nom_a_ajouter = form1.nom_du_client.text then ListView1.ListItems( listview1.listitems.count-1 ).Selected = True


    (je n'ai pas vérifié le syntaxe - dslé - je voulais juste montrer le principe)

  • signaler à un administrateur
    Commentaire de Brosske le 30/04/2008 11:00:02

    oups - donc ce code est a mettre juste avant le ors.movenext

  • signaler à un administrateur
    Commentaire de Renfield le 30/04/2008 11:00:28 administrateur CS

    ok, je voyais pas où tu souhaitais en vnir, précision utile

  • signaler à un administrateur
    Commentaire de Renfield le 30/04/2008 11:13:00 administrateur CS

    Brosske, ton code fonctionne, ok...

    je fais le pont, je ne répondrai a cette problématique que Lundi

  • signaler à un administrateur
    Commentaire de pluplu le 30/04/2008 22:06:02

    Bonjour Renfield,
    Je prend la cogitation en cours de route, perso j'utilise rarement le contrôle listview je préfère de loin le datagrid ou quelque chose de similaire comme le SCGrid http://www.scgrid.com/ sûrement plus souple que tous les autres. Le problème lorsqu'on utilise une form séparée pour rechercher un client c'est pour que se soit synchro avec la feuille appelante. J'ai retrouvé un exemple qui correspond à ce que tu veux faire, Dans la form de saisie de facture, j'ai un comboboxe avec la liste des clients par nom, ce qui convient pour quelques clients, mais si la liste s'allonge plus de 50 cela n'est pas top, alors avec un double clic sur le comboboxe, on ouvre une seconde fenêtre qui est composée d'une grid avec les informations complètes de tous les clients, au bas de cette grid j'ai deux texte boxes un pour le No de client et l'autre pour le nom, dès que je rentre dans l'un de ces texte boxes un début d'information automatiquement ma grid est rafraîchit par une requête qui pointe sur les éléments commençant par l'information que j'ai rentré. Un petit exemple, lorsque ma fenêtre apparaît en premier ma grid contient l'ensemble des clients, je rentre dans ma textboxe un début de nom "Pa" et ma grid se remplis de tout ce qui commence par pa, Paul, Paulissen, Paivard, Packard, etc si je continue et que complète par "pauli" la grid se rafraîchit et sort cette fois Paulic, Paulissen etc... c'est très rapide pour retrouver le nom que l'on cherche. Une fois le client choisit je transfert les infos sur ma première form et voilà. Je vais profiter de ce long week_end pour nettoyer le code et te l'envoyer.
    En attendant Bon premier mai

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 01/05/2008 16:37:53

    Bonjour,
    Il m' est arrivé d' utiliser ta technique PLUPLU, avec une variante cependant.
    Je ne rafraichissais pas ma liste à chaque frappe mais je me contentais
    de faire un appel à ma fonction RECHERCHER_PART selon que je suis sur la
    zone code ou la zone nom.Sitôt l' occurence trouvée je plaçais ma ligne au top
    de la liste.
    Autre façon de faire aussi, c' est d' utiliser une ListBox, et selon que le focus est
    sur la zone code ou la zone nom la remplir ou avec les Codes ou les Noms.
    Et dans l' evenement Change des deux zones, utiliser l' Api SendMessage qui permettera
    de trouver la première occurence.

    On voit bien ici que les techniques sont multiples, et je crois que le but recherché par
    Renfield est justement d' en faire la synthèse.

    A+

    @DRISSOU.
    Pas la peine d' avoir recours à une procèdure pour avoir la feuille appelante,
    il suffit de palcer son Nom dans le Tag de ta form2 au chargement de celle-ci.
    Faire ensuite:
    select case Me.Tag
        case "feuille1"
             form1.MiseAjour (NumClient)
        case else
    end select


  • signaler à un administrateur
    Commentaire de asimengo le 02/05/2008 02:12:16

    Je prends le train en marche, j'ai dû copier/coller le code du premier commentaire de Renf pour essayer de comprendre la problématique.

    Ci-dessous ma proposition pour cette problématique.

    FORM1
    -----

    Option Explicit
    Private WithEvents Frm As Form2
    Private lID As Long

    Private Sub CcTxtClient_Validate(Cancel As Boolean)
        lID = 0
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
        Set Frm = Nothing
    End Sub

    Private Sub Frm_Annuler()
        CcTxtClient = vbNullString
    End Sub

    Private Sub Frm_Valider(ByVal TbValeurs As Variant)
        lID = TbValeurs(0)
        CcTxtClient = lID & " - " & TbValeurs(1)
    End Sub


    Private Sub CcBtnClient_Click()
        Set Frm = New Form2
        With Frm
            .Init App.Path & "\Bd1.mdb", "SELECT * From `Clients` ORDER BY `Nom`", lID, CcTxtClient.Text
            .Show vbModal
        End With
    End Sub

    FORM2
    -----

    Option Explicit
    Public Event Valider(ByVal TbValeurs As Variant)
    Public Event Annuler()
    Private m_ID As Long, m_CheminBD As String, m_CmdText As String

    Public Function Init(ByVal sCheminBD As String, ByVal sCmdText As String, ByVal lID As Long, Optional sValeur As String) As Boolean
        m_ID = lID
        m_CheminBD = sCheminBD
        m_CmdText = sCmdText
    End Function

    Private Sub CcBtnOk_Click()
        CcLst_DblClick
    End Sub

    Private Sub CcLst_DblClick()
    On Error GoTo Handler
    Dim i As Long, sValeurs As String

        With CcLst
            sValeurs = Mid(.SelectedItem.Key, 2) & Chr(0) & .SelectedItem.Text
            For i = 2 To .ColumnHeaders.Count
                sValeurs = sValeurs & Chr(0) & .SelectedItem.ListSubItems(i - 1)
            Next i
        End With
        RaiseEvent Valider(Split(sValeurs, Chr(0)))
        Unload Me
        Exit Sub
        
    Handler:
        MsgBox Err.Description
    End Sub

    Private Sub CcBtnCancel_Click()
        RaiseEvent Annuler
        Unload Me
    End Sub

    Private Sub Form_Load()
    Dim oDb As Database
    Dim oRs As Recordset
    Dim lIndex As Long, lID As Long, i As Long

        Set oDb = OpenDatabase(m_CheminBD)
        Set oRs = oDb.OpenRecordset(m_CmdText)
        lIndex = 1
        Do Until oRs.EOF
            lID = oRs.Fields(0).Value
            With CcLst.ListItems.Add(Key:="#" & lID)
                .Text = oRs.Fields(1).Value
                For i = 3 To oRs.Fields.Count
                    .SubItems(i - 2) = oRs.Fields(i - 1).Value
                Next i
            End With
            If lID <> m_ID Then
                lIndex = lIndex + 1
            Else
                CcLst.ListItems(lIndex).Selected = True
            End If
            oRs.MoveNext
        Loop
        oRs.Close
        oDb.Close
    End Sub

    Je préfère des objets independants avec propriétés et méthodes et évènements en laissant le soin à l'appelant de jouer avec les évènements.

    A+

  • signaler à un administrateur
    Commentaire de Renfield le 05/05/2008 10:41:11 administrateur CS

    on touche un concept interressant, asimengo, des "objets indépendants"...

  • signaler à un administrateur
    Commentaire de Renfield le 05/05/2008 13:14:19 administrateur CS

    article publié ici:
    http://blogs.codes-sources.com/renfield/archive/2008/05/05/vb6-bo-tes-de-dialogue-communication-inter-form.aspx

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 05/05/2008 14:34:42

    Salut,
    Pas si indépendant que ça !
    Corrigez-moi si j' ai mal compris mais Lauch ne me renvoie qu' une Boolean.
    Ou est donc passer l' Id et surtout vers quelle control il va être dirrigé ?

    If Launch Then
           '# Pour cette Form, on renvoie l'ID
           [...]
       End If

    Tout la question est dans [...] !

    A vouloir contourner le Select Case on retombe dans pire !

    Toutefois, je suis d' accord sur le fait que seul l' iD compte.
    C ' est après qu' on s'occupera du reste, lorsque mon control dédié
    à le recevoir change.

    txtId_Change ==> Rechercher le reste.



  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 05/05/2008 14:41:48

    Pour le Change, je parlais de txtId (mon control masqué) et pas de CcTxtClient

  • signaler à un administrateur
    Commentaire de Renfield le 05/05/2008 14:44:14 administrateur CS

    voir la source, elle est commentée.

    on renvoie un Boolean qui indique uniquement si la Form a été validée ou non (ou Annulée, quoi).
    le parametre ClientID est passé par référence. on le modifie directement.

    comme énoncé dans l'article on pourrait utiliser une propriété publique de la Form
    genre:

    Public property get ClientID As Long

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 05/05/2008 14:56:42

    beh je savais bien que j' ai loupé quelque chose :-)
    Inconsciement peut être...du fait que je tenais beaucoup à ma méthode.
    Maintenant que j' ai tout compris, ou presque, j' essayerais de mettre en application cette nouvelle approche..et voir.

    A+

  • signaler à un administrateur
    Commentaire de Renfield le 05/05/2008 15:03:26 administrateur CS

    tout a fait, je ne fais qu'exposer, comme vous avez pu le faire, ma vision de la chose.

  • signaler à un administrateur
    Commentaire de LIBRE_MAX le 05/05/2008 15:11:30

    Merci en tout cas f' avoir pris la peine de le faire.
    C' est vraiment enrichissant, et ça permet de rappeler rout à chacun qu' on peut toujours faire autrement et surtout mieux.
    C' est d' ailleurs ma devise.

    A+
    Bonne continuation.

  • signaler à un administrateur
    Commentaire de drissou le 07/05/2008 14:30:01

    LIBRE_MAX:
    Effectivement je ne pense pas assez à ce tag..

    Je vais aller consulter l'article de Renfield..

  • signaler à un administrateur
    Commentaire de asimengo le 07/05/2008 18:53:36

    Je viens de voir ta maj renf, mais je prefere encore des objets plus independants, c'est effectivement pour mettre en evidence cet interaction que j'ai publié la source http://www.vbfrance.com/codes/CONTROLE-PERMETTANT-SELECTION-PARTIR-LISTE-PLUS-INTERESSANT-COMBOBOX_37540.aspx

    Bien que j'ai pas fait de mise a jour en ligne, j'utilise en gros cet objet pour tous mes contrôles de liste et je prefere un datagrid rattache a un recordset local qu'un listview, je vais d'aileurs regarder à quoi ressemble le scgrid de PLUPLU

Ajouter un commentaire

Appels d'offres

Pub



Snippets en rapport

CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS