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 :

[D7] [Win32] Conseil sur la création et la libération d'une Form


Sujet :

Langage Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut [D7] [Win32] Conseil sur la création et la libération d'une Form
    Bonjour,

    j'ai une TForm créée de façon dynamique avec des boutons, Labels et Edit. J'ai codé ceci :

    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
      // Creation de la boite de dialogue de saisie
      FormNew := TForm.Create(self);
      try
        With FormNew Do
          Begin
            Height := 143 ;
            ...
          End ;
        //  Label1
        Label1 := TLabel.Create(FormNew) ;  // Ou TLabel.Create(Self) ???
        With Label1 Do
          Begin
            Caption := 'Rep courant : ' ;
            ....
            Parent := FormNew ;
          End ;
        ...
        j := FormNew.Showmodal ;
        Case j of
          mrOk     : ...
          mrCancel : ...
        End;
     
        If (FormNew <> nil) Then
          Begin
            ...
            Label1.Free ;   // Obligation de libérer les enfants avant libération de FormNew ???
          End ;
      finally
        If (FormNew <> nil) Then FormNew.Free;
      end;
    Mes premières interrogations sont dans le code en commentaires.

    De plus, faut il impérativement protéger par un Try ... Except, la création de chacun des composants de FormNew. Si je le fais, cela risque de faire une cascade importante de Try Except ...

    Quelqu'un peut il me corriger et m'améliorer mon code ?

    Merci
    Charly

  2. #2
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Bonjour,

    En fait quand on créé un Composant, la grande différence par rapport à un objet simple c'est la notion de Owner (Le propriétaire du composant).
    C'est ce que l'on précise dans le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label1 := TLabel.Create(FormNew);
    Ici le Owner de Label1 c'est FormNew

    Cette notion de Owner permet de ne pas avoir besoin de libérer et détruire les composants si le Owner est détruit.
    Donc après ligne ci-dessus, si on détruit FormNew tous les composants dont FormNew est le propriétaire seront détruit automatiquement, donc Label1 sera détruit, pas besoin de le faire.

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Merci Thierry,

    et la protection des créations des enfants, faut il la faire et comment ?

  4. #4
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Merci Thierry,

    et la protection des créations des enfants, faut il la faire et comment ?
    Pas forcément, il n'y a pas vraiment de règles là. Tu peux si tu le veux mettre un seul try..Except pour la création de tout les enfants.

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Ok

    Je vais laisser comme cela, car je pense qu'il n'y a qu'une chance infinitésimale que l'on manque de ressources pour créer ces enfants.

    Merci beaucoup
    Charly

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Thierry Laborde Voir le message
    Ici le Owner de Label1 c'est FormNew
    Petite précision tout de même, Dans le cas d'un TControl, c'est la Parent qui est prioritaire sur le Owner il me semble

  7. #7
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Comme indiqué par Thierry Laborde, le Owner va libérer les composants qui sont liés.

    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
    // Creation de la boite de dialogue de saisie
    FormNew := TForm.Create(self);
     
    try
      FormNew.Height := 143;
      // ...
     
      Label1 := TLabel.Create(FormNew);
      Label1.Caption := 'Rep courant : ';
      Label1.Parent  := FormNew;
      //...
     
      case FormNew.Showmodal of
        mrOk     : // ...
        mrCancel : // ...
      end;
     
      // pas besoin de gérer la libération des composants à cause du Owner
    finally
      FreeAndNil(FormNew);
    end;
    @guillemouze : Note: The Parent property declared in TControl is similar to the Owner property declared in TComponent, in that the Parent of a control frees the control just as the Owner of a component frees that component. However, the Parent of a control is always a windowed control that visually contains the control, and is responsible for writing the control to a stream when the form is saved. The Owner of a component is the component that was passed as a parameter in the constructor and, if assigned, initiates the process of saving all objects (including the control and its parent) when the form is saved.

  8. #8
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Petite précision tout de même, Dans le cas d'un TControl, c'est la Parent qui est prioritaire sur le Owner il me semble
    En fait pas exactement.
    Lorsque vous posez un composant à la conception par défaut il met comme Owner le parent. Mais simplement parce qu'à la conception il n'y a pas d'endroits dans l'inspecteur d'objet ou l'on peut indiquer le Owner.
    Mais si vous créez dynamiquement un TControl vous pourrez préciser le Owner que vous voulez.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Citation Envoyé par Thierry Laborde Voir le message
    Lorsque vous posez un composant à la conception par défaut il met comme Owner le parent.
    Pas en VCL, il met la fiche
    Un bouton posé sur un panel aura la fiche comme propriétaire et le panel comme parent.

  10. #10
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Petite précision tout de même, Dans le cas d'un TControl, c'est la Parent qui est prioritaire sur le Owner il me semble
    Ma remarque concernait la destruction des objets (je le concède, ce n'est pas forcement évident).
    Ce que je voulais dire, c'est que la destruction d'un composant visuel est gérée par son Parent si il en a un, et non pas par son Owner.
    Donc, si tu as une form qui contient un panel qui contient un bouton, le fait de faire MonPanel.Free; va aussi détruire ton bouton, alors que le Owner de ce dernier est la Form.
    NB: Regarde la methode FreeNotification qui est aussi en rapport avec le sujet, la form "FreeNotifies" les composants posés au DesignTime, ainsi, lorsqu'un composant est détruit (par la destruction de son parent par exemple), la form en est informée et peu ainsi passer la variable associée à nil. Par 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
    TForm1 = class(TForm)
      panel1: TPanel;
      label1: TLabel; //dans panel1
     
    ...
    procedure TForm1.xxx();
    begin
      ShowMessage('Panel1 nil ? :' + BoolToStr(panel1 = nil, true)); //Panel1 nil ? : False
      ShowMessage('label1 nil ? :' + BoolToStr(label1 = nil, true)); //label1 nil ? : False
     
      panel1.Free;
     
      ShowMessage('Panel1 nil ? :' + BoolToStr(panel1 = nil, true)); //Panel1 nil ? : True
      ShowMessage('label1 nil ? :' + BoolToStr(label1 = nil, true)); //label1 nil ? : True

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Ce que je voulais dire, c'est que la destruction d'un composant visuel est gérée par son Parent si il en a un, et non pas par son Owner.
    Il peut être libéré autant par son parent que par son propriétaire à leur destruction.

    Le parent détruit les composants de sa liste Controls et le propriétaire de sa liste Components.

  12. #12
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Il peut être libéré autant par son parent que par son propriétaire à leur destruction.

    Le parent détruit les composants de sa liste Controls et le propriétaire de sa liste Components.
    Tout a fait, mais comme le TWinControl.Destroy est appelé avant le TComponent.Destroy car il en hérite, un Control sera détruit par son Parent et pas par son Owner

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Tout a fait, mais comme le TWinControl.Destroy est appelé avant le TComponent.Destroy car il en hérite, un Control sera détruit par son Parent et pas par son Owner
    Pour autant que le parent soit aussi le propriétaire ou que le parent du parent le soit ou etc.

    Mais il ne s'agit pas d'héritage ici.
    Un exemple où Panel1 et Panel2 sont chacun susceptibles de détruire Label1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Panel1 := TPanel.Create(Self);
    Panel2 := TPanel.Create(Self);
     
    Label1 := TLabel.Create(Panel2);
    Label1.Parent := Panel1;
    Bon, pas vraiment utile mais possible !

  14. #14
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Merci à tous,

    je vois que la notion de Parent et de Owner fait couler beaucoup d'encre !

    Pour moi le problème est résolu. Voici mon unité ChoixRep.pas qui affiche un Dialogue de choix d'un répertoire (car je n'étais pas satisfait de SelectDirectory). Il est possible de choisir le disque à afficher, de remonter dans l'arborescence et de créer éventuellement un nouveau Dossier.
    Le tout est créé dynamiquement (pas de composant) il suffit d'ajouter ChoixRep.pas à son projet. L'appel au dialogue de choix d'un répertoire est documenté dans le source.

    ChoixRep.zip

    En codant cette unité, j'ai pensé qu'il serait peut être utile d'ajouter 2 rubriques à la FAQ :

    - comment créer dynamiquement une boite de dialogue avec des TControls enfants
    - comment affecter une procédure à l'évènement d'un TControl créé dynamiquement

    Si vous pensez que c'est utile, je peux essayer de rédiger quelque chose avec des extraits de mon code

    A+
    Charly

  15. #15
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    En codant cette unité, j'ai pensé qu'il serait peut être utile d'ajouter 2 rubriques à la FAQ :

    - comment créer dynamiquement une boite de dialogue avec des TControls enfants
    - comment affecter une procédure à l'évènement d'un TControl créé dynamiquement

    Si vous pensez que c'est utile, je peux essayer de rédiger quelque chose avec des extraits de mon code
    Pour ma part, je trouve que c'est une bonne idée.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/12/2014, 15h38
  2. Réponses: 2
    Dernier message: 06/07/2009, 09h45
  3. Réponses: 6
    Dernier message: 08/02/2008, 22h33
  4. Réponses: 2
    Dernier message: 04/08/2005, 22h36
  5. Conseil sur la création d'un CD d'installation
    Par chrisis dans le forum Outils
    Réponses: 8
    Dernier message: 02/06/2005, 16h44

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