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 :

Problème au destroy d'un objet


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut Problème au destroy d'un objet
    Bonjour,

    J'ai un problème que je ne m'expplique pas.

    voila j'ai créer un objet avec un form et lorsz de la fermeture de mon application j'ai un plantae sur Myform.free, ou release etc...
    voici le code je shematise :

    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
     
    MTOBJET :Class(AncetreObjet)
    Private
        FMYForm :Tform
    public
        constructor InitMTOBJET;
        destructor destroy
    end
     
    constructor MTOBJET.InitMTOBJET;
    begin
        Inherited create;
        FMYForm :=Tform.create
        etc...
    end
     
    Destructor MTOBJET.Destroy;
    begin
        FMYForm.free //cette ligne plante, par contresi la ligne n'est pas là pas de problème     
        Inherited destroy;
    end
    Avez vous une idée de l'origine de ce problème

    merci
    Qays

  2. #2
    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
    plusieurs choses me chiffone :
    Pourquoi ya pas de override sur le destructeur ? et eventuelement sur le construteur selon l'ancetre ....
    Pourquoi la methode create de la form ne possede pas de owner ? C'est un oublit de retranscription ?

    En attendant de plus amples informations, je pense que tu as du mettre un owner <> NIL pour ta form et que tu as libéré ce "owner" avant ta form, d'ou l'erreur.

    Sinon faudrais voir de plus pres ton code ...
    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

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Merci de votre aide

    pour être plus claire voici le véritable code (on ne rit pas c'est mon premier objet):

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
     
      TECR_HABILLAGE = class(TForm)
        Memo1: TMemo;
        ComboBox1: TComboBox;
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        Panel1: TPanel;
        Image1: TImage;
        Label1: TLabel;
        Edit1: TEdit;
        Button1: TButton;
        CheckBox1: TCheckBox;
        RadioButton1: TRadioButton;
        ComboBox2: TComboBox;
        ListBox1: TListBox;
        Edit2: TEdit;
        SpeedButton1: TSpeedButton;
        BitBtn1: TBitBtn;
        DateTimePicker1: TDateTimePicker;
        TreeView1: TTreeView;
        ProgressBar1: TProgressBar;
        StringGrid1: TStringGrid;
        SpeedButton2: TSpeedButton;
        SpeedButton3: TSpeedButton;
        procedure ComboBox1Change(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure BitBtnQuitter1Click(Sender: TObject);
        procedure BitBtnValider1Click(Sender: TObject);
        procedure SpeedButton2Click(Sender: TObject);
        procedure SpeedButton3Click(Sender: TObject);
      private
        { Déclarations privées }
        Procedure TrouverFichier(Chemin : String ; Masque : String);
      public
        { Déclarations publiques }
     
      end;
      TSkin = Class(TskinData)
        Private
          FInifile        :String;
          FRepertoire :String;
          FSkin :String;
          FShow:boolean;
          FHABILLAGE: TECR_HABILLAGE;//Ecran qui me permet de sélectionner mon skin
          Procedure SetSkin(Value:String);
          Procedure SetFRepertoire(Value:String);
          Procedure SetInifile(Value:String);
          Procedure SETShow(Value:Boolean);
        Published
          property Skin:String Read FSkin write SetSkin;
          property Repertoire:String Read FRepertoire write SetFRepertoire;
          property Inifile:String Read FInifile write SetInifile;
          property Show :Boolean read FShow Write SETShow;
        Public
          Constructor InitSkin(Aowner:TComponent;FileIni:String);
          Destructor Destroy;override;
          Procedure ReadParamSkin;
          procedure WriteParamSkin(Value:String);
          Procedure Execute(ShowModal:boolean);
      end;
     
    .......
    .......
    .......
    .......
     
     
    //wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww//
    Constructor TSkin.InitSkin(Aowner:TComponent;FileIni:String);
    begin
        Inherited Create(Aowner);
        Inifile := FileIni;
        ReadParamSkin;
        Active := true;
        SkinFile :=Repertoire+'\'+Skin+'.skn';
        FHABILLAGE := TECR_HABILLAGE.Create(Aowner);
        FHABILLAGE.Hide;
    end;
    //wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww//
    Destructor TSkin.Destroy;
    begin
        Inherited Destroy;
    end;
     
    .......
    .......
    .......
    .......
    .......
    .......
    .......
    .......
     
     
    End.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Petit précision le programme marche mais je m'intéroge sur la raison qui justifi le plantage si je rajoute le code suivant dans de destroy :

    FHABILLAGE.free

    Merci

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FHABILLAGE := TECR_HABILLAGE.Create(Aowner);
    En fait tout reside la dedans

    Le fait de transmettre un owner a un composant, cela lie la duree de vie du composant a celle de son owner. C'est a dire que lorsque qu'un composant est detruit, tous les composants dont il est le owner sont detruit.

    Fatalement ta form sera detruite lorsque son owner sera detruit.
    Tu as transmis la variable "owner" du TSkin, la form sera detruit lorsque le composant qui est le "owner" de ton TSkin sera detruit.
    LE mieux est dans la plupart des cas de passer comme owner d'un sous composant Self. En l'occurance l'instance du TSkin.
    Ce qui est plus logique car lorsque le TSkin est detruit, il faut detruire la TForm.

    Dans le cas ou le owner d'un composant est <> de nil, il n'ets dont pas necessaire d'utiliser Free, puisque la liberation est automatique.

    Sinon, pour epliquer ton probleme, je pense que le mecanisme de gestion automatique de liberation des composant doit se faire chevaucher les liberations. C'est a dire que le owner de ton TSkin est detruit, entraine la liberation des objets dont il est le owner c'est a dire le TSkin et le TForm (car meme owner). Il se peut que le TForm soit libéré en premier et donc lors de l'appel a free quand le TSkin est lui meme detruit (apres coup) fait reference a une instance deja liberee ....

    J'espere avoir ete assez clair mais expliquer les owner deviens vite une sacree pagaille
    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

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Merci beaucoup, je comprends mieux le problème, je vais étudier cela

    Cordialement
    Qays

  7. #7
    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
    Dasn ce cas, pense au tag Resolu meme si c'est temporaire.
    Tu pourras le desactiver plus tard pour relancer le thread
    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

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    je pensais l'avoir fait,
    PS: j'ai corrigé mon code et c'est Ok

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

Discussions similaires

  1. Problème de lock d'un objet recordset
    Par aircamus dans le forum IHM
    Réponses: 2
    Dernier message: 12/06/2006, 14h17
  2. Solide problème avec visualisation d'un objet 3D
    Par vdumont dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/05/2006, 15h43
  3. Réponses: 2
    Dernier message: 05/04/2006, 12h29
  4. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31
  5. [C#] Problème pour l'appel d'objet...
    Par AntiSAL dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/06/2004, 09h59

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