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

Delphi Discussion :

Libération de composants


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Libération de composants
    Bonjour,

    Je suis tombé sur cette page du wiki.
    Ils donnent le code suivant :
    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 TForm1.FormCreate(Sender: TObject);
    var
      TaskDialog: TTaskDialog;
      Button: TTaskDialogBaseButtonItem;
    begin
      // display a task message dialog at a certain position
      TaskMessageDlgPos('Continue', 'Are you sure you want to continue?', mtWarning, mbYesNoCancel, 0, 10, 10);
     
      // display another message dialog at the current position
      TaskMessageDlg('Error', 'An error has occured', mtError, mbAbortRetryIgnore, 0);
     
      // create a custom task dialog
      TaskDialog := TTaskDialog.Create(Self);
      TaskDialog.Title := 'An error has occured in the query.';
      TaskDialog.Caption := 'Query result';
     
      // assign a MB_OK modal result to the task dialog
      TaskDialog.ModalResult := MB_OK;
     
      // add some customized buttons to the task dialog
      Button := TaskDialog.Buttons.Add;
      Button.Caption := 'Continue';
      Button.ModalResult := MB_OK;
     
      Button := TaskDialog.Buttons.Add;
      Button.Caption := 'Retry';
      Button.ModalResult := MB_RETRYCANCEL;
     
      // display the dialog box
      TaskDialog.Execute;
    end;
    Il n'y a pas de libération du TTaskDialog à la fin du traitement. C'est un oubli ?


    Lié à ces histoires de libération, lorsque j'ajoute manuellement des composants dans un form, sont-ils bien détruits automatiquement à la fermeture du form ?

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Peut-être que c'est un interface, ce qui évite le besoin de "libération", j'ai pas eu le temps de vérifier dans les sources

  3. #3
    Membre Expert
    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 : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

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

    Un Composant (Classe TComponent minimum) a 1 propriété qui est très importante et qui n'existe pas sur un objet : Le Owner.
    Le Owner est le propriétaire du composant. Il est indiqué à la création du composant. Donc ici :

    TaskDialog := TTaskDialog.Create(Self);
    Le owner est : Self, donc c'est la form qui est propriétaire du composant.
    Le rôle du propritétaire est de libérer tous les composants dont il est le propriétaire lorsqu'il est détruit. Donc quand la form est détruite elle détruite automatiquement tous les composants dont elle est propriétaire.
    Pour info, à la conception, quand je dépose un composant sur une Form, le propriétaire du composant est automatiquement la Form.

    ATTENTION, je pourrais créer dynamiquement un composant sans Owner, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TaskDialog := TTaskDialog.Create(Nil);
    Dans ce cas là le composant n'a pas de Owner et il faudra obligatoirement que je le détruise par le biais du code.

  4. #4
    Membre Expert
    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 : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Par défaut
    Je rajouterai une précision, attention de ne pas confondre le Parent et le Owner sur un composant.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 096
    Par défaut
    Citation Envoyé par Thierry Laborde Voir le message
    Je rajouterai une précision, attention de ne pas confondre le Parent et le Owner sur un composant.
    Mais au niveau libération, c'est plus bien tordu : https://www.developpez.net/forums/d6.../parent-owner/

    Citation Envoyé par benoit1024 Voir le message
    C'est un oubli ?
    Je ferais un mail via le menu feedback en bas de page pour leur proposer la correction "create try finally free" que le code soit propre.
    Avoir un Create avec Owner sur une variable locale, ce n'est pas terrible
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Il me semble aussi plus propre de libérer la mémoire allouée quand l'objet n'a pas de raison de rester au delà de la portée de son pointeur.

    Dans le cas présent, dans un FormCreate, c'est un peu bizarre, mais en effet il devrait y avoir libération après avoir récupéré le résultat du Execute.

    Citation Envoyé par ShaiLeTroll Voir le message
    Avoir un Create avec Owner sur une variable locale, ce n'est pas terrible
    Je ne vois pas ce qui te dérange dans le fait de déclarer une variable locale pour allouer une zone mémoire avec un objet ou un composant ensuite rattaché à autre chose.

    C'est comme si on avait fait un moche "with ttaskdialog.create(self) do begin end" sans déclarer la variable du coup.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Mais au niveau libération, c'est plus bien tordu : https://www.developpez.net/forums/d6.../parent-owner/
    c'est intéressant, je vais passer du temps à lire tout ça

  8. #8
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    C'est un oubli. Le "destructor" effectue entre autres les opérations suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    destructor TCustomTaskDialog.Destroy;
    begin
      FButtons.Free;
      FCustomFooterIcon.Free;
      FCustomMainIcon.Free;
      FProgressBar.Free;
      FRadioButtons.Free;
      inherited;
    end;

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci de vos précisions, je vais creuser.
    Je ne comprenais effectivement pas le rôle de owner, que j'avais tendance à confondre effectivement avec le parent.

  10. #10
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    Si je ne me trompe pas ce code est une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FPanel.Parent := Self.Parent;
    Voici le code que j'avais publié en 2009 mis à jour pour les version récentes de Delphi
    Une fois le programme lancé tu peux cliquer sur l'un des TPanel
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip D3.zip (1,6 Ko, 53 affichages)

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Si je ne me trompe pas ce code est une erreur
    Non, c'est un exemple qu'avait donnée Paul pour expliquer justement comment il avait compris le fonctionnement des owners.
    C'est dans le lien donnée par ShaiLeTroll dans cette discussion.

  12. #12
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par benoit1024 Voir le message
    Non, c'est un exemple qu'avait donnée Paul pour expliquer justement comment il avait compris le fonctionnement des owners.
    C'est dans le lien donnée par ShaiLeTroll dans cette discussion.
    Je sais j'avais participé à cette discussion en 2009 et oui déjà
    .
    Pour exemple tu créée une fiche avec un objet TPanel. Dans le onActivate tu met le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ShowMessage(Panel1.Owner.Name);
    ShowMessage(Panel1.Parent.Name);
    ShowMessage(Form1.Parent.name);
    La troisième ligne te sort une erreur car la propriété Parent d'un TForm est toujours à NIL
    Donc si tu écris "FPanel.Parent := Self.Parent;" cela revient à écrire "FPanel.Parent := NIL" ce qui ne peut que te poser des problèmes
    Regardes bien aussi l'exemple que je t'ai envoyé dans mon post précédent

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    La troisième ligne te sort une erreur car la propriété Parent d'un TForm est toujours à NIL
    Donc si tu écris "FPanel.Parent := Self.Parent;" cela revient à écrire "FPanel.Parent := NIL" ce qui ne peut que te poser des problèmes
    Regardes bien aussi l'exemple que je t'ai envoyé dans mon post précédent
    C'est bon, j'ai bien compris.

    "FPanel.Parent := Self.Parent;" c'est bizarre, mais ça ne pose pas de problème.
    Self fait référence à TFrame1 et Self.Parent à TForm1.
    C'est donc TForm1 qui détruit FPanel.

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

Discussions similaires

  1. JTabbedPane et composants (libération de la mémoire)
    Par Patrice Henrio dans le forum Composants
    Réponses: 0
    Dernier message: 24/04/2012, 15h42
  2. Réponses: 1
    Dernier message: 23/06/2002, 00h15
  3. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10
  4. Installer ses composants
    Par Geronimo dans le forum C++Builder
    Réponses: 14
    Dernier message: 18/06/2002, 14h51
  5. Re-dimensionnement automatique de composants
    Par ludo_7 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/05/2002, 16h35

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