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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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 : 326
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 ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    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 491
    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 491
    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.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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 : 287
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,

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    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 491
    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


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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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.

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    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 491
    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 ?

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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 : 283
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 : 282
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 : 281
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.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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...

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    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 491
    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.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Oui oui oui oui-oui oui-oui...
    Tu sais quoi ? Sans vouloir t'offenser en aucune manière, ta réponse me fait l'effet de celles que tu te fais le matin devant la glace quand tu penses très fort à quelque chose, tu vois le truc ?
    Des bouts de ta courte réponse me font germer des points d'interrogation plein les yeux, genre un appel de méthode attendant un paramètre Sender : ça serait quoi comme méthode, et elle ferait quoi avec ce paramètre ?
    Ou l'objet courant ? Moi j'en vois deux, d'objets, l'un dont la méthode qui attend un paramètre est issue et l'autre, ce Sender qui doit bien être lié à quelque chose.

    Essaie d'être un peu plus pédagogue (pédagogique ?) steuplait et imagine que tu t'adresses à un gamin de 10 ans, un gamin de 10 ans qui calculait des déplacements d'offset directement en langage machine en entrant des adresses au clavier, oui, il y a 40 ans, et s'amusait à faire écrire l'alphabet à une LA36 pilotée par un PDP 1104 (pour les anciens qui ont connu ça).

    Merci,

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Le matin devant ma glace je ne pense pas, je constate ! J'ai une toute autre position lorsque je pense

    TNotifyEvent ça te dit quelque chose ?

    ps: serions-nous contemporain ?

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    TNotifyEvent ça te dit quelque chose ?
    Je n'ai jamais joué avec.

    Citation Envoyé par Andnotor Voir le message
    ps: serions-nous contemporain ?
    Surement, oui,

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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.

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    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 491
    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 ?

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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 !

  17. #17
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    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 491
    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;

  18. #18
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    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 491
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Bon, après un superbe concert des Rolling Stones enregistré en 2008, je crois que je tiens une petite maquette fort sympathique, en ce qui concerne les "hébergeurs" et pour la suite, je verrai plus tard.

    Pour l'instant, j'ai le plaisir de partager avec vous la numérotation numériquement triée dans le bon ordre, c'est bien agréable, et le redimensionnement automatique sur OnResize, ça aussi c'est bien sympa.

    3 images pour montrer l'avancement :
    F9 puis création de 3 panneaux, je n'ai pas mis l'appel au Resize, on voit donc le panneau pnlCentre avec sa couleur clSkyBlue et le panneau pnl4clients (dont un bout en clAqua en bas dépasse) qui vient squatter dessus, avec 3 panneaux pnl4hosting, chacun contenant une Form entière avec 3 panneaux et 7 sous-objets répartis dedans. Dans la vraie vie cette couleur clAqua sera assortie au reste et ne se verra pas, mais là, j'ai besoin de voir les mécanismes en action et tous les rendus :
    Nom : F9.png
Affichages : 231
Taille : 29,2 Ko

    Redim agrandi :
    Nom : redim_agrandi.png
Affichages : 230
Taille : 33,5 Ko

    Redim rétréci :
    Nom : redim_réduit.png
Affichages : 228
Taille : 27,7 Ko

    Le 4e nombre dans la barre de titre, c'est la hauteur en px des panneaux.

    Et pour mettre les panneaux dans le bon ordre, à la fin de la création du panneau pnlhost, j'ai rajouté (et désolé pour ceux qui n'aiment pas le with, mais d'un strict point de vue lisibilité [et donc compréhension du message écrit], y a pas photo avec la version lourde où il faut écrire 3 fois le même long nom de l'objet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       with pnl4hosting do
         if i = 0 then Top := 0 else Top := Height * i;
    Et on peut même faire encore plus court (c'est bien, j'économise des bits, je prends soin de la planète, , pas comme les autres débiles de l'autre côté, qui sont en train de tout casser) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with pnl4hosting do if i=0 then Top:=0 else Top:=Height*i;

    Merci à tous et bonne nuit, faites de beaux rêves (malgré les misères de ce triste monde...)

Discussions similaires

  1. besoin d'explication sur le c++
    Par poporiding dans le forum MFC
    Réponses: 13
    Dernier message: 17/12/2005, 18h01
  2. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  3. [C#] J'aurais besoin d'explication
    Par Roach- dans le forum Windows Forms
    Réponses: 18
    Dernier message: 10/03/2005, 16h00
  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, 15h15
  5. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34

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