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

Lazarus Pascal Discussion :

[2.2.4] Besoin d'explication et d'aide à propos du TComponent et de sa destruction


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut [2.2.4] Besoin d'explication et d'aide à propos du TComponent et de sa destruction
    Bonjour,

    dans l'aide à propos de cette chose, je peux lire
    Citation Envoyé par aide Lazarus
    TComponent introduces a form of automatic memory management: When a component is destroyed, all its child components will be destroyed first.
    Bien.

    En plus on peut le demander gentiment :
    MonComposant.DestroyComponents;
    Citation Envoyé par aide Lazarus
    Destroy child components.
    Et moi pour assurer le coup, j'utilise les deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      MonComposant.DestroyComponents;
      MonComposant.Free;
    Mais quand je recrée MonComposant, je me fais envoyer sur les roses parce que les sous-composants existent déjà et ça me parle de duplicate name et moi je ne comprends pas que je puisse avoir quelque part en mémoire le nom de sous-composants dont le parent a été détruit et ses enfants avec lui.

    Ou alors c'est que le boulot est mal fait ?, ce que je pense de + en +, regardez, dans une boucle, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    showmessage('thisobject + i + cc '+thisobject.Name +' '+inttostr(i)+' '+inttostr(ComponentCount));
    thisobject.DestroyComponents;
    Application.ProcessMessages;
    showmessage('thisobject + i + cc '+thisobject.Name +' '+inttostr(i)+' '+inttostr(ComponentCount));
    et comme il n'y a qu'un composant, i est à 0, et les components, euh, mais je vous laisse regarder les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    retour de SM : 'thisobject i + cc pnlhosting0 0 40'
    thisobject.DestroyComponents;
    Application.ProcessMessages;
    retour de SM : 'thisobject i + cc pnlhosting0 0 40' <-- et toujours 40 !
    40 c'est 12 sub-composants par panel + les 3 panels eux-mêmes + 1 sur-panel pour emballer tout ça, soit 12x3 + 3 + 1 = 40
    Et donc si 40 est renvoyé, c'est ça signifie que rien n'est détruit !

    J'ai même essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (pnlCentre.Controls[i] as TPanelex).DestroyComponents;
    Application.ProcessMessages;
    retour de showmessage : 'thisobject i + cc pnlhosting0 0 40' <-- et toujours 40 !
    Alors leur DestroyComponents, je ris...
    Mais jaune puisqu'après je me prends une erreur "A component named "pnlinfos0" already exists" et le programme se vautre...

    Et aussi, on ne nous dit pas dans l'aide certains comportements qui se rencontrent IRL, par exemple ce TPanel gris argent posé en mode design en bas à droite d'une fiche
    Nom : panneau_silver_à_tort.png
Affichages : 208
Taille : 988 octets
    et dont je ne sais pas d'où il tire cette couleur puisqu'il est configuré avec Color = clDefaut (= gris clair, pas celui qu'on voit là), BevelColor = clDefault, ParentColor = False et ParentBackGround = False.

    Alors ça, plus le coup de la hauteur pas ou mal prise en compte (vu il y a deux ou trois jours) plus les destructions pas faites, je trouve que c'est normal que je passe des semaines pour faire des choses qui devraient être réglées en deux jours...

    Jusqu'à ce que j'abandonne, parce que si je ne peux pas supprimer les objets créés dynamiquement, mon prog est bon pour la poubelle.
    Une idée ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    On peut supposer que ton objet est sur une fiche, donc ComponentCount est à comprendre comme Form1.ComponentCount et non thisobject.ComponentCount

    Maintenant il ne faut pas oublier que ComponentCount énumère les composants possédés (visuels ou non-visuels) et pour se faire il faudra créer les sous-composants en spécifiant le bon propriétaire SubObject := TSubObject.Create(thisobject).

    A noter enfin que renseigner Name n'est pas obligatoire et qu'il n'y a pas de doublon sur des Name vides. De plus nommer des composants créés à l'exécution est rarement utile à moins de vouloir "bricoler" (et je pèse mes mots) avec des FindComponent.

    Citation Envoyé par Jipété Voir le message
    Et moi pour assurer le coup, j'utilise les deux
    C'est parfaitement inutile. Tu utiliserais DestroyComponents si tu voulais repartir sur un composant vierge de tout sous-composant uniquement.

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    Salut

    Pour la destruction des descendants des TComponent, cela dépend déjà de leur création...
    À la création il s'autoenregistre dans la liste des components se trouvant dans le TForm.
    De plus, si vous utilisez des composants tiers il arrive que ceux-ci n'aient pas récrit l'évènement Destroy et de ce fait les actions qui en découlent ne se font plus.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Salut les copains,

    Citation Envoyé par Andnotor Voir le message
    Tu utiliserais DestroyComponents si tu voulais repartir sur un composant vierge de tout sous-composant uniquement.
    C'est l'idée.

    En gros (toujours avec mon histoire de playlist), je voudrais, à l'intérieur d'un cadre composé de 4 panels (alignés alTop pour les boutons de fonctionnement du son, alLeft pour le choix des pistes et d'autres options, alRight pour jouer avec les fichiers de playlist proprement dit et alBottom pour boucler le tour), je voudrais veux au milieu un panneau alClient qui va contenir autant de panel alTop que de morceaux de musique et qui vont s'adapter après des calculs méticuleux (dont on a récemment vu que pour les TButtons c'était pas gagné) afin de joliment présenter une waveform au centre et encore un panel d'options alRight pour des infos propres au morceau, ainsi qu'un autre alLeft indiquant par sa couleur si le morceau joue, est en pause ou arrêté), bref, une usine à gaz.

    J'avais essayé de faire ça avec des TFrames mais ça n'a pas été glorieux : jamais compris pourquoi certaines procédures étaient parcourues deux fois, par exemple)
    J'ai remplacé les TFrames par des TForms et ça a coincé aussi, je ne sais plus pourquoi.

    Là je me rabats sur de simples panels (m'en suis créé un customisé tout bien comme il faut, mais je ne peux pas aller plus loin que l'envie que j'avais de pouvoir fermer un panneau et le rouvrir avec une autre chanson, à chaque fois j'ai ces histoires de doublons.

    Là j'ai avancé dans la direction de "je me tape tout à la main avec les boucles qui vont bien", je devrais y arriver.

    Mais j'espérais plus simple, à force de lire partout que si on détruit un gros parent ça détruit aussi sa descendance, chose que j'espérais et que je n'ai pas constatée.

    Citation Envoyé par anapurna Voir le message
    De plus, si vous utilisez des composants tiers
    Que des compos Lazarus purs et durs.

    Et pour voir de quoi je parle, une petite image brouillonne avec des trucs pas finis, pas propres, mais je ferai le ménage quand ça fonctionnera :
    Nom : playlist.png
Affichages : 175
Taille : 29,3 Ko

    Dans la procédure de destruction manuelle, pour le moment je comptabilise les objets :
    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
    upnlx, pnl4hosting0, ControlCount: 3, ComponentCount: 0
      pnl4img0
        upnlx, pnl4img0, ControlCount: 2, ComponentCount: 0
          TLabel
          TImage
      pnlchoix0
        upnlx, pnlchoix0, ControlCount: 0, ComponentCount: 0
      pnlinfos0
        upnlx, pnlinfos0, ControlCount: 7, ComponentCount: 0
          TCheckBox
          TCheckBox
          TButton
          TSpeedButton
          TLabel
          TLabel
          TLabel
    upnlx, pnl4hosting0, ControlCount: 0, ComponentCount: 0
    Par exemple, dans cette liste juste dessus on voit un TSpeedButton c'est le "Fermer ce panneau" et les 3 TLabels sont en haut à droite dans le vert, les "lbl..."

    Mais après la sortie de ce ShowMessage, au moment de recréer les composants pour un autre morceau, bim ! :
    Citation Envoyé par programme pas content
    Duplicate name: A component named "img0" already exists.
    À pluche,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Bon, j'en suis là en m'étant bien pris la tête avec la destruction d'objets, faut plus toucher, c'est un édifice fragile, un peu comme un château de cartes et ce n'est pas de mon fait !
    Nom : tite_dernière_pour_la_route.png
Affichages : 169
Taille : 53,2 Ko

    Si vous examinez attentivement l'image, vous remarquez au milieu les panneaux qui afficheront les waveforms un jour, en attendant ils sont séparés par une bordure incluse dans les TPanels, ils sont identiques et viennent du même moule et la première chose qui m'énerve, c'est de voir 3 fois pnl4hosting0 alors que mon code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pnl4hosting := TPanelex.Create(nil); // container des 3 autres panels
    with pnl4hosting do begin
      Name := 'pnl4hosting'+IntToStr(i);
      Align  := alTop;
    ...
    et aussi la taille de la séparation, de 2 pixels entre les panneaux et de 0 tout en bas ! Pourquoi ?
    Je fais des calculs qui prennent en compte la hauteur de la zone dispo, le nombre de panneaux, la volonté d'avoir pour les panneaux une hauteur impaire (canal gauche + 1 de séparation + canal droit) et malgré tout ça, l'affichage fait ce qu'il veut, c'est un peu déprimant.

    EDIT :
    Bon voilà, c'est pas mal du tout : l'identification des objets, l'effacement des panneaux et leurs sous-composants pour recréer un nouvel affichage, tout va bien !
    (je m'étais un poil embrouillé dans ma tête, lol !)

    J'oublie ce DestroyComponent qui ne veut rien entendre, je fais tout à la main, c'est laborieux et délicat, mais en étant soigneux on y arrive.

    Le dernier truc qui me reste à voir et ça, c'est un brave mystère, c'est l'encadrement des pnl4hostingX, que je veux utiliser pour bien séparer visuellement les panneaux et on voit que tout en bas du dernier panneau, on discerne un très léger trait pas de la même couleur que les autres traits d'encadrement : mais que se passe-t'il ?
    Nom : 3panneaux_ok.png
Affichages : 169
Taille : 51,3 Ko

    D'autant plus qu'en jouant sur la hauteur globale de la fiche et donc de tout ce qu'elle comporte et affiche, je vois que le bas du dernier panneau est à géométrie variable, c'est le cas de le dire !
    Deux exemples avec la hauteur de la fiche à 288 (1 point de plus qu'au démarrage) et 291 (4 points) :
    Nom : 3hauteurs.png
Affichages : 171
Taille : 30,1 Ko

    Puis encore un point et on retourne au début, sauf que la fiche a été agrandie de 5 points.
    Alors je m'attendais à ce que ce qui se trouve sous le dernier panneau change de taille, mais je n'imaginais pas du tout que ça impacterait le bas (la bordure) de ce panneau : bug caché ?
    À suivre...
    Bref, bonne soirée et merci pour tout.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    Salut

    La Création se fait de cette façon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    PanelcTRL := TPanel.Create(FrmMain);
    lb1 := Tlabel.create(PanelcTRL);
    lb1.Parent :=  PanelcTRL;  
    lb2 := Tlabel.create(PanelcTRL);
    lb2.Parent :=  PanelcTRL;
    ...
    et la suppression de cette manière

    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par anapurna Voir le message
    Salut

    La Création se fait de cette façon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    PanelcTRL := TPanel.Create(FrmMain);
    lb1 := Tlabel.create(PanelcTRL);
    lb1.Parent :=  PanelcTRL;  
    lb2 := Tlabel.create(PanelcTRL);
    lb2.Parent :=  PanelcTRL;
    ...
    C'est un peu cette idée, oui.
    Mais je me suis rendu compte que ça fonctionnait mieux avec par exemple lb1 := Tlabel.create(nil); tout en conservant l'affectation du Parent au bon composant pour avoir le lb1 dans son panneau de destination.

    Citation Envoyé par anapurna Voir le message
    et la suppression de cette manière

    Oui, mais comme je le disais, ça ne détruit pas les sous-objets.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    Salut

    Dans le create du TComponent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...   
      if AOwner <> nil then 
         ... ;
    Ne vois-tu pas pourquoi ça ne marche pas ?
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Je ne vois pas ce que tu veux dire : je n'ai jamais été très fort aux devinettes, je préfère qu'on me montre et qu'on m'explique, bah oui, je suis comme ça...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    Salut

    OK

    Quand tu fais
    lb1 := Tlabel.create(nil);
    vu que le owner est à nil cela implique que tu ne charges pas le composant dans la liste des components du conteneur (TPanel,TForm... ) et donc, quand tu le détruis, celui-ci ne s'efface pas automatiquement.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Donc j'ai remplacé mes nil par les noms des panneaux hébergeurs et j'ai remplacé dans ma proc DestructionPanneaux(aPanel: TPanel); ma quinzaine de lignes par juste ça :
    aPanel.Free;J'ai fait F9, le fichier en paramètre s'est bien chargé, normal, j'ai cliqué sur "Ouvrir" pour choisir un autre fichier, j'ai validé et ça n'a pas trainé, SIGSEGV.

    Ça me coûtera beaucoup moins de temps de remettre nil partout où il faut (12 fois) que d'essayer de savoir où ça coince et comment le corriger.

    Merci quand même.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    Salut

    Il est difficile de te répondre sans avoir l'occasion de faire des test plus aboutis.
    Normalement tu ne devrais pas avoir cette erreur.
    Il doit y avoir d'autre interactions dont je n'ai pas connaissance.

    Le TPanelEx ... c'est quoi comme composant ?
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par anapurna Voir le message
    sLe TPanelEx ... c'est quoi comme composant ?
    Un truc perso créé à partir d'un TPanel qui supporte 3 sous-panels qui embarquent des sous-composants ultra-classiques :

    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
    unit unit4panelex;
     
    {$mode ObjFPC}{$H+}
     
    interface
     
    uses
      LCLIntf, LCLType,
      SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
      ExtCtrls, Buttons;
     
    type
      TPanelex = class(ExtCtrls.TPanel)
      private
      public
        { Déclarations publiques }
        panelex: TPanelex;
        pnl4hosting: TPanel;
        pnlinfos : TPanel;
        pnlchoix : TPanel;
        pnl4img  : TPanel;
        lblinfo : TLabel;
        lblfreq : TLabel;
        lblsize : TLabel;
        lblfile : TLabel;
        img : TImage;
        btnMakeBmp: TButton;
        sbClosePanel : TSpeedButton;
        ckbxAfficheMono : TCheckBox;
        ckbxPlayThisSong: TCheckBox;
        procedure CreationPanneaux(i: integer);
        procedure DestructionPanneaux(aPanel: TPanel);
      published
        procedure ckbxAfficheMonoClick(Sender: TObject);
        procedure btnMakebmpClick(Sender: TObject);
      end;
    Je n'ai pas mis le détail du reste, il y en a pour 300 lignes environ, alors juste le premier panneau (un par morceau de musique), celui qui contient tout le reste, et le premier sous-panneau :
    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
    procedure TPanelex.CreationPanneaux(i: integer);
    begin
      pnl4hosting := TPanelex.Create(nil); // container des 3 autres panels
      with pnl4hosting do begin
        Name := 'pnl4hosting'+IntToStr(i);
        Align  := alTop;
        BorderWidth:= 0;
        BevelColor := clGray;
        BevelInner := bvSpace;
        BevelOuter := bvNone;
        Color:=clRed; // changer la couleur, à terme
        Caption := '';
        Parent := MainForm.pnl4clients; 
      end;
     
    {%region 3panneauxprincipaux}
      pnlinfos := TPanel.Create(nil); // 1 à droite
      with pnlinfos do begin
        Name := 'pnlinfos'+IntToStr(i);
        Align  := alRight;
        Width  := 142;
        BorderWidth:= 0;
        BevelInner := bvNone;
        BevelOuter := bvNone;
        Caption := '';// Name par défaut si pas rempli
        Color:=clMoneyGreen;
        Parent := pnl4hosting;
        //Height := Parent.Height; // valeur en dur nécessaire sinon le bouton se met à top 25
      end;
     
    etc.
    Allez, au dodo ! Bonne nuit, moi je suis mort !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #14
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut


    il n'y aurait pas un petit hic par ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TPanelex.CreationPanneaux(i: integer);
    begin
      pnl4hosting := TPanelex.Create(nil); // container des 3 autres panels
      with pnl4hosting do begin
    ...
    et ici aussi a mon avis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Parent := MainForm.pnl4clients;
    remplace le par


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TPanelex.CreationPanneaux(Owner : TCompoment;index: integer);
    begin
      pnl4hosting := TPanel.Create(Owner); // container des 3 autres panels
      with pnl4hosting do begin
    ...
     Parent := Owner;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    resalut

    petit test du matin

    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
    70
    71
    72
    73
     
     
    unit UPanel;
     
    interface
    uses
      SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
      ExtCtrls, Buttons;
     
    type
      TOnClicKEvent = TNotifyEvent;
     
    TPanelex = class(ExtCtrls.TPanel)
      private
        fEventAfficheMono : TOnClicKEvent;
        fbtnMakebmp       : TOnClicKEvent;
      public
        { Déclarations publiques }
        pnl4hosting: TPanel;
        pnlinfos : TPanel;
        pnlchoix : TPanel;
        ...
        procedure CreationPanneaux(PnlCtrl : TWinControl;i: integer);
        procedure DestructionPanneaux(aPanel: TPanel);
      published
        property EventAfficheMono : TOnClicKEvent Read fEventAfficheMono write fEventAfficheMono;
        Property EventbtnMakebmp  : TOnClicKEvent Read fbtnMakebmp write fbtnMakebmp;
      end;
     
    implementation
     
    procedure TPanelex.CreationPanneaux(PnlCtrl : TWinControl;i: integer);
    Begin
       pnl4hosting := TPanel.Create(PnlCtrl); // container des 3 autres panels
       with pnl4hosting do
       Begin
         Name := 'pnl4hosting'+IntToStr(i);
         Align  := alTop;
         BorderWidth:= 0;
         //BevelColor := clGray;
         BevelInner := bvSpace;
         BevelOuter := bvNone;
         Color:=clRed; // changer la couleur, à terme
         Caption := '';
         Parent := PnlCtrl; //MainForm.pnl4clients
       End;
     
    {%region 3panneauxprincipaux}
      pnlinfos := TPanel.Create(pnl4hosting); // 1 à droite
      with pnlinfos do
      begin
        Name := 'pnlinfos'+IntToStr(i);
        ......
        Parent := pnl4hosting;
        //Height := Parent.Height; // valeur en dur nécessaire sinon le bouton se met à top 25
      end;
     
      pnlchoix := TPanel.Create(pnl4hosting);
      pnl4img  := TPanel.Create(pnl4hosting);
      lblinfo := TLabel.Create(pnlinfos);;
      lblfreq := TLabel.Create(pnlinfos);;
      lblsize := TLabel.Create(pnlinfos);;
      lblfile := TLabel.Create(pnlinfos);;
      img := TImage.Create(pnl4img);
      btnMakeBmp:= TButton.Create(pnlchoix);
      sbClosePanel := TSpeedButton.Create(pnlchoix);
      ckbxAfficheMono := TCheckBox.Create(pnlchoix);
      ckbxPlayThisSong:= TCheckBox.Create(pnlchoix);
    End;
    procedure TPanelex.DestructionPanneaux(aPanel: TPanel);
    Begin
      pnl4hosting.Free
    End;
    la fenêtre 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
     
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
        Tab : Array of TPanelEx ;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SetLength(Tab,Length(Tab)+1);
      Tab[High(Tab)] := TPanelEx.create(Panel2);
      Tab[High(Tab)].CreationPanneaux(Panel2,Length(Tab));
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      if Length(Tab) >0 then
      Begin
        Tab[High(Tab)].DestructionPanneaux(Tab[High(Tab)]);
        SetLength(Tab,Length(Tab)-1);
      End;
    end;
    aucune erreur de pointeur a l'horizon
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Bonjour,

    Oh ça part fort, de bon matin,

    Citation Envoyé par anapurna Voir le message
    il n'y aurait pas un petit hic par ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TPanelex.CreationPanneaux(i: integer);
    begin
      pnl4hosting := TPanelex.Create(nil); // container des 3 autres panels
      with pnl4hosting do begin
    ...
    Si tu le dis...
    Alors jouons aux devinettes et je remplace TPanelex par TPanel, ainsi que les 12 nil par les objets qui vont bien, ce qui n'empêche pas que je suis obligé de détruire les compos un par un,

    Citation Envoyé par anapurna Voir le message
    et ici aussi a mon avis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Parent := MainForm.pnl4clients;
    remplace-le par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TPanelex.CreationPanneaux(Owner: TCompoment; index: integer);
    begin
      pnl4hosting := TPanel.Create(Owner); // container des 3 autres panels
      with pnl4hosting do begin
    ...
     Parent := Owner;
    Pourquoi ?
    Au final ça va revenir au même.

    Quant au test du matin (arrivé pendant que je préparais ma réponse), je l'étudierai plus tard.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #17
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    Salut

    Il te suffit de détruire le conteneur et le reste se détruit automatiquement.

    Dans mes messages précédents je t'avais mis sur cette piste.
    Si tu regardes les sources du TCcopponent, tu vois qu'à sa création, si le owner est renseigné, celui-ci s'enregistre automatiquement dans une liste compoments.
    Lors de sa destruction celle-ci efface tous les composants inscrits.

    Dans mon exemple, je te montre une mécanique afin de créer tes diffèrents panels et leur suppression.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  18. #18
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    J'ai bien apprécié ton petit exemple, je l'ai même allégé des deux compos pas nécessaires car pas utilisés pour le moment (fEventAfficheMono et fbtnMakebmp), j'ai changé une bordure et remis une couleur et ma foi, ça fonctionne.

    Nom : test_anapurna.png
Affichages : 169
Taille : 16,5 Ko

    Mais je n'ai pas trouvé comment avoir les tableaux de 1 à X de haut en bas, ce qui est plus agréable au quotidien.

    Et j'ai un chagrin, aussi : si j'ai 20 chansons, faudra que je clique 20 fois sur le Button2 ?
    J'ai essayé ainsi (après avoir rajouté var PanelEx: TPanelEx; dans UPanel.pas et renommé tab en tableau, plus confortable pour mon pauvre cerveau), m'inspirant de ce que tu avais écrit, mais il ne se passe rien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button2Click(Sender: TObject);
    var i: integer;
    begin
    {  if Length(Tableau) > 0 then
      Begin
        Tableau[High(Tableau)].DestructionPanneaux(Tableau[High(Tableau)]);
        SetLength(Tableau,Length(Tableau)-1);
      End; }
      for i := High(Tableau) downto Low(Tableau) do begin
        Tableau[High(Tableau)].DestructionPanneaux(Tableau[i]);
        SetLength(Tableau, Length(Tableau)-1);
      end;
    end;
    Faut dire aussi que je ne comprends pas ta proc de destruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TPanelex.DestructionPanneaux(aPanel: TPanel);
    Begin
      pnl4hosting.Free; 
    End;
    À quoi ça sert de mettre (aPanel: TPanel) si ce n'est pas utilisé ?
    Alors j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TPanelex.DestructionPanneaux(aPanel: TPanel);
    Begin
      //pnl4hosting.Free; //????????
      aPanel.Free;
    End;
    Mais ça ne détruit rien...

    Et avec un appel genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      if Length(Tableau) >0 then
      Begin
    //  Tableau[High(Tableau)].DestructionPanneaux(Tableau[High(Tableau)]);
        Tableau[High(Tableau)].DestructionPanneaux(panelex.pnl4hosting);
        SetLength(Tableau,Length(Tableau)-1);
      End;
    c'est l'AV !

    EDIT : j'ai trouvé !
    Plus besoin de var PanelEx: TPanelEx;
    Nouvelle proc de destruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TPanelex.DestructionPanneaux;//(aPanel: TPanel);
    Begin
      pnl4hosting.Free;
    End;
    Et nouvel appel de la proc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button2Click(Sender: TObject);
    var i: integer;
    begin
      if Length(Tableau) >0 then
      for i := High(Tableau) downto Low(Tableau) do begin
        Tableau[i].DestructionPanneaux;
        SetLength(Tableau, Length(Tableau)-1);
      end;
    end;
    /EDIT


    En résumé, puisque tu parlais de mécanique, alors pour prendre une image je dirais que tu nous montres une chaine de vélo, tout juste sortie de tes pensées, montée sur un plateau d'un côté et sur un pignon de l'autre, avec une manivelle sur le plateau et en avant, en tournant la manivelle le petit pignon tourne, c'est le principe et c'est le bonheur.

    Mais le jour où tu ajoutes des plateaux et le dérailleur qui va bien, plus plein de petits pignons et un système de freinage intégré dans le moyeu avec là aussi un dérailleur, ben au bout d'un certain temps, avec l'usure des dents et l'allongement des câbles de commande, un jour ça va dérailler pour de vrai et ce jour-là tu plantes le vélo.

    En plus je suis sous Linux et si j'ai tardé à répondre c'est que je fais face à une nouvelle embrouille, une fois mon premier panneau détruit car je veux changer de chanson et donc un nouveau recréé, il n'est effectivement recréé qu'au bout de l'enchainement des procédures et fonctions, autant dire qu'à un endroit dans ce parcours où j'ai besoin de récupérer les infos du song pour les afficher dans les labels qui vont bien, ben, y a pas encore de labels...
    C'est les joies de la POO : dans les boucles avec for i := 0 to panneaux.Count-1 do... ça ne rentre pas dans le do car les panneaux n'existent pas !
    Malgré des Applications.ProcessMessages; bien placés,

    Cet après-midi, maçonnerie, avec une vraie truelle et des vraies briques en terre rose, ça me changera, ah mais !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  19. #19
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    Salut

    fEventAfficheMono et fbtnMakebmp ne sont pas des composants mais des méthodes de classe que tu peux assigner comme le onclick, le onpaint ou le onshow.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  20. #20
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Yep !

    Citation Envoyé par anapurna Voir le message
    fEventAfficheMono et fbtnMakebmp ne sont pas des composants mais des methodes de class
    que tu peux assigner
    Oui, tu as raison, il faut être précis sinon c'est la pagaille.

    Mais en ce qui me concerne, c'est déjà la pagaille dans ma tête quand je lis des choses comme "méthode de classe", qui ne veut pas dire grand chose pour moi.
    C'est comme ce que j'ai lu cet après-midi après ma maçonnerie, quelque part sur dvlp où Google annonçait l'arrêt du support de Jpeg XL dans son Chromium, au profit du WebP pour améliorer l'expérience de navigation !

    Mais c'est quoi ce charabia, "expérience de navigation", qu'on voit partout maintenant ? Améliorer ma navigation c'était pas plus simple et donc plus compréhensible ? Ah oui mais c'est pas chébran, faut être dans le move, même si on ne comprend plus rien.
    Grrrrr !

    Bon, bref, parlons d'autre chose : comme je ne vois pas comment faire pour avoir mes panneaux dès qu'ils sont créés dans l'enchainement des procédures et fonctions, je vais sans doute abandonner les panels pour utiliser des forms (et pas des frames), alors si tu as une idée sympathique, je la lirai avec plaisir.
    Sinon, il y avait aussi la possibilité de passer par un timer, mais je trouve que ça fait un peu enclume pour écraser une mouche, non ?

    À pluche,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

Discussions similaires

  1. besoin d'explication sur le c++
    Par poporiding dans le forum MFC
    Réponses: 13
    Dernier message: 17/12/2005, 19h01
  2. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 15h51
  3. [C#] J'aurais besoin d'explication
    Par Roach- dans le forum Windows Forms
    Réponses: 18
    Dernier message: 10/03/2005, 17h00
  4. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 16h15
  5. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 12h34

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