IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Création de composants: Problème lors du Destroy


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut Création de composants: Problème lors du Destroy
    Bonjour à tous,

    voila je suis novice en création de compo.

    je cherche à créer un petit compo non-visuel tout simple:

    Ce composant sert à mesurer la durée d'affichage d'une form.
    Je m'explique :
    Dans un gros projet, j'aimerai avoir des indications sur les parties les plus utilisées, je pensais donc créer un compo non visuel que l'on poserai sur la fiche pour laquelle on veut avoir des infos.

    Ce compo serait lié à un autre qui serait sur la form principale de l'appli.

    Lors du create de la sous fiche, le compo dans son Create enregistre le temps de l'appel.
    Lors du destroy de la sous fiche, le methode Destroy de mon compo sera également automatiquement appelé.

    Je pensais donc que dans le Destroy je pouvais faire un appel au compo de la form principale pour qu'il enregistre (fichier txt, bdd, peu importe) en lui transmettant le temps calculé.

    Le problème est que lorsque ma sous fiche se ferme j'ai un problème de libération de mémoire, j'ai cherché et pourtant je ne vois toujours pas.

    Assez parlé, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    unit FormTracker;
     
    interface
     
    uses Classes, Dialogs, SysUtils, Math, MainTracker;
     
    type
     
      TFormTracker = class(Tcomponent)
      private
        FMasterTracker: TMainTracker;
        FCreateTime: TDateTime;
        FDestroyTime: TDateTIme;
        FTimeElapsed: Double;
      protected
        property TimeElapsed: Double read FTimeElapsed write FTimeElapsed;
        property CreateTime: TDateTime read FCreateTime write FCreateTime;
        property DestroyTime: TDateTime read FDestroyTime write FDestroyTime;
      public
        constructor Create(AOwner : TComponent); override;
        destructor Destroy; override;
      published
        property MasterTracker : TMainTracker read FMasterTracker
          write FMasterTracker;
      end;
     
     
    implementation
     
    constructor TFormTracker.Create(AOwner : TComponent);
    begin
      inherited Create(AOWner);
      FCreateTime := Now;
    end;
     
    destructor TFormTracker.Destroy;
    begin
      FDestroyTime  := DestroyTime;
      FTimeElapsed  := FDestroyTime - FCreateTime;
      Self.MasterTracker.Track(Self.Owner.Name, ttFormActivity, Floor(Frac(FTimeElapsed)));
      inherited Destroy;
    end;
     
    end.
    Même si je commente l'intégralité du code de la methode Track, le crash se produit, il doit y avoir quelque chose d'évident que je n'ai pas vu.

    Pourriez vous me donner quelques pistes pour trouvez l'origine du problème ?

    Merci à vous.

    Fred

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Essaie sans le Destroy après le Inherited

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    destructor TFormTracker.Destroy;
    begin
      FDestroyTime  := DestroyTime;
      FTimeElapsed  := FDestroyTime - FCreateTime;
      Self.MasterTracker.Track(Self.Owner.Name, ttFormActivity, Floor(Frac(FTimeElapsed)));
      inherited;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut
    Salut et merci de ton aide, mais ca ne change rien au problème..

    D'ailleurs, faut-il préciser le Destroy après le inherited ?

    j'ai pris exemple sur les sources du timer de la vcl où il est codé de la même façon.

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Quand et comment définis-tu la propriété MasterTracker ?
    Si celle-ci est à Nil alors ...

    @+

  5. #5
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Je ne vois pas l'allocation de "FMasterTracker" dans ton code (qui devrait être logiquement dans le create visiblement)

    --> si il est à nil , ca plantera

    :edit: grilled
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut
    Merci à vous,

    en fait la propriété MasterTracker est un lien vers le compo de ma fiche principale, ce lien est fait en mode design.

    Devrais-je faire qqchose avec dans Create ?

    Je n'ai pas trouvé d'infos sur les propriétés d'un compo qui sont en fait "des liens" vers d'autres compos...

    je m'exprime surement mal... merci de me corriger

    Merci d'avance,

    Fred

  7. #7
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Si c'est un lien, il faut que "FMasterTracker" soit affectée alors.

    Mais pour tester:

    Supprime la ligne faisant appel (enfin, mise en commentaire) à MasterTracker dans la méthode Destroy
    Ca plante toujours ?

    ou bien, sans supprimer cette ligne
    test en "pas à pas jusqu'à cette ligne" pour voir si juste avant l'appel FMasterTracker est différent de Nil ...
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re

    Au niveau du Destroy, déjà tu dois t'assurer que FMasterTracker est assigné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    destructor TFormTracker.Destroy;
    begin
      FTimeElapsed := Now - FCreateTime;
      if Assigned(FMasterTracker) then
        MasterTracker.Track(Owner.Name, ttFormActivity, Floor(Frac(FTimeElapsed)));
     
      inherited;
    end;
    Ensuite pour parfaire l'écriture de ton composant, tu peux (tu dois) implémenter la méthode Notification dans la classe FormTracker.

    Ceci est nécessaire lorsque, en design time, tu supprimes le composant TMainTracker alors qu'il a été assigné à la propriété MasterTracker.
    Sinon bug au niveau de l'EDI.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TFormTracker.Notification(AComponent: TComponent;
      Operation: TOperation);
    begin
      if (Operation = opRemove) and (AComponent = FMasterTracker) then 
        FMasterTracker := nil;
     
      inherited Notification(AComponent, Operation);
    end;
    Voilou
    @+

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut
    en fait MasterTracker.Track est bien assigné.

    En mettant la ligne en commentaire ca ne plante pas.

    En rajoutant Assign, cela plante tjrs preuve que MasterTracker est bien initialisé.

    Merci claudius pour les infos supplémentaire que j'ai d'ores et déja implémenté

    Mais sinon le bug persiste toujours...

    Je précise que dans la methode Track, tout le code est commenté pour essayer d'isoler le problème..

  10. #10
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Qu'est-ce qu'elle fait exactement la méthode Track de TMainTracker ?

    @+

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Qu'est-ce qu'elle fait exactement la méthode Track de TMainTracker ?

    @+

    En fait, elle ne fait plus rien et le problème persiste toujours !

  12. #12
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par fred64 Voir le message
    En fait, elle ne fait plus rien ...
    Euh oui, mais encore
    Elle est censé faire quoi ? On peut voir le code.

    @+

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Euh oui, mais encore
    Elle est censé faire quoi ? On peut voir le code.

    @+
    Voila tout le code du composant central, celui qui est sur la form principal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    unit MainTracker;
     
    interface
     
    uses Classes, SysUtils, Ora, Dialogs;
     
    type
     
      TTrackingType = (ttAction, ttFormActivity);
     
      TMainTracker = class(Tcomponent)
      private
        FDbMainSession: TOraSession;
      public
        constructor Create(AOwner : TComponent); override;
        destructor Destroy; override;
        procedure Track(TrackCaption: String; TrackType: TTrackingType;
          TrackValue: Integer);
      published
        property DbMainSession : TOraSession read FDbMainSession write FDbMainSession;
      end;
     
     
    implementation
     
    constructor TMainTracker.Create(AOwner : TComponent);
    begin
      inherited Create(AOWner);
    end;
     
    destructor TMainTracker.Destroy;
    begin
      inherited Destroy;
    end;
     
    procedure TMainTracker.Track(TrackCaption: String; TrackType: TTrackingType;
      TrackValue: Integer);
    var
      Query: TOraQuery;
      TrackingType: Integer;
      NewId: Integer;
    begin
      if TrackType = ttAction then
        TrackingType := 0
      else
        TrackingType := 1;
     
      try
        Query := TOraQuery.Create(Self);
        Query.Session := DbMainSession;
        Query.SQL.Add('SELECT MAX(tracking_id) FROM tracking');
        Query.Open;
        if Query.Fields[0].AsString = '' then
          NewId := 0;
        NewId :=  Query.Fields[0].AsInteger + 1;
        Query.Close;
        Query.SQL.Clear;
        Query.SQL.Add('INSERT INTO tracking VALUES ');
        Query.SQL.Add('(' + IntToStr(NewId) + ', ');
        Query.SQL.Add('''' + TrackCaption + ''', ');
        Query.SQL.Add(IntToStr(TrackingType) + ', ');
        Query.SQL.Add(IntToStr(TrackValue) + ')');
        Query.Execute;
      finally
        Query.Free;
        Query := nil;
      end; 
    end;
    end.

  14. #14
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Déplace ton code dans BeforeDestruction : au moment du Destoy, le Owner.Name n'est plus forcément en bon état
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    type
       TFormTracker = class(Tcomponent)
      private
        FMasterTracker: TMainTracker;
        FCreateTime: TDateTime;
        FDestroyTime: TDateTIme;
        FTimeElapsed: Double;
      protected
        property TimeElapsed: Double read FTimeElapsed write FTimeElapsed;
        property CreateTime: TDateTime read FCreateTime write FCreateTime;
        property DestroyTime: TDateTime read FDestroyTime write FDestroyTime;
      public
        constructor Create(AOwner : TComponent); override;
        procedure BeforeDestruction; override;
      published
        property MasterTracker : TMainTracker read FMasterTracker
          write FMasterTracker;
      end;
     
    implementation
     
    constructor TFormTracker.Create(AOwner : TComponent);
    begin
      inherited Create(AOWner);
      FCreateTime := Now;
    end;
     
    procedure TFormTracker.BeforeDestruction;
    begin
      FDestroyTime  := DestroyTime;
      FTimeElapsed  := FDestroyTime - FCreateTime;
      Self.MasterTracker.Track(Self.Owner.Name, ttFormActivity, Floor(Frac(FTimeElapsed)));
      inherited;
    end;
     
    end.
    Pour le inherited : tu n'est pas obligé de mettre le nom de la méthode si celle-ci a les mêmes paramètres, et n'est pas une fonction (ne renvoie pas de valeur). Car alors Delphi sait qu'il doit passer les mêmes arguments que ceux passés à la méthode courante.
    Perso, je fais le choix de toujours le mettre, sauf quand je fais une méthode override, qui par définition a les mêmes paramètres. Cela inclut donc le destructeur, mais pas le constructeur (sauf pour les composants, qui ont un constructeur virtuel, ce qui est plutôt rare )

    Au passage : superbe style d'écriture. On ne voit pas ça tous les jours
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  15. #15
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Il y a peut-être une relation avec l'état de ton composant pendant la destruction de la fiche.
    Ton composant faisant partie de la fiche, il est marqué pour être automatiquement supprimé lors de la destruction de la fiche.

    Or, pendant le destroy de la fiche, tu fais justement appel à une méthode de ce compo.
    Je suis déjà tombé sur des cas similaires je me rappelle plus exactement le cas de figure, et dans ce cas il faut tester les états du composant (voir TComponent.Destroying et TCOmponent.ComponentState avec notamment csDestroying).

    Sinon, pourquoi ne pas faire appel a tes méthode de chronométres sur le Show/Close plutot que sur le Create/destroy si c'est juste pour un taux d'utilisation.
    Ce serait même plus logique car en cas de pré-allocation une fenêtre allouée n'est pas forcément utilisée...
    Mais évidemment ca complique un peu ton souhait j'imagine, car le destroy de ton composant était appelé tout seul... doit bien y avoir une alternative ?
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut
    Merci à vous de m'aider !

    @ sjrd:
    J'ai modifié avec BeforeDestruction mais cela ne change rien...

    Sinon pour le style, c'etait ironique !?

    @ tictactoe:

    tu as vu juste, l'avantage c'est que je n'ai qu'a prendre les centaines de fiches du projet à analyser et je pose mon compo formTracker dessus, j'initialise MasterTracker et le tour est joué, les données se collectent toutes seules, pas besoin de copier/coller des centaines de fois dans les divers OnShow.

    Le problème pourrait etre résolu plus rapidement c'est sûr, mais ma curiosité me pousse à aller plus loin. je ne vois pas de raison logique que cela plante.

    j'ai créé un projet de test comme ceci :
    MasterTracker sur la form1, un bouton qui cree et affiche form2.
    Formtracker sur la form2, lié à mastertracker.
    lorsque je ferme Form2, plantage.

    Je ne comprends pas d'ou cela vient.

    L'objet mastertracker existe bel et bien lors de l'appel à sa méthode.
    j'avais pensé au pb du Owner.name et j'avais remplacé les paramètres par des valeurs en dur simplissimes pour tenter d'isoler le problème...

    J'utilise MemChk pour tracker les fuites mémoires, mais je ne comprends pas grand chose au rapport généré que je joins ici en pièce jointe

    Merci de votre aide, je continue de chercher,


    Fred
    Fichiers attachés Fichiers attachés

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 112
    Points
    112
    Par défaut
    Bonjour à tous,

    j'ai trouvé la solution !

    Le problème venait du owner.name :

    En fait, lors du destroy les propriétés du owner ne sont pas accessibles.

    Dans le create je récupère donc la prop. name du owner dont je me sers dans le Destroy, et là ca marche !

    Il faudrait plonger dans les sources de la vcl pour comprendre d'ou cela provient, à moins qu'un expert puisse éclairer ma lanterne.

    En tout cas, merci à tous pour votre aide ! ce forum est une mine d'or.

    Fred

  18. #18
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par fred64 Voir le message
    Bonjour à tous,

    j'ai trouvé la solution !

    Le problème venait du owner.name :

    En fait, lors du destroy les propriétés du owner ne sont pas accessibles.
    Donc c'était tout de même bien ce que je disais... Mais c'est bizarre que ça ne passe pas non plus dans BeforeDestruction.
    Citation Envoyé par sjrd Voir le message
    Déplace ton code dans BeforeDestruction : au moment du Destoy, le Owner.Name n'est plus forcément en bon état
    Citation Envoyé par fred64 Voir le message
    Sinon pour le style, c'etait ironique !?
    Absolument pas, c'était parfaitement sincère.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] Création de composant - Problème à la création dans l'IDE
    Par Jon Shannow dans le forum Lazarus
    Réponses: 4
    Dernier message: 03/12/2012, 10h34
  2. Réponses: 11
    Dernier message: 05/08/2009, 12h30
  3. Réponses: 2
    Dernier message: 21/11/2005, 09h29
  4. Problème lors de l'installation d'un composant
    Par bm10 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 28/09/2005, 16h42
  5. Clé étrangère problème lors de la création de la table.
    Par snoopy69 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 18/08/2005, 08h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo