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 :

Comment charger un TFrame depuis une dll ?


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 50
    Points : 25
    Points
    25
    Par défaut Comment charger un TFrame depuis une dll ?
    Bonjour,

    Je me casse les dents sur ce problème depuis quelque jours déjà.
    Comment puis-je charger une TFrame depuis une dll?

    Mon but est le suivant :
    je charge la dll qui me sert de plugin, et j'affiche la frame chargée, dans mon appli.
    Malheureusement je n'y arrive pas.

    si quelqu'un connait la solution.

    Merci d'avance.

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Ouip ben tupeux pas mieux tomber

    http://sjrd.developpez.com/delphi/de...s/compoplugin/

    C'est tout chaud, tout juste sorti du four

    Comme ca tu nous dira si c comprehensible DD

    Perso je reste dispo pour d'eventuelles question ... je suis en plei ndedans (generalisation du concepte des interfaces)

  3. #3
    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 : 35
    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
    Oui et n'oublie pas de nous dire quelle méthode tu préfères

  4. #4
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Je lui ai déjà donné le lien vers ce tutoriel... à partir d'un autre forum !

    Po de bol pour toi sjrd, il trouve ta méthode plutôt trop compliquée !

  5. #5
    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 : 35
    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 Bestiol
    Po de bol pour toi sjrd, il trouve ta méthode plutôt trop compliquée !

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    je vois que tu es partout bestiol

    Côté méthode, je préfère la méthode 2, je dois l'avouer
    mais à l'heure actuelle, elle est trop compliquée pour moi
    d'après ce qu ej'ai pu lire, le must est de faire des interfaces, comme tu l'indique, mais je n'ai aucune connaissance à ce sujet.

    Aurais-tu des tuto\guides pour me permettre de commencer mon études et la compréhension de la programmation des interfaces?

    Merci pour vos réponses.

  7. #7
    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 : 35
    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
    Ben ce tuto inclut un mini-tuto sur les interfaces, et tout le code y est expliqué : tu devrais pouvoir t'y retrouver.

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Aurais-tu des tuto\guides pour me permettre de commencer mon études et la compréhension de la programmation des interfaces?
    Ha bon ? ya pas de tutos sur les interfaces sur le lien donné ?!?

    http://www.eyrolles.com/Chapitres/9782212111439/19.pdf

    Regarde deja ca : C'est la gestion de Plugin sur plusieurs formes via DLL
    Porte plus d'attentions sur la derniere partie, celle ou ils commencent a introduire les Interfaces.

    Cet exemple ne parle pas de l'exportation d'objets graphiques mais donne de bonnes notions sur les interfaces.

    Ensuite relis bien le tuto de SJRD qui te sera peut etre plus clair ... et sinon on reprendra sur un thread specifique la definition et l'implementation d'interfaces.
    Mais comme ca ... ca va pas etre coton d'expliquer les interfaces en partant de rien

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    Je me suis penché un peu plus hier sori sur le problème : J'ai tout simplement commencé à relire des doc fournis dans l'aide de delphi7.
    j'ai commencé à entrapercevoir les possibilités des interfaces, qui à mon stage de sont qu'une goutte dans l'océan que cela représente...

    J'ai sous les yeux la doc de SJRD que je viens d'imprimer.
    Je commence à comprendre le fonctionnement.
    mais il va me falloir un peu de pratique.
    je redoute juste d'obtenir le même genre de messages qu'à l'heure actuelle "ne peut assigner tfont à tfont" que j'ai via mes tests avec ma tform récupérée de la dll.

    Pour en revenir aux interfaces, il est vrai que j'avais commencé à l'époque par regarder celles des IOTA, et sans connaissances, je me suis effrayé moi même.
    L'apprentissage ne se fait-il pas par le repoussement de ses peurs?

    en tout cas merci, je te tiendrais au courant de mes avancées, sur un nouveau thread surement

    Merci beaucoup

  10. #10
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Les IOTA, laisse tomber pour le moment .. ce sont les Interface proposees par delphi pour l'ecriture d'expert.

    Pour les messages d'erreur : cela vien du fait qu'il faut :
    Parent := Nil;
    ParentWindows := qque chose
    ParentFont := False;

    Ensuite, si tu as sous les yeux le Tuto de SJRD, je me permet uneprecision : Il utilise la gestion par paquet et non par Dll.
    Par paquet, on peux transmettre a l'executable un objet (compo il me semble) ce que tu ne peux pas faire dans le cas des Dlls.

    Dans ce cas, il faut que tous tes appels a l'objet exporté passe par des methodes de l'interface.

    Essaye un peu tout seul et je t'enverrais les bibliotheques generiques d'exportation de compo ( le temps que je les finissent )
    Le mieux est que tu reflechisse un peu sur le probleme car mes unites ne sont pas completes et il faudra y mettre la main de dedans de temsp e ntemps ;p

  11. #11
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Citation Envoyé par Clorish
    Ensuite, si tu as sous les yeux le Tuto de SJRD, je me permet uneprecision : Il utilise la gestion par paquet et non par Dll.
    Décidemment, ce problème est une mine

    Perso, ma méthode utilise des DLL et est très simple à mettre en place... 8)

    Je ne crois pas que sjrd l'ai mise sur son lien...

    Je peux te la décrire plus en détail si tu veux...

  12. #12
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par Clorish
    Les IOTA, laisse tomber pour le moment .. ce sont les Interface proposees par delphi pour l'ecriture d'expert.
    J'y ai travaillé desus il y a quelques mois, pou l'écriture d'un composant, qui devait me parcourir tous les composants de mes fiches delphi.
    Or pour finaliser mon composant il me manquait la fonction suivante : connaitre la liste des forms présente dans le projet (comme fait delphi quand on click sur le bouton "liste des fiches"), pour les ouvrir automatiqement, et les scanner.
    n'y étant pas arrivé, je devais ouvrir manuellement chaque fiche pour pallier à ce probleme.

    mais il s'agit là d'un autre problème.


    Je testerais la solution pour mon probleme de tfont ce soir.
    j'ai perdu assez de temps comme ca à mon travail, et je dois passer à auter chosE. je chercherais donc à mes heures perdues. mais je laisse pas tomber



    @Pedro204
    je suis toujours preneur.
    je ne promet pas de tout comprendre d'unc oup si c'est trsè complqué, mais je vais passer toute la semaine prochaine à travailler sur le sujet.


    Merci à vous. Pour une première question sur developpez.com je suis agréablement surpris et content d'avoir trouvé une telle aide dans cete communauté.

  13. #13
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Nan c'est super simple

    Tu crée un projet DLL qui contient un fichier .dpr dans lequel tu as une function qui crée et appelle ta frame t qui la renvoie en resultat du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function ExecuteTool(AppHandle:HWND):TFrame;
    AppHandle te permet de récupérer le TApplication courant...
    Note: Ton Frame doit avoir au moins ses propriété ParentFont, ParentColor à false...

    Ensuite, tu crées une appli normale dans laquelle tu mets un TPanel (ou un autre conteneur) en AutoSize...
    Tu lances ta fonctions depuis la DLL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      t:=ExecuteTool(Application.Handle);
      t.Parent:=LeConteneurDontJeParlaitAuparavant;
    Voila... C'est tout je crois que je n'ai rien oublié...

  14. #14
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    j'y suis presque, je le sens....
    ta nouvelle méthode marche (presque) :


    Voici le code de la dll, qui doit exporter la tframe :
    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
     
    library Project1;
    uses
      SysUtils,Classes,Windows,Forms,Controls,
      Unit1 in 'unit1.pas' {Frame1:TFrame};
     
    {$R *.res}
     
    Function ExecuteTool(AppHandle : HWnd) : TFrame;
    Begin
      Result := TFrame1.CreateParented(AppHandle);
    End;
     
    Exports ExecuteTool;
     
    begin
    end.
    Voici le code de la tframe :
    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
     
    unit unit1;
    interface
    uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,stdctrls;
     
    type
      tframe1 = class(tframe)
        button1 : tbutton;
        procedure button1click(sender:tobject);
      private
      public
      end;
     
    implementation
    {$R *.dfm}
     
    procedure tframe1.button1click(sender:tobject);
    begin
      showmessage('test reussi');
    end;
     
    end.
    rien d'important dans cette fiche


    voici le code de l'appli qui est censé recevoir la fiche :
    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
     
    unit unitmain;
     
    interface
    uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,stdctrls, extctrls;
     
    type
      tform1=class(tform)
        panel1 : tpanel;
        button1:tbutton;
        procedure button1click(sender:tobject);
      private
      public
      end;
     
    implementation
     
    {$R *.dfm}
     
    function ExecuteTool(AppHandle : HWnd):TFrame; external 'Project1.dll';
     
    procedure tform1.button1click(sender:tobject);
    var
      F : TFrame;
    begin
      F : ExecuteTool(Application.Handle);
      F.Parent := Panel1;
    end;

    quand je click sur le boutton button1, il est cesné me charger la frame dans panel1.
    j'obtiens le message d'erreur suivant :
    "classe d'exception EInvalidOperation avec le message 'le contrôle 'Frame1' n'a pas de fenêtre parente'"

    si tu vois d'ou ca peut venir.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,

    Dans UnitMain, procedure ButtonClick, essaies ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not HandleAllocated then Exit;

  16. #16
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut!!
    C'est juste que tu oublies stdcall dans tes déclarations:

    Code de la DLL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function ExecuteTool(AppHandle : HWnd) : TFrame;stdcall;
    Code de l'application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function ExecuteTool(AppHandle : HWnd):TFrame;stdcall; external 'Project1.dll';
    Et la ça devrait mieux marcher

    Bonne chance

  17. #17
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut

    Petite note: Si ça ne marche toujours pas, remplace CreéteParented dans la DLL par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Application.Handle:=AppHandle;
      Result:=TFrame1.Create(Application);
    Bonne chance et bienvenue dans ce sac de noeuds

  18. #18
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    j'ai une solution, simple, qui marche, mais moins propre que vos solutions prcédentes :


    Code de la DLL :
    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
     
    library Project1;
     
    uses
      SysUtils,
      Classes,Forms,
      Unit2 in 'Unit2.pas' {Frame2: TFrame};
     
    {$R *.res}
     
    procedure CreateFrame(aOwner:TComponent;var Frame:TFrame); export;
    begin
      Frame := TFrame2.Create(aOwner);
    end;
     
    exports CreateFrame;
     
    begin
    end.
    Code de la TFrame (pour exemple) :
    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
     
    unit Unit2;
     
    interface
     
    uses 
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
     
    type
      TFrame2 = class(TFrame)
        GroupBox1: TGroupBox;
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    implementation
     
    {$R *.dfm}
     
    end.

    Voici le code de l'appli qui charge la dll :

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
     
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure CreateFrame(aOwner:TComponent;var Frame:TFrame); external 'Project1.dll';
     
    procedure TForm1.FormCreate(Sender: TObject);
    var f     : TFrame;
    begin
      CreateFrame(self,f);
      f.ParentFont := False;
      f.Parent := self;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    var c     : TControl;
    begin
      while ControlCount > 0 do
      begin
        c := Controls[0];
        c.Parent := nil;
        c.Free;
      end;
    end;
     
    end.

    J'espère que cela vous sera utile.

    Merci pour votre aide

  19. #19
    Nouveau membre du Club
    Inscrit en
    Novembre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    j'ai une solution, simple, qui marche, mais moins propre que vos solutions prcédentes :


    Code de la DLL :
    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
     
    library Project1;
     
    uses
      SysUtils,
      Classes,Forms,
      Unit2 in 'Unit2.pas' {Frame2: TFrame};
     
    {$R *.res}
     
    procedure CreateFrame(aOwner:TComponent;var Frame:TFrame); export;
    begin
      Frame := TFrame2.Create(aOwner);
    end;
     
    exports CreateFrame;
     
    begin
    end.
    Code de la TFrame (pour exemple) :
    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
     
    unit Unit2;
     
    interface
     
    uses 
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
     
    type
      TFrame2 = class(TFrame)
        GroupBox1: TGroupBox;
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    implementation
     
    {$R *.dfm}
     
    end.

    Voici le code de l'appli qui charge la dll :

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
     
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure CreateFrame(aOwner:TComponent;var Frame:TFrame); external 'Project1.dll';
     
    procedure TForm1.FormCreate(Sender: TObject);
    var f     : TFrame;
    begin
      CreateFrame(self,f);
      f.ParentFont := False;
      f.Parent := self;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    var c     : TControl;
    begin
      while ControlCount > 0 do
      begin
        c := Controls[0];
        c.Parent := nil;
        c.Free;
      end;
    end;
     
    end.

    J'espère que cela vous sera utile.

    Merci pour votre aide

  20. #20
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    pour t'éviter du code inutile, met ParentFont et ParentColor à false directement sur le TFrame de la DLL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/12/2010, 21h00
  2. Charger un xaml avec eventHandler depuis une dll
    Par Tod_sd dans le forum Windows Presentation Foundation
    Réponses: 16
    Dernier message: 21/04/2009, 16h46
  3. Comment charger un fichier depuis une Servlet
    Par g25452 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 22/08/2008, 14h50
  4. Réponses: 9
    Dernier message: 03/12/2004, 12h35
  5. Comment basculer le focus depuis une autre form ?
    Par altahir007 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 03/09/2003, 16h54

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