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 :

Détruire un TCategoryPanelGroup et tout ce qui lui est associé


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 268
    Points : 41 671
    Points
    41 671
    Billets dans le blog
    64
    Par défaut Détruire un TCategoryPanelGroup et tout ce qui lui est associé
    Bonjour,

    Je dois créer un TCategoryPanelGroup au runtime (voici le code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    // on diras que c'est sur un onClick ;-)
    var
      AGroup : TCategoryPanelGroup;
      APanel : TCategoryPanel;
     
    begin     
       AGroup:=TCategoryPanelGroup.Create(self);
       AGroup.GradientBaseColor:=Main.Degrade.StartColor;
       AGroup.GradientColor:=Main.Degrade.EndColor;
       AGroup.Parent:=Panel1;
       AGroup.Name:='Groupe';
       AGroup.ParentColor:=True;
       AGroup.Align:=alClient;
       for i:=1 to 5 do
           APanel:= AGroup.CreatePanel(Self) as TCategoryPanel;
           APanel.Caption:='Panneau '+inttostr(i);
           APanel.Height:=120+AGroup.HeaderHeight;
           APanel.Align:=alTop;
           APanel.Collapsed:=True;
           APanel.Tag:=i;
           APAnel.OnExpand:=CategoryPanel1Expand;
         end;
       APanel:=AGroup.Panels.First;
       APanel.Expand;
    end;
     
    procedure TFormArticle.CategoryPanel1Expand(Sender: TObject);
    var F : TFrame3;
        TROQ : TZReadOnlyQuery;
        Opt : String;
    begin
     if (Sender as TCategoryPanel).tag<0 then exit;
     F:=TFrame3.Create(Self);
     try
       F.Parent:=TCategoryPanel(Sender);
       F.Name:='F'+inttostr((Sender as TCategoryPanel).tag);
       (Sender as TCategoryPanel).tag:=(Sender as TCategoryPanel).tag*-1;
       F.ParentColor:=True;
       F.Align:=alClient;
     finally 
     end;
    end;
    mais aussi détruire ce dernier avec bien sur tous les composants (en l'occurence une Frame mis dedans et là , je doute ......

    ce code fait bien le travail
    mais est-ce une destruction propre ....
    Quid des composants posés (et frames) , sont ils(elles) détruit(e)s en même temps ou suis-je en train de polluer la mémoire ? "That is the Question" écrirait Shakespeare

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 593
    Points
    25 593
    Par défaut
    Destroy ou Free
    N'appelez pas directement Destroy. Appelez plutôt Free
    Ben alors Sergio, tu devrais le savoir depuis le temps !

    CreatePanel
    Appelez CreatePanel pour créer un objet TCategoryPanel et l'assigner au groupe de panneaux.

    AOwner est le propriétaire de l'objet TCustomCategoryPanel et est responsable de la libération de cet objet durant le nettoyage.
    Tu as mis Self remplace le par AGroup et tu auras la garantie de la libération des Panels lors de la libération du TCategoryPanelGroup
    Etudie un peu de plus près la notion de Owner
    Ensuite, il faut savoir qu'un Parent libère aussi ses controles :
    Remarque : La propriété Parent déclarée dans TControl est similaire à la propriété Owner déclarée dans TComponent, dans le sens où le Parent d'un contrôle libère le contrôle de même que le propriétaire d'un composant libère ce composant.
    Voir le sujet Parent et Owner
    Qui nous a permis de voir qu'à partir de Delphi 6, enfin la documentation décrivait l’infanticide du TWinControl ! Avant cela n'était pas mentionné malgré qu'il le faisait !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function TCustomCategoryPanelGroup.CreatePanel(AOwner: TComponent): TCustomCategoryPanel;
    begin
      Result := GetCategoryPanelClass.Create(AOwner);
      Result.Parent := Self;
      Result.PanelGroup := Self;
    end;
    En plus, il déjà son parent, donc si tu libères un TCategoryPanelGroup, il va bien libérer les TCategoryPanel qui lui ont été ajouté !

    Le Owner est surtout utile pour le mode DFM qui permet de mettre à nil les références publiées !





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i:=1 to 5 do
           APanel:= AGroup.CreatePanel(Self) as TCategoryPanel;
    ben alors Sergio, tu nous copie un code incomplet, et le begin ???


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      F:=TFrame3.Create(Self);
     try
    ...
     finally 
     end;
    Pourquoi un finally vide ? un reste d'une libération honteuse ?

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 268
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 268
    Points : 41 671
    Points
    41 671
    Billets dans le blog
    64
    Par défaut
    Oui , faut vraiment faire attention au troll méchant

    Destroy ou Free , j'avais un doute , mais tu penses bien que je n'étais pas resté sans chercher avant de poser la question et le Destroy vient de chez .... roulement de tambour .... CodeGear (enfin plus exactement dans un de leur Forum)

    Méa culpa , pour le begin mais tu penses bien que ce n'était qu'un copié-collé modifié (en fait la boucle se fait sur un Dataset) l'objectif avoir une sorte de DBGrid "amélioré" pour ce cas précis

    Quant au finally , c'est un peu le même contexte (une simplification trop hâtive).

    Quant au Parent/Owner un jour j'essaierai de maitriser

    C'est surtout les Frames qui me chagrine (ma première fois) je suis en terra incognita.

    Enfin si le Free libère bien tout je suis soulagé

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

Discussions similaires

  1. Supprimer un enregistrement et tout ce qui y est affecté
    Par 4rocky4 dans le forum VBA Access
    Réponses: 6
    Dernier message: 27/02/2008, 23h11
  2. [RegEx] Supprimer tout ce qui n'est pas un mot
    Par Astorz dans le forum Langage
    Réponses: 5
    Dernier message: 08/02/2008, 04h24
  3. Récupérer tout ce qui n'est pas dans la base
    Par SnakeBoudoir dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/11/2006, 20h18
  4. Réponses: 2
    Dernier message: 26/07/2006, 15h40
  5. LIKE de tout ce qui n'est pas compris entre a<-&
    Par DjinnS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/07/2003, 14h09

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