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 :

[Classe] Auto destruction d'instances


Sujet :

Langage Delphi

  1. #1
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut [Classe] Auto destruction d'instances
    Est il correcte et "sûr" de faire un FreeAndNil(Self) au sien meme de la definition de la classe afin d'auto detruire l'instance de la classe et de mettre nil a la variable de l'instance pour permettre l'utilisation des If Assigned.

    J'ai une classe avec 2 types de constructeur/destructeur.
    Create/Destroy qui cree et libere la classe elel meme.
    Open/Close qui cree et libere des sous objet et qui active reelement la classe.
    Le but etant de permettre entre les 2 appels d'affecter a la classe une serie d'options necessaire a la creationdes sous objets.

    Cela permet aussi de liberer la classe sans la detruire completement .. pour changer les options et la relancer.
    PAr contre dans la plupars des cas il n'y aura aucun changement d'options donc il faudra liberer l'instance juste apres le "Close" ... cela permet donc d'eviter 2 lignes de destructions.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    FreeAndNil sur sois même, c'est mauvais.
    Tu peux éventuellement utiliser release mais tu ne pourra pas repasser à nil.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Puis je avoir plus de detail concernant le probleme d'utiliser FreeAndNil pour comprendre

    et quel est la difference entre Free et Release ....
    Ce qui m'embete c'est que si je ne repasse pas a nil, alors tous les Assigned suivant seront vrai.

    Sinon faudra que je passe par le l'autre cote : Inclure dans le destroy un test si l'instance est operationnel (open) ou bien préfermée (passe par close) dans le 1e cas faire appel a close.
    Mais cela oblige a changer le code quand on souhaite basculer d'un cas a l'autre.
    AutoFree me permetait de liberer completement l'instance avec un close ... la difference se faisant jsute au niveau des options pouvant etre parametre depuis un fichier sans recompilation.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Autre probleme : les TWinControl ne possedent pas de Release
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Release n'existe que pour les TcustomForm et ses descendants.

    Release ce contente d'appelert le message CMRelease, et le message CMRelease ne fait QUE FREE.

    Théoriquement appeler free ou release est identique. Cependant pour certaine application DLL multi form (ouis je sais une DLL ne devrait pas être multiform si l'on veut éviter les ennuis) Release évite des plantage en sortie d'application. En XP seulement s'il vous plait. En faite Release ce comporte comme un free asynchrone.

    Pour detruire et mettre un form vous devez le fair manuellment depuis une l'extérieure de la form. Si vous le faite depuis la forme vous aurez fatalement un plantage.

    Début d'évenement de mas form
    Dans l'évenement, je détruit la form
    Fin de l'événement de la form, windows fait apelle a la form donc plantage

    J'utilise un truc de ce genre.

    Dans une unité je mest une reférence FormToDelete: TForm, 1 Timer et une procedure servant d'évenement au timer.

    En finalization de l'unité je detruit le timer, en initialization je le créer (le temps d'attente peut être de l'ordre de 100 milliseconde par exemple).
    quand le timer est declencher il effectue les orders suivant.
    1° mettre le timmer en diseabled;
    2° si formtoDelete <> nil then Freeandnil(FormToDelete);


    Donc si dans un évenement de My form je veux Détruire My forme.
    1° m'est Self dans formtoDelete.
    2° Je m'est Timer a enabled.
    3° je termine en urgence ma procedure de façon à arréter de travailler avec pour pouvoir la détruire.

    4° en Autoamtique le time se declenche et détruit la form

    Ce n'est qu'un bricolage, mais cela fonctionne.

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Outch ca me parrait assez lourd a mettre en place comme technique.
    Mais je vais y refflechir ...
    Eventuelement un Petit Thread avec un freeOnTerminate ... A Voir.

    Par contre je n'ai jamais parle de "Form" ou bien peut etre que je me trompe ... c'est un composant derive de TWincontrol tout simple ...
    Mais bon, le principe reste le meme je pense

    Merci .. je vais voir comment je peut me debrouiller.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Quand je dis form je pense au TForm bien sur.


    Les TForm descendent des TCustomform.
    Les TcustomForm descendent des TScrollingWinControl.
    Les TScrollingWinControl descendent des tWinControl.

    Release n'est implémenter qu'au niveau de TCustomform.
    Release apparaît par défaut dans les descendant de TCustomform.

    Dans tous les cas, le truc est de détruire et de nettoyer un control depuis l'extérieur de control. Faute de quoi la procédure finira par faire référence au control après que l'ayez détruit (au niveau de la gestion des événements windows). J'avais pris les form comme démo car vous aviez mentionner Release.

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Oui je comprends le principe ....

    Moi je voulais pouvoir juste donner la possibilité au developper de faire un close ou un free selon un parametre defini a la creation pour eviter de changer le code.
    J'ai donc rajouté le test pour faire une close dans le destroy .. comme ca il n'aura pas a tapper les 2 Lignes de code .. mais devra quand meme choisir si c'est une fermeture finale ou un close tout simple :/

    Tant pis
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

Discussions similaires

  1. Probleme de auto-destruction virtuel d'une classe
    Par djun1 dans le forum Débuter
    Réponses: 4
    Dernier message: 28/12/2013, 19h46
  2. Variables de classe vs Variables d'instance
    Par webja dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2007, 09h28
  3. Réponses: 5
    Dernier message: 09/03/2007, 21h14
  4. Destruction en instance d'un objet
    Par TicTacToe dans le forum Delphi
    Réponses: 3
    Dernier message: 16/12/2006, 10h57
  5. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 17h16

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